{"version":3,"file":"index.mjs","sources":["../src/index.ts"],"sourcesContent":["/**\n * Collection of valid extension types.\n * @memberof PIXI\n * @property {string} Application - Application plugins\n * @property {string} RendererPlugin - Plugins for Renderer\n * @property {string} CanvasRendererPlugin - Plugins for CanvasRenderer\n * @property {string} Loader - Plugins to use with Loader\n * @property {string} LoadParser - Parsers for Assets loader.\n * @property {string} ResolveParser - Parsers for Assets resolvers.\n * @property {string} CacheParser - Parsers for Assets cache.\n */\nenum ExtensionType\n// eslint-disable-next-line @typescript-eslint/indent\n{\n    Renderer = 'renderer',\n    Application = 'application',\n    RendererSystem = 'renderer-webgl-system',\n    RendererPlugin = 'renderer-webgl-plugin',\n    CanvasRendererSystem = 'renderer-canvas-system',\n    CanvasRendererPlugin = 'renderer-canvas-plugin',\n    Asset = 'asset',\n    LoadParser = 'load-parser',\n    ResolveParser = 'resolve-parser',\n    CacheParser = 'cache-parser',\n    DetectionParser = 'detection-parser',\n}\n\ninterface ExtensionMetadataDetails\n{\n    type: ExtensionType | ExtensionType[];\n    name?: string;\n    priority?: number;\n}\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 PIXI\n */\ninterface ExtensionFormatLoose\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 * Strict extension format that is used internally for registrations.\n * @memberof PIXI\n */\ninterface ExtensionFormat extends ExtensionFormatLoose\n{\n    /** The extension type, always expressed as multiple, even if a single */\n    type: ExtensionType[];\n}\n\ntype ExtensionHandler = (extension: ExtensionFormat) => void;\n\n/**\n * Convert input into extension format data.\n * @ignore\n */\nconst normalizeExtension = (ext: ExtensionFormatLoose | any): ExtensionFormat =>\n{\n    // Class/Object submission, use extension object\n    if (typeof ext === 'function' || (typeof ext === 'object' && ext.extension))\n    {\n        if (process.env.DEBUG)\n        {\n            if (!ext.extension)\n            {\n                throw new Error('Extension class must have an extension object');\n            }\n        }\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 */\nconst normalizePriority = (ext: ExtensionFormatLoose | any, defaultPriority: number): number =>\n    normalizeExtension(ext).priority ?? defaultPriority;\n\n/**\n * Global registration of all PixiJS extensions. One-stop-shop for extensibility.\n * @memberof PIXI\n * @namespace 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, ExtensionFormat[]>>,\n\n    /**\n     * Remove extensions from PixiJS.\n     * @param extensions - Extensions to be removed.\n     * @returns {PIXI.extensions} For chaining.\n     */\n    remove(...extensions: Array<ExtensionFormatLoose | 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 {PIXI.extensions} For chaining.\n     */\n    add(...extensions: Array<ExtensionFormatLoose | 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 for handling when extensions are added/registered passes {@link PIXI.ExtensionFormat}.\n     * @param onRemove  - Function for handling when extensions are removed/unregistered passes {@link PIXI.ExtensionFormat}.\n     * @returns {PIXI.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 (process.env.DEBUG)\n        {\n            if (addHandlers[type] || removeHandlers[type])\n            {\n                throw new Error(`Extension type ${type} already has a handler`);\n            }\n        }\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 {PIXI.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.\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 {PIXI.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) => normalizePriority(b, defaultPriority) - normalizePriority(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    ExtensionFormat,\n    ExtensionFormatLoose,\n    ExtensionHandler,\n    ExtensionMetadata,\n};\n"],"names":["ExtensionType","extensions"],"mappings":"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"}