{"version":3,"file":"Assets.mjs","sources":["../src/Assets.ts"],"sourcesContent":["import { extensions, ExtensionType } from 'pixijs/core';\nimport { BackgroundLoader } from './BackgroundLoader';\nimport { Cache } from './cache/Cache';\nimport { Loader } from './loader/Loader';\nimport { loadTextures } from './loader/parsers';\nimport { Resolver } from './resolver/Resolver';\nimport { convertToList } from './utils/convertToList';\nimport { isSingleItem } from './utils/isSingleItem';\n\nimport type { FormatDetectionParser } from './detections';\nimport type { LoadAsset } from './loader';\nimport type { ResolveAsset, ResolverBundle, ResolverManifest } from './resolver';\nimport type { BundleIdentifierOptions } from './resolver/Resolver';\n\nexport type ProgressCallback = (progress: number) => void;\n\n/**\n * Initialization options object for Asset Class.\n * @memberof PIXI\n */\nexport interface AssetInitOptions\n{\n    // basic...\n    /** a base path for any assets loaded */\n    basePath?: string;\n\n    /** a default URL parameter string to append to all assets loaded */\n    defaultSearchParams?: string | Record<string, any>;\n\n    /**\n     * a manifest to tell the asset loader upfront what all your assets are\n     * this can be the manifest object itself, or a URL to the manifest.\n     */\n    manifest?: string | ResolverManifest;\n    /**\n     * optional preferences for which textures preferences you have when resolving assets\n     * for example you might set the resolution to 0.5 if the user is on a rubbish old phone\n     * or you might set the resolution to 2 if the user is on a retina display\n     */\n    texturePreference?: {\n        /** the resolution order you prefer, can be an array (priority order - first is prefered) or a single resolutions  */\n        resolution?: number | number[];\n        /** the formats you prefer, by default this will be:  ['avif', 'webp', 'png', 'jpg', 'jpeg'] */\n        format?: string | string[];\n    };\n\n    /** advanced - override how bundlesIds are generated */\n    bundleIdentifier?: BundleIdentifierOptions;\n}\n\n/**\n * A one stop shop for all Pixi resource management!\n * Super modern and easy to use, with enough flexibility to customize and do what you need!\n * @memberof PIXI\n * @namespace Assets\n *\n * Only one Asset Class exists accessed via the Global Asset object.\n *\n * It has four main responsibilities:\n * 1. Allows users to map URLs to keys and resolve them according to the user's browser capabilities\n * 2. Loads the resources and transforms them into assets that developers understand.\n * 3. Caches the assets and provides a way to access them.\n * 4. Allow developers to unload assets and clear the cache.\n *\n * It also has a few advanced features:\n * 1. Allows developers to provide a manifest upfront of all assets and help manage them via 'bundles'.\n * 2. Allows users to background load assets. Shortening (or eliminating) load times and improving UX. With this feature,\n * in-game loading bars can be a thing of the past!\n *\n * ### Assets Loading\n *\n * Do not be afraid to load things multiple times - under the hood, it will NEVER load anything more than once.\n *\n * For example:\n *\n * ```js\n * import { Assets } from 'pixijs/browser';\n *\n * promise1 = Assets.load('bunny.png')\n * promise2 = Assets.load('bunny.png')\n *\n * // promise1 === promise2\n * ```\n *\n * Here both promises will be the same. Once resolved... Forever resolved! It makes for really easy resource management!\n *\n * Out of the box it supports the following files:\n * - textures (avif, webp, png, jpg, gif, svg)\n * - sprite sheets (json)\n * - bitmap fonts (xml, fnt, txt)\n * - web fonts (ttf, woff, woff2)\n * - json files (json)\n * - text files (txt)\n *\n * More types can be added fairly easily by creating additional loader parsers.\n *\n * ### Textures\n * - Textures are loaded as ImageBitmap on a worker thread where possible.\n * Leading to much less janky load + parse times.\n * - By default, we will prefer to load AVIF and WebP image files if you specify them.\n * But if the browser doesn't support AVIF or WebP we will fall back to png and jpg.\n * - Textures can also be accessed via Texture.from(...) and now use this asset manager under the hood!\n * - Don't worry if you set preferences for textures that don't exist (for example you prefer 2x resolutions images\n *  but only 1x is available for that texture, the Asset manager will pick that up as a fallback automatically)\n *\n * #### Sprite sheets\n * - It's hard to know what resolution a sprite sheet is without loading it first, to address this\n * there is a naming convention we have added that will let Pixi understand the image format and resolution\n * of the spritesheet via its file name:\n *\n * `my-spritesheet{resolution}.{imageFormat}.json`\n *\n * For example:\n *\n * `my-spritesheet@2x.webp.json` // 2x resolution, WebP sprite sheet\n * `my-spritesheet@0.5x.png.json` // 0.5x resolution, png sprite sheet\n *\n * This is optional! You can just load a sprite sheet as normal.\n * This is only useful if you have a bunch of different res / formatted spritesheets.\n *\n * ### Fonts\n * Web fonts will be loaded with all weights.\n * It is possible to load only specific weights by doing the following:\n *\n * ```js\n * import { Assets } from 'pixijs/browser';\n *\n * // Load specific weights..\n * await Assets.load({\n *     data: {\n *         weights: ['normal'], // Only loads the weight\n *     },\n *     src: `outfit.woff2`,\n * });\n *\n * // Load everything...\n * await Assets.load(`outfit.woff2`);\n * ```\n *\n * ### Background Loading\n * Background loading will load stuff for you passively behind the scenes. To minimize jank,\n * it will only load one asset at a time. As soon as a developer calls `Assets.load(...)` the\n * background loader is paused and requested assets are loaded as a priority.\n * Don't worry if something is in there that's already loaded, it will just get skipped!\n *\n * You still need to call `Assets.load(...)` to get an asset that has been loaded in the background.\n * It's just that this promise will resolve instantly if the asset\n * has already been loaded.\n *\n * ### Manifest and Bundles\n * - Manifest is a JSON file that contains a list of all assets and their properties.\n * - Bundles are a way to group assets together.\n *\n * ```js\n * import { Assets } from 'pixijs/browser';\n *\n * // Manifest Example\n * const manifest = {\n *     bundles: [\n *         {\n *             name: 'load-screen',\n *             assets: [\n *                 {\n *                     name: 'background',\n *                     srcs: 'sunset.png',\n *                 },\n *                 {\n *                     name: 'bar',\n *                     srcs: 'load-bar.{png,webp}',\n *                 },\n *             ],\n *         },\n *         {\n *             name: 'game-screen',\n *             assets: [\n *                 {\n *                     name: 'character',\n *                     srcs: 'robot.png',\n *                 },\n *                 {\n *                     name: 'enemy',\n *                     srcs: 'bad-guy.png',\n *                 },\n *             ],\n *         },\n *     ]\n * };\n *\n * await Asset.init({ manifest });\n *\n * // Load a bundle...\n * loadScreenAssets = await Assets.loadBundle('load-screen');\n * // Load another bundle...\n * gameScreenAssets = await Assets.loadBundle('game-screen');\n * ```\n * @example\n * import { Assets } from 'pixijs/browser';\n *\n * const bunny = await Assets.load('bunny.png');\n */\nexport class AssetsClass\n{\n    /** the resolver to map various urls */\n    public resolver: Resolver;\n    /**\n     * The loader, loads stuff!\n     * @type {PIXI.AssetLoader}\n     */\n    public loader: Loader;\n    /**\n     * The global cache of all assets within PixiJS\n     * @type {PIXI.Cache}\n     */\n    public cache: typeof Cache;\n\n    /** takes care of loading assets in the background */\n    private readonly _backgroundLoader: BackgroundLoader;\n\n    private _detections: FormatDetectionParser[] = [];\n\n    private _initialized = false;\n\n    constructor()\n    {\n        this.resolver = new Resolver();\n        this.loader = new Loader();\n        this.cache = Cache;\n\n        this._backgroundLoader = new BackgroundLoader(this.loader);\n        this._backgroundLoader.active = true;\n\n        this.reset();\n    }\n\n    /**\n     * Best practice is to call this function before any loading commences\n     * Initiating is the best time to add any customization to the way things are loaded.\n     *\n     * you do not need to call this for the Asset class to work, only if you want to set any initial properties\n     * @param options - options to initialize the Asset manager with\n     */\n    public async init(options: AssetInitOptions = {}): Promise<void>\n    {\n        if (this._initialized)\n        {\n            // #if _DEBUG\n            console.warn('[Assets]AssetManager already initialized, did you load before calling this Asset.init()?');\n            // #endif\n\n            return;\n        }\n\n        this._initialized = true;\n\n        if (options.defaultSearchParams)\n        {\n            this.resolver.setDefaultSearchParams(options.defaultSearchParams);\n        }\n\n        if (options.basePath)\n        {\n            this.resolver.basePath = options.basePath;\n        }\n\n        if (options.bundleIdentifier)\n        {\n            this.resolver.setBundleIdentifier(options.bundleIdentifier);\n        }\n\n        if (options.manifest)\n        {\n            let manifest = options.manifest;\n\n            if (typeof manifest === 'string')\n            {\n                manifest = await this.load<ResolverManifest>(manifest);\n            }\n\n            this.resolver.addManifest(manifest);\n        }\n\n        const resolutionPref = options.texturePreference?.resolution ?? 1;\n        const resolution = (typeof resolutionPref === 'number') ? [resolutionPref] : resolutionPref;\n\n        let formats: string[] = [];\n\n        if (options.texturePreference?.format)\n        {\n            const formatPref = options.texturePreference?.format;\n\n            formats = (typeof formatPref === 'string') ? [formatPref] : formatPref;\n\n            // we should remove any formats that are not supported by the browser\n            for (const detection of this._detections)\n            {\n                if (!await detection.test())\n                {\n                    formats = await detection.remove(formats);\n                }\n            }\n        }\n        else\n        {\n            // we should add any formats that are supported by the browser\n            for (const detection of this._detections)\n            {\n                if (await detection.test())\n                {\n                    formats = await detection.add(formats);\n                }\n            }\n        }\n\n        this.resolver.prefer({\n            params: {\n                format: formats,\n                resolution,\n            },\n        });\n    }\n\n    /**\n     * Allows you to specify how to resolve any assets load requests.\n     * There are a few ways to add things here as shown below:\n     * @example\n     * import { Assets } from 'pixijs/browser';\n     *\n     * // Simple\n     * Assets.add('bunnyBooBoo', 'bunny.png');\n     * const bunny = await Assets.load('bunnyBooBoo');\n     *\n     * // Multiple keys:\n     * Assets.add(['burger', 'chicken'], 'bunny.png');\n     *\n     * const bunny = await Assets.load('burger');\n     * const bunny2 = await Assets.load('chicken');\n     *\n     * // passing options to to the object\n     * Assets.add(\n     *     'bunnyBooBooSmooth',\n     *     'bunny{png,webp}',\n     *     { scaleMode: SCALE_MODES.NEAREST }, // Base texture options\n     * );\n     *\n     * // Multiple assets\n     *\n     * // The following all do the same thing:\n     *\n     * Assets.add('bunnyBooBoo', 'bunny{png,webp}');\n     *\n     * Assets.add('bunnyBooBoo', [\n     *     'bunny.png',\n     *     'bunny.webp',\n     * ]);\n     *\n     * Assets.add('bunnyBooBoo', [\n     *     {\n     *         format: 'png',\n     *         src: 'bunny.png',\n     *     },\n     *     {\n     *         format: 'webp',\n     *         src: 'bunny.webp',\n     *     },\n     * ]);\n     *\n     * const bunny = await Assets.load('bunnyBooBoo'); // Will try to load WebP if available\n     * @param keysIn - the key or keys that you will reference when loading this asset\n     * @param assetsIn - the asset or assets that will be chosen from when loading via the specified key\n     * @param data - asset-specific data that will be passed to the loaders\n     * - Useful if you want to initiate loaded objects with specific data\n     */\n    public add(keysIn: string | string[], assetsIn: string | (ResolveAsset | string)[], data?: unknown): void\n    {\n        this.resolver.add(keysIn, assetsIn, data);\n    }\n\n    /**\n     * Loads your assets! You pass in a key or URL and it will return a promise that\n     * resolves to the loaded asset. If multiple assets a requested, it will return a hash of assets.\n     *\n     * Don't worry about loading things multiple times, behind the scenes assets are only ever loaded\n     * once and the same promise reused behind the scenes so you can safely call this function multiple\n     * times with the same key and it will always return the same asset.\n     * @example\n     * import { Assets } from 'pixijs/browser';\n     *\n     * // Load a URL:\n     * const myImageTexture = await Assets.load('http://some.url.com/image.png'); // => returns a texture\n     *\n     * Assets.add('thumper', 'bunny.png');\n     * Assets.add('chicko', 'chicken.png');\n     *\n     * // Load multiple assets:\n     * const textures = await Assets.load(['thumper', 'chicko']); // => {thumper: Texture, chicko: Texture}\n     * @param urls - the urls to load\n     * @param onProgress - optional function that is called when progress on asset loading is made.\n     * The function is passed a single parameter, `progress`, which represents the percentage\n     * (0.0 - 1.0) of the assets loaded.\n     * @returns - the assets that were loaded, either a single asset or a hash of assets\n     */\n    public async load<T = any>(\n        urls: string | LoadAsset,\n        onProgress?: ProgressCallback,\n    ): Promise<T>;\n    public async load<T = any>(\n        urls: string[] | LoadAsset[],\n        onProgress?: ProgressCallback,\n    ): Promise<Record<string, T>>;\n    public async load<T = any>(\n        urls: string | string[] | LoadAsset | LoadAsset[],\n        onProgress?: ProgressCallback,\n    ): Promise<T | Record<string, T>>\n    {\n        if (!this._initialized)\n        {\n            await this.init();\n        }\n\n        const singleAsset = isSingleItem(urls);\n\n        const urlArray = convertToList<ResolveAsset>(urls)\n            .map((url) =>\n            {\n                if (typeof url !== 'string')\n                {\n                    this.resolver.add(url.src as string, url);\n\n                    return url.src;\n                }\n\n                if (!this.resolver.hasKey(url))\n                {\n                    this.resolver.add(url, url);\n                }\n\n                return url;\n            });\n\n        // check cache first...\n        const resolveResults = this.resolver.resolve(urlArray);\n\n        // remap to the keys used..\n        const out: Record<string, T> = await this._mapLoadToResolve<T>(resolveResults, onProgress);\n\n        return singleAsset ? out[urlArray[0] as string] : out;\n    }\n\n    /**\n     * This adds a bundle of assets in one go so that you can load them as a group.\n     * For example you could add a bundle for each screen in you pixi app\n     * @example\n     * import { Assets } from 'pixijs/browser';\n     *\n     * Assets.addBundle('animals', {\n     *     bunny: 'bunny.png',\n     *     chicken: 'chicken.png',\n     *     thumper: 'thumper.png',\n     * });\n     *\n     * const assets = await Assets.loadBundle('animals');\n     * @param bundleId - the id of the bundle to add\n     * @param assets - a record of the asset or assets that will be chosen from when loading via the specified key\n     */\n    public addBundle(bundleId: string, assets: ResolverBundle['assets']): void\n    {\n        this.resolver.addBundle(bundleId, assets);\n    }\n\n    /**\n     * Bundles are a way to load multiple assets at once.\n     * If a manifest has been provided to the init function then you can load a bundle, or bundles.\n     * you can also add bundles via `addBundle`\n     * @example\n     * import { Assets } from 'pixijs/browser';\n     *\n     * // Manifest Example\n     * const manifest = {\n     *     bundles: [\n     *         {\n     *             name: 'load-screen',\n     *             assets: [\n     *                 {\n     *                     name: 'background',\n     *                     srcs: 'sunset.png',\n     *                 },\n     *                 {\n     *                     name: 'bar',\n     *                     srcs: 'load-bar.{png,webp}',\n     *                 },\n     *             ],\n     *         },\n     *         {\n     *             name: 'game-screen',\n     *             assets: [\n     *                 {\n     *                     name: 'character',\n     *                     srcs: 'robot.png',\n     *                 },\n     *                 {\n     *                     name: 'enemy',\n     *                     srcs: 'bad-guy.png',\n     *                 },\n     *             ],\n     *         },\n     *     ]\n     * };\n     *\n     * await Asset.init({ manifest });\n     *\n     * // Load a bundle...\n     * loadScreenAssets = await Assets.loadBundle('load-screen');\n     * // Load another bundle...\n     * gameScreenAssets = await Assets.loadBundle('game-screen');\n     * @param bundleIds - the bundle id or ids to load\n     * @param onProgress - Optional function that is called when progress on asset loading is made.\n     * The function is passed a single parameter, `progress`, which represents the percentage (0.0 - 1.0)\n     * of the assets loaded. Do not use this function to detect when assets are complete and available,\n     * instead use the Promise returned by this function.\n     * @returns all the bundles assets or a hash of assets for each bundle specified\n     */\n    public async loadBundle(bundleIds: string | string[], onProgress?: ProgressCallback): Promise<any>\n    {\n        if (!this._initialized)\n        {\n            await this.init();\n        }\n\n        let singleAsset = false;\n\n        if (typeof bundleIds === 'string')\n        {\n            singleAsset = true;\n            bundleIds = [bundleIds];\n        }\n\n        const resolveResults = this.resolver.resolveBundle(bundleIds);\n\n        const out: Record<string, Record<string, any>> = {};\n\n        const keys = Object.keys(resolveResults);\n        let count = 0;\n        let total = 0;\n        const _onProgress = () =>\n        {\n            onProgress?.(++count / total);\n        };\n        const promises = keys.map((bundleId) =>\n        {\n            const resolveResult = resolveResults[bundleId];\n\n            total += Object.keys(resolveResult).length;\n\n            return this._mapLoadToResolve(resolveResult, _onProgress)\n                .then((resolveResult) =>\n                {\n                    out[bundleId] = resolveResult;\n                });\n        });\n\n        await Promise.all(promises);\n\n        return singleAsset ? out[bundleIds[0]] : out;\n    }\n\n    /**\n     * Initiate a background load of some assets. It will passively begin to load these assets in the background.\n     * So when you actually come to loading them you will get a promise that resolves to the loaded assets immediately\n     *\n     * An example of this might be that you would background load game assets after your inital load.\n     * then when you got to actually load your game screen assets when a player goes to the game - the loading\n     * would already have stared or may even be complete, saving you having to show an interim load bar.\n     * @example\n     * import { Assets } from 'pixijs/browser';\n     *\n     * Assets.backgroundLoad('bunny.png');\n     *\n     * // later on in your app...\n     * await Assets.loadBundle('bunny.png'); // Will resolve quicker as loading may have completed!\n     * @param urls - the url / urls you want to background load\n     */\n    public async backgroundLoad(urls: string | string[]): Promise<void>\n    {\n        if (!this._initialized)\n        {\n            await this.init();\n        }\n\n        if (typeof urls === 'string')\n        {\n            urls = [urls];\n        }\n\n        const resolveResults = this.resolver.resolve(urls);\n\n        this._backgroundLoader.add(Object.values(resolveResults));\n    }\n\n    /**\n     * Initiate a background of a bundle, works exactly like backgroundLoad but for bundles.\n     * this can only be used if the loader has been initiated with a manifest\n     * @example\n     * import { Assets } from 'pixijs/browser';\n     *\n     * await Assets.init({\n     *     manifest: {\n     *         bundles: [\n     *             {\n     *                 name: 'load-screen',\n     *                 assets: [...],\n     *             },\n     *             ...\n     *         ],\n     *     },\n     * });\n     *\n     * Assets.backgroundLoadBundle('load-screen');\n     *\n     * // Later on in your app...\n     * await Assets.loadBundle('load-screen'); // Will resolve quicker as loading may have completed!\n     * @param bundleIds - the bundleId / bundleIds you want to background load\n     */\n    public async backgroundLoadBundle(bundleIds: string | string[]): Promise<void>\n    {\n        if (!this._initialized)\n        {\n            await this.init();\n        }\n\n        if (typeof bundleIds === 'string')\n        {\n            bundleIds = [bundleIds];\n        }\n\n        const resolveResults = this.resolver.resolveBundle(bundleIds);\n\n        Object.values(resolveResults).forEach((resolveResult) =>\n        {\n            this._backgroundLoader.add(Object.values(resolveResult));\n        });\n    }\n\n    /**\n     * Only intended for development purposes.\n     * This will wipe the resolver and caches.\n     * You will need to reinitialize the Asset\n     */\n    public reset(): void\n    {\n        this.resolver.reset();\n        this.loader.reset();\n        this.cache.reset();\n\n        this._initialized = false;\n    }\n\n    /**\n     * Instantly gets an asset already loaded from the cache. If the asset has not yet been loaded,\n     * it will return undefined. So it's on you! When in doubt just use `Assets.load` instead.\n     * (Remember, the loader will never load things more than once!)\n     * @param keys - The key or keys for the assets that you want to access\n     * @returns - The assets or hash of assets requested\n     */\n    public get<T = any>(keys: string): T;\n    public get<T = any>(keys: string[]): Record<string, T>;\n    public get<T = any>(keys: string | string[]): T | Record<string, T>\n    {\n        if (typeof keys === 'string')\n        {\n            return Cache.get(keys);\n        }\n\n        const assets: Record<string, T> = {};\n\n        for (let i = 0; i < keys.length; i++)\n        {\n            assets[i] = Cache.get(keys[i]);\n        }\n\n        return assets;\n    }\n\n    /**\n     * helper function to map resolved assets back to loaded assets\n     * @param resolveResults - the resolve results from the resolver\n     * @param onProgress - the progress callback\n     */\n    private async _mapLoadToResolve<T>(\n        resolveResults: ResolveAsset | Record<string, ResolveAsset>,\n        onProgress?: ProgressCallback\n    ): Promise<Record<string, T>>\n    {\n        const resolveArray = Object.values(resolveResults);\n        const resolveKeys = Object.keys(resolveResults);\n\n        // pause background loader...\n        this._backgroundLoader.active = false;\n\n        const loadedAssets = await this.loader.load<T>(resolveArray, onProgress);\n\n        // resume background loader...\n        this._backgroundLoader.active = true;\n\n        // remap to the keys used..\n\n        const out: Record<string, T> = {};\n\n        resolveArray.forEach((resolveResult, i) =>\n        {\n            const asset = loadedAssets[resolveResult.src];\n\n            const keys = [resolveResult.src];\n\n            if (resolveResult.alias)\n            {\n                keys.push(...resolveResult.alias);\n            }\n\n            out[resolveKeys[i]] = asset;\n\n            Cache.set(keys, asset);\n        });\n\n        return out;\n    }\n\n    /**\n     * Unload an asset or assets. As the Assets class is responsible for creating the assets via the `load` function\n     * this will make sure to destroy any assets and release them from memory.\n     * Once unloaded, you will need to load the asset again.\n     *\n     * Use this to help manage assets if you find that you have a large app and you want to free up memory.\n     *\n     * - it's up to you as the developer to make sure that textures are not actively being used when you unload them,\n     * Pixi won't break but you will end up with missing assets. Not a good look for the user!\n     * @example\n     * import { Assets } from 'pixijs/browser';\n     *\n     * // Load a URL:\n     * const myImageTexture = await Assets.load('http://some.url.com/image.png'); // => returns a texture\n     *\n     * await Assets.unload('http://some.url.com/image.png')\n     *\n     * // myImageTexture will be destroyed now.\n     *\n     * // Unload multiple assets:\n     * const textures = await Assets.unload(['thumper', 'chicko']);\n     * @param urls - the urls to unload\n     */\n    public async unload(\n        urls: string | string[] | LoadAsset | LoadAsset[]\n    ): Promise<void>\n    {\n        if (!this._initialized)\n        {\n            await this.init();\n        }\n\n        const urlArray = convertToList<string | LoadAsset>(urls)\n            .map((url) =>\n                ((typeof url !== 'string') ? url.src : url));\n\n        // check cache first...\n        const resolveResults = this.resolver.resolve(urlArray);\n\n        await this._unloadFromResolved(resolveResults);\n    }\n\n    /**\n     * Bundles are a way to manage multiple assets at once.\n     * this will unload all files in a bundle.\n     *\n     * once a bundle has been unloaded, you need to load it again to have access to the assets.\n     * @example\n     * import { Assets } from 'pixijs/browser';\n     *\n     * Assets.addBundle({\n     *     'thumper': 'http://some.url.com/thumper.png',\n     * })\n     *\n     * const assets = await Assets.loadBundle('thumper');\n     *\n     * // Now to unload...\n     *\n     * await Assets.unloadBundle('thumper');\n     *\n     * // All assets in the assets object will now have been destroyed and purged from the cache\n     * @param bundleIds - the bundle id or ids to unload\n     */\n    public async unloadBundle(bundleIds: string | string[]): Promise<void>\n    {\n        if (!this._initialized)\n        {\n            await this.init();\n        }\n\n        bundleIds = convertToList<string>(bundleIds);\n\n        const resolveResults = this.resolver.resolveBundle(bundleIds);\n\n        const promises = Object.keys(resolveResults).map((bundleId) =>\n            this._unloadFromResolved(resolveResults[bundleId]));\n\n        await Promise.all(promises);\n    }\n\n    private async _unloadFromResolved(resolveResult: ResolveAsset | Record<string, ResolveAsset>)\n    {\n        const resolveArray = Object.values(resolveResult);\n\n        resolveArray.forEach((resolveResult) =>\n        {\n            Cache.remove(resolveResult.src);\n        });\n\n        await this.loader.unload(resolveArray);\n    }\n\n    /** All the detection parsers currently added to the Assets class. */\n    public get detections(): FormatDetectionParser[]\n    {\n        return this._detections;\n    }\n\n    /**\n     * When set to `true`, loading and decoding images will happen with Worker thread,\n     * if available on the browser. This is much more performant as network requests\n     * and decoding can be expensive on the CPU. However, not all environments support\n     * Workers, in some cases it can be helpful to disable by setting to `false`.\n     * @default true\n     */\n    public get preferWorkers(): boolean\n    {\n        return loadTextures.config.preferWorkers;\n    }\n    public set preferWorkers(value: boolean)\n    {\n        loadTextures.config.preferWorkers = value;\n    }\n}\n\nexport const Assets = new AssetsClass();\n\n// Handle registration of extensions\nextensions\n    .handleByList(ExtensionType.LoadParser, Assets.loader.parsers)\n    .handleByList(ExtensionType.ResolveParser, Assets.resolver.parsers)\n    .handleByList(ExtensionType.CacheParser, Assets.cache.parsers)\n    .handleByList(ExtensionType.DetectionParser, Assets.detections);\n"],"names":[],"mappings":"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"}