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 • 22.3 kB
Source Map (JSON)
{"version":3,"file":"Extensions.mjs","sources":["../../src/extensions/Extensions.ts"],"sourcesContent":["/**\n * Collection of valid extension types.\n * @category extensions\n * @advanced\n */\nenum ExtensionType\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 * @category 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 * @category extensions\n * @advanced\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 * @category extensions\n * @advanced\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 * @category 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\n/**\n * The function that is called when an extension is added or removed.\n * @category extensions\n * @ignore\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 * @category extensions\n */\nexport const normalizeExtensionPriority = (ext: ExtensionFormat | any, defaultPriority: number): number =>\n normalizeExtension(ext).priority ?? defaultPriority;\n\n/**\n * Global registration system for all PixiJS extensions. Provides a centralized way to add, remove,\n * and manage functionality across the engine.\n *\n * Features:\n * - Register custom extensions and plugins\n * - Handle multiple extension types\n * - Priority-based ordering\n * @example\n * ```ts\n * import { extensions, ExtensionType } from 'pixi.js';\n *\n * // Register a simple object extension\n * extensions.add({\n * extension: {\n * type: ExtensionType.LoadParser,\n * name: 'my-loader',\n * priority: 100, // Optional priority for ordering\n * },\n * // add load parser functions\n * });\n *\n * // Register a class-based extension\n * class MyRendererPlugin {\n * static extension = {\n * type: [ExtensionType.WebGLSystem, ExtensionType.WebGPUSystem],\n * name: 'myRendererPlugin'\n * };\n *\n * // add renderer plugin methods\n * }\n * extensions.add(MyRendererPlugin);\n *\n * // Remove extensions\n * extensions.remove(MyRendererPlugin);\n * ```\n * @remarks\n * - Extensions must have a type from {@link ExtensionType}\n * - Can be registered before or after their handlers\n * - Supports priority-based ordering\n * - Automatically normalizes extension formats\n * @see {@link ExtensionType} For all available extension types\n * @see {@link ExtensionFormat} For extension registration format\n * @see {@link Application} For application plugin system\n * @see {@link LoaderParser} For asset loading extensions\n * @category extensions\n * @standard\n * @class\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. Can be:\n * - Extension class with static `extension` property\n * - Extension format object with `type` and `ref`\n * - Multiple extensions as separate arguments\n * @returns {extensions} this for chaining\n * @example\n * ```ts\n * // Remove a single extension\n * extensions.remove(MyRendererPlugin);\n *\n * // Remove multiple extensions\n * extensions.remove(\n * MyRendererPlugin,\n * MySystemPlugin\n * );\n * ```\n * @see {@link ExtensionType} For available extension types\n * @see {@link ExtensionFormat} For extension format details\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. Extensions can be registered in multiple formats:\n * - As a class with a static `extension` property\n * - As an extension format object\n * - As multiple extensions passed as separate arguments\n * @param extensions - Extensions to add to PixiJS. Each can be:\n * - A class with static `extension` property\n * - An extension format object with `type` and `ref`\n * - Multiple extensions as separate arguments\n * @returns This extensions instance for chaining\n * @example\n * ```ts\n * // Register a simple extension\n * extensions.add(MyRendererPlugin);\n *\n * // Register multiple extensions\n * extensions.add(\n * MyRendererPlugin,\n * MySystemPlugin,\n * });\n * ```\n * @see {@link ExtensionType} For available extension types\n * @see {@link ExtensionFormat} For extension format details\n * @see {@link extensions.remove} For removing registered extensions\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 this for chaining.\n * @internal\n * @ignore\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 this for chaining.\n * @ignore\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 this for chaining.\n * @ignore\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 this for chaining.\n * @ignore\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 /**\n * Mixin the source object(s) properties into the target class's prototype.\n * Copies all property descriptors from source objects to the target's prototype.\n * @param Target - The target class to mix properties into\n * @param sources - One or more source objects containing properties to mix in\n * @example\n * ```ts\n * // Create a mixin with shared properties\n * const moveable = {\n * x: 0,\n * y: 0,\n * move(x: number, y: number) {\n * this.x += x;\n * this.y += y;\n * }\n * };\n *\n * // Create a mixin with computed properties\n * const scalable = {\n * scale: 1,\n * get scaled() {\n * return this.scale > 1;\n * }\n * };\n *\n * // Apply mixins to a class\n * extensions.mixin(Sprite, moveable, scalable);\n *\n * // Use mixed-in properties\n * const sprite = new Sprite();\n * sprite.move(10, 20);\n * console.log(sprite.x, sprite.y); // 10, 20\n * ```\n * @remarks\n * - Copies all properties including getters/setters\n * - Does not modify source objects\n * - Preserves property descriptors\n * @see {@link Object.defineProperties} For details on property descriptors\n * @see {@link Object.getOwnPropertyDescriptors} For details on property copying\n */\n mixin(Target: any, ...sources: Parameters<typeof Object.getOwnPropertyDescriptors>[0][])\n {\n // Apply each source's properties to the target prototype\n for (const source of sources)\n {\n Object.defineProperties(Target.prototype, Object.getOwnPropertyDescriptors(source));\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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"}