1 line
18 KiB
Plaintext
1 line
18 KiB
Plaintext
{"version":3,"file":"Extensions.mjs","sources":["../../src/extensions/Extensions.ts"],"sourcesContent":["/**\n * `extensions` is a global object that holds all the extensions registered with PixiJS.\n * PixiJS uses a this extensions architecture a lot to make the library more modular and\n * flexible.\n *\n * For example, if you want to add load a new type of asset, you can register a new\n * {@link assets.LoaderParser} with the `extensions` object.\n *\n * ```js\n * import { extensions, ExtensionType } from 'pixi.js';\n *\n * // create a custom asset loader\n * const customAssetLoader = {\n * extension: {\n * type: ExtensionType.LoadParser,\n * name: 'custom-asset-loader',\n * },\n * test(url) {\n * // check if this new loader should be used...\n * },\n * load(url) {\n * // load the asset...\n * },\n * };\n *\n * // add the custom asset loader to pixi\n * extensions.add(customAssetLoader);\n * ```\n *\n * This would add the `customAssetLoader` to the list of available loaders that PixiJS can use.\n *\n * There are many different types of extensions, which are listed in {@link extensions.ExtensionType}.\n * @namespace extensions\n */\n\n/**\n * Collection of valid extension types.\n * @memberof extensions\n */\nenum ExtensionType\n// eslint-disable-next-line @typescript-eslint/indent\n{\n /** extensions that are registered as Application plugins */\n Application = 'application',\n\n /** extensions that are registered as WebGL render pipes */\n WebGLPipes = 'webgl-pipes',\n /** extensions that are registered as WebGL render pipes adaptors */\n WebGLPipesAdaptor = 'webgl-pipes-adaptor',\n /** extensions that are registered as WebGL render systems */\n WebGLSystem = 'webgl-system',\n\n /** extensions that are registered as WebGPU render pipes */\n WebGPUPipes = 'webgpu-pipes',\n /** extensions that are registered as WebGPU render pipes adaptors */\n WebGPUPipesAdaptor = 'webgpu-pipes-adaptor',\n /** extensions that are registered as WebGPU render systems */\n WebGPUSystem = 'webgpu-system',\n\n /** extensions that are registered as Canvas render pipes */\n CanvasSystem = 'canvas-system',\n /** extensions that are registered as Canvas render pipes adaptors */\n CanvasPipesAdaptor = 'canvas-pipes-adaptor',\n /** extensions that are registered as Canvas render systems */\n CanvasPipes = 'canvas-pipes',\n\n /** extensions that combine the other Asset extensions */\n Asset = 'asset',\n /** extensions that are used to load assets through Assets */\n LoadParser = 'load-parser',\n /** extensions that are used to resolve asset urls through Assets */\n ResolveParser = 'resolve-parser',\n /** extensions that are used to handle how urls are cached by Assets */\n CacheParser = 'cache-parser',\n /** extensions that are used to add/remove available resources from Assets */\n DetectionParser = 'detection-parser',\n\n /** extensions that are registered with the MaskEffectManager */\n MaskEffect = 'mask-effect',\n\n /** A type of extension for creating a new advanced blend mode */\n BlendMode = 'blend-mode',\n\n /** A type of extension that will be used to auto detect a resource type */\n TextureSource = 'texture-source',\n\n /** A type of extension that will be used to auto detect an environment */\n Environment = 'environment',\n\n /** A type of extension for building and triangulating custom shapes used in graphics. */\n ShapeBuilder = 'shape-builder',\n\n /** A type of extension for creating custom batchers used in rendering. */\n Batcher = 'batcher',\n}\n\n/**\n * The metadata for an extension.\n * @memberof extensions\n * @ignore\n */\ninterface ExtensionMetadataDetails\n{\n /** The extension type, can be multiple types */\n type: ExtensionType | ExtensionType[];\n /** Optional. Some plugins provide an API name/property, to make them more easily accessible */\n name?: string;\n /** Optional, used for sorting the plugins in a particular order */\n priority?: number;\n}\n\n/**\n * The metadata for an extension.\n * @memberof extensions\n */\ntype ExtensionMetadata = ExtensionType | ExtensionMetadataDetails;\n\n/**\n * Format when registering an extension. Generally, the extension\n * should have these values as `extension` static property,\n * but you can override name or type by providing an object.\n * @memberof extensions\n */\ninterface ExtensionFormat\n{\n /** The extension type, can be multiple types */\n type: ExtensionType | ExtensionType[];\n /** Optional. Some plugins provide an API name/property, such as Renderer plugins */\n name?: string;\n /** Optional, used for sorting the plugins in a particular order */\n priority?: number;\n /** Reference to the plugin object/class */\n ref: any;\n}\n\n/**\n * Extension format that is used internally for registrations.\n * @memberof extensions\n * @ignore\n */\ninterface StrictExtensionFormat extends ExtensionFormat\n{\n /** The extension type, always expressed as multiple, even if a single */\n type: ExtensionType[];\n}\n\ntype ExtensionHandler = (extension: StrictExtensionFormat) => void;\n\n/**\n * Convert input into extension format data.\n * @ignore\n */\nconst normalizeExtension = (ext: ExtensionFormat | any): StrictExtensionFormat =>\n{\n // Class/Object submission, use extension object\n if (typeof ext === 'function' || (typeof ext === 'object' && ext.extension))\n {\n // #if _DEBUG\n if (!ext.extension)\n {\n throw new Error('Extension class must have an extension object');\n }\n // #endif\n const metadata: ExtensionMetadataDetails = (typeof ext.extension !== 'object')\n ? { type: ext.extension }\n : ext.extension;\n\n ext = { ...metadata, ref: ext };\n }\n if (typeof ext === 'object')\n {\n ext = { ...ext };\n }\n else\n {\n throw new Error('Invalid extension type');\n }\n\n if (typeof ext.type === 'string')\n {\n ext.type = [ext.type];\n }\n\n return ext;\n};\n\n/**\n * Get the priority for an extension.\n * @ignore\n * @param ext - Any extension\n * @param defaultPriority - Fallback priority if none is defined.\n * @returns The priority for the extension.\n * @memberof extensions\n */\nexport const normalizeExtensionPriority = (ext: ExtensionFormat | any, defaultPriority: number): number =>\n normalizeExtension(ext).priority ?? defaultPriority;\n\n/**\n * Global registration of all PixiJS extensions. One-stop-shop for extensibility.\n *\n * Import the `extensions` object and use it to register new functionality via the described methods below.\n * ```js\n * import { extensions } from 'pixi.js';\n *\n * // register a new extension\n * extensions.add(myExtension);\n * ```\n * @property {Function} remove - Remove extensions from PixiJS.\n * @property {Function} add - Register new extensions with PixiJS.\n * @property {Function} handle - Internal method to handle extensions by name.\n * @property {Function} handleByMap - Handle a type, but using a map by `name` property.\n * @property {Function} handleByNamedList - Handle a type, but using a list of extensions with a `name` property.\n * @property {Function} handleByList - Handle a type, but using a list of extensions.\n * @memberof extensions\n */\nconst extensions = {\n\n /** @ignore */\n _addHandlers: {} as Partial<Record<ExtensionType, ExtensionHandler>>,\n\n /** @ignore */\n _removeHandlers: {} as Partial<Record<ExtensionType, ExtensionHandler>>,\n\n /** @ignore */\n _queue: {} as Partial<Record<ExtensionType, StrictExtensionFormat[]>>,\n\n /**\n * Remove extensions from PixiJS.\n * @param extensions - Extensions to be removed.\n * @returns {extensions} For chaining.\n */\n remove(...extensions: Array<ExtensionFormat | any>)\n {\n extensions.map(normalizeExtension).forEach((ext) =>\n {\n ext.type.forEach((type) => this._removeHandlers[type]?.(ext));\n });\n\n return this;\n },\n\n /**\n * Register new extensions with PixiJS.\n * @param extensions - The spread of extensions to add to PixiJS.\n * @returns {extensions} For chaining.\n */\n add(...extensions: Array<ExtensionFormat | any>)\n {\n // Handle any extensions either passed as class w/ data or as data\n extensions.map(normalizeExtension).forEach((ext) =>\n {\n ext.type.forEach((type) =>\n {\n const handlers = this._addHandlers;\n const queue = this._queue;\n\n if (!handlers[type])\n {\n queue[type] = queue[type] || [];\n queue[type]?.push(ext);\n }\n else\n {\n handlers[type]?.(ext);\n }\n });\n });\n\n return this;\n },\n\n /**\n * Internal method to handle extensions by name.\n * @param type - The extension type.\n * @param onAdd - Function handler when extensions are added/registered {@link StrictExtensionFormat}.\n * @param onRemove - Function handler when extensions are removed/unregistered {@link StrictExtensionFormat}.\n * @returns {extensions} For chaining.\n */\n handle(type: ExtensionType, onAdd: ExtensionHandler, onRemove: ExtensionHandler)\n {\n const addHandlers = this._addHandlers;\n const removeHandlers = this._removeHandlers;\n\n // #if _DEBUG\n if (addHandlers[type] || removeHandlers[type])\n {\n throw new Error(`Extension type ${type} already has a handler`);\n }\n // #endif\n\n addHandlers[type] = onAdd;\n removeHandlers[type] = onRemove;\n\n // Process the queue\n const queue = this._queue;\n\n // Process any plugins that have been registered before the handler\n if (queue[type])\n {\n queue[type]?.forEach((ext) => onAdd(ext));\n delete queue[type];\n }\n\n return this;\n },\n\n /**\n * Handle a type, but using a map by `name` property.\n * @param type - Type of extension to handle.\n * @param map - The object map of named extensions.\n * @returns {extensions} For chaining.\n */\n handleByMap(type: ExtensionType, map: Record<string, any>)\n {\n return this.handle(type,\n (extension) =>\n {\n if (extension.name)\n {\n map[extension.name] = extension.ref;\n }\n },\n (extension) =>\n {\n if (extension.name)\n {\n delete map[extension.name];\n }\n }\n );\n },\n\n /**\n * Handle a type, but using a list of extensions with a `name` property.\n * @param type - Type of extension to handle.\n * @param map - The array of named extensions.\n * @param defaultPriority - Fallback priority if none is defined.\n * @returns {extensions} For chaining.\n */\n handleByNamedList(type: ExtensionType, map: {name: string, value: any}[], defaultPriority = -1)\n {\n return this.handle(\n type,\n (extension) =>\n {\n const index = map.findIndex((item) => item.name === extension.name);\n\n if (index >= 0) return;\n\n map.push({ name: extension.name, value: extension.ref });\n map.sort((a, b) =>\n normalizeExtensionPriority(b.value, defaultPriority)\n - normalizeExtensionPriority(a.value, defaultPriority));\n },\n (extension) =>\n {\n const index = map.findIndex((item) => item.name === extension.name);\n\n if (index !== -1)\n {\n map.splice(index, 1);\n }\n }\n );\n },\n\n /**\n * Handle a type, but using a list of extensions.\n * @param type - Type of extension to handle.\n * @param list - The list of extensions.\n * @param defaultPriority - The default priority to use if none is specified.\n * @returns {extensions} For chaining.\n */\n handleByList(type: ExtensionType, list: any[], defaultPriority = -1)\n {\n return this.handle(\n type,\n (extension) =>\n {\n if (list.includes(extension.ref))\n {\n return;\n }\n\n list.push(extension.ref);\n list.sort((a, b) =>\n normalizeExtensionPriority(b, defaultPriority) - normalizeExtensionPriority(a, defaultPriority));\n },\n (extension) =>\n {\n const index = list.indexOf(extension.ref);\n\n if (index !== -1)\n {\n list.splice(index, 1);\n }\n }\n );\n },\n};\n\nexport {\n extensions,\n ExtensionType,\n};\nexport type {\n StrictExtensionFormat as ExtensionFormat,\n ExtensionFormat as ExtensionFormatLoose,\n ExtensionHandler,\n ExtensionMetadata,\n ExtensionMetadataDetails\n};\n"],"names":["ExtensionType","extensions"],"mappings":"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"} |