Skip to content

Commit 1d8eabd

Browse files
committed
feat(hook): parser hook and transitioner api
Added a hook for parsers and added the API endpoints for the transitioner. Refers to #403 Refers to #397
1 parent a704fec commit 1d8eabd

File tree

3 files changed

+108
-68
lines changed

3 files changed

+108
-68
lines changed

api.js

+71-39
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,8 @@ function dbmigrate(plugins, isModule, options, callback) {
6262

6363
this.internals = {
6464

65-
onComplete: onComplete
65+
onComplete: onComplete,
66+
migrationProtocol: 1
6667
};
6768
var internals = this.internals;
6869

@@ -295,6 +296,14 @@ dbmigrate.prototype = {
295296
return log.silence(isSilent);
296297
},
297298

299+
/**
300+
* Transition migrations to the latest defined protocol.
301+
*/
302+
transition: function() {
303+
304+
transition(this.internals);
305+
},
306+
298307
/**
299308
* Creates a correctly formatted migration
300309
*/
@@ -474,7 +483,7 @@ function setDefaultArgv(internals, isModule) {
474483
'ignore-completed-migrations': false
475484
})
476485
.usage(
477-
'Usage: db-migrate [up|down|reset|create|db|seed] [[dbname/]migrationName|all] [options]'
486+
'Usage: db-migrate [up|down|reset|create|db|seed|transition] [[dbname/]migrationName|all] [options]'
478487
)
479488

