db-migrate 1.0.0-beta.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/CHANGELOG.md +487 -0
  2. package/LICENSE +22 -0
  3. package/README.md +100 -0
  4. package/api.js +463 -0
  5. package/bin/db-migrate +39 -0
  6. package/connect.js +198 -0
  7. package/get.js +67 -0
  8. package/index.js +85 -0
  9. package/lib/chain.js +157 -0
  10. package/lib/class.js +75 -0
  11. package/lib/commands/check.js +52 -0
  12. package/lib/commands/create-migration.js +252 -0
  13. package/lib/commands/db.js +63 -0
  14. package/lib/commands/down.js +45 -0
  15. package/lib/commands/dump.js +22 -0
  16. package/lib/commands/fn/plugin.js +45 -0
  17. package/lib/commands/generated.js +32 -0
  18. package/lib/commands/helper/assert.js +15 -0
  19. package/lib/commands/helper/load-config.js +26 -0
  20. package/lib/commands/helper/migration-hook.js +4 -0
  21. package/lib/commands/helper/register-events.js +19 -0
  22. package/lib/commands/index.js +9 -0
  23. package/lib/commands/on-complete.js +28 -0
  24. package/lib/commands/run.js +122 -0
  25. package/lib/commands/seed.js +48 -0
  26. package/lib/commands/set-default-argv.js +169 -0
  27. package/lib/commands/sync.js +52 -0
  28. package/lib/commands/undo-seed.js +54 -0
  29. package/lib/commands/up.js +52 -0
  30. package/lib/config.js +207 -0
  31. package/lib/driver/index.js +156 -0
  32. package/lib/driver/shadow.js +74 -0
  33. package/lib/executors/versioned/v1.js +48 -0
  34. package/lib/executors/versioned/v2.js +78 -0
  35. package/lib/file.js +190 -0
  36. package/lib/interface/migratorInterface.js +127 -0
  37. package/lib/interface/seederInterface.js +145 -0
  38. package/lib/learn.js +369 -0
  39. package/lib/methods/v2/conventions.js +47 -0
  40. package/lib/methods/v2/migrate.js +5 -0
  41. package/lib/methods/v2/statetravel.js +86 -0
  42. package/lib/methods/v2/translatestate.js +117 -0
  43. package/lib/relation.js +37 -0
  44. package/lib/state.js +154 -0
  45. package/lib/template.js +312 -0
  46. package/lib/templates/v2.js +12 -0
  47. package/lib/temputils.js +62 -0
  48. package/lib/walker.js +266 -0
  49. package/package.json +87 -0
  50. package/pnpm-lock.yaml +2574 -0
  51. package/te.js +70 -0
