UNPKG

objection

Version:
193 lines (145 loc) 16 kB
'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==