baqend
Version:
Baqend JavaScript SDK
321 lines • 21.3 kB
JavaScript
"use strict";
var __extends = (this && this.__extends) || (function () {
var extendStatics = function (d, b) {
extendStatics = Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
return extendStatics(d, b);
};
return function (d, b) {
if (typeof b !== "function" && b !== null)
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
extendStatics(d, b);
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
})();
var __assign = (this && this.__assign) || function () {
__assign = Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.ManagedType = void 0;
var Type_1 = require("./Type");
var binding_1 = require("../binding");
var intersection_1 = require("../intersection");
var ManagedType = /** @class */ (function (_super) {
__extends(ManagedType, _super);
/**
* @param ref or full class name
* @param typeConstructor The type constructor of the managed lass
*/
function ManagedType(ref, typeConstructor) {
var _this = _super.call(this, ref.indexOf('/db/') !== 0 ? "/db/".concat(ref) : ref, typeConstructor) || this;
_this.enhancer = null;
_this.declaredAttributes = [];
_this.schemaAddPermission = new intersection_1.Permission();
_this.schemaReplacePermission = new intersection_1.Permission();
_this.metadata = null;
_this.superType = null;
_this._validationCode = null;
return _this;
}
Object.defineProperty(ManagedType.prototype, "validationCode", {
/**
* @type Function
*/
get: function () {
return this._validationCode;
},
/**
* @param code
*/
set: function (code) {
this._validationCode = code;
},
enumerable: false,
configurable: true
});
Object.defineProperty(ManagedType.prototype, "typeConstructor", {
/**
* The Managed class
*/
get: function () {
if (!this._typeConstructor) {
this.typeConstructor = this.createProxyClass();
}
return this._typeConstructor;
},
/**
* The Managed class constructor
* @param typeConstructor The managed class constructor
*/
set: function (typeConstructor) {
if (this._typeConstructor) {
throw new Error('Type constructor has already been set.');
}
var isEntity = typeConstructor.prototype instanceof binding_1.Entity;
if (this.isEntity) {
if (!isEntity) {
throw new TypeError('Entity classes must extends the Entity class.');
}
}
else if (!(typeConstructor.prototype instanceof binding_1.Managed) || isEntity) {
throw new TypeError('Embeddable classes must extends the Managed class.');
}
this.enhancer.enhance(this, typeConstructor);
this._typeConstructor = typeConstructor;
},
enumerable: false,
configurable: true
});
/**
* Initialize this type
* @param enhancer The class enhancer used to instantiate an instance of this managed class
*/
ManagedType.prototype.init = function (enhancer) {
this.enhancer = enhancer;
if (this._typeConstructor && !binding_1.Enhancer.getIdentifier(this._typeConstructor)) {
binding_1.Enhancer.setIdentifier(this._typeConstructor, this.ref);
}
};
/**
* Creates a new instance of the managed type, without invoking any constructors
*
* This method is used to create object instances which are loaded form the backend.
*
* @return The created instance
*/
ManagedType.prototype.create = function () {
var instance = Object.create(this.typeConstructor.prototype);
binding_1.Managed.init(instance);
return instance;
};
/**
* An iterator which returns all attributes declared by this type and inherited form all super types
* @return
*/
ManagedType.prototype.attributes = function () {
var _a;
var iter;
var index = 0;
var type = this;
if (this.superType) {
iter = this.superType.attributes();
}
return _a = {},
_a[Symbol.iterator] = function () {
return this;
},
_a.next = function () {
if (iter) {
var item = iter.next();
if (!item.done) {
return item;
}
iter = null;
}
if (index < type.declaredAttributes.length) {
var value = type.declaredAttributes[index];
index += 1;
return { value: value, done: false };
}
return { done: true, value: undefined };
},
_a;
};
/**
* Adds an attribute to this type
* @param attr The attribute to add
* @param order Position of the attribute
* @return
*/
ManagedType.prototype.addAttribute = function (attr, order) {
if (this.getAttribute(attr.name)) {
throw new Error("An attribute with the name ".concat(attr.name, " is already declared."));
}
var initOrder;
if (!attr.order) {
initOrder = typeof order === 'undefined' ? this.declaredAttributes.length : order;
}
else {
initOrder = attr.order;
}
attr.init(this, initOrder);
this.declaredAttributes.push(attr);
if (this._typeConstructor && this.name !== 'Object') {
this.enhancer.enhanceProperty(this._typeConstructor, attr);
}
};
/**
* Removes an attribute from this type
* @param name The Name of the attribute which will be removed
* @return
*/
ManagedType.prototype.removeAttribute = function (name) {
var length = this.declaredAttributes.length;
this.declaredAttributes = this.declaredAttributes.filter(function (val) { return val.name !== name; });
if (length === this.declaredAttributes.length) {
throw new Error("An Attribute with the name ".concat(name, " is not declared."));
}
};
/**
* @param name
* @return
*/
ManagedType.prototype.getAttribute = function (name) {
var attr = this.getDeclaredAttribute(name);
if (!attr && this.superType) {
attr = this.superType.getAttribute(name);
}
return attr;
};
/**
* @param val Name or order of the attribute
* @return
*/
ManagedType.prototype.getDeclaredAttribute = function (val) {
return this.declaredAttributes.filter(function (attr) { return attr.name === val || attr.order === val; })[0] || null;
};
/**
* @inheritDoc
*/
ManagedType.prototype.fromJsonValue = function (state, jsonObject, currentObject, options) {
if (!jsonObject || !currentObject) {
return null;
}
var iter = this.attributes();
for (var el = iter.next(); !el.done; el = iter.next()) {
var attribute = el.value;
if (!options.onlyMetadata || attribute.isMetadata) {
attribute.setJsonValue(state, currentObject, jsonObject[attribute.name], options);
}
}
return currentObject;
};
/**
* @inheritDoc
*/
ManagedType.prototype.toJsonValue = function (state, object, options) {
if (!(object instanceof this.typeConstructor)) {
return null;
}
var value = {};
var iter = this.attributes();
for (var el = iter.next(); !el.done; el = iter.next()) {
var attribute = el.value;
if (!options.excludeMetadata || !attribute.isMetadata) {
value[attribute.name] = attribute.getJsonValue(state, object, options);
}
}
return value;
};
/**
* Converts ths type schema to json
* @return
*/
ManagedType.prototype.toJSON = function () {
var fields = {};
this.declaredAttributes.forEach(function (attribute) {
if (!attribute.isMetadata) {
fields[attribute.name] = attribute;
}
});
return __assign(__assign(__assign({ class: this.ref, fields: fields, acl: {
schemaAdd: this.schemaAddPermission.toJSON(),
schemaReplace: this.schemaReplacePermission.toJSON(),
} }, (this.superType && { superClass: this.superType.ref })), (this.isEmbeddable && { embedded: true })), (this.metadata && { metadata: this.metadata }));
};
/**
* Returns iterator to get all referenced entities
* @return
*/
ManagedType.prototype.references = function () {
var _a;
var attributes = this.attributes();
var attribute;
var embeddedAttributes;
return _a = {},
_a[Symbol.iterator] = function () {
return this;
},
_a.next = function () {
for (;;) {
if (embeddedAttributes) {
var item_1 = embeddedAttributes.next();
if (!item_1.done) {
return { value: { path: [attribute.name].concat(item_1.value.path) } };
}
embeddedAttributes = null;
}
var item = attributes.next();
if (item.done) {
// currently TS requires a undefined value here https://github.com/microsoft/TypeScript/issues/38479
return { done: true, value: undefined };
}
attribute = item.value;
var type = attribute.isCollection
? attribute.elementType
: attribute.type;
if (type.isEntity) {
return { value: { path: [attribute.name] } };
}
if (type.isEmbeddable) {
embeddedAttributes = type.references();
}
}
},
_a;
};
/**
* Retrieves whether this type has specific metadata
*
* @param key
* @return
*/
ManagedType.prototype.hasMetadata = function (key) {
return !!this.metadata && !!this.metadata[key];
};
/**
* Gets some metadata of this type
*
* @param key
* @return
*/
ManagedType.prototype.getMetadata = function (key) {
if (!this.hasMetadata(key)) {
return null;
}
return this.metadata[key];
};
return ManagedType;
}(Type_1.Type));
exports.ManagedType = ManagedType;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWFuYWdlZFR5cGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvbWV0YW1vZGVsL01hbmFnZWRUeXBlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsK0JBQThCO0FBRTlCLHNDQUVvQjtBQU9wQixnREFBMkQ7QUFFM0Q7SUFBNkQsK0JBQU87SUE2RGxFOzs7T0FHRztJQUNILHFCQUFZLEdBQVcsRUFBRSxlQUEwQjtRQUFuRCxZQUNFLGtCQUFNLEdBQUcsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFPLEdBQUcsQ0FBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsZUFBZSxDQUFDLFNBQ3ZFO1FBbEVNLGNBQVEsR0FBb0IsSUFBSSxDQUFDO1FBRWpDLHdCQUFrQixHQUFxQixFQUFFLENBQUM7UUFFMUMseUJBQW1CLEdBQWUsSUFBSSx5QkFBVSxFQUFFLENBQUM7UUFFbkQsNkJBQXVCLEdBQWUsSUFBSSx5QkFBVSxFQUFFLENBQUM7UUFFdkQsY0FBUSxHQUFxQyxJQUFJLENBQUM7UUFFbEQsZUFBUyxHQUEyQixJQUFJLENBQUM7UUFFekMscUJBQWUsR0FBb0IsSUFBSSxDQUFDOztJQXNEL0MsQ0FBQztJQWpERCxzQkFBSSx1Q0FBYztRQUhsQjs7V0FFRzthQUNIO1lBQ0UsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDO1FBQzlCLENBQUM7UUFFRDs7V0FFRzthQUNILFVBQW1CLElBQXFCO1lBQ3RDLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO1FBQzlCLENBQUM7OztPQVBBO0lBWUQsc0JBQUksd0NBQWU7UUFIbkI7O1dBRUc7YUFDSDtZQUNFLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUU7Z0JBQzFCLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7YUFDaEQ7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