@pebula/metap
Version:
meta-programming tools
123 lines • 11.7 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Mixin } from '@pebula/utils';
/** @type {?} */
const ModelClassCollectionMark = Symbol('ModelClassCollection instance mark');
/** @type {?} */
const NON_EXTENDABLE_PROPS = ['constructor'];
/** @type {?} */
const pCopyMap = new Map();
/**
* @param {?} proto
* @return {?}
*/
function buildAndCacheProperties(proto) {
/** @type {?} */
const propertiesToCopy = Object.getOwnPropertyNames(proto)
.concat((/** @type {?} */ (Object.getOwnPropertySymbols(proto))))
.filter((/**
* @param {?} v
* @return {?}
*/
v => NON_EXTENDABLE_PROPS.indexOf(v) === -1));
pCopyMap.set(proto, propertiesToCopy);
}
/**
* @param {?} proto
* @param {?} thisVar
* @return {?}
*/
function runtimeExtend(proto, thisVar) {
/** @type {?} */
const propertiesToCopy = pCopyMap.get(proto) || [];
thisVar[ModelClassCollectionMark] = true;
for (let i = 0, len = propertiesToCopy.length; i < len; i++) {
/** @type {?} */
const name = propertiesToCopy[i];
/** @type {?} */
const propDesc = Object.getOwnPropertyDescriptor(proto, name);
if (propDesc) {
Object.defineProperty(thisVar, name, propDesc);
}
else {
thisVar[name] = proto[name];
}
}
}
// TODO: document the class and how to use it. explain about methods that return new instance (concat, reverse, etc)
// that return Array instance and not ActiveRecordCollection instance.
// TODO: override ref changing methods? throw on them? return ActiveRecordCollection on them?
/**
* @template T
*/
export class ModelClassCollection extends Array {
constructor() {
super();
runtimeExtend(ModelClassCollection.prototype, this);
}
/**
* @param {?} type
* @return {?}
*/
static extend(type) {
Mixin((/** @type {?} */ (ModelClassCollection)), type);
buildAndCacheProperties(ModelClassCollection.prototype);
}
/**
* @param {?} instance
* @return {?}
*/
static instanceOf(instance) {
return instance[ModelClassCollectionMark] === true;
}
/**
* @template T
* @param {?=} targetStore
* @param {?=} type
* @return {?}
*/
static create(targetStore, type) {
if (!type) {
return new ModelClassCollection();
}
else {
return targetStore.getTargetMeta(type).createCollection();
}
}
/**
* Creates a new ModelClassCollection class mixed in with the proto object.
* @template T
* @param {?} proto An object literal used as a mixin to the ModelClassCollection prototype.
* @return {?}
*/
static factory(proto) {
/** @type {?} */
const clz = class RuntimeTDMCollection extends ModelClassCollection {
constructor() {
super();
runtimeExtend(clz.prototype, this);
}
/**
* @param {?} type
* @return {?}
*/
static extend(type) {
Mixin((/** @type {?} */ (ModelClassCollection)), type);
buildAndCacheProperties(clz.prototype);
}
};
Object.defineProperty(clz, Symbol.hasInstance, {
value: clz.instanceOf
});
Object.assign(clz.prototype, proto);
buildAndCacheProperties(clz.prototype);
return clz;
}
}
Object.defineProperty(ModelClassCollection, Symbol.hasInstance, {
value: ModelClassCollection.instanceOf
});
buildAndCacheProperties(ModelClassCollection.prototype);
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwtY2xhc3MtY29sbGVjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BwZWJ1bGEvbWV0YXAvaW50ZXJuYWwvIiwic291cmNlcyI6WyJsaWIvbW9kZWwvbW9kZWwtY2xhc3MtY29sbGVjdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFlLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQzs7TUFHN0Msd0JBQXdCLEdBQUcsTUFBTSxDQUFDLG9DQUFvQyxDQUFDOztNQUN2RSxvQkFBb0IsR0FBRyxDQUFDLGFBQWEsQ0FBQzs7TUFFdEMsUUFBUSxHQUFHLElBQUksR0FBRyxFQUErQjs7Ozs7QUFFdkQsU0FBUyx1QkFBdUIsQ0FBQyxLQUFVOztVQUNuQyxnQkFBZ0IsR0FBRyxNQUFNLENBQUMsbUJBQW1CLENBQUMsS0FBSyxDQUFDO1NBQ3ZELE1BQU0sQ0FBQyxtQkFBQSxNQUFNLENBQUMscUJBQXFCLENBQUMsS0FBSyxDQUFDLEVBQU8sQ0FBQztTQUNsRCxNQUFNOzs7O0lBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUM7SUFFdEQsUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztBQUN4QyxDQUFDOzs7Ozs7QUFFRCxTQUFTLGFBQWEsQ0FBQyxLQUFVLEVBQUUsT0FBbUI7O1VBQzlDLGdCQUFnQixHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRTtJQUVsRCxPQUFPLENBQUMsd0JBQXdCLENBQUMsR0FBRyxJQUFJLENBQUM7SUFFekMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFHLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFOztjQUNyRCxJQUFJLEdBQUcsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDOztjQUMxQixRQUFRLEdBQUcsTUFBTSxDQUFDLHdCQUF3QixDQUFDLEtBQUssRUFBRSxJQUFJLENBQUM7UUFDN0QsSUFBSSxRQUFRLEVBQUU7WUFDWixNQUFNLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7U0FDaEQ7YUFBTTtZQUNMLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDN0I7S0FDRjtBQUNILENBQUM7Ozs7Ozs7QUFLRCxNQUFNLE9BQU8sb0JBQTZELFNBQVEsS0FBUTtJQUN4RjtRQUNFLEtBQUssRUFBRSxDQUFDO1FBQ1IsYUFBYSxDQUFDLG9CQUFvQixDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUN0RCxDQUFDOzs7OztJQUVELE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBUztRQUNyQixLQUFLLENBQUMsbUJBQUEsb0JBQW9CLEVBQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztRQUN6Qyx1QkFBdUIsQ0FBQyxvQkFBb0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUMxRCxDQUFDOzs7OztJQUVELE1BQU0sQ0FBQyxVQUFVLENBQUMsUUFBYTtRQUM3QixPQUFPLFFBQVEsQ0FBQyx3QkFBd0IsQ0FBQyxLQUFLLElBQUksQ0FBQztJQUNyRCxDQUFDOzs7Ozs7O0lBVUQsTUFBTSxDQUFDLE1BQU0sQ0FBSSxXQUF5QixFQUFFLElBQXFCO1FBQy9ELElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDVCxPQUFPLElBQUksb0JBQW9CLEVBQU8sQ0FBQztTQUN4QzthQUFNO1lBQ0wsT0FBTyxXQUFXLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLGdCQUFnQixFQUFFLENBQUM7U0FDM0Q7SUFDSCxDQUFDOzs7Ozs7O0lBT0QsTUFBTSxDQUFDLE9BQU8sQ0FBSSxLQUFVOztjQUNwQixHQUFHLEdBQUcsTUFBTSxvQkFBd0IsU0FBUSxvQkFBdUI7WUFDdkU7Z0JBQ0UsS0FBSyxFQUFFLENBQUM7Z0JBQ1IsYUFBYSxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDckMsQ0FBQzs7Ozs7WUFFRCxNQUFNLENBQUMsTUFBTSxDQUFDLElBQVM7Z0JBQ3JCLEtBQUssQ0FBQyxtQkFBQSxvQkFBb0IsRUFBTyxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUN6Qyx1QkFBdUIsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDekMsQ0FBQztTQUNGO1FBRUQsTUFBTSxDQUFDLGNBQWMsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLFdBQVcsRUFBRTtZQUM3QyxLQUFLLEVBQUUsR0FBRyxDQUFDLFVBQVU7U0FDdEIsQ0FBQyxDQUFDO1FBRUgsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3BDLHVCQUF1QixDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUV2QyxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7Q0FDRjtBQUVELE1BQU0sQ0FBQyxjQUFjLENBQUMsb0JBQW9CLEVBQUUsTUFBTSxDQUFDLFdBQVcsRUFBRTtJQUM5RCxLQUFLLEVBQUUsb0JBQW9CLENBQUMsVUFBVTtDQUN2QyxDQUFDLENBQUM7QUFFSCx1QkFBdUIsQ0FBQyxvQkFBb0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbnN0cnVjdG9yLCBNaXhpbiB9IGZyb20gJ0BwZWJ1bGEvdXRpbHMnO1xuaW1wb3J0IHsgVGFyZ2V0U3RvcmUgfSBmcm9tICcuLi9tZXRhZGF0YS90YXJnZXQtc3RvcmUnO1xuXG5jb25zdCBNb2RlbENsYXNzQ29sbGVjdGlvbk1hcmsgPSBTeW1ib2woJ01vZGVsQ2xhc3NDb2xsZWN0aW9uIGluc3RhbmNlIG1hcmsnKTtcbmNvbnN0IE5PTl9FWFRFTkRBQkxFX1BST1BTID0gWydjb25zdHJ1Y3RvciddO1xuXG5jb25zdCBwQ29weU1hcCA9IG5ldyBNYXA8YW55LCBBcnJheTxzdHJpbmcgfCBzeW1ib2w+PigpO1xuXG5mdW5jdGlvbiBidWlsZEFuZENhY2hlUHJvcGVydGllcyhwcm90bzogYW55KSB7XG4gIGNvbnN0IHByb3BlcnRpZXNUb0NvcHkgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhwcm90bylcbiAgICAuY29uY2F0KE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocHJvdG8pIGFzIGFueSlcbiAgICAuZmlsdGVyKHYgPT4gTk9OX0VYVEVOREFCTEVfUFJPUFMuaW5kZXhPZih2KSA9PT0gLTEpO1xuXG4gIHBDb3B5TWFwLnNldChwcm90bywgcHJvcGVydGllc1RvQ29weSk7XG59XG5cbmZ1bmN0aW9uIHJ1bnRpbWVFeHRlbmQocHJvdG86IGFueSwgdGhpc1ZhcjogQXJyYXk8YW55Pik6IGFueSB7XG4gIGNvbnN0IHByb3BlcnRpZXNUb0NvcHkgPSBwQ29weU1hcC5nZXQocHJvdG8pIHx8IFtdO1xuXG4gIHRoaXNWYXJbTW9kZWxDbGFzc0NvbGxlY3Rpb25NYXJrXSA9IHRydWU7XG5cbiAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHByb3BlcnRpZXNUb0NvcHkubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICBjb25zdCBuYW1lID0gcHJvcGVydGllc1RvQ29weVtpXTtcbiAgICBjb25zdCBwcm9wRGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IocHJvdG8sIG5hbWUpO1xuICAgIGlmIChwcm9wRGVzYykge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXNWYXIsIG5hbWUsIHByb3BEZXNjKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpc1ZhcltuYW1lXSA9IHByb3RvW25hbWVdO1xuICAgIH1cbiAgfVxufVxuXG4vLyBUT0RPOiBkb2N1bWVudCB0aGUgY2xhc3MgYW5kIGhvdyB0byB1c2UgaXQuIGV4cGxhaW4gYWJvdXQgbWV0aG9kcyB0aGF0IHJldHVybiBuZXcgaW5zdGFuY2UgKGNvbmNhdCwgcmV2ZXJzZSwgZXRjKVxuLy8gdGhhdCByZXR1cm4gQXJyYXkgaW5zdGFuY2UgYW5kIG5vdCBBY3RpdmVSZWNvcmRDb2xsZWN0aW9uIGluc3RhbmNlLlxuLy8gVE9ETzogb3ZlcnJpZGUgcmVmIGNoYW5naW5nIG1ldGhvZHM/IHRocm93IG9uIHRoZW0/IHJldHVybiBBY3RpdmVSZWNvcmRDb2xsZWN0aW9uIG9uIHRoZW0/XG5leHBvcnQgY2xhc3MgTW9kZWxDbGFzc0NvbGxlY3Rpb248VCAvKiBleHRlbmRzIEFjdGl2ZVJlY29yZDxhbnksIGFueT4gKi8+IGV4dGVuZHMgQXJyYXk8VD4ge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICAgIHJ1bnRpbWVFeHRlbmQoTW9kZWxDbGFzc0NvbGxlY3Rpb24ucHJvdG90eXBlLCB0aGlzKTtcbiAgfVxuXG4gIHN0YXRpYyBleHRlbmQodHlwZTogYW55KTogdm9pZCB7XG4gICAgTWl4aW4oTW9kZWxDbGFzc0NvbGxlY3Rpb24gYXMgYW55LCB0eXBlKTtcbiAgICBidWlsZEFuZENhY2hlUHJvcGVydGllcyhNb2RlbENsYXNzQ29sbGVjdGlvbi5wcm90b3R5cGUpO1xuICB9XG5cbiAgc3RhdGljIGluc3RhbmNlT2YoaW5zdGFuY2U6IGFueSk6IGluc3RhbmNlIGlzIE1vZGVsQ2xhc3NDb2xsZWN0aW9uPGFueT4ge1xuICAgIHJldHVybiBpbnN0YW5jZVtNb2RlbENsYXNzQ29sbGVjdGlvbk1hcmtdID09PSB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgTW9kZWxDbGFzc0NvbGxlY3Rpb24uXG4gICAqIElmIGEgdHlwZSBpcyBzcGVjaWZpZWQsIHJldHVybnMgdGhlIE1vZGVsQ2xhc3NDb2xsZWN0aW9uIGNsYXNzIGZvciB0aGF0IHR5cGUuXG4gICAqIEl0IGlzIHJlY29tbWVuZGVkIHRvIHVzZSB0aGlzIG1ldGhvZCBhbG9uZyB3aXRoIGEgdHlwZSB0byBlbnN1cmUgcGx1Z2lucyBmdW5jdGlvbmFsaXR5LlxuICAgKiBAcGFyYW0gdHlwZVxuICAgKi9cbiAgc3RhdGljIGNyZWF0ZTxUPigpOiBNb2RlbENsYXNzQ29sbGVjdGlvbjxUPlxuICBzdGF0aWMgY3JlYXRlPFQ+KHRhcmdldFN0b3JlOiBUYXJnZXRTdG9yZSwgdHlwZTogQ29uc3RydWN0b3I8VD4pOiBNb2RlbENsYXNzQ29sbGVjdGlvbjxUPjtcbiAgc3RhdGljIGNyZWF0ZTxUPih0YXJnZXRTdG9yZT86IFRhcmdldFN0b3JlLCB0eXBlPzogQ29uc3RydWN0b3I8VD4pOiBNb2RlbENsYXNzQ29sbGVjdGlvbjxUPiB7XG4gICAgaWYgKCF0eXBlKSB7XG4gICAgICByZXR1cm4gbmV3IE1vZGVsQ2xhc3NDb2xsZWN0aW9uPGFueT4oKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRhcmdldFN0b3JlLmdldFRhcmdldE1ldGEodHlwZSkuY3JlYXRlQ29sbGVjdGlvbigpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IE1vZGVsQ2xhc3NDb2xsZWN0aW9uIGNsYXNzIG1peGVkIGluIHdpdGggdGhlIHByb3RvIG9iamVjdC5cbiAgICogQHBhcmFtIHByb3RvIEFuIG9iamVjdCBsaXRlcmFsIHVzZWQgYXMgYSBtaXhpbiB0byB0aGUgTW9kZWxDbGFzc0NvbGxlY3Rpb24gcHJvdG90eXBlLlxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgc3RhdGljIGZhY3Rvcnk8VD4ocHJvdG86IGFueSk6IHR5cGVvZiBNb2RlbENsYXNzQ29sbGVjdGlvbiAmIENvbnN0cnVjdG9yPE1vZGVsQ2xhc3NDb2xsZWN0aW9uPFQ+PiB7XG4gICAgY29uc3QgY2x6ID0gY2xhc3MgUnVudGltZVRETUNvbGxlY3Rpb248VD4gZXh0ZW5kcyBNb2RlbENsYXNzQ29sbGVjdGlvbjxUPiB7XG4gICAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgcnVudGltZUV4dGVuZChjbHoucHJvdG90eXBlLCB0aGlzKTtcbiAgICAgIH1cblxuICAgICAgc3RhdGljIGV4dGVuZCh0eXBlOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgTWl4aW4oTW9kZWxDbGFzc0NvbGxlY3Rpb24gYXMgYW55LCB0eXBlKTtcbiAgICAgICAgYnVpbGRBbmRDYWNoZVByb3BlcnRpZXMoY2x6LnByb3RvdHlwZSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjbHosIFN5bWJvbC5oYXNJbnN0YW5jZSwge1xuICAgICAgdmFsdWU6IGNsei5pbnN0YW5jZU9mXG4gICAgfSk7XG5cbiAgICBPYmplY3QuYXNzaWduKGNsei5wcm90b3R5cGUsIHByb3RvKTtcbiAgICBidWlsZEFuZENhY2hlUHJvcGVydGllcyhjbHoucHJvdG90eXBlKTtcblxuICAgIHJldHVybiBjbHo7XG4gIH1cbn1cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KE1vZGVsQ2xhc3NDb2xsZWN0aW9uLCBTeW1ib2wuaGFzSW5zdGFuY2UsIHtcbiAgdmFsdWU6IE1vZGVsQ2xhc3NDb2xsZWN0aW9uLmluc3RhbmNlT2Zcbn0pO1xuXG5idWlsZEFuZENhY2hlUHJvcGVydGllcyhNb2RlbENsYXNzQ29sbGVjdGlvbi5wcm90b3R5cGUpO1xuIl19