index.js 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. 'use strict';
  2. exports.__esModule = true;
  3. var _extend2 = require('lodash/extend');
  4. var _extend3 = _interopRequireDefault(_extend2);
  5. var _each2 = require('lodash/each');
  6. var _each3 = _interopRequireDefault(_each2);
  7. var _template2 = require('lodash/template');
  8. var _template3 = _interopRequireDefault(_template2);
  9. var _bind2 = require('lodash/bind');
  10. var _bind3 = _interopRequireDefault(_bind2);
  11. var _map2 = require('lodash/map');
  12. var _map3 = _interopRequireDefault(_map2);
  13. var _includes2 = require('lodash/includes');
  14. var _includes3 = _interopRequireDefault(_includes2);
  15. var _filter2 = require('lodash/filter');
  16. var _filter3 = _interopRequireDefault(_filter2);
  17. var _fs = require('fs');
  18. var _fs2 = _interopRequireDefault(_fs);
  19. var _path = require('path');
  20. var _path2 = _interopRequireDefault(_path);
  21. var _mkdirp = require('mkdirp');
  22. var _mkdirp2 = _interopRequireDefault(_mkdirp);
  23. var _bluebird = require('bluebird');
  24. var _bluebird2 = _interopRequireDefault(_bluebird);
  25. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  26. // The new seeds we're performing, typically called from the `knex.seed`
  27. // interface on the main `knex` object. Passes the `knex` instance performing
  28. // the seeds.
  29. // Seeder
  30. // -------
  31. function Seeder(knex) {
  32. this.knex = knex;
  33. this.config = this.setConfig(knex.client.config.seeds);
  34. }
  35. // Runs all seed files for the given environment.
  36. Seeder.prototype.run = _bluebird2.default.method(function (config) {
  37. this.config = this.setConfig(config);
  38. return this._seedData().bind(this).spread(function (all) {
  39. return this._runSeeds(all);
  40. });
  41. });
  42. // Creates a new seed file, with a given name.
  43. Seeder.prototype.make = function (name, config) {
  44. this.config = this.setConfig(config);
  45. if (!name) _bluebird2.default.rejected(new Error('A name must be specified for the generated seed'));
  46. return this._ensureFolder(config).bind(this).then(this._generateStubTemplate).then(this._writeNewSeed(name));
  47. };
  48. // Lists all available seed files as a sorted array.
  49. Seeder.prototype._listAll = _bluebird2.default.method(function (config) {
  50. this.config = this.setConfig(config);
  51. var loadExtensions = this.config.loadExtensions;
  52. return _bluebird2.default.promisify(_fs2.default.readdir, { context: _fs2.default })(this._absoluteConfigDir()).bind(this).then(function (seeds) {
  53. return (0, _filter3.default)(seeds, function (value) {
  54. var extension = _path2.default.extname(value);
  55. return (0, _includes3.default)(loadExtensions, extension);
  56. }).sort();
  57. });
  58. });
  59. // Gets the seed file list from the specified seed directory.
  60. Seeder.prototype._seedData = function () {
  61. return _bluebird2.default.join(this._listAll());
  62. };
  63. // Ensures a folder for the seeds exist, dependent on the
  64. // seed config settings.
  65. Seeder.prototype._ensureFolder = function () {
  66. var dir = this._absoluteConfigDir();
  67. return _bluebird2.default.promisify(_fs2.default.stat, { context: _fs2.default })(dir).catch(function () {
  68. return _bluebird2.default.promisify(_mkdirp2.default)(dir);
  69. });
  70. };
  71. // Run seed files, in sequence.
  72. Seeder.prototype._runSeeds = function (seeds) {
  73. return _bluebird2.default.all((0, _map3.default)(seeds, (0, _bind3.default)(this._validateSeedStructure, this))).bind(this).then(function (seeds) {
  74. return _bluebird2.default.bind(this).then(function () {
  75. return this._waterfallBatch(seeds);
  76. });
  77. });
  78. };
  79. // Validates seed files by requiring and checking for a `seed` function.
  80. Seeder.prototype._validateSeedStructure = function (name) {
  81. var seed = require(_path2.default.join(this._absoluteConfigDir(), name));
  82. if (typeof seed.seed !== 'function') {
  83. throw new Error('Invalid seed file: ' + name + ' must have a seed function');
  84. }
  85. return name;
  86. };
  87. // Generates the stub template for the current seed file, returning a compiled template.
  88. Seeder.prototype._generateStubTemplate = function () {
  89. var stubPath = this.config.stub || _path2.default.join(__dirname, 'stub', this.config.extension + '.stub');
  90. return _bluebird2.default.promisify(_fs2.default.readFile, { context: _fs2.default })(stubPath).then(function (stub) {
  91. return (0, _template3.default)(stub.toString(), { variable: 'd' });
  92. });
  93. };
  94. // Write a new seed to disk, using the config and generated filename,
  95. // passing any `variables` given in the config to the template.
  96. Seeder.prototype._writeNewSeed = function (name) {
  97. var config = this.config;
  98. var dir = this._absoluteConfigDir();
  99. return function (tmpl) {
  100. if (name[0] === '-') name = name.slice(1);
  101. var filename = name + '.' + config.extension;
  102. return _bluebird2.default.promisify(_fs2.default.writeFile, { context: _fs2.default })(_path2.default.join(dir, filename), tmpl(config.variables || {})).return(_path2.default.join(dir, filename));
  103. };
  104. };
  105. // Runs a batch of seed files.
  106. Seeder.prototype._waterfallBatch = function (seeds) {
  107. var knex = this.knex;
  108. var seedDirectory = this._absoluteConfigDir();
  109. var current = _bluebird2.default.bind({ failed: false, failedOn: 0 });
  110. var log = [];
  111. (0, _each3.default)(seeds, function (seed) {
  112. var name = _path2.default.join(seedDirectory, seed);
  113. seed = require(name);
  114. // Run each seed file.
  115. current = current.then(function () {
  116. return seed.seed(knex, _bluebird2.default);
  117. }).then(function () {
  118. log.push(name);
  119. });
  120. });
  121. return current.thenReturn([log]);
  122. };
  123. Seeder.prototype._absoluteConfigDir = function () {
  124. return _path2.default.resolve(process.cwd(), this.config.directory);
  125. };
  126. Seeder.prototype.setConfig = function (config) {
  127. return (0, _extend3.default)({
  128. extension: 'js',
  129. directory: './seeds',
  130. loadExtensions: ['.co', '.coffee', '.eg', '.iced', '.js', '.litcoffee', '.ls', '.ts']
  131. }, this.config || {}, config);
  132. };
  133. exports.default = Seeder;
  134. module.exports = exports['default'];