480489
.describe('env',
@@ -780,61 +789,75 @@ function _assert(err, callback) {
780789
return true;
781790
}
782791

792+
function migrationHook(internals) {
793+
794+
var Migration = require('./lib/migration.js');
795+
return Migration.registerHook(internals.plugins, internals);
796+
}
797+
783798
function executeUp(internals, config, callback) {
784799

785-
var Migrator = require('./lib/migrator.js');
786-
var index = require('./connect');
800+
migrationHook(internals)
801+
.then(function() {
787802

788-
if (!internals.argv.count) {
789-
internals.argv.count = Number.MAX_VALUE;
790-
}
791-
index.connect({
792-
config: config.getCurrent().settings,
793-
internals: internals
794-
}, Migrator, function(err, migrator) {
795-
assert.ifError(err);
803+
var Migrator = require('./lib/migrator.js');
804+
var index = require('./connect');
805+
806+
if (!internals.argv.count) {
807+
internals.argv.count = Number.MAX_VALUE;
808+
}
809+
index.connect({
810+
config: config.getCurrent().settings,
811+
internals: internals
812+
}, Migrator, function(err, migrator) {
813+
assert.ifError(err);
796814

797-
if (internals.locTitle)
815+
if (internals.locTitle)
798816
migrator.migrationsDir = path.resolve(internals.argv['migrations-dir'],
799-
internals.locTitle);
800-
else
817+
internals.locTitle);
818+
else
801819
migrator.migrationsDir = path.resolve(internals.argv['migrations-dir']);
802820

803-
internals.migrationsDir = migrator.migrationsDir;
821+
internals.migrationsDir = migrator.migrationsDir;
804822

805-
migrator.driver.createMigrationsTable(function(err) {
806-
assert.ifError(err);
807-
log.verbose('migration table created');
823+
migrator.driver.createMigrationsTable(function(err) {
824+
assert.ifError(err);
825+
log.verbose('migration table created');
808826

809-
migrator.up(internals.argv, internals.onComplete.bind(this,
810-
migrator, internals, callback));
811-
});
827+
migrator.up(internals.argv, internals.onComplete.bind(this,
828+
migrator, internals, callback));
829+
});
830+
});
812831
});
813832
}
814833

815834
function executeDown(internals, config, callback) {
816835

817-
var Migrator = require('./lib/migrator.js');
818-
var index = require('./connect');
819-
820-
if (!internals.argv.count) {
821-
log.info('Defaulting to running 1 down migration.');
822-
internals.argv.count = 1;
823-
}
836+
migrationHook(internals)
837+
.then(function() {
824838

825-
index.connect({
826-
config: config.getCurrent().settings,
827-
internals: internals
828-
}, Migrator, function(err, migrator) {
829-
assert.ifError(err);
839+
var Migrator = require('./lib/migrator.js');
840+
var index = require('./connect');
830841

831-
migrator.migrationsDir = path.resolve(internals.argv['migrations-dir']);
842+
if (!internals.argv.count) {
843+
log.info('Defaulting to running 1 down migration.');
844+
internals.argv.count = 1;
845+
}
832846

833-
migrator.driver.createMigrationsTable(function(err) {
847+
index.connect({
848+
config: config.getCurrent().settings,
849+
internals: internals
850+
}, Migrator, function(err, migrator) {
834851
assert.ifError(err);
835-
migrator.down(internals.argv, internals.onComplete.bind(this,
836-
migrator, internals, callback));
837-
});
852+
853+
migrator.migrationsDir = path.resolve(internals.argv['migrations-dir']);
854+
855+
migrator.driver.createMigrationsTable(function(err) {
856+
assert.ifError(err);
857+
migrator.down(internals.argv, internals.onComplete.bind(this,
858+
migrator, internals, callback));
859+
});
860+
});
838861
});
839862
}
840863

@@ -994,13 +1017,22 @@ function onComplete(migrator, internals, callback, originalErr) {
9941017
});
9951018
}
9961019

1020+
function transition(internals) {
1021+
1022+
require('./lib/transitions/transitioner.js')(internals);
1023+
}
1024+
9971025
function run(internals, config) {
9981026
var action = internals.argv._.shift(),
9991027
folder = action.split(':');
10001028

10011029
action = folder[0];
10021030

10031031
switch (action) {
1032+
case 'transition':
1033+
1034+
transition(internals);
1035+
break;
10041036
case 'create':
10051037

10061038
if (folder[1]) {

lib/migration.js

+35-14
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,9 @@ var fs = require('fs');
22
var path = require('path');
33
var log = require('db-migrate-shared').log;
44
var Skeleton = require('./skeleton');
5+
var Promise = require('bluebird');
56

67
var filesRegEx = /\.js$/;
7-
var coffeeSupported = false;
8-
var coffeeModule = null;
9-
try {
10-
coffeeModule = require('coffee-script');
11-
if (coffeeModule && coffeeModule.register) coffeeModule.register();
12-
coffeeSupported = true;
13-
filesRegEx = /\.(js|coffee)$/;
14-
} catch (e) {}
15-
168
var internals = {};
179

1810
function writeMigrationRecord(db, migration, callback) {
@@ -42,6 +34,38 @@ var Migration = Skeleton.extend({
4234
}
4335
});
4436

37+
Migration.registerHook = function(plugin, internals) {
38+
39+
var plugin = plugin.hook('migrator:migration:hook:require');
40+
internals.parser = internals.parse || {
41+
filesRegEx: filesRegEx,
42+
extensions: 'js'
43+
};
44+
45+
if(!plugin)
46+
return Promise.resolve(null);
47+
48+
return Promise.resolve(plugin)
49+
.map(function(plugin) {
50+
51+
return plugin['migrator:migration:hook:require']();
52+
})
53+
.each(function(parser) {
54+
55+
internals.parser.extensions = internals.parser.extensions + '|' +
56+
parser.extensions;
57+
})
58+
.then(function() {
59+
internals.parser.filesRegEx = new RegExp(
60+
'\\.(' +
61+
internals.parser.extensions +
62+
')$'
63+
);
64+
65+
return internals.parser;
66+
});
67+
};
68+
4569
Migration.prototype.defaultCoffeeTemplate = function() {
4670
return [
4771
'\'use strict\';',
@@ -302,11 +326,8 @@ Migration.loadFromFilesystem = function(dir, internals, callback) {
302326
}
303327
var coffeeWarn = true;
304328
files = files.filter(function(file) {
305-
if (coffeeWarn && !coffeeSupported && /\.coffee$/.test(file)) {
306-
log.warn('CoffeeScript not installed');
307-
coffeeWarn = false;
308-
}
309-
return filesRegEx.test(file);
329+
330+
return internals.parser.filesRegEx.test(file);
310331
});
311332
var migrations = files.sort().map(function(file) {
312333
return new Migration(path.join(dir, file), internals);

lib/seed.js

+2-15
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,6 @@ var path = require('path');
33
var log = require('db-migrate-shared').log;
44
var Skeleton = require('./skeleton');
55

6-
var filesRegEx = /\.js$/;
7-
var coffeeSupported = false;
8-
var coffeeModule = null;
9-
try {
10-
coffeeModule = require('coffee-script');
11-
if (coffeeModule && coffeeModule.register) coffeeModule.register();
12-
coffeeSupported = true;
13-
filesRegEx = /\.(js|coffee)$/;
14-
} catch (e) {}
15-
166
var Seed = Skeleton.extend({
177

188
init: function() {
@@ -129,11 +119,8 @@ Seed.loadFromFilesystem = function(dir, internals, callback) {
129119
if (err) { callback(err); return; }
130120
var coffeeWarn = true;
131121
files = files.filter(function(file) {
132-
if (coffeeWarn && !coffeeSupported && /\.coffee$/.test(file)) {
133-
log.warn('CoffeeScript not installed');
134-
coffeeWarn = false;
135-
}
136-
return filesRegEx.test(file);
122+
123+
return internals.parser.filesRegEx.test(file);
137124
});
138125
var seeds = files.sort().map(function(file) {
139126
return new Seed(path.join(dir, file), internals);

0 commit comments

Comments
 (0)