{"version":3,"sources":["../../../../src/lib/A-ServerEntityList/A-EntityList.entity.ts"],"names":[],"mappings":"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","file":"A-EntityList.entity.mjs","sourcesContent":["import {\n    A_Context, A_Entity, A_Scope,\n    A_TYPES__Entity_Constructor,\n    ASEID,\n} from \"@adaas/a-concept\";\nimport {\n    A_SERVER_TYPES__A_EntityListConstructor,\n    A_SERVER_TYPES__A_EntityListPagination,\n    A_SERVER_TYPES__A_EntityListSerialized\n} from \"./A-EntityList.types\";\nimport { A_ServerEntityListPagination } from \"./A-EntityListPagination.context\";\nimport { A_ServerEntityListCacheState } from \"./A-EntityListCacheState.context\";\n\n\n\n/**\n * A-EntityList\n *\n * Typed, paginated list of A-Concept entities.\n *\n * Construction (user-facing):\n *   new A_ServerEntityList<User>({ entity: User, pagination: { page: 1, pageSize: 20 } })\n *\n * Construction (controller-internal, backward-compat):\n *   new A_ServerEntityList({ name: 'user', scope: 'my-scope', constructor: User })\n */\nexport class A_ServerEntityList<\n    EntityType extends A_Entity = A_Entity,\n> extends A_Entity<\n    A_SERVER_TYPES__A_EntityListConstructor<EntityType>,\n    A_SERVER_TYPES__A_EntityListSerialized<EntityType>\n> {\n\n    static get scope(): string {\n        return 'a-server';\n    }\n\n    protected _entityConstructor!: A_TYPES__Entity_Constructor<EntityType>;\n\n    /**\n     * Ordered item references for O(1) positional access.\n     * The list's own scope is the authoritative store (enables @A_Inject and\n     * feature chains on items); this array mirrors the same items in order.\n     */\n    protected _items: Array<EntityType> = [];\n\n    /** Lazily allocated private scope — pagination and cache state live here. */\n    private _ownScope?: A_Scope;\n\n\n    // ── Getters ──────────────────────────────────────────────────────────────\n\n    /**\n     * The list's own scope, created on first access and bound to this entity\n     * via A_Context.allocate.  Items, pagination and cache state are registered\n     * here so they participate in feature chains and @A_Inject resolution.\n     */\n    get ownScope(): A_Scope {\n        if (!this._ownScope) {\n            this._ownScope = A_Context.allocate(\n                this,\n                new A_Scope({ name: `${this.aseid.id}-scope` })\n            );\n        }\n        return this._ownScope;\n    }\n\n    get entityConstructor(): A_TYPES__Entity_Constructor<EntityType> {\n        return this._entityConstructor;\n    }\n\n    get items(): Array<EntityType> {\n        return this._items;\n    }\n\n    /** Pagination state — lives as a Fragment in the list's own scope. */\n    get pagination(): A_ServerEntityListPagination {\n        return this.ownScope.resolveFlatOnce(A_ServerEntityListPagination)!;\n    }\n\n    private get cacheState(): A_ServerEntityListCacheState {\n        return this.ownScope.resolveFlatOnce(A_ServerEntityListCacheState)!;\n    }\n\n    /** Total number of items currently held in memory. */\n    get length(): number {\n        return this._items.length;\n    }\n\n\n    // ── Initialisation ───────────────────────────────────────────────────────\n\n    fromNew(newEntity: A_SERVER_TYPES__A_EntityListConstructor<EntityType>): void {\n        this.aseid = this.generateASEID({\n            concept: A_Context.root.name,\n            entity: 'a-list.' + newEntity.entity.name,\n        });\n\n        this._entityConstructor = newEntity.entity;\n\n        // Initialise state Fragments in the list's own scope\n        this.ownScope.register(new A_ServerEntityListPagination(newEntity.pagination));\n        this.ownScope.register(new A_ServerEntityListCacheState());\n    }\n\n\n    /**\n     * Populate the list from raw repository data.\n     * Items are registered in the list's own scope so they participate in\n     * feature chains and @A_Inject resolution.\n     */\n    fromList(\n        items: Array<EntityType> | Array<ReturnType<EntityType['toJSON']>>,\n        pagination?: A_SERVER_TYPES__A_EntityListPagination\n    ) {\n        // Deregister previous items from own scope\n        this._items.forEach(item => {\n            try { this.ownScope.deregister(item); } catch { /* already gone */ }\n        });\n\n        this._items = items.map(item => {\n            const entity = item instanceof A_Entity\n                ? item as EntityType\n                : new this._entityConstructor(item as any);\n            this.ownScope.register(entity);\n            return entity;\n        });\n\n        if (pagination) {\n            this.pagination.update(pagination);\n        }\n    }\n\n\n    // ── Collection access ────────────────────────────────────────────────────\n\n    /** Return the item at `index`, or `undefined` if out of range. */\n    at(index: number): EntityType | undefined {\n        return this._items[index];\n    }\n\n    /** Replace the item at `index` in place. Accepts a live entity or a plain serialised object. */\n    replace(index: number, item: EntityType | ReturnType<EntityType['toJSON']>): this {\n        const next = item instanceof A_Entity\n            ? item as EntityType\n            : new this._entityConstructor(item as any);\n        try { this.ownScope.deregister(this._items[index]); } catch { /* ok */ }\n        this.ownScope.register(next);\n        this._items[index] = next;\n        return this;\n    }\n\n    /** Append an item to the end of the list. */\n    push(item: EntityType | ReturnType<EntityType['toJSON']>): this {\n        const next = item instanceof A_Entity\n            ? item as EntityType\n            : new this._entityConstructor(item as any);\n        this.ownScope.register(next);\n        this._items.push(next);\n        return this;\n    }\n\n    /** Prepend an item to the beginning of the list. */\n    unshift(item: EntityType | ReturnType<EntityType['toJSON']>): this {\n        const next = item instanceof A_Entity\n            ? item as EntityType\n            : new this._entityConstructor(item as any);\n        this.ownScope.register(next);\n        this._items.unshift(next);\n        return this;\n    }\n\n    /** Remove the item at `index` from the list. */\n    remove(index: number): this {\n        const [removed] = this._items.splice(index, 1);\n        if (removed) {\n            try { this.ownScope.deregister(removed); } catch { /* ok */ }\n        }\n        return this;\n    }\n\n    /** Return the first item that satisfies `predicate`, or `undefined`. */\n    find(predicate: (item: EntityType, index: number) => boolean): EntityType | undefined {\n        return this._items.find(predicate);\n    }\n\n    /** Return all items that satisfy `predicate` without mutating the list. */\n    filter(predicate: (item: EntityType, index: number) => boolean): EntityType[] {\n        return this._items.filter(predicate);\n    }\n\n\n    // ── Caching ──────────────────────────────────────────────────────────────\n\n    /**\n     * Mark this list as cached for `ttlMs` milliseconds from now.\n     * Callers can check `isCached()` to decide whether to skip `load()`.\n     */\n    setCache(ttlMs: number): this {\n        this.cacheState.set(ttlMs);\n        return this;\n    }\n\n    /** Returns `true` if the cache is still valid. */\n    isCached(): boolean {\n        return this.cacheState.isValid();\n    }\n\n    /** Invalidate the cache so the next `load()` call fetches fresh data. */\n    invalidateCache(): this {\n        this.cacheState.invalidate();\n        return this;\n    }\n\n\n    // ── Serialisation ────────────────────────────────────────────────────────\n\n    toJSON(): A_SERVER_TYPES__A_EntityListSerialized<EntityType> {\n        const { total, page, pageSize } = this.pagination;\n        return {\n            ...super.toJSON(),\n            items: this._items.map(i => i.toJSON()) as ReturnType<EntityType['toJSON']>[],\n            type: (this._entityConstructor as any).entity ?? 'unknown',\n            pagination: { total, page, pageSize },\n        };\n    }\n}\n\n"]}