UNPKG

objection

Version:
111 lines (86 loc) 10.9 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = transaction; var _lodash = require('lodash'); var _lodash2 = _interopRequireDefault(_lodash); var _bluebird = require('bluebird'); var _bluebird2 = _interopRequireDefault(_bluebird); var _Model = require('./model/Model'); var _Model2 = _interopRequireDefault(_Model); var _classUtils = require('./utils/classUtils'); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /** * @returns {Promise} */ function transaction() { // There must be at least one model class and the callback. if (arguments.length < 2) { return _bluebird2.default.reject(new Error('objection.transaction: provide at least one Model class to bind to the transaction or a knex instance')); } if (!(0, _classUtils.isSubclassOf)(arguments[0], _Model2.default) && _lodash2.default.isFunction(arguments[0].transaction)) { var args = _lodash2.default.toArray(arguments); var knex = _lodash2.default.first(args); args = args.slice(1); // If the function is a generator, wrap it using Promise.coroutine. if (isGenerator(args[0])) { args[0] = _bluebird2.default.coroutine(args[0]); } return knex.transaction.apply(knex, args); } else { // The last argument should be the callback and all other Model subclasses. var callback = _lodash2.default.last(arguments); var modelClasses = _lodash2.default.take(arguments, arguments.length - 1); var i = void 0; for (i = 0; i < modelClasses.length; ++i) { if (!(0, _classUtils.isSubclassOf)(modelClasses[i], _Model2.default)) { return _bluebird2.default.reject(new Error('objection.transaction: all but the last argument should be Model subclasses')); } } var _knex = _lodash2.default.first(modelClasses).knex(); for (i = 0; i < modelClasses.length; ++i) { if (modelClasses[i].knex() !== _knex) { return _bluebird2.default.reject(new Error('objection.transaction: all Model subclasses must be bound to the same database')); } } // If the function is a generator, wrap it using Promise.coroutine. if (isGenerator(callback)) { callback = _bluebird2.default.coroutine(callback); } return _knex.transaction(function (trx) { var args = new Array(modelClasses.length + 1); for (var _i = 0; _i < modelClasses.length; ++_i) { args[_i] = modelClasses[_i].bindTransaction(trx); } args[args.length - 1] = trx; return _bluebird2.default.try(function () { return callback.apply(trx, args); }); }); } } /** * @param {Constructor.<Model>|knex} modelClassOrKnex * @returns {Promise} */ transaction.start = function (modelClassOrKnex) { var knex = modelClassOrKnex; if ((0, _classUtils.isSubclassOf)(modelClassOrKnex, _Model2.default)) { knex = modelClassOrKnex.knex(); } if (!_lodash2.default.isFunction(knex.transaction)) { return _bluebird2.default.reject(new Error('objection.transaction.start: first argument must be a model class or a knex instance')); } return new _bluebird2.default(function (resolve, reject) { knex.transaction(function (trx) { resolve(trx); }).catch(function (err) { reject(err); }); }); }; function isGenerator(fn) { return fn && fn.constructor && fn.constructor.name === 'GeneratorFunction'; } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRyYW5zYWN0aW9uLmpzIl0sIm5hbWVzIjpbInRyYW5zYWN0aW9uIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwicmVqZWN0IiwiRXJyb3IiLCJpc0Z1bmN0aW9uIiwiYXJncyIsInRvQXJyYXkiLCJrbmV4IiwiZmlyc3QiLCJzbGljZSIsImlzR2VuZXJhdG9yIiwiY29yb3V0aW5lIiwiYXBwbHkiLCJjYWxsYmFjayIsImxhc3QiLCJtb2RlbENsYXNzZXMiLCJ0YWtlIiwiaSIsIkFycmF5IiwiYmluZFRyYW5zYWN0aW9uIiwidHJ4IiwidHJ5Iiwic3RhcnQiLCJtb2RlbENsYXNzT3JLbmV4IiwicmVzb2x2ZSIsImNhdGNoIiwiZXJyIiwiZm4iLCJjb25zdHJ1Y3RvciIsIm5hbWUiXSwibWFwcGluZ3MiOiI7Ozs7O2tCQVF3QkEsVzs7QUFSeEI7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFFQTs7O0FBR2UsU0FBU0EsV0FBVCxHQUF1QjtBQUNwQztBQUNBLE1BQUlDLFVBQVVDLE1BQVYsR0FBbUIsQ0FBdkIsRUFBMEI7QUFDeEIsV0FBTyxtQkFBUUMsTUFBUixDQUFlLElBQUlDLEtBQUosQ0FBVSx1R0FBVixDQUFmLENBQVA7QUFDRDs7QUFFRCxNQUFJLENBQUMsOEJBQWFILFVBQVUsQ0FBVixDQUFiLGtCQUFELElBQXNDLGlCQUFFSSxVQUFGLENBQWFKLFVBQVUsQ0FBVixFQUFhRCxXQUExQixDQUExQyxFQUFrRjtBQUNoRixRQUFJTSxPQUFPLGlCQUFFQyxPQUFGLENBQVVOLFNBQVYsQ0FBWDtBQUNBLFFBQUlPLE9BQU8saUJBQUVDLEtBQUYsQ0FBUUgsSUFBUixDQUFYO0FBQ0FBLFdBQU9BLEtBQUtJLEtBQUwsQ0FBVyxDQUFYLENBQVA7O0FBRUE7QUFDQSxRQUFJQyxZQUFZTCxLQUFLLENBQUwsQ0FBWixDQUFKLEVBQTBCO0FBQ3hCQSxXQUFLLENBQUwsSUFBVSxtQkFBUU0sU0FBUixDQUFrQk4sS0FBSyxDQUFMLENBQWxCLENBQVY7QUFDRDs7QUFF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J2xvZGFzaCc7XG5pbXBvcnQgUHJvbWlzZSBmcm9tICdibHVlYmlyZCc7XG5pbXBvcnQgTW9kZWwgZnJvbSAnLi9tb2RlbC9Nb2RlbCc7XG5pbXBvcnQge2lzU3ViY2xhc3NPZn0gZnJvbSAnLi91dGlscy9jbGFzc1V0aWxzJztcblxuLyoqXG4gKiBAcmV0dXJucyB7UHJvbWlzZX1cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdHJhbnNhY3Rpb24oKSB7XG4gIC8vIFRoZXJlIG11c3QgYmUgYXQgbGVhc3Qgb25lIG1vZGVsIGNsYXNzIGFuZCB0aGUgY2FsbGJhY2suXG4gIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikge1xuICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoJ29iamVjdGlvbi50cmFuc2FjdGlvbjogcHJvdmlkZSBhdCBsZWFzdCBvbmUgTW9kZWwgY2xhc3MgdG8gYmluZCB0byB0aGUgdHJhbnNhY3Rpb24gb3IgYSBrbmV4IGluc3RhbmNlJykpO1xuICB9XG5cbiAgaWYgKCFpc1N1YmNsYXNzT2YoYXJndW1lbnRzWzBdLCBNb2RlbCkgJiYgXy5pc0Z1bmN0aW9uKGFyZ3VtZW50c1swXS50cmFuc2FjdGlvbikpIHtcbiAgICBsZXQgYXJncyA9IF8udG9BcnJheShhcmd1bWVudHMpO1xuICAgIGxldCBrbmV4ID0gXy5maXJzdChhcmdzKTtcbiAgICBhcmdzID0gYXJncy5zbGljZSgxKTtcblxuICAgIC8vIElmIHRoZSBmdW5jdGlvbiBpcyBhIGdlbmVyYXRvciwgd3JhcCBpdCB1c2luZyBQcm9taXNlLmNvcm91dGluZS5cbiAgICBpZiAoaXNHZW5lcmF0b3IoYXJnc1swXSkpIHtcbiAgICAgIGFyZ3NbMF0gPSBQcm9taXNlLmNvcm91dGluZShhcmdzWzBdKTtcbiAgICB9XG5cbiAgICByZXR1cm4ga25leC50cmFuc2FjdGlvbi5hcHBseShrbmV4LCBhcmdzKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBUaGUgbGFzdCBhcmd1bWVudCBzaG91bGQgYmUgdGhlIGNhbGxiYWNrIGFuZCBhbGwgb3RoZXIgTW9kZWwgc3ViY2xhc3Nlcy5cbiAgICBsZXQgY2FsbGJhY2sgPSBfLmxhc3QoYXJndW1lbnRzKTtcbiAgICBsZXQgbW9kZWxDbGFzc2VzID0gXy50YWtlKGFyZ3VtZW50cywgYXJndW1lbnRzLmxlbmd0aCAtIDEpO1xuICAgIGxldCBpO1xuXG4gICAgZm9yIChpID0gMDsgaSA8IG1vZGVsQ2xhc3Nlcy5sZW5ndGg7ICsraSkge1xuICAgICAgaWYgKCFpc1N1YmNsYXNzT2YobW9kZWxDbGFzc2VzW2ldLCBNb2RlbCkpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcignb2JqZWN0aW9uLnRyYW5zYWN0aW9uOiBhbGwgYnV0IHRoZSBsYXN0IGFyZ3VtZW50IHNob3VsZCBiZSBNb2RlbCBzdWJjbGFzc2VzJykpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBrbmV4ID0gXy5maXJzdChtb2RlbENsYXNzZXMpLmtuZXgoKTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgbW9kZWxDbGFzc2VzLmxlbmd0aDsgKytpKSB7XG4gICAgICBpZiAobW9kZWxDbGFzc2VzW2ldLmtuZXgoKSAhPT0ga25leCkge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCdvYmplY3Rpb24udHJhbnNhY3Rpb246IGFsbCBNb2RlbCBzdWJjbGFzc2VzIG11c3QgYmUgYm91bmQgdG8gdGhlIHNhbWUgZGF0YWJhc2UnKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlIGZ1bmN0aW9uIGlzIGEgZ2VuZXJhdG9yLCB3cmFwIGl0IHVzaW5nIFByb21pc2UuY29yb3V0aW5lLlxuICAgIGlmIChpc0dlbmVyYXRvcihjYWxsYmFjaykpIHtcbiAgICAgIGNhbGxiYWNrID0gUHJvbWlzZS5jb3JvdXRpbmUoY2FsbGJhY2spO1xuICAgIH1cblxuICAgIHJldHVybiBrbmV4LnRyYW5zYWN0aW9uKHRyeCA9PiB7XG4gICAgICBsZXQgYXJncyA9IG5ldyBBcnJheShtb2RlbENsYXNzZXMubGVuZ3RoICsgMSk7XG5cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbW9kZWxDbGFzc2VzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGFyZ3NbaV0gPSBtb2RlbENsYXNzZXNbaV0uYmluZFRyYW5zYWN0aW9uKHRyeCk7XG4gICAgICB9XG5cbiAgICAgIGFyZ3NbYXJncy5sZW5ndGggLSAxXSA9IHRyeDtcblxuICAgICAgcmV0dXJuIFByb21pc2UudHJ5KCgpID0+IHtcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrLmFwcGx5KHRyeCwgYXJncyk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIEBwYXJhbSB7Q29uc3RydWN0b3IuPE1vZGVsPnxrbmV4fSBtb2RlbENsYXNzT3JLbmV4XG4gKiBAcmV0dXJucyB7UHJvbWlzZX1cbiAqL1xudHJhbnNhY3Rpb24uc3RhcnQgPSBmdW5jdGlvbiAobW9kZWxDbGFzc09yS25leCkge1xuICBsZXQga25leCA9IG1vZGVsQ2xhc3NPcktuZXg7XG5cbiAgaWYgKGlzU3ViY2xhc3NPZihtb2RlbENsYXNzT3JLbmV4LCBNb2RlbCkpIHtcbiAgICBrbmV4ID0gbW9kZWxDbGFzc09yS25leC5rbmV4KCk7XG4gIH1cblxuICBpZiAoIV8uaXNGdW5jdGlvbihrbmV4LnRyYW5zYWN0aW9uKSkge1xuICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoJ29iamVjdGlvbi50cmFuc2FjdGlvbi5zdGFydDogZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIG1vZGVsIGNsYXNzIG9yIGEga25leCBpbnN0YW5jZScpKTtcbiAgfVxuXG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAga25leC50cmFuc2FjdGlvbih0cnggPT4ge1xuICAgICAgcmVzb2x2ZSh0cngpO1xuICAgIH0pLmNhdGNoKGVyciA9PiB7XG4gICAgICByZWplY3QoZXJyKTtcbiAgICB9KTtcbiAgfSk7XG59O1xuXG5mdW5jdGlvbiBpc0dlbmVyYXRvcihmbikge1xuICByZXR1cm4gZm4gJiYgZm4uY29uc3RydWN0b3IgJiYgZm4uY29uc3RydWN0b3IubmFtZSA9PT0gJ0dlbmVyYXRvckZ1bmN0aW9uJztcbn1cbiJdfQ==