objection
Version:
An SQL-friendly ORM for Node.js
159 lines (121 loc) • 14.9 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = undefined;
var _toConsumableArray2 = require('babel-runtime/helpers/toConsumableArray');
var _toConsumableArray3 = _interopRequireDefault(_toConsumableArray2);
var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');
var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn');
var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);
var _inherits2 = require('babel-runtime/helpers/inherits');
var _inherits3 = _interopRequireDefault(_inherits2);
var _QueryBuilderOperation = require('./QueryBuilderOperation');
var _QueryBuilderOperation2 = _interopRequireDefault(_QueryBuilderOperation);
var _dbUtils = require('../../utils/dbUtils');
var _ReferenceBuilder = require('../ReferenceBuilder');
var _ReferenceBuilder2 = _interopRequireDefault(_ReferenceBuilder);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var QueryBuilderBase = null;
var JoinBuilder = null;
var WrappingQueryBuilderOperation = function (_QueryBuilderOperatio) {
(0, _inherits3.default)(WrappingQueryBuilderOperation, _QueryBuilderOperatio);
function WrappingQueryBuilderOperation(name, opt) {
(0, _classCallCheck3.default)(this, WrappingQueryBuilderOperation);
var _this = (0, _possibleConstructorReturn3.default)(this, _QueryBuilderOperatio.call(this, name, opt));
_this.args = null;
return _this;
}
WrappingQueryBuilderOperation.prototype.call = function call(builder, args) {
var ret = wrapArgs(this, builder, args);
this.args = args;
return ret;
};
return WrappingQueryBuilderOperation;
}(_QueryBuilderOperation2.default);
exports.default = WrappingQueryBuilderOperation;
function wrapArgs(op, builder, args) {
// Preventing cyclic deps
QueryBuilderBase = QueryBuilderBase || requireQueryBuilderBase();
var skipUndefined = builder.shouldSkipUndefined();
var knex = builder.knex();
for (var i = 0, l = args.length; i < l; ++i) {
var arg = args[i];
if (arg === undefined) {
if (skipUndefined) {
return false;
} else {
throw new Error('undefined passed as argument #' + l + ' for \'' + op.name + '\' operation. Call skipUndefined() method to ignore the undefined values.');
}
} else if (arg instanceof _ReferenceBuilder2.default) {
args[i] = knex.raw.apply(knex, (0, _toConsumableArray3.default)(args[i].toRawArgs()));
} else if (arg instanceof QueryBuilderBase) {
// Convert QueryBuilderBase instances into knex query builders.
args[i] = arg.build();
} else if (Array.isArray(arg)) {
if (skipUndefined) {
args[i] = withoutUndefined(arg);
} else if (includesUndefined(arg)) {
throw new Error('undefined passed as an item in argument #' + l + ' for \'' + op.name + '\' operation. Call skipUndefined() method to ignore the undefined values.');
}
// convert reference builders to knex.raw
args[i] = args[i].map(function (arg) {
return arg instanceof _ReferenceBuilder2.default ? knex.raw.apply(knex, (0, _toConsumableArray3.default)(arg.toRawArgs())) : arg;
});
} else if (typeof arg === 'function') {
// If an argument is a function, knex calls it with a query builder as
// first argument (and as `this` context). We wrap the query builder into
// a QueryBuilderBase instance.
args[i] = wrapFunctionArg(arg, knex);
}
}
return true;
}
function wrapFunctionArg(func, knex) {
// Preventing cyclic deps
QueryBuilderBase = QueryBuilderBase || requireQueryBuilderBase();
JoinBuilder = JoinBuilder || requireJoinBuilder();
return function wrappedKnexFunctionArg() {
if ((0, _dbUtils.isKnexQueryBuilder)(this)) {
var knexQueryBuilder = this;
// Wrap knex query builder into a QueryBuilderBase so that we can use
// our extended query builder in nested queries.
var wrappedQueryBuilder = new QueryBuilderBase(knex);
func.call(wrappedQueryBuilder, wrappedQueryBuilder);
wrappedQueryBuilder.buildInto(knexQueryBuilder);
} else if ((0, _dbUtils.isKnexJoinBuilder)(this)) {
var _knexQueryBuilder = this;
var joinClauseBuilder = new JoinBuilder(knex);
func.call(joinClauseBuilder, joinClauseBuilder);
joinClauseBuilder.buildInto(_knexQueryBuilder);
} else {
// maybe someone falls here to the original knex implementation
return func.apply(this, arguments);
}
};
}
function withoutUndefined(arr) {
var out = [];
for (var i = 0, l = arr.length; i < l; ++i) {
if (arr[i] !== undefined) {
out.push(arr[i]);
}
}
return out;
}
function includesUndefined(arr) {
for (var i = 0, l = arr.length; i < l; ++i) {
if (arr[i] === undefined) {
return true;
}
}
return false;
}
function requireQueryBuilderBase() {
return require('../QueryBuilderBase').default;
}
function requireJoinBuilder() {
return require('../JoinBuilder').default;
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIldyYXBwaW5nUXVlcnlCdWlsZGVyT3BlcmF0aW9uLmpzIl0sIm5hbWVzIjpbIlF1ZXJ5QnVpbGRlckJhc2UiLCJKb2luQnVpbGRlciIsIldyYXBwaW5nUXVlcnlCdWlsZGVyT3BlcmF0aW9uIiwibmFtZSIsIm9wdCIsImFyZ3MiLCJjYWxsIiwiYnVpbGRlciIsInJldCIsIndyYXBBcmdzIiwib3AiLCJyZXF1aXJlUXVlcnlCdWlsZGVyQmFzZSIsInNraXBVbmRlZmluZWQiLCJzaG91bGRTa2lwVW5kZWZpbmVkIiwia25leCIsImkiLCJsIiwibGVuZ3RoIiwiYXJnIiwidW5kZWZpbmVkIiwiRXJyb3IiLCJyYXciLCJ0b1Jhd0FyZ3MiLCJidWlsZCIsIkFycmF5IiwiaXNBcnJheSIsIndpdGhvdXRVbmRlZmluZWQiLCJpbmNsdWRlc1VuZGVmaW5lZCIsIm1hcCIsIndyYXBGdW5jdGlvbkFyZyIsImZ1bmMiLCJyZXF1aXJlSm9pbkJ1aWxkZXIiLCJ3cmFwcGVkS25leEZ1bmN0aW9uQXJnIiwia25leFF1ZXJ5QnVpbGRlciIsIndyYXBwZWRRdWVyeUJ1aWxkZXIiLCJidWlsZEludG8iLCJqb2luQ2xhdXNlQnVpbGRlciIsImFwcGx5IiwiYXJndW1lbnRzIiwiYXJyIiwib3V0IiwicHVzaCIsInJlcXVpcmUiLCJkZWZhdWx0Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOzs7O0FBQ0E7O0FBQ0E7Ozs7OztBQUVBLElBQUlBLG1CQUFtQixJQUF2QjtBQUNBLElBQUlDLGNBQWMsSUFBbEI7O0lBRXFCQyw2Qjs7O0FBRW5CLHlDQUFZQyxJQUFaLEVBQWtCQyxHQUFsQixFQUF1QjtBQUFBOztBQUFBLCtEQUNyQixpQ0FBTUQsSUFBTixFQUFZQyxHQUFaLENBRHFCOztBQUVyQixVQUFLQyxJQUFMLEdBQVksSUFBWjtBQUZxQjtBQUd0Qjs7MENBRURDLEksaUJBQUtDLE8sRUFBU0YsSSxFQUFNO0FBQ2xCLFFBQU1HLE1BQU1DLFNBQVMsSUFB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QUE1QjtBQUVELEtBTk0sTUFNQTtBQUNMO0FBQ0EsYUFBT0gsS0FBS08sS0FBTCxDQUFXLElBQVgsRUFBaUJDLFNBQWpCLENBQVA7QUFDRDtBQUNGLEdBbkJEO0FBb0JEOztBQUVELFNBQVNaLGdCQUFULENBQTBCYSxHQUExQixFQUErQjtBQUM3QixNQUFNQyxNQUFNLEVBQVo7O0FBRUEsT0FBSyxJQUFJekIsSUFBSSxDQUFSLEVBQVdDLElBQUl1QixJQUFJdEIsTUFBeEIsRUFBZ0NGLElBQUlDLENBQXBDLEVBQXVDLEVBQUVELENBQXpDLEVBQTRDO0FBQzFDLFFBQUl3QixJQUFJeEIsQ0FBSixNQUFXSSxTQUFmLEVBQTBCO0FBQ3hCcUIsVUFBSUMsSUFBSixDQUFTRixJQUFJeEIsQ0FBSixDQUFUO0FBQ0Q7QUFDRjs7QUFFRCxTQUFPeUIsR0FBUDtBQUNEOztBQUVELFNBQVNiLGlCQUFULENBQTJCWSxHQUEzQixFQUFnQztBQUM5QixPQUFLLElBQUl4QixJQUFJLENBQVIsRUFBV0MsSUFBSXVCLElBQUl0QixNQUF4QixFQUFnQ0YsSUFBSUMsQ0FBcEMsRUFBdUMsRUFBRUQsQ0FBekMsRUFBNEM7QUFDMUMsUUFBSXdCLElBQUl4QixDQUFKLE1BQVdJLFNBQWYsRUFBMEI7QUFDeEIsYUFBTyxJQUFQO0FBQ0Q7QUFDRjs7QUFFRCxTQUFPLEtBQVA7QUFDRDs7QUFFRCxTQUFTUix1QkFBVCxHQUFtQztBQUNqQyxTQUFPK0IsUUFBUSxxQkFBUixFQUErQkMsT0FBdEM7QUFDRDs7QUFFRCxTQUFTWixrQkFBVCxHQUE4QjtBQUM1QixTQUFPVyxRQUFRLGdCQUFSLEVBQTBCQyxPQUFqQztBQUNEIiwiZmlsZSI6IldyYXBwaW5nUXVlcnlCdWlsZGVyT3BlcmF0aW9uLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFF1ZXJ5QnVpbGRlck9wZXJhdGlvbiBmcm9tICcuL1F1ZXJ5QnVpbGRlck9wZXJhdGlvbic7XG5pbXBvcnQge2lzS25leFF1ZXJ5QnVpbGRlciwgaXNLbmV4Sm9pbkJ1aWxkZXJ9IGZyb20gJy4uLy4uL3V0aWxzL2RiVXRpbHMnO1xuaW1wb3J0IFJlZmVyZW5jZUJ1aWxkZXIgZnJvbSAnLi4vUmVmZXJlbmNlQnVpbGRlcic7XG5cbmxldCBRdWVyeUJ1aWxkZXJCYXNlID0gbnVsbDtcbmxldCBKb2luQnVpbGRlciA9IG51bGw7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFdyYXBwaW5nUXVlcnlCdWlsZGVyT3BlcmF0aW9uIGV4dGVuZHMgUXVlcnlCdWlsZGVyT3BlcmF0aW9uIHtcblxuICBjb25zdHJ1Y3RvcihuYW1lLCBvcHQpIHtcbiAgICBzdXBlcihuYW1lLCBvcHQpO1xuICAgIHRoaXMuYXJncyA9IG51bGw7XG4gIH1cblxuICBjYWxsKGJ1aWxkZXIsIGFyZ3MpIHtcbiAgICBjb25zdCByZXQgPSB3cmFwQXJncyh0aGlzLCBidWlsZGVyLCBhcmdzKTtcbiAgICB0aGlzLmFyZ3MgPSBhcmdzO1xuICAgIHJldHVybiByZXQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gd3JhcEFyZ3Mob3AsIGJ1aWxkZXIsIGFyZ3MpIHtcbiAgLy8gUHJldmVudGluZyBjeWNsaWMgZGVwc1xuICBRdWVyeUJ1aWxkZXJCYXNlID0gUXVlcnlCdWlsZGVyQmFzZSB8fCByZXF1aXJlUXVlcnlCdWlsZGVyQmFzZSgpO1xuXG4gIGNvbnN0IHNraXBVbmRlZmluZWQgPSBidWlsZGVyLnNob3VsZFNraXBVbmRlZmluZWQoKTtcbiAgY29uc3Qga25leCA9IGJ1aWxkZXIua25leCgpO1xuXG4gIGZvciAobGV0IGkgPSAwLCBsID0gYXJncy5sZW5ndGg7IGkgPCBsOyArK2kpIHtcbiAgICBjb25zdCBhcmcgPSBhcmdzW2ldO1xuXG4gICAgaWYgKGFyZyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoc2tpcFVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHVuZGVmaW5lZCBwYXNzZWQgYXMgYXJndW1lbnQgIyR7bH0gZm9yICcke29wLm5hbWV9JyBvcGVyYXRpb24uIENhbGwgc2tpcFVuZGVmaW5lZCgpIG1ldGhvZCB0byBpZ25vcmUgdGhlIHVuZGVmaW5lZCB2YWx1ZXMuYCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChhcmcgaW5zdGFuY2VvZiBSZWZlcmVuY2VCdWlsZGVyKSB7XG4gICAgICBhcmdzW2ldID0ga25leC5yYXcoLi4uYXJnc1tpXS50b1Jhd0FyZ3MoKSk7XG4gICAgfSBlbHNlIGlmIChhcmcgaW5zdGFuY2VvZiBRdWVyeUJ1aWxkZXJCYXNlKSB7XG4gICAgICAvLyBDb252ZXJ0IFF1ZXJ5QnVpbGRlckJhc2UgaW5zdGFuY2VzIGludG8ga25leCBxdWVyeSBidWlsZGVycy5cbiAgICAgIGFyZ3NbaV0gPSBhcmcuYnVpbGQoKTtcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoYXJnKSkge1xuICAgICAgaWYgKHNraXBVbmRlZmluZWQpIHtcbiAgICAgICAgYXJnc1tpXSA9IHdpdGhvdXRVbmRlZmluZWQoYXJnKTtcbiAgICAgIH0gZWxzZSBpZiAoaW5jbHVkZXNVbmRlZmluZWQoYXJnKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHVuZGVmaW5lZCBwYXNzZWQgYXMgYW4gaXRlbSBpbiBhcmd1bWVudCAjJHtsfSBmb3IgJyR7b3AubmFtZX0nIG9wZXJhdGlvbi4gQ2FsbCBza2lwVW5kZWZpbmVkKCkgbWV0aG9kIHRvIGlnbm9yZSB0aGUgdW5kZWZpbmVkIHZhbHVlcy5gKTtcbiAgICAgIH1cbiAgICAgIC8vIGNvbnZlcnQgcmVmZXJlbmNlIGJ1aWxkZXJzIHRvIGtuZXgucmF3XG4gICAgICBhcmdzW2ldID0gYXJnc1tpXS5tYXAoYXJnID0+IHtcbiAgICAgICAgcmV0dXJuIGFyZyBpbnN0YW5jZW9mIFJlZmVyZW5jZUJ1aWxkZXIgPyBrbmV4LnJhdyguLi5hcmcudG9SYXdBcmdzKCkpIDogYXJnO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgYXJnID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAvLyBJZiBhbiBhcmd1bWVudCBpcyBhIGZ1bmN0aW9uLCBrbmV4IGNhbGxzIGl0IHdpdGggYSBxdWVyeSBidWlsZGVyIGFzXG4gICAgICAvLyBmaXJzdCBhcmd1bWVudCAoYW5kIGFzIGB0aGlzYCBjb250ZXh0KS4gV2Ugd3JhcCB0aGUgcXVlcnkgYnVpbGRlciBpbnRvXG4gICAgICAvLyBhIFF1ZXJ5QnVpbGRlckJhc2UgaW5zdGFuY2UuXG4gICAgICBhcmdzW2ldID0gd3JhcEZ1bmN0aW9uQXJnKGFyZywga25leCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIHdyYXBGdW5jdGlvbkFyZyhmdW5jLCBrbmV4KSB7XG4gIC8vIFByZXZlbnRpbmcgY3ljbGljIGRlcHNcbiAgUXVlcnlCdWlsZGVyQmFzZSA9IFF1ZXJ5QnVpbGRlckJhc2UgfHwgcmVxdWlyZVF1ZXJ5QnVpbGRlckJhc2UoKTtcbiAgSm9pbkJ1aWxkZXIgPSBKb2luQnVpbGRlciB8fCByZXF1aXJlSm9pbkJ1aWxkZXIoKTtcblxuICByZXR1cm4gZnVuY3Rpb24gd3JhcHBlZEtuZXhGdW5jdGlvbkFyZygpIHtcbiAgICBpZiAoaXNLbmV4UXVlcnlCdWlsZGVyKHRoaXMpKSB7XG4gICAgICBjb25zdCBrbmV4UXVlcnlCdWlsZGVyID0gdGhpcztcbiAgICAgIC8vIFdyYXAga25leCBxdWVyeSBidWlsZGVyIGludG8gYSBRdWVyeUJ1aWxkZXJCYXNlIHNvIHRoYXQgd2UgY2FuIHVzZVxuICAgICAgLy8gb3VyIGV4dGVuZGVkIHF1ZXJ5IGJ1aWxkZXIgaW4gbmVzdGVkIHF1ZXJpZXMuXG4gICAgICBjb25zdCB3cmFwcGVkUXVlcnlCdWlsZGVyID0gbmV3IFF1ZXJ5QnVpbGRlckJhc2Uoa25leCk7XG4gICAgICBmdW5jLmNhbGwod3JhcHBlZFF1ZXJ5QnVpbGRlciwgd3JhcHBlZFF1ZXJ5QnVpbGRlcik7XG4gICAgICB3cmFwcGVkUXVlcnlCdWlsZGVyLmJ1aWxkSW50byhrbmV4UXVlcnlCdWlsZGVyKTtcblxuICAgIH0gZWxzZSBpZiAoaXNLbmV4Sm9pbkJ1aWxkZXIodGhpcykpIHtcbiAgICAgIGNvbnN0IGtuZXhRdWVyeUJ1aWxkZXIgPSB0aGlzO1xuICAgICAgY29uc3Qgam9pbkNsYXVzZUJ1aWxkZXIgPSBuZXcgSm9pbkJ1aWxkZXIoa25leCk7XG4gICAgICBmdW5jLmNhbGwoam9pbkNsYXVzZUJ1aWxkZXIsIGpvaW5DbGF1c2VCdWlsZGVyKTtcbiAgICAgIGpvaW5DbGF1c2VCdWlsZGVyLmJ1aWxkSW50byhrbmV4UXVlcnlCdWlsZGVyKTtcblxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBtYXliZSBzb21lb25lIGZhbGxzIGhlcmUgdG8gdGhlIG9yaWdpbmFsIGtuZXggaW1wbGVtZW50YXRpb25cbiAgICAgIHJldHVybiBmdW5jLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfVxuICB9O1xufVxuXG5mdW5jdGlvbiB3aXRob3V0VW5kZWZpbmVkKGFycikge1xuICBjb25zdCBvdXQgPSBbXTtcblxuICBmb3IgKGxldCBpID0gMCwgbCA9IGFyci5sZW5ndGg7IGkgPCBsOyArK2kpIHtcbiAgICBpZiAoYXJyW2ldICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG91dC5wdXNoKGFycltpXSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG91dDtcbn1cblxuZnVuY3Rpb24gaW5jbHVkZXNVbmRlZmluZWQoYXJyKSB7XG4gIGZvciAobGV0IGkgPSAwLCBsID0gYXJyLmxlbmd0aDsgaSA8IGw7ICsraSkge1xuICAgIGlmIChhcnJbaV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiByZXF1aXJlUXVlcnlCdWlsZGVyQmFzZSgpIHtcbiAgcmV0dXJuIHJlcXVpcmUoJy4uL1F1ZXJ5QnVpbGRlckJhc2UnKS5kZWZhdWx0O1xufVxuXG5mdW5jdGlvbiByZXF1aXJlSm9pbkJ1aWxkZXIoKSB7XG4gIHJldHVybiByZXF1aXJlKCcuLi9Kb2luQnVpbGRlcicpLmRlZmF1bHQ7XG59XG4iXX0=