@@ -0,0 +1,63 @@
1
+ 'use strict';
2
+
3
+ var log = require('db-migrate-shared').log;
4
+ var assert = require('assert');
5
+
6
+ function executeDB (internals, config, callback) {
7
+ var index = require('../../connect');
8
+
9
+ if (internals.argv._.length > 0) {
10
+ internals.argv.dbname = internals.argv._.shift().toString();
11
+ } else {
12
+ log.info('Error: You must enter a database name!');
13
+ return;
14
+ }
15
+
16
+ delete config.getCurrent().settings.database;
17
+
18
+ index.driver(config.getCurrent().settings, function (err, db) {
19
+ assert.ifError(err);
20
+
21
+ if (internals.mode === 'create') {
22
+ db.createDatabase(
23
+ internals.argv.dbname,
24
+ {
25
+ ifNotExists: true
26
+ },
27
+ function (err) {
28
+ if (err) {
29
+ if (err.error) err = err.error;
30
+ log.error('Error: Failed to create database!', err);
31
+ } else {
32
+ log.info('Created database "' + internals.argv.dbname + '"');
33
+ }
34
+
35
+ db.close();
36
+ if (typeof callback === 'function') callback(err);
37
+ else process.exit(err ? 1 : 0);
38
+ }
39
+ );
40
+ } else if (internals.mode === 'drop') {
41
+ db.dropDatabase(
42
+ internals.argv.dbname,
43
+ {
44
+ ifExists: true
45
+ },
46
+ function (err) {
47
+ if (err) {
48
+ if (err.error) err = err.error;
49
+ log.error('Error: Failed to drop database!', err);
50
+ } else {
51
+ log.info('Deleted database "' + internals.argv.dbname + '"');
52
+ }
53
+
54
+ db.close();
55
+ if (typeof callback === 'function') callback(err);
56
+ else process.exit(err ? 1 : 0);
57
+ }
58
+ );
59
+ }
60
+ });
61
+ }
62
+
63
+ module.exports = executeDB;
@@ -0,0 +1,45 @@
1
+ var path = require('path');
2
+ var log = require('db-migrate-shared').log;
3
+ var migrationHook = require('./helper/migration-hook.js');
4
+
5
+ async function prepare (internals, config) {
6
+ try {
7
+ await migrationHook(internals);
8
+ var Migrator = require('../walker.js');
9
+ var index = require('../../connect');
10
+
11
+ if (!internals.argv.count) {
12
+ log.info('Defaulting to running 1 down migration.');
13
+ internals.argv.count = 1;
14
+ }
15
+
16
+ const migrator = await index.connect(
17
+ {
18
+ config: config.getCurrent().settings,
19
+ internals: internals,
20
+ prefix: 'migration'
21
+ },
22
+ Migrator
23
+ );
24
+
25
+ migrator.migrationsDir = path.resolve(internals.argv['migrations-dir']);
26
+
27
+ await migrator.createMigrationsTable();
28
+ log.verbose('migration table created');
29
+
30
+ return migrator;
31
+ } catch (err) {
32
+ throw err;
33
+ }
34
+ }
35
+
36
+ module.exports = async function (internals, config) {
37
+ const migrator = await prepare(internals, config);
38
+
39
+ try {
40
+ const res = await migrator.down(internals.argv);
41
+ return internals.onComplete(migrator, internals, null, res);
42
+ } catch (err) {
43
+ return internals.onComplete(migrator, internals, err);
44
+ }
45
+ };
@@ -0,0 +1,22 @@
1
+ const path = require('path');
2
+ const log = require('db-migrate-shared').log;
3
+
4
+ async function prepare (internals, config) {
5
+ const index = require('../../connect');
6
+
7
+ return index.driver({
8
+ config: config.getCurrent().settings,
9
+ internals: internals
10
+ });
11
+ }
12
+
13
+ module.exports = async function (internals, config) {
14
+ const driver = await prepare(internals, config);
15
+
16
+ try {
17
+ const res = await driver.backupGet(internals.argv);
18
+ return internals.onComplete(driver, internals, null, res);
19
+ } catch (err) {
20
+ return internals.onComplete(driver, internals, err);
21
+ }
22
+ };
@@ -0,0 +1,45 @@
1
+ 'use strict';
2
+
3
+ const log = require('db-migrate-shared').log;
4
+
5
+ function registerPluginLoader (plugins) {
6
+ return {
7
+ overwrite: function (name) {
8
+ if (plugins[name] && plugins[name].length) {
9
+ var plugin = plugins[name];
10
+
11
+ if (plugin.length !== 1) {
12
+ log.warn(
13
+ 'Attention, multiple overwrites registered for %s, we are ' +
14
+ 'only loading the first plugin %s!',
15
+ name,
16
+ plugin.name
17
+ );
18
+ }
19
+
20
+ plugin = plugin[0];
21
+ if (typeof plugin.loadPlugin === 'function') plugin.loadPlugin();
22
+
23
+ return plugin;
24
+ }
25
+
26
+ return false;
27
+ },
28
+
29
+ hook: function (name) {
30
+ if (plugins[name] && plugins[name].length) {
31
+ var plugin = plugins[name];
32
+
33
+ plugin.map(function (plugin) {
34
+ if (typeof plugin.loadPlugin === 'function') plugin.loadPlugin();
35
+ });
36
+
37
+ return plugin;
38
+ }
39
+
40
+ return false;
41
+ }
42
+ };
43
+ }
44
+
45
+ module.exports = registerPluginLoader;
@@ -0,0 +1,32 @@
1
+
2
+ 'use strict';
3
+
4
+ const path = require('path');
5
+
6
+ const files = {
7
+ "check": require('./check.js'),
8
+ "create-migration": require('./create-migration.js'),
9
+ "db": require('./db.js'),
10
+ "down": require('./down.js'),
11
+ "dump": require('./dump.js'),
12
+ "fn/plugin": require('./fn/plugin.js'),
13
+ "generated": require('./generated.js'),
14
+ "helper/assert": require('./helper/assert.js'),
15
+ "helper/load-config": require('./helper/load-config.js'),
16
+ "helper/migration-hook": require('./helper/migration-hook.js'),
17
+ "helper/register-events": require('./helper/register-events.js'),
18
+ "index": require('./index.js'),
19
+ "on-complete": require('./on-complete.js'),
20
+ "run": require('./run.js'),
21
+ "seed": require('./seed.js'),
22
+ "set-default-argv": require('./set-default-argv.js'),
23
+ "sync": require('./sync.js'),
24
+ "undo-seed": require('./undo-seed.js'),
25
+ "up": require('./up.js')
26
+ }
27
+
28
+ function register (module) {
29
+ return files[module];
30
+ }
31
+
32
+ module.exports = register;
@@ -0,0 +1,15 @@
1
+ var assert = require('assert');
2
+
3
+ module.exports = function (err, callback) {
4
+ if (err) {
5
+ if (typeof (callback) === 'function') {
6
+ callback(err);
7
+ return false;
8
+ } else {
9
+ assert.ifError(err);
10
+ return false;
11
+ }
12
+ }
13
+
14
+ return true;
15
+ };
@@ -0,0 +1,26 @@
1
+ 'use strict';
2
+
3
+ var log = require('db-migrate-shared').log;
4
+
5
+ function loadConfig (config, internals) {
6
+ var out;
7
+ var currentEnv = internals.currentEnv || internals.argv.env;
8
+
9
+ if (internals.configObject) {
10
+ out = config.loadObject(internals.configObject, currentEnv);
11
+ } else {
12
+ out = config.loadFile(internals.argv.config, currentEnv, internals.plugins);
13
+ }
14
+ if (internals.verbose) {
15
+ var current = out.getCurrent();
16
+ var s = JSON.parse(JSON.stringify(current.settings));
17
+
18
+ if (s.password) s.password = '******';
19
+
20
+ log.info('Using', current.env, 'settings:', s);
21
+ }
22
+
23
+ return out;
24
+ }
25
+
26
+ module.exports = loadConfig;
@@ -0,0 +1,4 @@
1
+ module.exports = function (internals) {
2
+ var Migration = require('../../file.js');
3
+ return Migration.registerHook(internals.plugins, internals);
4
+ };
@@ -0,0 +1,19 @@
1
+ 'use strict';
2
+
3
+ var log = require('db-migrate-shared').log;
4
+
5
+ function registerEvents () {
6
+ process.on('uncaughtException', function (err) {
7
+ log.error('uncaughtException');
8
+ log.error(err.stack || err);
9
+ process.exit(1);
10
+ });
11
+
12
+ process.on('unhandledRejection', function (reason) {
13
+ log.error('unhandledRejection');
14
+ log.error(reason.stack || reason);
15
+ process.exit(1);
16
+ });
17
+ }
18
+
19
+ module.exports = registerEvents;
@@ -0,0 +1,9 @@
1
+ 'use strict';
2
+
3
+ var path = require('path');
4
+
5
+ function register (module) {
6
+ return require(path.resolve(__dirname, module));
7
+ }
8
+
9
+ module.exports = register;
@@ -0,0 +1,28 @@
1
+ var assert = require('assert');
2
+ var log = require('db-migrate-shared').log;
3
+
4
+ const Promise = require('bluebird');
5
+
6
+ module.exports = function (migrator, internals, originalErr, results) {
7
+ return Promise.fromCallback(callback => {
8
+ migrator.driver.close(function (err) {
9
+ if ((err || originalErr) && typeof callback === 'function') {
10
+ callback(originalErr || err);
11
+ return;
12
+ } else {
13
+ assert.ifError(originalErr);
14
+ assert.ifError(err);
15
+ log.info('Done');
16
+ }
17
+
18
+ if (internals.argv['force-exit']) {
19
+ log.verbose('Forcing exit');
20
+ return process.exit(0);
21
+ }
22
+
23
+ if (typeof callback === 'function') {
24
+ callback(null, results);
25
+ }
26
+ });
27
+ });
28
+ };
@@ -0,0 +1,122 @@
1
+ 'use strict';
2
+
3
+ var log = require('db-migrate-shared').log;
4
+ var yargs = require('yargs');
5
+
6
+ function run (internals, config) {
7
+ const { load } = internals;
8
+ var action = internals.argv._.shift();
9
+ var folder = action.split(':');
10
+
11
+ action = folder[0];
12
+
13
+ switch (action) {
14
+ case 'create':
15
+ if (folder[1]) {
16
+ internals.matching = folder[1];
17
+ internals.migrationMode = folder[1];
18
+ }
19
+ load('create-migration')(internals, config);
20
+ break;
21
+ case 'sync':
22
+ var executeSync = load('sync');
23
+
24
+ if (internals.argv._.length === 0) {
25
+ log.error('Missing sync destination!');
26
+ process.exit(1);
27
+ }
28
+
29
+ internals.argv.count = Number.MAX_VALUE;
30
+ internals.argv.destination = internals.argv._.shift().toString();
31
+
32
+ if (folder[1]) {
33
+ internals.matching = folder[1];
34
+ internals.migrationMode = folder[1];
35
+ }
36
+
37
+ executeSync(internals, config);
38
+ break;
39
+ case 'up':
40
+ case 'down':
41
+ case 'reset':
42
+ if (action === 'reset') internals.argv.count = Number.MAX_VALUE;
43
+
44
+ if (internals.argv._.length > 0) {
45
+ if (action === 'down') {
46
+ internals.argv.count = internals.argv.count || Number.MAX_VALUE;
47
+ internals.argv.destination = internals.argv._.shift().toString();
48
+ } else {
49
+ internals.argv.destination = internals.argv._.shift().toString();
50
+ }
51
+ }
52
+
53
+ if (folder[1]) {
54
+ internals.matching = folder[1];
55
+ internals.migrationMode = folder[1];
56
+ }
57
+
58
+ if (action === 'up') {
59
+ var executeUp = load('up');
60
+ executeUp(internals, config);
61
+ } else {
62
+ var executeDown = load('down');
63
+ executeDown(internals, config);
64
+ }
65
+ break;
66
+
67
+ case 'check':
68
+ var executeCheck = load('check');
69
+
70
+ if (folder[1]) {
71
+ internals.matching = folder[1];
72
+ internals.migrationMode = folder[1];
73
+ }
74
+
75
+ executeCheck(internals, config);
76
+ break;
77
+ case 'db':
78
+ if (folder.length < 1) {
79
+ log.info('Please enter a valid command, i.e. db:create|db:drop');
80
+ } else {
81
+ internals.mode = folder[1];
82
+ load('db')(internals, config);
83
+ }
84
+ break;
85
+ case 'seed':
86
+ internals.mode = folder[1] || 'vc';
87
+ internals.migrationMode = folder[2];
88
+
89
+ if (internals.argv._[0] === 'down' || internals.argv._[0] === 'reset') {
90
+ if (internals.argv._[0] === 'reset') {
91
+ internals.argv.count = Number.MAX_VALUE;
92
+ }
93
+
94
+ internals.argv._.shift();
95
+ load('undo-seed')(internals, config);
96
+ } else {
97
+ load('seed')(internals, config);
98
+ }
99
+ break;
100
+
101
+ default:
102
+ var plugins = internals.plugins;
103
+ var plugin = plugins.overwrite(
104
+ 'run:default:action:' + action + ':overwrite'
105
+ );
106
+ if (plugin) {
107
+ plugin['run:default:action:' + action + ':overwrite'](
108
+ internals,
109
+ config
110
+ );
111
+ } else {
112
+ log.error(
113
+ 'Invalid Action: Must be [up|down|check|create|reset|sync|db].'
114
+ );
115
+ yargs.showHelp();
116
+ process.exit(1);
117
+ }
118
+ break;
119
+ }
120
+ }
121
+
122
+ module.exports = run;
@@ -0,0 +1,48 @@
1
+ 'use strict';
2
+
3
+ var assert = require('assert');
4
+ var path = require('path');
5
+ var _assert = require('./helper/assert');
6
+
7
+ function executeSeed (internals, config, callback) {
8
+ var index = require('../../connect');
9
+ var Seeder = require('../walker.js');
10
+
11
+ if (internals.argv._.length > 0) {
12
+ internals.argv.destination = internals.argv._.shift().toString();
13
+ }
14
+
15
+ index.connect(
16
+ {
17
+ config: config.getCurrent().settings,
18
+ internals: internals,
19
+ prefix: 'seed'
20
+ },
21
+ Seeder,
22
+ function (err, seeder) {
23
+ assert.ifError(err);
24
+ var seedDir =
25
+ internals.mode !== 'static' ? 'vcseeder-dir' : 'staticseeder-dir';
26
+
27
+ seeder.seedDir = path.resolve(internals.argv[seedDir]);
28
+
29
+ if (internals.mode === 'static') {
30
+ seeder.seed(
31
+ internals.argv,
32
+ internals.onComplete.bind(this, seeder, internals, callback)
33
+ );
34
+ } else {
35
+ seeder.createSeedsTable(function (err) {
36
+ if (_assert(err, callback)) {
37
+ seeder.seed(
38
+ internals.argv,
39
+ internals.onComplete.bind(this, seeder, internals, callback)
40
+ );
41
+ }
42
+ });
43
+ }
44
+ }
45
+ );
46
+ }
47
+
48
+ module.exports = executeSeed;
@@ -0,0 +1,169 @@
1
+ var yargs = require('yargs');
2
+ var log = require('db-migrate-shared').log;
3
+
4
+ module.exports = function (internals, isModule) {
5
+ var rc = require('rc');
6
+ var deepExtend = require('deep-extend');
7
+ var defaultConfig = {
8
+ verbose: false,
9
+ state: 'migrations_state',
10
+ table: 'migrations',
11
+ 'seeds-table': 'seeds',
12
+ 'force-exit': false,
13
+ 'sql-file': false,
14
+ 'non-transactional': false,
15
+ config: internals.configFile || internals.cwd + '/database.json',
16
+ 'migrations-dir': internals.cwd + '/migrations',
17
+ 'vcseeder-dir': internals.cwd + '/VCSeeder',
18
+ 'staticseeder-dir': internals.cwd + '/Seeder',
19
+ 'ignore-completed-migrations': false
20
+ };
21
+
22
+ if (!isModule) {
23
+ internals.argv = yargs
24
+ .default(defaultConfig)
25
+ .usage(
26
+ 'Usage: db-migrate [up|down|check|reset|sync|create|db] ' +
27
+ '[[dbname/]migrationName|all] [options]'
28
+ )
29
+ .describe(
30
+ 'env',
31
+ 'The environment to run the migrations under (dev, test, prod).'
32
+ )
33
+ .alias('e', 'env')
34
+ .string('e')
35
+ .describe(
36
+ 'migrations-dir',
37
+ 'The directory containing your migration files.'
38
+ )
39
+ .alias('m', 'migrations-dir')
40
+ .string('m')
41
+ .describe('count', 'Max number of migrations to run.')
42
+ .alias('c', 'count')
43
+ .string('c')
44
+ .describe('dry-run', "Prints the SQL but doesn't run it.")
45
+ .boolean('dry-run')
46
+ .describe(
47
+ 'check',
48
+ 'Prints the migrations to be run without running them.'
49
+ )
50
+ .boolean('check')
51
+ .describe(
52
+ 'force-exit',
53
+ 'Forcibly exit the migration process on completion.'
54
+ )
55
+ .boolean('force-exit')
56
+ .describe('verbose', 'Verbose mode.')
57
+ .alias('v', 'verbose')
58
+ .boolean('v')
59
+ .alias('h', 'help')
60
+ .alias('h', '?')
61
+ .boolean('h')
62
+ .describe('version', 'Print version info.')
63
+ .alias('i', 'version')
64
+ .boolean('version')
65
+ .describe('config', 'Location of the database.json file.')
66
+ .string('config')
67
+ .describe('v2-file', 'Create v2 schema migration')
68
+ .boolean('v2-file')
69
+ .describe(
70
+ 'sql-file',
71
+ 'Automatically create two sql files for up and down statements in ' +
72
+ '/sqls and generate the javascript code that loads them.'
73
+ )
74
+ .boolean('sql-file')
75
+ .describe('coffee-file', 'Create a coffeescript migration file')
76
+ .boolean('coffee-file')
77
+ .describe(
78
+ 'ignore-on-init',
79
+ 'Create files that will run only if ignore-on-init in the env is set ' +
80
+ 'to false (currently works only with SQL)'
81
+ )
82
+ .boolean('ignore-on-init')
83
+ .describe(
84
+ 'migration-table',
85
+ 'Set the name of the migration table, which stores the migration history.'
86
+ )
87
+ .alias('table', 'migration-table')
88
+ .alias('t', 'table')
89
+ .string('t')
90
+ .describe(
91
+ 'seeds-table',
92
+ 'Set the name of the seeds table, which stores the seed history.'
93
+ )
94
+ .describe(
95
+ 'state-table',
96
+ 'Set the name of the migration state table, which stores the migration' +
97
+ ' state to coordinate concurrency and advanced features.'
98
+ )
99
+ .alias('state', 'state-table')
100
+ .alias('s', 'state')
101
+ .string('s')
102
+ .string('seeds-table')
103
+ .describe(
104
+ 'vcseeder-dir',
105
+ 'Set the path to the Version Controlled Seeder directory.'
106
+ )
107
+ .string('vcseeder-dir')
108
+ .describe('staticseeder-dir', 'Set the path to the Seeder directory.')
109
+ .string('staticseeder-dir')
110
+ .describe('non-transactional', 'Explicitly disable transactions')
111
+ .boolean('non-transactional')
112
+ .describe('ignore-completed-migrations', 'Start at the first migration')
113
+ .boolean('ignore-completed-migrations')
114
+ .describe('log-level', 'Set the log-level, for example sql|warn')
115
+ .string('log-level')
116
+ .parse();
117
+ } else {
118
+ internals.argv = Object.assign(defaultConfig, internals.cmdOptions);
119
+ }
120
+
121
+ var plugins = internals.plugins;
122
+ var plugin = plugins.hook('init:cli:config:hook');
123
+ var _config = internals.argv.config;
124
+
125
+ if (plugin) {
126
+ plugin.forEach(function (plugin) {
127
+ // var configs = plugin['init:cli:config:hook']();
128
+ // if (!configs) return;
129
+ // hook not yet used, we look into migrating away from yargs first
130
+ });
131
+ }
132
+
133
+ internals.argv = deepExtend(internals.argv, rc('db-migrate', {}));
134
+ internals.argv.rcconfig = internals.argv.config;
135
+ internals.argv.config = internals.argv.configFile || _config;
136
+
137
+ if (internals.argv.version) {
138
+ console.log(internals.dbm.version);
139
+ process.exit(0);
140
+ }
141
+
142
+ if (!isModule && (internals.argv.help || internals.argv._.length === 0)) {
143
+ yargs.showHelp();
144
+ process.exit(1);
145
+ }
146
+
147
+ if (internals.argv['log-level']) {
148
+ log.setLogLevel(internals.argv['log-level']);
149
+ }
150
+
151
+ internals.ignoreCompleted = internals.argv['ignore-completed-migrations'];
152
+ internals.migrationTable = internals.argv.table;
153
+ internals.migrationState = internals.argv.state;
154
+ internals.seedTable = internals.argv['seeds-table'];
155
+ internals.matching = '';
156
+ internals.verbose = internals.argv.verbose;
157
+ global.verbose = internals.verbose;
158
+ internals.notransactions = internals.argv['non-transactional'];
159
+ internals.dryRun = internals.argv['dry-run'];
160
+ global.dryRun = internals.dryRun;
161
+ internals.check = internals.argv.check;
162
+
163
+ if (internals.dryRun) {
164
+ log.info('dry run');
165
+ }
166
+ if (internals.check) {
167
+ log.info('check');
168
+ }
169
+ };