1 line
46 KiB
Plaintext
1 line
46 KiB
Plaintext
{"version":3,"file":"Assets.mjs","sources":["../../src/assets/Assets.ts"],"sourcesContent":["/* eslint-disable max-len */\nimport { extensions, ExtensionType } from '../extensions/Extensions';\nimport { bitmapFontCachePlugin, loadBitmapFont } from '../scene/text-bitmap/asset/loadBitmapFont';\nimport { warn } from '../utils/logging/warn';\nimport { BackgroundLoader } from './BackgroundLoader';\nimport { Cache } from './cache/Cache';\nimport { cacheTextureArray } from './cache/parsers/cacheTextureArray';\nimport { detectAvif } from './detections/parsers/detectAvif';\nimport { detectDefaults } from './detections/parsers/detectDefaults';\nimport { detectMp4 } from './detections/parsers/detectMp4';\nimport { detectOgv } from './detections/parsers/detectOgv';\nimport { detectWebm } from './detections/parsers/detectWebm';\nimport { detectWebp } from './detections/parsers/detectWebp';\nimport { Loader } from './loader/Loader';\nimport { loadJson } from './loader/parsers/loadJson';\nimport { loadTxt } from './loader/parsers/loadTxt';\nimport { loadWebFont } from './loader/parsers/loadWebFont';\nimport { loadSvg } from './loader/parsers/textures/loadSVG';\nimport { type LoadTextureConfig, loadTextures } from './loader/parsers/textures/loadTextures';\nimport { loadVideoTextures } from './loader/parsers/textures/loadVideoTextures';\nimport { resolveJsonUrl } from './resolver/parsers/resolveJsonUrl';\nimport { resolveTextureUrl } from './resolver/parsers/resolveTextureUrl';\nimport { Resolver } from './resolver/Resolver';\nimport { convertToList } from './utils/convertToList';\nimport { isSingleItem } from './utils/isSingleItem';\n\nimport type { AssetExtension } from './AssetExtension';\nimport type { FormatDetectionParser } from './detections/types';\nimport type { LoadSVGConfig } from './loader/parsers/textures/loadSVG';\nimport type { BundleIdentifierOptions } from './resolver/Resolver';\nimport type { ArrayOr, AssetsBundle, AssetsManifest, ResolvedAsset, UnresolvedAsset } from './types';\n\n/**\n * Callback for 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.\n * @memberof assets\n * @callback ProgressCallback\n * @param {number} progress - The percentage (0.0 - 1.0) of the assets loaded.\n * @returns {void}\n * @example\n * (progress) => console.log(progress * 100 + '%')\n */\nexport type ProgressCallback = (progress: number) => void;\n\n/**\n * Extensible preferences that can be used, for instance, when configuring loaders.\n * @since 7.2.0\n * @memberof assets\n */\nexport interface AssetsPreferences extends LoadTextureConfig, LoadSVGConfig, PixiMixins.AssetsPreferences {}\n\n/**\n * Initialization options object for the Assets Class.\n * @memberof assets\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 | AssetsManifest;\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 preferred) or a single resolutions */\n resolution?: number | number[];\n /**\n * the formats you prefer, by default this will be:\n * ['avif', 'webp', 'png', 'jpg', 'jpeg', 'webm', 'mp4', 'm4v', 'ogv']\n */\n format?: ArrayOr<string>;\n };\n\n /**\n * If true, don't attempt to detect whether browser has preferred formats available.\n * May result in increased performance as it skips detection step.\n */\n skipDetections?: boolean;\n\n /** advanced - override how bundlesIds are generated */\n bundleIdentifier?: BundleIdentifierOptions;\n\n /** Optional loader preferences */\n preferences?: Partial<AssetsPreferences>;\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 * @namespace assets\n *\n * Use the singleton class [Assets]{@link assets.Assets} to easily load and manage all your assets.\n *\n * ```typescript\n * import { Assets, Texture } from 'pixi.js';\n *\n * const bunnyTexture = await Assets.load<Texture>('bunny.png');\n * const sprite = new Sprite(bunnyTexture);\n * ```\n *\n * Check out the sections below for more information on how to deal with assets.\n *\n * <details id=\"assets-loading\">\n *\n * <summary>Asset Loading</summary>\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 'pixi.js';\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 Pixi supports the following files:\n * - Textures (**_avif_**, **_webp_**, **_png_**, **_jpg_**, **_gif_**, **_svg_**) via {@link assets.loadTextures}, {@link assets.loadSvg}\n * - Video Textures (**_mp4_**, **_m4v_**, **_webm_**, **_ogg_**, **_ogv_**, **_h264_**, **_avi_**, **_mov_**) via {@link assets.loadVideoTextures}\n * - Sprite sheets (**_json_**) via {@link assets.spritesheetAsset}\n * - Bitmap fonts (**_xml_**, **_fnt_**, **_txt_**) via {@link assets.loadBitmapFont}\n * - Web fonts (**_ttf_**, **_woff_**, **_woff2_**) via {@link assets.loadWebFont}\n * - JSON files (**_json_**) via {@link assets.loadJson}\n * - Text Files (**_txt_**) via {@link assets.loadTxt}\n * <br/>\n * More types can be added fairly easily by creating additional {@link assets.LoaderParser LoaderParsers}.\n * </details>\n *\n * <details id=\"textures\">\n *\n * <summary>Textures</summary>\n *\n * - Textures are loaded as ImageBitmap on a worker thread where possible. 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()` (see {@link core.from|Texture.from})\n * and now use this asset manager under the hood!\n * - Don't worry if you set preferences for textures that don't exist\n * (for example you prefer 2x resolutions images but only 1x is available for that texture,\n * the Assets 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: `my-spritesheet{resolution}.{imageFormat}.json`\n * <br><br>For example:\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 * - 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 * </details>\n *\n * <details id=\"fonts\">\n *\n * <summary>Fonts</summary>\n *\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 'pixi.js';\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 * </details>\n *\n * <details id=\"background-loading\">\n *\n * <summary>Background Loading</summary>\n *\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 * </details>\n *\n * <details id=\"manifests-and-bundles\">\n *\n * <summary>Manifest and Bundles</summary>\n *\n * - {@link assets.AssetsManifest Manifest} is a descriptor that contains a list of all assets and their properties.\n * - {@link assets.AssetsBundle Bundles} are a way to group assets together.\n *\n * ```js\n * import { Assets } from 'pixi.js';\n *\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 * await Assets.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 * </details>\n */\n\n/**\n * The global Assets class, it's a singleton so you don't need to instantiate it.\n *\n * **The `Assets` class 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 *\n * **It also has a few advanced features:**\n * 1. Allows developers to provide a {@link assets.Manifest} upfront of all assets and help manage\n * them via {@link assets.AssetsBundles 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 * @example\n * import { Assets } from 'pixi.js';\n *\n * const bunny = await Assets.load('bunny.png');\n * @memberof assets\n * @class Assets\n */\nexport class AssetsClass\n{\n /** the resolver to map various urls */\n public resolver: Resolver;\n /** The loader, loads stuff! */\n public loader: Loader;\n /**\n * The global cache of all assets within PixiJS\n * @type {assets.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 readonly _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 Assets class to work, only if you want to set any initial properties\n * @param options - options to initialize the Assets manager with\n */\n public async init(options: AssetInitOptions = {}): Promise<void>\n {\n if (this._initialized)\n {\n // #if _DEBUG\n warn('[Assets]AssetManager already initialized, did you load before calling this Assets.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<AssetsManifest>(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 const formats = await this._detectFormats({\n preferredFormats: options.texturePreference?.format,\n skipDetections: options.skipDetections,\n detections: this._detections\n });\n\n this.resolver.prefer({\n params: {\n format: formats,\n resolution,\n },\n });\n\n if (options.preferences)\n {\n this.setPreferences(options.preferences);\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 'pixi.js';\n *\n * // Simple\n * Assets.add({alias: 'bunnyBooBoo', src: 'bunny.png'});\n * const bunny = await Assets.load('bunnyBooBoo');\n *\n * // Multiple keys:\n * Assets.add({alias: ['burger', 'chicken'], src: '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 * alias: 'bunnyBooBooSmooth',\n * src: 'bunny{png,webp}',\n * data: { 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({alias: 'bunnyBooBoo', src: 'bunny{png,webp}'});\n *\n * Assets.add({\n * alias: 'bunnyBooBoo',\n * src: [\n * 'bunny.png',\n * 'bunny.webp',\n * ],\n * });\n *\n * const bunny = await Assets.load('bunnyBooBoo'); // Will try to load WebP if available\n * @param assets - the unresolved assets to add to the resolver\n */\n public add(assets: (ArrayOr<UnresolvedAsset>)): void\n {\n this.resolver.add(assets);\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 'pixi.js';\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 | UnresolvedAsset,\n onProgress?: ProgressCallback,\n ): Promise<T>;\n public async load<T = any>(\n urls: string[] | UnresolvedAsset[],\n onProgress?: ProgressCallback,\n ): Promise<Record<string, T>>;\n public async load<T = any>(\n urls: ArrayOr<string> | ArrayOr<UnresolvedAsset>,\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: string[] = convertToList<UnresolvedAsset | string>(urls)\n .map((url) =>\n {\n if (typeof url !== 'string')\n {\n const aliases = this.resolver.getAlias(url);\n\n if (aliases.some((alias) => !this.resolver.hasKey(alias)))\n {\n this.add(url);\n }\n\n return Array.isArray(aliases) ? aliases[0] : aliases;\n }\n\n // if it hasn't been added, add it now\n if (!this.resolver.hasKey(url)) this.add({ alias: url, src: url });\n\n return url;\n }) as string[];\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 'pixi.js';\n *\n * Assets.addBundle('animals', [\n * { alias: 'bunny', src: 'bunny.png' },\n * { alias: 'chicken', src: 'chicken.png' },\n * { alias: 'thumper', src: 'thumper.png' },\n * ]);\n * // or\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: AssetsBundle['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 'pixi.js';\n *\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 * await Assets.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: ArrayOr<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 initial 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 'pixi.js';\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: ArrayOr<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 'pixi.js';\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: ArrayOr<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: ArrayOr<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: ResolvedAsset | Record<string, ResolvedAsset>,\n onProgress?: ProgressCallback\n ): Promise<Record<string, T>>\n {\n const resolveArray = [...new Set(Object.values(resolveResults))] as ResolvedAsset[];\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) =>\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 keys.forEach((key) =>\n {\n out[key] = asset;\n });\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 'pixi.js';\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: ArrayOr<string> | ResolvedAsset | ResolvedAsset[]\n ): Promise<void>\n {\n if (!this._initialized)\n {\n await this.init();\n }\n\n const urlArray = convertToList<string | ResolvedAsset>(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 'pixi.js';\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: ArrayOr<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: ResolvedAsset | Record<string, ResolvedAsset>)\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 /**\n * Detects the supported formats for the browser, and returns an array of supported formats, respecting\n * the users preferred formats order.\n * @param options - the options to use when detecting formats\n * @param options.preferredFormats - the preferred formats to use\n * @param options.skipDetections - if we should skip the detections altogether\n * @param options.detections - the detections to use\n * @returns - the detected formats\n */\n private async _detectFormats(options: {\n preferredFormats: string | string[],\n skipDetections: boolean,\n detections: FormatDetectionParser[]\n }): Promise<string[]>\n {\n let formats: string[] = [];\n\n // set preferred formats\n if (options.preferredFormats)\n {\n formats = Array.isArray(options.preferredFormats)\n ? options.preferredFormats : [options.preferredFormats];\n }\n\n // we should add any formats that are supported by the browser\n for (const detection of options.detections)\n {\n if (options.skipDetections || await detection.test())\n {\n formats = await detection.add(formats);\n }\n else if (!options.skipDetections)\n {\n formats = await detection.remove(formats);\n }\n }\n\n // remove any duplicates\n formats = formats.filter((format, index) => formats.indexOf(format) === index);\n\n return formats;\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 * General setter for preferences. This is a helper function to set preferences on all parsers.\n * @param preferences - the preferences to set\n */\n public setPreferences(preferences: Partial<AssetsPreferences>): void\n {\n // Find matching config keys in loaders with preferences\n // and set the values\n this.loader.parsers.forEach((parser) =>\n {\n if (!parser.config) return;\n\n (Object.keys(parser.config) as (keyof AssetsPreferences)[])\n .filter((key) => key in preferences)\n .forEach((key) =>\n {\n parser.config[key] = preferences[key];\n });\n });\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);\nextensions.add(\n cacheTextureArray,\n\n detectDefaults,\n detectAvif,\n detectWebp,\n detectMp4,\n detectOgv,\n detectWebm,\n\n loadJson,\n loadTxt,\n loadWebFont,\n loadSvg,\n loadTextures,\n loadVideoTextures,\n loadBitmapFont,\n\n bitmapFontCachePlugin,\n\n resolveTextureUrl,\n resolveJsonUrl\n);\n\nconst assetKeyMap = {\n loader: ExtensionType.LoadParser,\n resolver: ExtensionType.ResolveParser,\n cache: ExtensionType.CacheParser,\n detection: ExtensionType.DetectionParser,\n};\n\ntype AssetType = keyof typeof assetKeyMap;\n\n// Split the Asset extension into it's various parts\n// these are handled in the Assets.ts file\nextensions.handle(ExtensionType.Asset, (extension) =>\n{\n const ref = extension.ref as AssetExtension;\n\n Object.entries(assetKeyMap)\n .filter(([key]) => !!ref[key as AssetType])\n .forEach(([key, type]) => extensions.add(Object.assign(\n ref[key as AssetType],\n // Allow the function to optionally define it's own\n // ExtensionMetadata, the use cases here is priority for LoaderParsers\n { extension: ref[key as AssetType].extension ?? type },\n )));\n}, (extension) =>\n{\n const ref = extension.ref as AssetExtension;\n\n Object.keys(assetKeyMap)\n .filter((key) => !!ref[key as AssetType])\n .forEach((key) => extensions.remove(ref[key as AssetType]));\n});\n"],"names":["resolveResult"],"mappings":"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"} |