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

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 = {
},
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;
if (typeof hooks === 'string') {
hookType = hooks;
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 (!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) {
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
return hook.apply(this, fnArgs);
debug(`running hook(sync) ${hookType}`);
return hook.apply(this, hookArgs);
}
return;
}
// run hooks async
const promise = Promise.each(hooks, hook => {
// asynchronous hooks (default)
return Promise.each(hooks, hook => {
if (typeof hook === 'object') {
hook = hook.fn;
}
if (hookType && hook.length > hookTypes[hookType].params) {
hook = Promise.promisify(hook, this);
}
debug(`running hook ${hookType}`); // log async hook
return hook.apply(this, fnArgs);
debug(`running hook ${hookType}`);
return Promise.resolve(hook.apply(this, hookArgs));
}).return();
return promise;
},
hook() {
......
......@@ -5,7 +5,8 @@ var chai = require('chai')
, expect = chai.expect
, Support = require(__dirname + '/../support')
, DataTypes = require(__dirname + '/../../../lib/data-types')
, sinon = require('sinon');
, sinon = require('sinon')
, Promise = require('bluebird');
describe(Support.getTestDialectTeaser('Hooks'), function() {
beforeEach(function() {
......@@ -101,24 +102,24 @@ describe(Support.getTestDialectTeaser('Hooks'), function() {
var beforeBulkCreate = false
, afterBulkCreate = false;
this.User.beforeBulkCreate(function(daos, options, fn) {
this.User.beforeBulkCreate(function(daos, options) {
beforeBulkCreate = true;
fn();
return Promise.resolve();
});
this.User.afterBulkCreate(function(daos, options, fn) {
this.User.afterBulkCreate(function(daos, options) {
afterBulkCreate = true;
fn();
return Promise.resolve();
});
this.User.beforeCreate(function(user, options, fn) {
this.User.beforeCreate(function(user, options) {
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;
fn();
return Promise.resolve();
});
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() {
var beforeBulkCreate = false
, afterBulkCreate = false;
this.User.beforeBulkCreate(function(daos, options, fn) {
this.User.beforeBulkCreate(function(daos, options) {
beforeBulkCreate = true;
fn();
return Promise.resolve();
});
this.User.afterBulkCreate(function(daos, options, fn) {
this.User.afterBulkCreate(function(daos, options) {
afterBulkCreate = true;
fn();
return Promise.resolve();
});
this.User.beforeCreate(function(user, options, fn) {
fn(new Error('You shall not pass!'));
this.User.beforeCreate(function(user, options) {
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;
fn();
return Promise.resolve();
});
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() {
, beforeHook = false
, afterHook = false;
this.User.beforeBulkDestroy(function(options, fn) {
this.User.beforeBulkDestroy(function(options) {
beforeBulk = true;
fn();
return Promise.resolve();
});
this.User.afterBulkDestroy(function(options, fn) {
this.User.afterBulkDestroy(function(options) {
afterBulk = true;
fn();
return Promise.resolve();
});
this.User.beforeDestroy(function(user, options, fn) {
this.User.beforeDestroy(function(user, options) {
beforeHook = true;
fn();
return Promise.resolve();
});
this.User.afterDestroy(function(user, options, fn) {
this.User.afterDestroy(function(user, options) {
afterHook = true;
fn();
return Promise.resolve();
});
return this.User.bulkCreate([
......@@ -419,24 +420,24 @@ describe(Support.getTestDialectTeaser('Hooks'), function() {
, beforeHook = false
, afterHook = false;
this.User.beforeBulkDestroy(function(options, fn) {
this.User.beforeBulkDestroy(function(options) {
beforeBulk = true;
fn();
return Promise.resolve();
});
this.User.afterBulkDestroy(function(options, fn) {
this.User.afterBulkDestroy(function(options) {
afterBulk = true;
fn();
return Promise.resolve();
});
this.User.beforeDestroy(function(user, options, fn) {
this.User.beforeDestroy(function(user, options) {
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;
fn();
return Promise.resolve();
});
return this.User.bulkCreate([{aNumber: 1}, {aNumber: 1}, {aNumber: 1}], { fields: ['aNumber'] }).then(function() {
......@@ -544,9 +545,9 @@ describe(Support.getTestDialectTeaser('Hooks'), function() {
this.ParanoidUser.beforeBulkRestore(beforeBulk);
this.ParanoidUser.afterBulkRestore(afterBulk);
this.ParanoidUser.beforeRestore(function(user, options, fn) {
this.ParanoidUser.beforeRestore(function(user, options) {
beforeHook();
fn(new Error('You shall not pass!'));
return Promise.reject(new Error('You shall not pass!'));
});
this.ParanoidUser.afterRestore(afterHook);
......
......@@ -6,7 +6,8 @@ var chai = require('chai')
, Support = require(__dirname + '/../support')
, DataTypes = require(__dirname + '/../../../lib/data-types')
, Sequelize = Support.Sequelize
, sinon = require('sinon');
, sinon = require('sinon')
, Promise = require('bluebird');
describe(Support.getTestDialectTeaser('Hooks'), function() {
beforeEach(function() {
......@@ -102,9 +103,9 @@ describe(Support.getTestDialectTeaser('Hooks'), function() {
var hookCalled = 0;
A.addHook('afterCreate', function(instance, options, next) {
A.addHook('afterCreate', function(instance, options) {
hookCalled++;
next();
return Promise.resolve();
});
B.belongsToMany(A, {through: 'a_b'});
......
......@@ -7,7 +7,8 @@ var chai = require('chai')
, DataTypes = require(__dirname + '/../../../lib/data-types')
, Sequelize = Support.Sequelize
, dialect = Support.getTestDialect()
, sinon = require('sinon');
, sinon = require('sinon')
, Promise = require('bluebird');
describe(Support.getTestDialectTeaser('Hooks'), function() {
beforeEach(function() {
......@@ -112,15 +113,15 @@ describe(Support.getTestDialectTeaser('Hooks'), function() {
username: DataTypes.STRING
}, {
hooks: {
beforeValidate: function(user, options, fn) {
beforeValidate: function(user, options) {
expect(user).to.be.instanceof(User);
beforeHooked = true;
fn();
return Promise.resolve();
},
afterValidate: function(user, options, fn) {
afterValidate: function(user, options) {
expect(user).to.be.instanceof(User);
afterHooked = true;
fn();
return Promise.resolve();
}
}
});
......@@ -142,15 +143,15 @@ describe(Support.getTestDialectTeaser('Hooks'), function() {
username: DataTypes.STRING
}, {
hooks: {
beforeCreate: function(user, options, fn) {
beforeCreate: function(user, options) {
expect(user).to.be.instanceof(User);
beforeHooked = true;
fn();
return Promise.resolve();
},
afterCreate: function(user, options, fn) {
afterCreate: function(user, options) {
expect(user).to.be.instanceof(User);
afterHooked = true;
fn();
return Promise.resolve();
}
}
});
......@@ -172,15 +173,15 @@ describe(Support.getTestDialectTeaser('Hooks'), function() {
username: DataTypes.STRING
}, {
hooks: {
beforeDestroy: function(user, options, fn) {
beforeDestroy: function(user, options) {
expect(user).to.be.instanceof(User);
beforeHooked = true;
fn();
return Promise.resolve();
},
afterDestroy: function(user, options, fn) {
afterDestroy: function(user, options) {
expect(user).to.be.instanceof(User);
afterHooked = true;
fn();
return Promise.resolve();
}
}
});
......@@ -204,15 +205,15 @@ describe(Support.getTestDialectTeaser('Hooks'), function() {
username: DataTypes.STRING
}, {
hooks: {
beforeDelete: function(user, options, fn) {
beforeDelete: function(user, options) {
expect(user).to.be.instanceof(User);
beforeHooked = true;
fn();
return Promise.resolve();
},
afterDelete: function(user, options, fn) {
afterDelete: function(user, options) {
expect(user).to.be.instanceof(User);
afterHooked = true;
fn();
return Promise.resolve();
}
}
});
......@@ -236,15 +237,15 @@ describe(Support.getTestDialectTeaser('Hooks'), function() {
username: DataTypes.STRING
}, {
hooks: {
beforeUpdate: function(user, options, fn) {
beforeUpdate: function(user, options) {
expect(user).to.be.instanceof(User);
beforeHooked = true;
fn();
return Promise.resolve();
},
afterUpdate: function(user, options, fn) {
afterUpdate: function(user, options) {
expect(user).to.be.instanceof(User);
afterHooked = true;
fn();
return Promise.resolve();
}
}
});
......
......@@ -14,26 +14,6 @@ describe(Support.getTestDialectTeaser('Hooks'), function() {
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 () {
it('hooks can modify passed arguments', function () {
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!