UNPKG

@pebula/metap

Version:
123 lines 11.7 kB
/** * @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