UNPKG

pixi.js

Version:

<p align="center"> <a href="https://pixijs.com" target="_blank" rel="noopener noreferrer"> <img height="150" src="https://files.pixijs.download/branding/pixijs-logo-transparent-dark.svg?v=1" alt="PixiJS logo"> </a> </p> <br/> <p align="center">

1 lines 43 kB
{"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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"}