objection
Version:
An SQL-friendly ORM for Node.js
193 lines (145 loc) • 16 kB
JavaScript
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _map = require('babel-runtime/core-js/map');
var _map2 = _interopRequireDefault(_map);
var _keys = require('babel-runtime/core-js/object/keys');
var _keys2 = _interopRequireDefault(_keys);
exports.fromJson = fromJson;
exports.toDatabaseJson = toDatabaseJson;
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var KnexQueryBuilder = require('knex/lib/query/builder');
var KnexRaw = require('knex/lib/raw');
var QueryBuilderBase = null;
var ReferenceBuilder = null;
function fromJson(_ref) {
var modelClass = _ref.modelClass,
json = _ref.json,
deep = _ref.deep,
modelOptions = _ref.modelOptions;
lazyLoadDeps();
if (deep) {
return fromJsonDeep(json, modelClass, modelOptions);
} else {
return fromJsonShallow(json, modelClass, modelOptions);
}
}
function toDatabaseJson(_ref2) {
var model = _ref2.model,
queryProps = _ref2.queryProps;
var json = model.$toDatabaseJson();
var modelClass = model.constructor;
if (queryProps) {
var query = queryProps.get(model);
if (query) {
var keys = (0, _keys2.default)(query);
for (var i = 0, l = keys.length; i < l; ++i) {
var key = keys[i];
var queryProp = query[key];
if (queryProp instanceof QueryBuilderBase) {
queryProp = queryProp.build();
}
json[modelClass.propertyNameToColumnName(key)] = queryProp;
}
}
}
return json;
}
function fromJsonDeep(obj, modelClass, modelOptions) {
var queryProps = new _map2.default();
var ctx = {
modelOptions: modelOptions,
queryProps: queryProps
};
var model = splitDeep(obj, modelClass, ctx);
return {
model: model,
queryProps: queryProps
};
}
function fromJsonShallow(obj, modelClass, modelOptions) {
var queryProps = new _map2.default();
var model = void 0;
if (Array.isArray(obj)) {
model = obj.map(function (obj) {
return doSplit(obj, modelClass, queryProps, modelOptions);
});
} else {
model = doSplit(obj, modelClass, queryProps, modelOptions);
}
return {
model: model,
queryProps: queryProps
};
}
function splitDeep(objs, modelClass, ctx) {
if (Array.isArray(objs)) {
return splitDeepMany(objs, modelClass, ctx);
} else if (objs) {
return splitDeepOne(objs, modelClass, ctx);
}
}
function splitDeepMany(objs, modelClass, ctx) {
var models = new Array(objs.length);
for (var i = 0, l = objs.length; i < l; ++i) {
models[i] = splitDeepOne(objs[i], modelClass, ctx);
}
return models;
}
function splitDeepOne(obj, modelClass, ctx) {
var relations = modelClass.getRelationArray();
var model = doSplit(obj, modelClass, ctx.queryProps, ctx.modelOptions);
for (var i = 0, l = relations.length; i < l; ++i) {
var relation = relations[i];
var relatedObjs = obj[relation.name];
var relatedModelClass = relation.relatedModelClass;
if (relatedObjs) {
model[relation.name] = splitDeep(relatedObjs, relatedModelClass, ctx);
} else {
if (relatedObjs !== undefined) {
model[relation.name] = relatedObjs;
}
}
}
return model;
}
function doSplit(obj, modelClass, queryProps, modelOpt) {
var query = {};
var model = {};
var keys = (0, _keys2.default)(obj);
var relations = modelClass.getRelations();
var hasQueries = false;
for (var i = 0, l = keys.length; i < l; ++i) {
var key = keys[i];
var value = obj[key];
if (relations[key]) {
continue;
}
if (isQueryProp(value)) {
hasQueries = true;
query[key] = value;
} else {
model[key] = value;
}
}
model = modelClass.fromJson(model, modelOpt);
if (hasQueries) {
queryProps.set(model, query);
}
return model;
}
function isQueryProp(value) {
return value instanceof KnexQueryBuilder || value instanceof QueryBuilderBase || value instanceof KnexRaw || value instanceof ReferenceBuilder;
}
function lazyLoadDeps() {
QueryBuilderBase = QueryBuilderBase || requireQueryBuilderBase();
ReferenceBuilder = ReferenceBuilder || requireReferenceBuilder();
}
function requireQueryBuilderBase() {
return require('../queryBuilder/QueryBuilderBase').default;
}
function requireReferenceBuilder() {
return require('../queryBuilder/ReferenceBuilder').default;
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm1vZGVsRmFjdG9yeS5qcyJdLCJuYW1lcyI6WyJmcm9tSnNvbiIsInRvRGF0YWJhc2VKc29uIiwiS25leFF1ZXJ5QnVpbGRlciIsInJlcXVpcmUiLCJLbmV4UmF3IiwiUXVlcnlCdWlsZGVyQmFzZSIsIlJlZmVyZW5jZUJ1aWxkZXIiLCJtb2RlbENsYXNzIiwianNvbiIsImRlZXAiLCJtb2RlbE9wdGlvbnMiLCJsYXp5TG9hZERlcHMiLCJmcm9tSnNvbkRlZXAiLCJmcm9tSnNvblNoYWxsb3ciLCJtb2RlbCIsInF1ZXJ5UHJvcHMiLCIkdG9EYXRhYmFzZUpzb24iLCJjb25zdHJ1Y3RvciIsInF1ZXJ5IiwiZ2V0Iiwia2V5cyIsImkiLCJsIiwibGVuZ3RoIiwia2V5IiwicXVlcnlQcm9wIiwiYnVpbGQiLCJwcm9wZXJ0eU5hbWVUb0NvbHVtbk5hbWUiLCJvYmoiLCJjdHgiLCJzcGxpdERlZXAiLCJBcnJheSIsImlzQXJyYXkiLCJtYXAiLCJkb1NwbGl0Iiwib2JqcyIsInNwbGl0RGVlcE1hbnkiLCJzcGxpdERlZXBPbmUiLCJtb2RlbHMiLCJyZWxhdGlvbnMiLCJnZXRSZWxhdGlvbkFycmF5IiwicmVsYXRpb24iLCJyZWxhdGVkT2JqcyIsIm5hbWUiLCJyZWxhdGVkTW9kZWxDbGFzcyIsInVuZGVmaW5lZCIsIm1vZGVsT3B0IiwiZ2V0UmVsYXRpb25zIiwiaGFzUXVlcmllcyIsInZhbHVlIiwiaXNRdWVyeVByb3AiLCJzZXQiLCJyZXF1aXJlUXVlcnlCdWlsZGVyQmFzZSIsInJlcXVpcmVSZWZlcmVuY2VCdWlsZGVyIiwiZGVmYXVsdCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7UUFNZ0JBLFEsR0FBQUEsUTtRQVVBQyxjLEdBQUFBLGM7Ozs7QUFoQmhCLElBQU1DLG1CQUFtQkMsUUFBUSx3QkFBUixDQUF6QjtBQUNBLElBQU1DLFVBQVVELFFBQVEsY0FBUixDQUFoQjs7QUFFQSxJQUFJRSxtQkFBbUIsSUFBdkI7QUFDQSxJQUFJQyxtQkFBbUIsSUFB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QUN0Qk4scUJBQW1CQSxvQkFBb0IrQyx5QkFBdkM7QUFDQTlDLHFCQUFtQkEsb0JBQW9CK0MseUJBQXZDO0FBQ0Q7O0FBRUQsU0FBU0QsdUJBQVQsR0FBbUM7QUFDakMsU0FBT2pELFFBQVEsa0NBQVIsRUFBNENtRCxPQUFuRDtBQUNEOztBQUVELFNBQVNELHVCQUFULEdBQW1DO0FBQ2pDLFNBQU9sRCxRQUFRLGtDQUFSLEVBQTRDbUQsT0FBbkQ7QUFDRCIsImZpbGUiOiJtb2RlbEZhY3RvcnkuanMiLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBLbmV4UXVlcnlCdWlsZGVyID0gcmVxdWlyZSgna25leC9saWIvcXVlcnkvYnVpbGRlcicpO1xuY29uc3QgS25leFJhdyA9IHJlcXVpcmUoJ2tuZXgvbGliL3JhdycpO1xuXG5sZXQgUXVlcnlCdWlsZGVyQmFzZSA9IG51bGw7XG5sZXQgUmVmZXJlbmNlQnVpbGRlciA9IG51bGw7XG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tSnNvbih7bW9kZWxDbGFzcywganNvbiwgZGVlcCwgbW9kZWxPcHRpb25zfSkge1xuICBsYXp5TG9hZERlcHMoKTtcblxuICBpZiAoZGVlcCkge1xuICAgIHJldHVybiBmcm9tSnNvbkRlZXAoanNvbiwgbW9kZWxDbGFzcywgbW9kZWxPcHRpb25zKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZnJvbUpzb25TaGFsbG93KGpzb24sIG1vZGVsQ2xhc3MsIG1vZGVsT3B0aW9ucyk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRvRGF0YWJhc2VKc29uKHttb2RlbCwgcXVlcnlQcm9wc30pIHtcbiAgY29uc3QganNvbiA9IG1vZGVsLiR0b0RhdGFiYXNlSnNvbigpO1xuICBjb25zdCBtb2RlbENsYXNzID0gbW9kZWwuY29uc3RydWN0b3I7XG5cbiAgaWYgKHF1ZXJ5UHJvcHMpIHtcbiAgICBjb25zdCBxdWVyeSA9IHF1ZXJ5UHJvcHMuZ2V0KG1vZGVsKTtcblxuICAgIGlmIChxdWVyeSkge1xuICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHF1ZXJ5KTtcblxuICAgICAgZm9yIChsZXQgaSA9IDAsIGwgPSBrZXlzLmxlbmd0aDsgaSA8IGw7ICsraSkge1xuICAgICAgICBjb25zdCBrZXkgPSBrZXlzW2ldO1xuICAgICAgICBsZXQgcXVlcnlQcm9wID0gcXVlcnlba2V5XTtcblxuICAgICAgICBpZiAocXVlcnlQcm9wIGluc3RhbmNlb2YgUXVlcnlCdWlsZGVyQmFzZSkge1xuICAgICAgICAgIHF1ZXJ5UHJvcCA9IHF1ZXJ5UHJvcC5idWlsZCgpO1xuICAgICAgICB9XG5cbiAgICAgICAganNvblttb2RlbENsYXNzLnByb3BlcnR5TmFtZVRvQ29sdW1uTmFtZShrZXkpXSA9IHF1ZXJ5UHJvcDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4ganNvbjtcbn1cblxuZnVuY3Rpb24gZnJvbUpzb25EZWVwKG9iaiwgbW9kZWxDbGFzcywgbW9kZWxPcHRpb25zKSB7XG4gIGNvbnN0IHF1ZXJ5UHJvcHMgPSBuZXcgTWFwKCk7XG5cbiAgY29uc3QgY3R4ID0ge1xuICAgIG1vZGVsT3B0aW9ucyxcbiAgICBxdWVyeVByb3BzXG4gIH07XG5cbiAgY29uc3QgbW9kZWwgPSBzcGxpdERlZXAob2JqLCBtb2RlbENsYXNzLCBjdHgpO1xuXG4gIHJldHVybiB7XG4gICAgbW9kZWwsXG4gICAgcXVlcnlQcm9wc1xuICB9O1xufVxuXG5mdW5jdGlvbiBmcm9tSnNvblNoYWxsb3cob2JqLCBtb2RlbENsYXNzLCBtb2RlbE9wdGlvbnMpIHtcbiAgY29uc3QgcXVlcnlQcm9wcyA9IG5ldyBNYXAoKTtcblxuICBsZXQgbW9kZWw7XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkge1xuICAgIG1vZGVsID0gb2JqLm1hcChvYmogPT4gZG9TcGxpdChvYmosIG1vZGVsQ2xhc3MsIHF1ZXJ5UHJvcHMsIG1vZGVsT3B0aW9ucykpO1xuICB9IGVsc2Uge1xuICAgIG1vZGVsID0gZG9TcGxpdChvYmosIG1vZGVsQ2xhc3MsIHF1ZXJ5UHJvcHMsIG1vZGVsT3B0aW9ucyk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIG1vZGVsLFxuICAgIHF1ZXJ5UHJvcHNcbiAgfTtcbn1cblxuZnVuY3Rpb24gc3BsaXREZWVwKG9ianMsIG1vZGVsQ2xhc3MsIGN0eCkge1xuICBpZiAoQXJyYXkuaXNBcnJheShvYmpzKSkge1xuICAgIHJldHVybiBzcGxpdERlZXBNYW55KG9ianMsIG1vZGVsQ2xhc3MsIGN0eCk7XG4gIH0gZWxzZSBpZiAob2Jqcykge1xuICAgIHJldHVybiBzcGxpdERlZXBPbmUob2JqcywgbW9kZWxDbGFzcywgY3R4KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzcGxpdERlZXBNYW55KG9ianMsIG1vZGVsQ2xhc3MsIGN0eCkge1xuICBjb25zdCBtb2RlbHMgPSBuZXcgQXJyYXkob2Jqcy5sZW5ndGgpO1xuXG4gIGZvciAobGV0IGkgPSAwLCBsID0gb2Jqcy5sZW5ndGg7IGkgPCBsOyArK2kpIHtcbiAgICBtb2RlbHNbaV0gPSBzcGxpdERlZXBPbmUob2Jqc1tpXSwgbW9kZWxDbGFzcywgY3R4KTtcbiAgfVxuXG4gIHJldHVybiBtb2RlbHM7XG59XG5cbmZ1bmN0aW9uIHNwbGl0RGVlcE9uZShvYmosIG1vZGVsQ2xhc3MsIGN0eCkge1xuICBjb25zdCByZWxhdGlvbnMgPSBtb2RlbENsYXNzLmdldFJlbGF0aW9uQXJyYXkoKTtcbiAgY29uc3QgbW9kZWwgPSBkb1NwbGl0KG9iaiwgbW9kZWxDbGFzcywgY3R4LnF1ZXJ5UHJvcHMsIGN0eC5tb2RlbE9wdGlvbnMpO1xuXG4gIGZvciAobGV0IGkgPSAwLCBsID0gcmVsYXRpb25zLmxlbmd0aDsgaSA8IGw7ICsraSkge1xuICAgIGNvbnN0IHJlbGF0aW9uID0gcmVsYXRpb25zW2ldO1xuICAgIGNvbnN0IHJlbGF0ZWRPYmpzID0gb2JqW3JlbGF0aW9uLm5hbWVdO1xuICAgIGNvbnN0IHJlbGF0ZWRNb2RlbENsYXNzID0gcmVsYXRpb24ucmVsYXRlZE1vZGVsQ2xhc3M7XG5cbiAgICBpZiAocmVsYXRlZE9ianMpIHtcbiAgICAgIG1vZGVsW3JlbGF0aW9uLm5hbWVdID0gc3BsaXREZWVwKHJlbGF0ZWRPYmpzLCByZWxhdGVkTW9kZWxDbGFzcywgY3R4KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHJlbGF0ZWRPYmpzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbW9kZWxbcmVsYXRpb24ubmFtZV0gPSByZWxhdGVkT2JqcztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbW9kZWw7XG59XG5cbmZ1bmN0aW9uIGRvU3BsaXQob2JqLCBtb2RlbENsYXNzLCBxdWVyeVByb3BzLCBtb2RlbE9wdCkge1xuICBsZXQgcXVlcnkgPSB7fTtcbiAgbGV0IG1vZGVsID0ge307XG5cbiAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKG9iaik7XG4gIGNvbnN0IHJlbGF0aW9ucyA9IG1vZGVsQ2xhc3MuZ2V0UmVsYXRpb25zKCk7XG4gIGxldCBoYXNRdWVyaWVzID0gZmFsc2U7XG5cbiAgZm9yIChsZXQgaSA9IDAsIGwgPSBrZXlzLmxlbmd0aDsgaSA8IGw7ICsraSkge1xuICAgIGNvbnN0IGtleSA9IGtleXNbaV07XG4gICAgY29uc3QgdmFsdWUgPSBvYmpba2V5XTtcblxuICAgIGlmIChyZWxhdGlvbnNba2V5XSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKGlzUXVlcnlQcm9wKHZhbHVlKSkge1xuICAgICAgaGFzUXVlcmllcyA9IHRydWU7XG4gICAgICBxdWVyeVtrZXldID0gdmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIG1vZGVsW2tleV0gPSB2YWx1ZTtcbiAgICB9XG4gIH1cblxuICBtb2RlbCA9IG1vZGVsQ2xhc3MuZnJvbUpzb24obW9kZWwsIG1vZGVsT3B0KTtcblxuICBpZiAoaGFzUXVlcmllcykge1xuICAgIHF1ZXJ5UHJvcHMuc2V0KG1vZGVsLCBxdWVyeSk7XG4gIH1cblxuICByZXR1cm4gbW9kZWw7XG59XG5cbmZ1bmN0aW9uIGlzUXVlcnlQcm9wKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIEtuZXhRdWVyeUJ1aWxkZXJcbiAgICB8fCB2YWx1ZSBpbnN0YW5jZW9mIFF1ZXJ5QnVpbGRlckJhc2VcbiAgICB8fCB2YWx1ZSBpbnN0YW5jZW9mIEtuZXhSYXdcbiAgICB8fCB2YWx1ZSBpbnN0YW5jZW9mIFJlZmVyZW5jZUJ1aWxkZXI7XG59XG5cbmZ1bmN0aW9uIGxhenlMb2FkRGVwcygpIHtcbiAgUXVlcnlCdWlsZGVyQmFzZSA9IFF1ZXJ5QnVpbGRlckJhc2UgfHwgcmVxdWlyZVF1ZXJ5QnVpbGRlckJhc2UoKTtcbiAgUmVmZXJlbmNlQnVpbGRlciA9IFJlZmVyZW5jZUJ1aWxkZXIgfHwgcmVxdWlyZVJlZmVyZW5jZUJ1aWxkZXIoKTtcbn1cblxuZnVuY3Rpb24gcmVxdWlyZVF1ZXJ5QnVpbGRlckJhc2UoKSB7XG4gIHJldHVybiByZXF1aXJlKCcuLi9xdWVyeUJ1aWxkZXIvUXVlcnlCdWlsZGVyQmFzZScpLmRlZmF1bHQ7XG59XG5cbmZ1bmN0aW9uIHJlcXVpcmVSZWZlcmVuY2VCdWlsZGVyKCkge1xuICByZXR1cm4gcmVxdWlyZSgnLi4vcXVlcnlCdWlsZGVyL1JlZmVyZW5jZUJ1aWxkZXInKS5kZWZhdWx0O1xufSJdfQ==