{"version":3,"file":"Cache.mjs","sources":["../../../src/assets/cache/Cache.ts"],"sourcesContent":["import { warn } from '../../utils/logging/warn';\nimport { convertToList } from '../utils/convertToList';\n\nimport type { CacheParser } from './CacheParser';\n\n/**\n * A single Cache for all assets.\n *\n * When assets are added to the cache via set they normally are added to the cache as key-value pairs.\n *\n * With this cache, you can add parsers that will take the object and convert it to a list of assets that can be cached.\n * for example a cacheSpritesheet parser will add all of the textures found within its sprite sheet directly to the cache.\n *\n * This gives devs the flexibility to cache any type of object however we want.\n *\n * It is not intended that this class is created by developers - it is part of the Asset package.\n * This is the first major system of PixiJS' main Assets class.\n * @example\n * import { Cache } from 'pixi.js';\n *\n * Cache.set('bunny', bunnyTexture);\n * @class Cache\n * @memberof assets\n */\nclass CacheClass\n{\n    private readonly _parsers: CacheParser[] = [];\n\n    private readonly _cache: Map<any, any> = new Map();\n    private readonly _cacheMap: Map<string, {\n        keys: string[],\n        cacheKeys: string[],\n    }> = new Map();\n\n    /** Clear all entries. */\n    public reset(): void\n    {\n        this._cacheMap.clear();\n        this._cache.clear();\n    }\n\n    /**\n     * Check if the key exists\n     * @param key - The key to check\n     */\n    public has(key: any): boolean\n    {\n        return this._cache.has(key);\n    }\n\n    /**\n     * Fetch entry by key\n     * @param key - The key of the entry to get\n     */\n    public get<T = any>(key: any): T\n    {\n        const result = this._cache.get(key);\n\n        if (!result)\n        {\n            // #if _DEBUG\n            warn(`[Assets] Asset id ${key} was not found in the Cache`);\n            // #endif\n        }\n\n        return result as T;\n    }\n\n    /**\n     * Set a value by key or keys name\n     * @param key - The key or keys to set\n     * @param value - The value to store in the cache or from which cacheable assets will be derived.\n     */\n    public set(key: any | any[], value: unknown): void\n    {\n        const keys = convertToList<string>(key);\n\n        let cacheableAssets: Record<string, any>;\n\n        for (let i = 0; i < this.parsers.length; i++)\n        {\n            const parser = this.parsers[i];\n\n            if (parser.test(value))\n            {\n                cacheableAssets = parser.getCacheableAssets(keys, value);\n\n                break;\n            }\n        }\n\n        // convert cacheable assets to a map of key-value pairs\n        const cacheableMap = new Map(Object.entries(cacheableAssets || {}));\n\n        if (!cacheableAssets)\n        {\n            keys.forEach((key) =>\n            {\n                cacheableMap.set(key, value);\n            });\n        }\n\n        const cacheKeys = [...cacheableMap.keys()];\n\n        const cachedAssets = {\n            cacheKeys,\n            keys\n        };\n\n        // this is so we can remove them later..\n        keys.forEach((key) =>\n        {\n            this._cacheMap.set(key, cachedAssets as any);\n        });\n\n        cacheKeys.forEach((key) =>\n        {\n            const val = cacheableAssets ? cacheableAssets[key] : value;\n\n            if (this._cache.has(key) && this._cache.get(key) !== val)\n            {\n                // #if _DEBUG\n                warn('[Cache] already has key:', key);\n                // #endif\n            }\n\n            this._cache.set(key, cacheableMap.get(key));\n        });\n    }\n\n    /**\n     * Remove entry by key\n     *\n     * This function will also remove any associated alias from the cache also.\n     * @param key - The key of the entry to remove\n     */\n    public remove(key: any): void\n    {\n        if (!this._cacheMap.has(key))\n        {\n            // #if _DEBUG\n            warn(`[Assets] Asset id ${key} was not found in the Cache`);\n            // #endif\n\n            return;\n        }\n\n        const cacheMap = this._cacheMap.get(key);\n\n        const cacheKeys = cacheMap.cacheKeys;\n\n        cacheKeys.forEach((key) =>\n        {\n            this._cache.delete(key);\n        });\n\n        cacheMap.keys.forEach((key: string) =>\n        {\n            this._cacheMap.delete(key);\n        });\n    }\n\n    /** All loader parsers registered */\n    public get parsers(): CacheParser[]\n    {\n        return this._parsers;\n    }\n}\n\nexport const Cache = new CacheClass();\n"],"names":["key"],"mappings":";;;;AAwBA,MAAM,UACN,CAAA;AAAA,EADA,WAAA,GAAA;AAEI,IAAA,IAAA,CAAiB,WAA0B,EAAC,CAAA;AAE5C,IAAiB,IAAA,CAAA,MAAA,uBAA4B,GAAI,EAAA,CAAA;AACjD,IAAiB,IAAA,CAAA,SAAA,uBAGR,GAAI,EAAA,CAAA;AAAA,GAAA;AAAA;AAAA,EAGN,KACP,GAAA;AACI,IAAA,IAAA,CAAK,UAAU,KAAM,EAAA,CAAA;AACrB,IAAA,IAAA,CAAK,OAAO,KAAM,EAAA,CAAA;AAAA,GACtB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMO,IAAI,GACX,EAAA;AACI,IAAO,OAAA,IAAA,CAAK,MAAO,CAAA,GAAA,CAAI,GAAG,CAAA,CAAA;AAAA,GAC9B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMO,IAAa,GACpB,EAAA;AACI,IAAA,MAAM,MAAS,GAAA,IAAA,CAAK,MAAO,CAAA,GAAA,CAAI,GAAG,CAAA,CAAA;AAElC,IAAA,IAAI,CAAC,MACL,EAAA;AAEI,MAAK,IAAA,CAAA,CAAA,kBAAA,EAAqB,GAAG,CAA6B,2BAAA,CAAA,CAAA,CAAA;AAAA,KAE9D;AAEA,IAAO,OAAA,MAAA,CAAA;AAAA,GACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOO,GAAA,CAAI,KAAkB,KAC7B,EAAA;AACI,IAAM,MAAA,IAAA,GAAO,cAAsB,GAAG,CAAA,CAAA;AAEtC,IAAI,IAAA,eAAA,CAAA;AAEJ,IAAA,KAAA,IAAS,IAAI,CAAG,EAAA,CAAA,GAAI,IAAK,CAAA,OAAA,CAAQ,QAAQ,CACzC,EAAA,EAAA;AACI,MAAM,MAAA,MAAA,GAAS,IAAK,CAAA,OAAA,CAAQ,CAAC,CAAA,CAAA;AAE7B,MAAI,IAAA,MAAA,CAAO,IAAK,CAAA,KAAK,CACrB,EAAA;AACI,QAAkB,eAAA,GAAA,MAAA,CAAO,kBAAmB,CAAA,IAAA,EAAM,KAAK,CAAA,CAAA;AAEvD,QAAA,MAAA;AAAA,OACJ;AAAA,KACJ;AAGA,IAAM,MAAA,YAAA,GAAe,IAAI,GAAI,CAAA,MAAA,CAAO,QAAQ,eAAmB,IAAA,EAAE,CAAC,CAAA,CAAA;AAElE,IAAA,IAAI,CAAC,eACL,EAAA;AACI,MAAK,IAAA,CAAA,OAAA,CAAQ,CAACA,IACd,KAAA;AACI,QAAa,YAAA,CAAA,GAAA,CAAIA,MAAK,KAAK,CAAA,CAAA;AAAA,OAC9B,CAAA,CAAA;AAAA,KACL;AAEA,IAAA,MAAM,SAAY,GAAA,CAAC,GAAG,YAAA,CAAa,MAAM,CAAA,CAAA;AAEzC,IAAA,MAAM,YAAe,GAAA;AAAA,MACjB,SAAA;AAAA,MACA,IAAA;AAAA,KACJ,CAAA;AAGA,IAAK,IAAA,CAAA,OAAA,CAAQ,CAACA,IACd,KAAA;AACI,MAAK,IAAA,CAAA,SAAA,CAAU,GAAIA,CAAAA,IAAAA,EAAK,YAAmB,CAAA,CAAA;AAAA,KAC9C,CAAA,CAAA;AAED,IAAU,SAAA,CAAA,OAAA,CAAQ,CAACA,IACnB,KAAA;AACI,MAAA,MAAM,GAAM,GAAA,eAAA,GAAkB,eAAgBA,CAAAA,IAAG,CAAI,GAAA,KAAA,CAAA;AAErD,MAAI,IAAA,IAAA,CAAK,MAAO,CAAA,GAAA,CAAIA,IAAG,CAAA,IAAK,KAAK,MAAO,CAAA,GAAA,CAAIA,IAAG,CAAA,KAAM,GACrD,EAAA;AAEI,QAAA,IAAA,CAAK,4BAA4BA,IAAG,CAAA,CAAA;AAAA,OAExC;AAEA,MAAA,IAAA,CAAK,OAAO,GAAIA,CAAAA,IAAAA,EAAK,YAAa,CAAA,GAAA,CAAIA,IAAG,CAAC,CAAA,CAAA;AAAA,KAC7C,CAAA,CAAA;AAAA,GACL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,OAAO,GACd,EAAA;AACI,IAAA,IAAI,CAAC,IAAA,CAAK,SAAU,CAAA,GAAA,CAAI,GAAG,CAC3B,EAAA;AAEI,MAAK,IAAA,CAAA,CAAA,kBAAA,EAAqB,GAAG,CAA6B,2BAAA,CAAA,CAAA,CAAA;AAG1D,MAAA,OAAA;AAAA,KACJ;AAEA,IAAA,MAAM,QAAW,GAAA,IAAA,CAAK,SAAU,CAAA,GAAA,CAAI,GAAG,CAAA,CAAA;AAEvC,IAAA,MAAM,YAAY,QAAS,CAAA,SAAA,CAAA;AAE3B,IAAU,SAAA,CAAA,OAAA,CAAQ,CAACA,IACnB,KAAA;AACI,MAAK,IAAA,CAAA,MAAA,CAAO,OAAOA,IAAG,CAAA,CAAA;AAAA,KACzB,CAAA,CAAA;AAED,IAAS,QAAA,CAAA,IAAA,CAAK,OAAQ,CAAA,CAACA,IACvB,KAAA;AACI,MAAK,IAAA,CAAA,SAAA,CAAU,OAAOA,IAAG,CAAA,CAAA;AAAA,KAC5B,CAAA,CAAA;AAAA,GACL;AAAA;AAAA,EAGA,IAAW,OACX,GAAA;AACI,IAAA,OAAO,IAAK,CAAA,QAAA,CAAA;AAAA,GAChB;AACJ,CAAA;AAEa,MAAA,KAAA,GAAQ,IAAI,UAAW;;;;"}