不要怂,就是干,撸起袖子干!

Commit 3d1b8b63 by Mick Hansen Committed by Sushant

chore(hooks): remove callback support, closes #5228 (#6323)

* chore(hooks): remove callback support, closes #5228

* fix rejections
1 parent 045a29a4
...@@ -114,46 +114,43 @@ const Hooks = { ...@@ -114,46 +114,43 @@ const Hooks = {
}, },
runHooks(hooks) { runHooks(hooks) {
const fnArgs = Utils.sliceArgs(arguments, 1); if (!hooks) throw new Error('runHooks requires atleast 1 argument');
const hookArgs = Utils.sliceArgs(arguments, 1);
let hookType; let hookType;
if (typeof hooks === 'string') { if (typeof hooks === 'string') {
hookType = hooks; hookType = hooks;
hooks = this.options.hooks[hookType] || []; hooks = this.options.hooks[hookType] || [];
if (!Array.isArray(hooks)) hooks = hooks === undefined ? [] : [hooks];
if (this.sequelize) hooks = hooks.concat(this.sequelize.options.hooks[hookType] || []); if (this.sequelize) hooks = hooks.concat(this.sequelize.options.hooks[hookType] || []);
} }
if (!Array.isArray(hooks)) { if (!Array.isArray(hooks)) {
hooks = hooks === undefined ? [] : [hooks]; hooks = [hooks];
} }
// run hooks as sync functions if flagged as sync // synchronous hooks
if (hookTypes[hookType] && hookTypes[hookType].sync) { if (hookTypes[hookType] && hookTypes[hookType].sync) {
for (let hook of hooks) { for (let hook of hooks) {
if (typeof hook === 'object') hook = hook.fn; if (typeof hook === 'object') {
hook = hook.fn;
}
debug(`running hook(sync) ${hookType}`); // log sync hooks debug(`running hook(sync) ${hookType}`);
return hook.apply(this, fnArgs); return hook.apply(this, hookArgs);
} }
return; return;
} }
// run hooks async // asynchronous hooks (default)
const promise = Promise.each(hooks, hook => { return Promise.each(hooks, hook => {
if (typeof hook === 'object') { if (typeof hook === 'object') {
hook = hook.fn; hook = hook.fn;
} }
if (hookType && hook.length > hookTypes[hookType].params) { debug(`running hook ${hookType}`);
hook = Promise.promisify(hook, this); return Promise.resolve(hook.apply(this, hookArgs));
}
debug(`running hook ${hookType}`); // log async hook
return hook.apply(this, fnArgs);
}).return(); }).return();
return promise;
}, },
hook() { hook() {
......
...@@ -5,7 +5,8 @@ var chai = require('chai') ...@@ -5,7 +5,8 @@ var chai = require('chai')
, expect = chai.expect , expect = chai.expect
, Support = require(__dirname + '/../support') , Support = require(__dirname + '/../support')
, DataTypes = require(__dirname + '/../../../lib/data-types') , DataTypes = require(__dirname + '/../../../lib/data-types')
, sinon = require('sinon'); , sinon = require('sinon')
, Promise = require('bluebird');
describe(Support.getTestDialectTeaser('Hooks'), function() { describe(Support.getTestDialectTeaser('Hooks'), function() {
beforeEach(function() { beforeEach(function() {
...@@ -101,24 +102,24 @@ describe(Support.getTestDialectTeaser('Hooks'), function() { ...@@ -101,24 +102,24 @@ describe(Support.getTestDialectTeaser('Hooks'), function() {
var beforeBulkCreate = false var beforeBulkCreate = false
, afterBulkCreate = false; , afterBulkCreate = false;
this.User.beforeBulkCreate(function(daos, options, fn) { this.User.beforeBulkCreate(function(daos, options) {
beforeBulkCreate = true; beforeBulkCreate = true;
fn(); return Promise.resolve();
}); });
this.User.afterBulkCreate(function(daos, options, fn) { this.User.afterBulkCreate(function(daos, options) {
afterBulkCreate = true; afterBulkCreate = true;
fn(); return Promise.resolve();
}); });
this.User.beforeCreate(function(user, options, fn) { this.User.beforeCreate(function(user, options) {
user.beforeHookTest = true; user.beforeHookTest = true;
fn(); return Promise.resolve();
}); });
this.User.afterCreate(function(user, options, fn) { this.User.afterCreate(function(user, options) {
user.username = 'User' + user.id; user.username = 'User' + user.id;
fn(); return Promise.resolve();
}); });
return this.User.bulkCreate([{aNumber: 5}, {aNumber: 7}, {aNumber: 3}], { fields: ['aNumber'], individualHooks: true }).then(function(records) { return this.User.bulkCreate([{aNumber: 5}, {aNumber: 7}, {aNumber: 3}], { fields: ['aNumber'], individualHooks: true }).then(function(records) {
...@@ -135,23 +136,23 @@ describe(Support.getTestDialectTeaser('Hooks'), function() { ...@@ -135,23 +136,23 @@ describe(Support.getTestDialectTeaser('Hooks'), function() {
var beforeBulkCreate = false var beforeBulkCreate = false
, afterBulkCreate = false; , afterBulkCreate = false;
this.User.beforeBulkCreate(function(daos, options, fn) { this.User.beforeBulkCreate(function(daos, options) {
beforeBulkCreate = true; beforeBulkCreate = true;
fn(); return Promise.resolve();
}); });
this.User.afterBulkCreate(function(daos, options, fn) { this.User.afterBulkCreate(function(daos, options) {
afterBulkCreate = true; afterBulkCreate = true;
fn(); return Promise.resolve();
}); });
this.User.beforeCreate(function(user, options, fn) { this.User.beforeCreate(function(user, options) {
fn(new Error('You shall not pass!')); return Promise.reject(new Error('You shall not pass!'));
}); });
this.User.afterCreate(function(user, options, fn) { this.User.afterCreate(function(user, options) {
user.username = 'User' + user.id; user.username = 'User' + user.id;
fn(); return Promise.resolve();
}); });
return this.User.bulkCreate([{aNumber: 5}, {aNumber: 7}, {aNumber: 3}], { fields: ['aNumber'], individualHooks: true }).catch(function(err) { return this.User.bulkCreate([{aNumber: 5}, {aNumber: 7}, {aNumber: 3}], { fields: ['aNumber'], individualHooks: true }).catch(function(err) {
...@@ -380,24 +381,24 @@ describe(Support.getTestDialectTeaser('Hooks'), function() { ...@@ -380,24 +381,24 @@ describe(Support.getTestDialectTeaser('Hooks'), function() {
, beforeHook = false , beforeHook = false
, afterHook = false; , afterHook = false;
this.User.beforeBulkDestroy(function(options, fn) { this.User.beforeBulkDestroy(function(options) {
beforeBulk = true; beforeBulk = true;
fn(); return Promise.resolve();
}); });
this.User.afterBulkDestroy(function(options, fn) { this.User.afterBulkDestroy(function(options) {
afterBulk = true; afterBulk = true;
fn(); return Promise.resolve();
}); });
this.User.beforeDestroy(function(user, options, fn) { this.User.beforeDestroy(function(user, options) {
beforeHook = true; beforeHook = true;
fn(); return Promise.resolve();
}); });
this.User.afterDestroy(function(user, options, fn) { this.User.afterDestroy(function(user, options) {
afterHook = true; afterHook = true;
fn(); return Promise.resolve();
}); });
return this.User.bulkCreate([ return this.User.bulkCreate([
...@@ -419,24 +420,24 @@ describe(Support.getTestDialectTeaser('Hooks'), function() { ...@@ -419,24 +420,24 @@ describe(Support.getTestDialectTeaser('Hooks'), function() {
, beforeHook = false , beforeHook = false
, afterHook = false; , afterHook = false;
this.User.beforeBulkDestroy(function(options, fn) { this.User.beforeBulkDestroy(function(options) {
beforeBulk = true; beforeBulk = true;
fn(); return Promise.resolve();
}); });
this.User.afterBulkDestroy(function(options, fn) { this.User.afterBulkDestroy(function(options) {
afterBulk = true; afterBulk = true;
fn(); return Promise.resolve();
}); });
this.User.beforeDestroy(function(user, options, fn) { this.User.beforeDestroy(function(user, options) {
beforeHook = true; beforeHook = true;
fn(new Error('You shall not pass!')); return Promise.reject(new Error('You shall not pass!'));
}); });
this.User.afterDestroy(function(user, options, fn) { this.User.afterDestroy(function(user, options) {
afterHook = true; afterHook = true;
fn(); return Promise.resolve();
}); });
return this.User.bulkCreate([{aNumber: 1}, {aNumber: 1}, {aNumber: 1}], { fields: ['aNumber'] }).then(function() { return this.User.bulkCreate([{aNumber: 1}, {aNumber: 1}, {aNumber: 1}], { fields: ['aNumber'] }).then(function() {
...@@ -544,9 +545,9 @@ describe(Support.getTestDialectTeaser('Hooks'), function() { ...@@ -544,9 +545,9 @@ describe(Support.getTestDialectTeaser('Hooks'), function() {
this.ParanoidUser.beforeBulkRestore(beforeBulk); this.ParanoidUser.beforeBulkRestore(beforeBulk);
this.ParanoidUser.afterBulkRestore(afterBulk); this.ParanoidUser.afterBulkRestore(afterBulk);
this.ParanoidUser.beforeRestore(function(user, options, fn) { this.ParanoidUser.beforeRestore(function(user, options) {
beforeHook(); beforeHook();
fn(new Error('You shall not pass!')); return Promise.reject(new Error('You shall not pass!'));
}); });
this.ParanoidUser.afterRestore(afterHook); this.ParanoidUser.afterRestore(afterHook);
......
...@@ -6,7 +6,8 @@ var chai = require('chai') ...@@ -6,7 +6,8 @@ var chai = require('chai')
, Support = require(__dirname + '/../support') , Support = require(__dirname + '/../support')
, DataTypes = require(__dirname + '/../../../lib/data-types') , DataTypes = require(__dirname + '/../../../lib/data-types')
, Sequelize = Support.Sequelize , Sequelize = Support.Sequelize
, sinon = require('sinon'); , sinon = require('sinon')
, Promise = require('bluebird');
describe(Support.getTestDialectTeaser('Hooks'), function() { describe(Support.getTestDialectTeaser('Hooks'), function() {
beforeEach(function() { beforeEach(function() {
...@@ -102,9 +103,9 @@ describe(Support.getTestDialectTeaser('Hooks'), function() { ...@@ -102,9 +103,9 @@ describe(Support.getTestDialectTeaser('Hooks'), function() {
var hookCalled = 0; var hookCalled = 0;
A.addHook('afterCreate', function(instance, options, next) { A.addHook('afterCreate', function(instance, options) {
hookCalled++; hookCalled++;
next(); return Promise.resolve();
}); });
B.belongsToMany(A, {through: 'a_b'}); B.belongsToMany(A, {through: 'a_b'});
......
...@@ -7,7 +7,8 @@ var chai = require('chai') ...@@ -7,7 +7,8 @@ var chai = require('chai')
, DataTypes = require(__dirname + '/../../../lib/data-types') , DataTypes = require(__dirname + '/../../../lib/data-types')
, Sequelize = Support.Sequelize , Sequelize = Support.Sequelize
, dialect = Support.getTestDialect() , dialect = Support.getTestDialect()
, sinon = require('sinon'); , sinon = require('sinon')
, Promise = require('bluebird');
describe(Support.getTestDialectTeaser('Hooks'), function() { describe(Support.getTestDialectTeaser('Hooks'), function() {
beforeEach(function() { beforeEach(function() {
...@@ -112,15 +113,15 @@ describe(Support.getTestDialectTeaser('Hooks'), function() { ...@@ -112,15 +113,15 @@ describe(Support.getTestDialectTeaser('Hooks'), function() {
username: DataTypes.STRING username: DataTypes.STRING
}, { }, {
hooks: { hooks: {
beforeValidate: function(user, options, fn) { beforeValidate: function(user, options) {
expect(user).to.be.instanceof(User); expect(user).to.be.instanceof(User);
beforeHooked = true; beforeHooked = true;
fn(); return Promise.resolve();
}, },
afterValidate: function(user, options, fn) { afterValidate: function(user, options) {
expect(user).to.be.instanceof(User); expect(user).to.be.instanceof(User);
afterHooked = true; afterHooked = true;
fn(); return Promise.resolve();
} }
} }
}); });
...@@ -142,15 +143,15 @@ describe(Support.getTestDialectTeaser('Hooks'), function() { ...@@ -142,15 +143,15 @@ describe(Support.getTestDialectTeaser('Hooks'), function() {
username: DataTypes.STRING username: DataTypes.STRING
}, { }, {
hooks: { hooks: {
beforeCreate: function(user, options, fn) { beforeCreate: function(user, options) {
expect(user).to.be.instanceof(User); expect(user).to.be.instanceof(User);
beforeHooked = true; beforeHooked = true;
fn(); return Promise.resolve();
}, },
afterCreate: function(user, options, fn) { afterCreate: function(user, options) {
expect(user).to.be.instanceof(User); expect(user).to.be.instanceof(User);
afterHooked = true; afterHooked = true;
fn(); return Promise.resolve();
} }
} }
}); });
...@@ -172,15 +173,15 @@ describe(Support.getTestDialectTeaser('Hooks'), function() { ...@@ -172,15 +173,15 @@ describe(Support.getTestDialectTeaser('Hooks'), function() {
username: DataTypes.STRING username: DataTypes.STRING
}, { }, {
hooks: { hooks: {
beforeDestroy: function(user, options, fn) { beforeDestroy: function(user, options) {
expect(user).to.be.instanceof(User); expect(user).to.be.instanceof(User);
beforeHooked = true; beforeHooked = true;
fn(); return Promise.resolve();
}, },
afterDestroy: function(user, options, fn) { afterDestroy: function(user, options) {
expect(user).to.be.instanceof(User); expect(user).to.be.instanceof(User);
afterHooked = true; afterHooked = true;
fn(); return Promise.resolve();
} }
} }
}); });
...@@ -204,15 +205,15 @@ describe(Support.getTestDialectTeaser('Hooks'), function() { ...@@ -204,15 +205,15 @@ describe(Support.getTestDialectTeaser('Hooks'), function() {
username: DataTypes.STRING username: DataTypes.STRING
}, { }, {
hooks: { hooks: {
beforeDelete: function(user, options, fn) { beforeDelete: function(user, options) {
expect(user).to.be.instanceof(User); expect(user).to.be.instanceof(User);
beforeHooked = true; beforeHooked = true;
fn(); return Promise.resolve();
}, },
afterDelete: function(user, options, fn) { afterDelete: function(user, options) {
expect(user).to.be.instanceof(User); expect(user).to.be.instanceof(User);
afterHooked = true; afterHooked = true;
fn(); return Promise.resolve();
} }
} }
}); });
...@@ -236,15 +237,15 @@ describe(Support.getTestDialectTeaser('Hooks'), function() { ...@@ -236,15 +237,15 @@ describe(Support.getTestDialectTeaser('Hooks'), function() {
username: DataTypes.STRING username: DataTypes.STRING
}, { }, {
hooks: { hooks: {
beforeUpdate: function(user, options, fn) { beforeUpdate: function(user, options) {
expect(user).to.be.instanceof(User); expect(user).to.be.instanceof(User);
beforeHooked = true; beforeHooked = true;
fn(); return Promise.resolve();
}, },
afterUpdate: function(user, options, fn) { afterUpdate: function(user, options) {
expect(user).to.be.instanceof(User); expect(user).to.be.instanceof(User);
afterHooked = true; afterHooked = true;
fn(); return Promise.resolve();
} }
} }
}); });
......
...@@ -14,26 +14,6 @@ describe(Support.getTestDialectTeaser('Hooks'), function() { ...@@ -14,26 +14,6 @@ describe(Support.getTestDialectTeaser('Hooks'), function() {
this.Model = current.define('m'); this.Model = current.define('m');
}); });
describe('callback', function () {
// Legacy - remove at some point
it('success', function () {
this.Model.beforeCreate(function (attributes, options, fn) {
fn();
});
return expect(this.Model.runHooks('beforeCreate', {}, {})).to.be.resolved;
});
it('error', function () {
this.Model.beforeCreate(function (attributes, options, fn) {
fn('No!');
});
return expect(this.Model.runHooks('beforeCreate', {}, {})).to.be.rejectedWith('No!');
});
});
describe('arguments', function () { describe('arguments', function () {
it('hooks can modify passed arguments', function () { it('hooks can modify passed arguments', function () {
this.Model.addHook('beforeCreate', function (options) { this.Model.addHook('beforeCreate', function (options) {
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!