@linaframework/arango-orm
Version:
> Please check out https://github.com/awesome-graphql-space/lina and https://github.com/oknoah/final/packages/arangolize for similar projects that MAY be more up to date
152 lines (118 loc) • 5.01 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
var _iterator = require('babel-runtime/core-js/symbol/iterator');
var _iterator2 = _interopRequireDefault(_iterator);
var _toConsumableArray2 = require('babel-runtime/helpers/toConsumableArray');
var _toConsumableArray3 = _interopRequireDefault(_toConsumableArray2);
var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');
var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
var _createClass2 = require('babel-runtime/helpers/createClass');
var _createClass3 = _interopRequireDefault(_createClass2);
var _model = require('../models/model');
var _model2 = _interopRequireDefault(_model);
var _fieldType = require('../fields/field-type');
var _fieldType2 = _interopRequireDefault(_fieldType);
var _fieldTypes = require('../fields/field-types');
var _fieldTypes2 = _interopRequireDefault(_fieldTypes);
var _fieldModel = require('../fields/field-model');
var _fieldModel2 = _interopRequireDefault(_fieldModel);
var _fieldModels = require('../fields/field-models');
var _fieldModels2 = _interopRequireDefault(_fieldModels);
var _fieldSchemas = require('../fields/field-schemas');
var _fieldSchemas2 = _interopRequireDefault(_fieldSchemas);
function _interopRequireDefault(obj) {
return obj && obj.__esModule ? obj : { default: obj };
}
var Schema = function () {
function Schema() {
var userSchema = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
var basePath = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
var isRootSchema = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
(0, _classCallCheck3.default)(this, Schema);
this.basePath = basePath;
this.fields = this.parseUserSchema(userSchema);
if (isRootSchema) {
this.fields.push(new _fieldType2.default(basePath, ['_id'], String, null, true));
this.fields.push(new _fieldType2.default(basePath, ['_key'], String, null, true));
this.fields.push(new _fieldType2.default(basePath, ['_rev'], String, null, true));
this.fields.push(new _fieldType2.default(basePath, ['_removed'], Boolean, null, true));
this.fields.push(new _fieldType2.default(basePath, ['createdAt'], String, null, true));
this.fields.push(new _fieldType2.default(basePath, ['updatedAt'], String, null, true));
}
}
(0, _createClass3.default)(Schema, [{
key: 'parseUserSchema',
value: function parseUserSchema(userSchema) {
var parentPath = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
var basePath = this.basePath;
var fields = [];
for (var key in userSchema) {
if (userSchema.hasOwnProperty(key)) {
var path = [].concat((0, _toConsumableArray3.default)(parentPath), [key]);
var value = userSchema[key];
if ('$type' in value) {
var options = value;
value = value.$type;
} else {
options = {};
}
if (typeof value === 'function') {
if (value.prototype instanceof _model2.default) {
fields.push(new _fieldModel2.default(basePath, path, value, options));
} else {
fields.push(new _fieldType2.default(basePath, path, value, options));
}
} else if (Array.isArray(value)) {
var firstItem = value[0];
if (typeof firstItem === 'function') {
if (firstItem.prototype instanceof _model2.default) {
fields.push(new _fieldModels2.default(basePath, path, firstItem, options));
} else {
fields.push(new _fieldTypes2.default(basePath, path, firstItem, options));
}
} else {
fields.push(new _fieldSchemas2.default(basePath, path, firstItem, options));
}
} else {
var subFields = this.parseUserSchema(value, path);
fields.push.apply(fields, (0, _toConsumableArray3.default)(subFields));
}
}
}
return fields;
}
}, {
key: 'validate',
value: function validate(data) {
var basePath = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
this.fields.forEach(function (field) {
return field.validate(data, basePath);
});
}
}, {
key: 'documentToModel',
value: function documentToModel(model, document) {
this.fields.forEach(function (field) {
field.documentToModel(model, document);
});
return model;
}
}, {
key: 'modelToDocument',
value: function modelToDocument(model, document) {
this.fields.forEach(function (field) {
field.modelToDocument(model, document);
});
return document;
}
}, {
key: _iterator2.default,
value: function value() {
return this.fields.values();
}
}]);
return Schema;
}();
exports.default = Schema;