{"version":3,"file":"Resolver.mjs","sources":["../../../src/assets/resolver/Resolver.ts"],"sourcesContent":["import { warn } from '../../utils/logging/warn';\nimport { path } from '../../utils/path';\nimport { convertToList } from '../utils/convertToList';\nimport { createStringVariations } from '../utils/createStringVariations';\nimport { isSingleItem } from '../utils/isSingleItem';\n\nimport type {\n    ArrayOr,\n    AssetsBundle,\n    AssetsManifest,\n    AssetSrc,\n    ResolvedAsset,\n    ResolvedSrc,\n    UnresolvedAsset,\n} from '../types';\nimport type { PreferOrder, ResolveURLParser } from './types';\n\n/**\n * Options for how the resolver deals with generating bundle ids\n * @category assets\n * @advanced\n */\nexport interface BundleIdentifierOptions\n{\n    /** The character that is used to connect the bundleId and the assetId when generating a bundle asset id key */\n    connector?: string;\n    /**\n     * A function that generates a bundle asset id key from a bundleId and an assetId\n     * @param bundleId - the bundleId\n     * @param assetId  - the assetId\n     * @returns the bundle asset id key\n     */\n    createBundleAssetId?: (bundleId: string, assetId: string) => string;\n    /**\n     * A function that generates an assetId from a bundle asset id key. This is the reverse of generateBundleAssetId\n     * @param bundleId - the bundleId\n     * @param assetBundleId - the bundle asset id key\n     * @returns the assetId\n     */\n    extractAssetIdFromBundle?: (bundleId: string, assetBundleId: string) => string;\n}\n\n/**\n * A class that is responsible for resolving mapping asset URLs to keys.\n * At its most basic it can be used for Aliases:\n *\n * ```js\n * resolver.add('foo', 'bar');\n * resolver.resolveUrl('foo') // => 'bar'\n * ```\n *\n * It can also be used to resolve the most appropriate asset for a given URL:\n *\n * ```js\n * resolver.prefer({\n *     params: {\n *         format: 'webp',\n *         resolution: 2,\n *     }\n * });\n *\n * resolver.add('foo', ['bar@2x.webp', 'bar@2x.png', 'bar.webp', 'bar.png']);\n *\n * resolver.resolveUrl('foo') // => 'bar@2x.webp'\n * ```\n * Other features include:\n * - Ability to process a manifest file to get the correct understanding of how to resolve all assets\n * - Ability to add custom parsers for specific file types\n * - Ability to add custom prefer rules\n *\n * This class only cares about the URL, not the loading of the asset itself.\n *\n * It is not intended that this class is created by developers - its part of the Asset class\n * This is the third major system of PixiJS' main Assets class\n * @category assets\n * @advanced\n */\nexport class Resolver\n{\n    /**\n     * The prefix that denotes a URL is for a retina asset.\n     * @default /@([0-9\\.]+)x/\n     * @example `@2x`\n     */\n    public static RETINA_PREFIX = /@([0-9\\.]+)x/;\n\n    private readonly _defaultBundleIdentifierOptions: Required<BundleIdentifierOptions> = {\n        connector: '-',\n        createBundleAssetId: (bundleId, assetId) =>\n            `${bundleId}${this._bundleIdConnector}${assetId}`,\n        extractAssetIdFromBundle: (bundleId, assetBundleId) =>\n            assetBundleId.replace(`${bundleId}${this._bundleIdConnector}`, ''),\n    };\n\n    /** The character that is used to connect the bundleId and the assetId when generating a bundle asset id key */\n    private _bundleIdConnector = this._defaultBundleIdentifierOptions.connector;\n\n    /**\n     * A function that generates a bundle asset id key from a bundleId and an assetId\n     * @param bundleId - the bundleId\n     * @param assetId  - the assetId\n     * @returns the bundle asset id key\n     */\n    private _createBundleAssetId: (\n        bundleId: string,\n        assetId: string\n    ) => string = this._defaultBundleIdentifierOptions.createBundleAssetId;\n\n    /**\n     * A function that generates an assetId from a bundle asset id key. This is the reverse of generateBundleAssetId\n     * @param bundleId - the bundleId\n     * @param assetBundleId - the bundle asset id key\n     * @returns the assetId\n     */\n    private _extractAssetIdFromBundle: (\n        bundleId: string,\n        assetBundleId: string\n    ) => string = this._defaultBundleIdentifierOptions.extractAssetIdFromBundle;\n\n    private _assetMap: Record<string, ResolvedAsset[]> = {};\n    private _preferredOrder: PreferOrder[] = [];\n    private readonly _parsers: ResolveURLParser[] = [];\n\n    private _resolverHash: Record<string, ResolvedAsset> = {};\n    private _rootPath: string;\n    private _basePath: string;\n    private _manifest: AssetsManifest;\n    private _bundles: Record<string, string[]> = {};\n    private _defaultSearchParams: string;\n\n    /**\n     * Override how the resolver deals with generating bundle ids.\n     * must be called before any bundles are added\n     * @param bundleIdentifier - the bundle identifier options\n     */\n    public setBundleIdentifier(bundleIdentifier: BundleIdentifierOptions): void\n    {\n        this._bundleIdConnector = bundleIdentifier.connector ?? this._bundleIdConnector;\n        this._createBundleAssetId = bundleIdentifier.createBundleAssetId ?? this._createBundleAssetId;\n        this._extractAssetIdFromBundle = bundleIdentifier.extractAssetIdFromBundle ?? this._extractAssetIdFromBundle;\n\n        if (this._extractAssetIdFromBundle('foo', this._createBundleAssetId('foo', 'bar')) !== 'bar')\n        {\n            throw new Error('[Resolver] GenerateBundleAssetId are not working correctly');\n        }\n    }\n\n    /**\n     * Let the resolver know which assets you prefer to use when resolving assets.\n     * Multiple prefer user defined rules can be added.\n     * @example\n     * resolver.prefer({\n     *     // first look for something with the correct format, and then then correct resolution\n     *     priority: ['format', 'resolution'],\n     *     params:{\n     *         format:'webp', // prefer webp images\n     *         resolution: 2, // prefer a resolution of 2\n     *     }\n     * })\n     * resolver.add('foo', ['bar@2x.webp', 'bar@2x.png', 'bar.webp', 'bar.png']);\n     * resolver.resolveUrl('foo') // => 'bar@2x.webp'\n     * @param preferOrders - the prefer options\n     */\n    public prefer(...preferOrders: PreferOrder[]): void\n    {\n        preferOrders.forEach((prefer) =>\n        {\n            this._preferredOrder.push(prefer);\n\n            if (!prefer.priority)\n            {\n                // generate the priority based on the order of the object\n                prefer.priority = Object.keys(prefer.params);\n            }\n        });\n\n        this._resolverHash = {};\n    }\n\n    /**\n     * Set the base path to prepend to all urls when resolving\n     * @example\n     * resolver.basePath = 'https://home.com/';\n     * resolver.add('foo', 'bar.ong');\n     * resolver.resolveUrl('foo', 'bar.png'); // => 'https://home.com/bar.png'\n     * @param basePath - the base path to use\n     */\n    public set basePath(basePath: string)\n    {\n        this._basePath = basePath;\n    }\n\n    public get basePath(): string\n    {\n        return this._basePath;\n    }\n\n    /**\n     * Set the root path for root-relative URLs. By default the `basePath`'s root is used. If no `basePath` is set, then the\n     * default value for browsers is `window.location.origin`\n     * @example\n     * // Application hosted on https://home.com/some-path/index.html\n     * resolver.basePath = 'https://home.com/some-path/';\n     * resolver.rootPath = 'https://home.com/';\n     * resolver.add('foo', '/bar.png');\n     * resolver.resolveUrl('foo', '/bar.png'); // => 'https://home.com/bar.png'\n     * @param rootPath - the root path to use\n     */\n    public set rootPath(rootPath: string)\n    {\n        this._rootPath = rootPath;\n    }\n\n    public get rootPath(): string\n    {\n        return this._rootPath;\n    }\n\n    /**\n     * All the active URL parsers that help the parser to extract information and create\n     * an asset object-based on parsing the URL itself.\n     *\n     * Can be added using the extensions API\n     * @example\n     * resolver.add('foo', [\n     *     {\n     *         resolution: 2,\n     *         format: 'png',\n     *         src: 'image@2x.png',\n     *     },\n     *     {\n     *         resolution:1,\n     *         format:'png',\n     *         src: 'image.png',\n     *     },\n     * ]);\n     *\n     * // With a url parser the information such as resolution and file format could extracted from the url itself:\n     * extensions.add({\n     *     extension: ExtensionType.ResolveParser,\n     *     test: loadTextures.test, // test if url ends in an image\n     *     parse: (value: string) =>\n     *     ({\n     *         resolution: parseFloat(Resolver.RETINA_PREFIX.exec(value)?.[1] ?? '1'),\n     *         format: value.split('.').pop(),\n     *         src: value,\n     *     }),\n     * });\n     *\n     * // Now resolution and format can be extracted from the url\n     * resolver.add('foo', [\n     *     'image@2x.png',\n     *     'image.png',\n     * ]);\n     */\n    public get parsers(): ResolveURLParser[]\n    {\n        return this._parsers;\n    }\n\n    /** Used for testing, this resets the resolver to its initial state */\n    public reset(): void\n    {\n        this.setBundleIdentifier(this._defaultBundleIdentifierOptions);\n\n        this._assetMap = {};\n        this._preferredOrder = [];\n        // Do not reset this._parsers\n\n        this._resolverHash = {};\n        this._rootPath = null;\n        this._basePath = null;\n        this._manifest = null;\n        this._bundles = {};\n        this._defaultSearchParams = null;\n    }\n\n    /**\n     * Sets the default URL search parameters for the URL resolver. The urls can be specified as a string or an object.\n     * @param searchParams - the default url parameters to append when resolving urls\n     */\n    public setDefaultSearchParams(searchParams: string | Record<string, unknown>): void\n    {\n        if (typeof searchParams === 'string')\n        {\n            this._defaultSearchParams = searchParams;\n        }\n        else\n        {\n            const queryValues = searchParams as Record<string, any>;\n\n            this._defaultSearchParams = Object.keys(queryValues)\n                .map((key) => `${encodeURIComponent(key)}=${encodeURIComponent(queryValues[key])}`)\n                .join('&');\n        }\n    }\n\n    /**\n     * Returns the aliases for a given asset\n     * @param asset - the asset to get the aliases for\n     */\n    public getAlias(asset: UnresolvedAsset): string[]\n    {\n        const { alias, src } = asset;\n        const aliasesToUse = convertToList<ArrayOr<string | AssetSrc>>(\n            alias || src, (value: string | AssetSrc) =>\n            {\n                if (typeof value === 'string') return value;\n\n                if (Array.isArray(value)) return value.map((v) => (v as ResolvedSrc)?.src ?? v);\n\n                if (value?.src) return value.src;\n\n                return value;\n            }, true) as string[];\n\n        return aliasesToUse;\n    }\n\n    /**\n     * Removes the specified alias for an asset.\n     *\n     * This only removes the alias mapping. It does **not** remove, unload, or destroy the\n     * underlying asset. If the asset is already cached, it stays in memory until you call\n     * `Assets.unload`.\n     *\n     * If `asset` is provided, the alias is only removed when the resolver's current mapping for\n     * that alias matches the given `ResolvedAsset`. This lets you avoid accidentally removing an\n     * alias that has been reassigned.\n     *\n     * Silently returns if the alias does not exist or the asset does not match.\n     * @param alias - the alias to remove\n     * @param asset - only remove the alias if it is currently assigned to this asset\n     * @example\n     * ```ts\n     * resolver.add({ alias: 'hero', src: 'hero.png' });\n     *\n     * // Simple removal\n     * resolver.removeAlias('hero');\n     *\n     * // Conditional removal — only if alias currently maps to a specific asset\n     * const resolved = resolver.resolve('hero');\n     * resolver.removeAlias('hero', resolved);\n     * ```\n     */\n    public removeAlias(alias: string, asset?: ResolvedAsset): void\n    {\n        if (!this._assetMap[alias])\n        {\n            return;\n        }\n\n        if (asset && asset !== this._resolverHash[alias])\n        {\n            return;\n        }\n\n        delete this._resolverHash[alias];\n        delete this._assetMap[alias];\n    }\n\n    /**\n     * Add a manifest to the asset resolver. This is a nice way to add all the asset information in one go.\n     * generally a manifest would be built using a tool.\n     * @param manifest - the manifest to add to the resolver\n     */\n    public addManifest(manifest: AssetsManifest): void\n    {\n        if (this._manifest)\n        {\n            // #if _DEBUG\n            warn('[Resolver] Manifest already exists, this will be overwritten');\n            // #endif\n        }\n\n        this._manifest = manifest;\n\n        manifest.bundles.forEach((bundle) =>\n        {\n            this.addBundle(bundle.name, bundle.assets);\n        });\n    }\n\n    /**\n     * This adds a bundle of assets in one go so that you can resolve them as a group.\n     * For example you could add a bundle for each screen in you pixi app\n     * @example\n     * resolver.addBundle('animals', [\n     *  { alias: 'bunny', src: 'bunny.png' },\n     *  { alias: 'chicken', src: 'chicken.png' },\n     *  { alias: 'thumper', src: 'thumper.png' },\n     * ]);\n     * // or\n     * resolver.addBundle('animals', {\n     *     bunny: 'bunny.png',\n     *     chicken: 'chicken.png',\n     *     thumper: 'thumper.png',\n     * });\n     *\n     * const resolvedAssets = await resolver.resolveBundle('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: AssetsBundle['assets']): void\n    {\n        const assetNames: string[] = [];\n        let convertedAssets: UnresolvedAsset[] = assets as UnresolvedAsset[];\n\n        if (!Array.isArray(assets))\n        {\n            // convert to array...\n            convertedAssets = Object.entries(assets).map(([alias, src]) =>\n            {\n                if (typeof src === 'string' || Array.isArray(src))\n                {\n                    return { alias, src };\n                }\n\n                return { alias, ...src };\n            });\n        }\n\n        // when storing keys against a bundle we prepend the bundleId to each asset key\n        // and pass it through as an additional alias for the asset\n        // this keeps clashing ids separate on a per-bundle basis\n        // you can also resolve a file using the bundleId-assetId syntax\n\n        convertedAssets.forEach((asset) =>\n        {\n            const srcs = asset.src;\n            const aliases = asset.alias;\n            let ids: string[];\n\n            if (typeof aliases === 'string')\n            {\n                const bundleAssetId = this._createBundleAssetId(bundleId, aliases);\n\n                assetNames.push(bundleAssetId);\n                ids = [aliases, bundleAssetId];\n            }\n            else\n            {\n                const bundleIds = aliases.map((name) => this._createBundleAssetId(bundleId, name));\n\n                assetNames.push(...bundleIds);\n                ids = [...aliases, ...bundleIds];\n            }\n\n            this.add({\n                ...asset,\n                ...{\n                    alias: ids,\n                    src: srcs,\n                }\n            });\n        });\n\n        this._bundles[bundleId] = assetNames;\n    }\n\n    /**\n     * Tells the resolver what keys are associated with witch asset.\n     * The most important thing the resolver does\n     * @example\n     * // Single key, single asset:\n     * resolver.add({alias: 'foo', src: 'bar.png');\n     * resolver.resolveUrl('foo') // => 'bar.png'\n     *\n     * // Multiple keys, single asset:\n     * resolver.add({alias: ['foo', 'boo'], src: 'bar.png'});\n     * resolver.resolveUrl('foo') // => 'bar.png'\n     * resolver.resolveUrl('boo') // => 'bar.png'\n     *\n     * // Multiple keys, multiple assets:\n     * resolver.add({alias: ['foo', 'boo'], src: ['bar.png', 'bar.webp']});\n     * resolver.resolveUrl('foo') // => 'bar.png'\n     *\n     * // Add custom data attached to the resolver\n     * Resolver.add({\n     *     alias: 'bunnyBooBooSmooth',\n     *     src: 'bunny{png,webp}',\n     *     data: { scaleMode:SCALE_MODES.NEAREST }, // Base texture options\n     * });\n     *\n     * resolver.resolve('bunnyBooBooSmooth') // => { src: 'bunny.png', data: { scaleMode: SCALE_MODES.NEAREST } }\n     * @param aliases - the UnresolvedAsset or array of UnresolvedAssets to add to the resolver\n     */\n    public add(\n        aliases: ArrayOr<UnresolvedAsset>,\n    ): void\n    {\n        const assets: UnresolvedAsset[] = [];\n\n        if (Array.isArray(aliases))\n        {\n            assets.push(...(aliases as UnresolvedAsset[]));\n        }\n        else\n        {\n            assets.push(aliases as UnresolvedAsset);\n        }\n\n        let keyCheck: (key: string) => void;\n\n        // #if _DEBUG\n        // eslint-disable-next-line prefer-const\n        keyCheck = (key: string) =>\n        {\n            if (this.hasKey(key))\n            {\n                // #if _DEBUG\n                warn(`[Resolver] already has key: ${key} overwriting`);\n                // #endif\n            }\n        };\n        // #endif\n\n        const assetArray = convertToList(assets);\n\n        // loop through all the assets and generate a resolve asset for each src\n        assetArray.forEach((asset) =>\n        {\n            const { src } = asset;\n            let {\n                data,\n                format,\n                loadParser: userDefinedLoadParser,\n                parser: userDefinedParser,\n            } = asset;\n\n            // src can contain an unresolved asset itself\n            // so we need to merge that data with the current asset\n            // we dont need to create string variations for the src if it is a ResolvedAsset\n            const srcsToUse: (string | ResolvedSrc)[][] = convertToList<AssetSrc>(src).map((src) =>\n            {\n                if (typeof src === 'string')\n                { return createStringVariations(src); }\n\n                return Array.isArray(src) ? src : [src];\n            });\n\n            const aliasesToUse = this.getAlias(asset);\n\n            // #if _DEBUG\n            Array.isArray(aliasesToUse) ? aliasesToUse.forEach(keyCheck) : keyCheck(aliasesToUse);\n            // #endif\n\n            // loop through all the srcs and generate a resolve asset for each src\n            const resolvedAssets: ResolvedAsset[] = [];\n\n            // Helper function to parse a URL string using registered parsers\n            const parseUrl = (url: string): ResolvedAsset =>\n            {\n                const parser = this._parsers.find((p) => p.test(url));\n\n                return {\n                    src: url,\n                    ...parser?.parse(url),\n                };\n            };\n\n            srcsToUse.forEach((srcs) =>\n            {\n                srcs.forEach((src) =>\n                {\n                    let formattedAsset = {} as ResolvedAsset;\n\n                    if (typeof src !== 'object')\n                    {\n                        // first see if it contains any {} tags...\n                        formattedAsset = parseUrl(src);\n                    }\n                    else\n                    {\n                        data = src.data ?? data;\n                        format = src.format ?? format;\n                        if (src.loadParser || src.parser)\n                        {\n                            userDefinedLoadParser = src.loadParser ?? userDefinedLoadParser;\n                            userDefinedParser = src.parser ?? userDefinedParser;\n                        }\n\n                        formattedAsset = {\n                            ...parseUrl(src.src),\n                            ...src,\n                        };\n                    }\n\n                    // check if aliases is undefined\n                    if (!aliasesToUse)\n                    {\n                        throw new Error(`[Resolver] alias is undefined for this asset: ${formattedAsset.src}`);\n                    }\n\n                    formattedAsset = this._buildResolvedAsset(formattedAsset, {\n                        aliases: aliasesToUse,\n                        data,\n                        format,\n                        loadParser: userDefinedLoadParser,\n                        parser: userDefinedParser,\n                        progressSize: asset.progressSize,\n                    });\n\n                    resolvedAssets.push(formattedAsset);\n                });\n            });\n\n            aliasesToUse.forEach((alias) =>\n            {\n                this._assetMap[alias] = resolvedAssets;\n            });\n        });\n    }\n\n    // TODO: this needs an overload like load did in Assets\n    /**\n     * If the resolver has had a manifest set via setManifest, this will return the assets urls for\n     * a given bundleId or bundleIds.\n     * @example\n     * // Manifest Example\n     * const manifest = {\n     *     bundles: [\n     *         {\n     *             name: 'load-screen',\n     *             assets: [\n     *                 {\n     *                     alias: 'background',\n     *                     src: 'sunset.png',\n     *                 },\n     *                 {\n     *                     alias: 'bar',\n     *                     src: 'load-bar.{png,webp}',\n     *                 },\n     *             ],\n     *         },\n     *         {\n     *             name: 'game-screen',\n     *             assets: [\n     *                 {\n     *                     alias: 'character',\n     *                     src: 'robot.png',\n     *                 },\n     *                 {\n     *                     alias: 'enemy',\n     *                     src: 'bad-guy.png',\n     *                 },\n     *             ],\n     *         },\n     *     ]\n     * };\n     *\n     * resolver.setManifest(manifest);\n     * const resolved = resolver.resolveBundle('load-screen');\n     * @param bundleIds - The bundle ids to resolve\n     * @returns All the bundles assets or a hash of assets for each bundle specified\n     */\n    public resolveBundle(bundleIds: ArrayOr<string>):\n    Record<string, ResolvedAsset> | Record<string, Record<string, ResolvedAsset>>\n    {\n        const singleAsset = isSingleItem(bundleIds);\n\n        bundleIds = convertToList<string>(bundleIds);\n\n        const out: Record<string, Record<string, ResolvedAsset>> = {};\n\n        bundleIds.forEach((bundleId) =>\n        {\n            const assetNames = this._bundles[bundleId];\n\n            if (assetNames)\n            {\n                const results = this.resolve(assetNames) as Record<string, ResolvedAsset>;\n\n                const assets: Record<string, ResolvedAsset> = {};\n\n                for (const key in results)\n                {\n                    const asset = results[key];\n\n                    assets[this._extractAssetIdFromBundle(bundleId, key)] = asset;\n                }\n\n                out[bundleId] = assets;\n            }\n        });\n\n        return singleAsset ? out[bundleIds[0]] : out;\n    }\n\n    /**\n     * Does exactly what resolve does, but returns just the URL rather than the whole asset object\n     * @param key - The key or keys to resolve\n     * @returns - The URLs associated with the key(s)\n     */\n    public resolveUrl(key: ArrayOr<string>): string | Record<string, string>\n    {\n        const result = this.resolve(key as string) as ResolvedAsset | Record<string, ResolvedAsset>;\n\n        if (typeof key !== 'string')\n        {\n            const out: Record<string, string> = {};\n\n            for (const i in result)\n            {\n                out[i] = (result as Record<string, ResolvedAsset>)[i].src;\n            }\n\n            return out;\n        }\n\n        return (result as ResolvedAsset).src;\n    }\n\n    /**\n     * Resolves each key in the list to an asset object.\n     * Another key function of the resolver! After adding all the various key/asset pairs. this will run the logic\n     * of finding which asset to return based on any preferences set using the `prefer` function\n     * by default the same key passed in will be returned if nothing is matched by the resolver.\n     * @example\n     * resolver.add('boo', 'bunny.png');\n     *\n     * resolver.resolve('boo') // => { src: 'bunny.png' }\n     *\n     * // Will return the same string as no key was added for this value..\n     * resolver.resolve('another-thing.png') // => { src: 'another-thing.png' }\n     * @param keys - key or keys to resolve\n     * @returns - the resolve asset or a hash of resolve assets for each key specified\n     */\n    public resolve(keys: string): ResolvedAsset;\n    public resolve(keys: string[]): Record<string, ResolvedAsset>;\n    public resolve(keys: ArrayOr<string>): ResolvedAsset | Record<string, ResolvedAsset>\n    {\n        const singleAsset = isSingleItem(keys);\n\n        keys = convertToList<string>(keys);\n\n        const result: Record<string, ResolvedAsset> = {};\n\n        keys.forEach((key) =>\n        {\n            if (!this._resolverHash[key])\n            {\n                if (this._assetMap[key])\n                {\n                    let assets = this._assetMap[key];\n                    const preferredOrder = this._getPreferredOrder(assets);\n\n                    preferredOrder?.priority.forEach((priorityKey) =>\n                    {\n                        preferredOrder.params[priorityKey].forEach((value: unknown) =>\n                        {\n                            const filteredAssets = assets.filter((asset) =>\n                            {\n                                if (asset[priorityKey as keyof ResolvedAsset])\n                                {\n                                    return asset[priorityKey as keyof ResolvedAsset] === value;\n                                }\n\n                                return false;\n                            });\n\n                            if (filteredAssets.length)\n                            {\n                                assets = filteredAssets;\n                            }\n                        });\n                    });\n\n                    this._resolverHash[key] = assets[0];\n                }\n                else\n                {\n                    this._resolverHash[key] = this._buildResolvedAsset({\n                        alias: [key],\n                        src: key,\n                    }, {});\n                }\n            }\n\n            result[key] = this._resolverHash[key];\n        });\n\n        return singleAsset ? result[keys[0]] : result;\n    }\n\n    /**\n     * Checks if an asset with a given key exists in the resolver\n     * @param key - The key of the asset\n     */\n    public hasKey(key: string): boolean\n    {\n        return !!this._assetMap[key];\n    }\n\n    /**\n     * Checks if a bundle with the given key exists in the resolver\n     * @param key - The key of the bundle\n     */\n    public hasBundle(key: string): boolean\n    {\n        return !!this._bundles[key];\n    }\n\n    /**\n     * Internal function for figuring out what prefer criteria an asset should use.\n     * @param assets\n     */\n    private _getPreferredOrder(assets: ResolvedAsset[]): PreferOrder\n    {\n        for (let i = 0; i < assets.length; i++)\n        {\n            const asset = assets[i];\n\n            const preferred = this._preferredOrder.find((preference: PreferOrder) =>\n                preference.params.format.includes(asset.format));\n\n            if (preferred)\n            {\n                return preferred;\n            }\n        }\n\n        return this._preferredOrder[0];\n    }\n\n    /**\n     * Appends the default url parameters to the url\n     * @param url - The url to append the default parameters to\n     * @returns - The url with the default parameters appended\n     */\n    private _appendDefaultSearchParams(url: string): string\n    {\n        if (!this._defaultSearchParams) return url;\n\n        const paramConnector = (/\\?/).test(url) ? '&' : '?';\n\n        return `${url}${paramConnector}${this._defaultSearchParams}`;\n    }\n\n    private _buildResolvedAsset(formattedAsset: ResolvedAsset, data?: {\n        aliases?: string[],\n        data?: Record<string, unknown>\n        loadParser?: string,\n        parser?: string,\n        format?: string,\n        progressSize?: number,\n    }): ResolvedAsset\n    {\n        const { aliases, data: assetData, loadParser, parser, format, progressSize } = data;\n\n        if (this._basePath || this._rootPath)\n        {\n            formattedAsset.src = path.toAbsolute(formattedAsset.src, this._basePath, this._rootPath);\n        }\n\n        formattedAsset.alias = aliases ?? formattedAsset.alias ?? [formattedAsset.src];\n        formattedAsset.src = this._appendDefaultSearchParams(formattedAsset.src);\n        formattedAsset.data = { ...assetData || {}, ...formattedAsset.data };\n        formattedAsset.loadParser = loadParser ?? formattedAsset.loadParser;\n        formattedAsset.parser = parser ?? formattedAsset.parser;\n        formattedAsset.format = format ?? formattedAsset.format ?? getUrlExtension(formattedAsset.src);\n        if (progressSize !== undefined)\n        {\n            formattedAsset.progressSize = progressSize;\n        }\n\n        return formattedAsset;\n    }\n}\n\n/**\n * @param url\n * @internal\n */\nexport function getUrlExtension(url: string)\n{\n    return url.split('.').pop().split('?').shift()\n        .split('#')\n        .shift();\n}\n"],"names":["src"],"mappings":"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"}