{"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 _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 */\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 Record<ExtensionType, ExtensionHandler>,\n\n    /** @ignore */\n    _removeHandlers: {} as Record<ExtensionType, ExtensionHandler>,\n\n    /** @ignore */\n    _queue: {} as 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 _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 {PIXI.extensions} For chaining.\n     */\n    handleByMap(type: ExtensionType, map: Record<string, any>)\n    {\n        return this.handle(type,\n            (extension) =>\n            {\n                map[extension.name] = extension.ref;\n            },\n            (extension) =>\n            {\n                delete map[extension.name];\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":[],"mappings":"AAWK,IAAA,aAAA,qBAAA,cAAL,KAAA;AAGI,EAAW,cAAA,CAAA,UAAA,CAAA,GAAA,UAAA,CAAA;AACX,EAAc,cAAA,CAAA,aAAA,CAAA,GAAA,aAAA,CAAA;AACd,EAAiB,cAAA,CAAA,gBAAA,CAAA,GAAA,uBAAA,CAAA;AACjB,EAAiB,cAAA,CAAA,gBAAA,CAAA,GAAA,uBAAA,CAAA;AACjB,EAAuB,cAAA,CAAA,sBAAA,CAAA,GAAA,wBAAA,CAAA;AACvB,EAAuB,cAAA,CAAA,sBAAA,CAAA,GAAA,wBAAA,CAAA;AACvB,EAAQ,cAAA,CAAA,OAAA,CAAA,GAAA,OAAA,CAAA;AACR,EAAa,cAAA,CAAA,YAAA,CAAA,GAAA,aAAA,CAAA;AACb,EAAgB,cAAA,CAAA,eAAA,CAAA,GAAA,gBAAA,CAAA;AAChB,EAAc,cAAA,CAAA,aAAA,CAAA,GAAA,cAAA,CAAA;AACd,EAAkB,cAAA,CAAA,iBAAA,CAAA,GAAA,kBAAA,CAAA;AAbjB,EAAA,OAAA,cAAA,CAAA;AAAA,CAAA,EAAA,aAAA,IAAA,EAAA,EAAA;AA2DL,MAAM,kBAAA,GAAqB,CAAC,GAC5B,KAAA;AAEI,EAAA,IAAI,OAAO,GAAQ,KAAA,UAAA,IAAe,OAAO,GAAQ,KAAA,QAAA,IAAY,IAAI,SACjE,EAAA;AAEI,IAAI,IAAA,CAAC,IAAI,SACT,EAAA;AACI,MAAM,MAAA,IAAI,MAAM,+CAA+C,CAAA,CAAA;AAAA,KACnE;AAEA,IAAM,MAAA,QAAA,GAAsC,OAAO,GAAA,CAAI,SAAc,KAAA,QAAA,GAC/D,EAAE,IAAM,EAAA,GAAA,CAAI,SAAU,EAAA,GACtB,GAAI,CAAA,SAAA,CAAA;AAEV,IAAA,GAAA,GAAM,EAAE,GAAG,QAAU,EAAA,GAAA,EAAK,GAAI,EAAA,CAAA;AAAA,GAClC;AACA,EAAI,IAAA,OAAO,QAAQ,QACnB,EAAA;AACI,IAAM,GAAA,GAAA,EAAE,GAAG,GAAI,EAAA,CAAA;AAAA,GAGnB,MAAA;AACI,IAAM,MAAA,IAAI,MAAM,wBAAwB,CAAA,CAAA;AAAA,GAC5C;AAEA,EAAI,IAAA,OAAO,GAAI,CAAA,IAAA,KAAS,QACxB,EAAA;AACI,IAAI,GAAA,CAAA,IAAA,GAAO,CAAC,GAAA,CAAI,IAAI,CAAA,CAAA;AAAA,GACxB;AAEA,EAAO,OAAA,GAAA,CAAA;AACX,CAAA,CAAA;AASA,MAAM,oBAAoB,CAAC,GAAA,EAAiC,oBACxD,kBAAmB,CAAA,GAAG,EAAE,QAAY,IAAA,eAAA,CAAA;AAOxC,MAAM,UAAa,GAAA;AAAA,EAGf,cAAc,EAAC;AAAA,EAGf,iBAAiB,EAAC;AAAA,EAGlB,QAAQ,EAAC;AAAA,EAOT,UAAU,WACV,EAAA;AACI,IAAA,WAAA,CAAW,GAAI,CAAA,kBAAkB,CAAE,CAAA,OAAA,CAAQ,CAAC,GAC5C,KAAA;AACI,MAAI,GAAA,CAAA,IAAA,CAAK,QAAQ,CAAC,IAAA,KAAS,KAAK,eAAgB,CAAA,IAAA,CAAA,GAAQ,GAAG,CAAC,CAAA,CAAA;AAAA,KAC/D,CAAA,CAAA;AAED,IAAO,OAAA,IAAA,CAAA;AAAA,GACX;AAAA,EAOA,OAAO,WACP,EAAA;AAEI,IAAA,WAAA,CAAW,GAAI,CAAA,kBAAkB,CAAE,CAAA,OAAA,CAAQ,CAAC,GAC5C,KAAA;AACI,MAAI,GAAA,CAAA,IAAA,CAAK,OAAQ,CAAA,CAAC,IAClB,KAAA;AACI,QAAA,MAAM,WAAW,IAAK,CAAA,YAAA,CAAA;AACtB,QAAA,MAAM,QAAQ,IAAK,CAAA,MAAA,CAAA;AAEnB,QAAI,IAAA,CAAC,SAAS,IACd,CAAA,EAAA;AACI,UAAM,KAAA,CAAA,IAAA,CAAA,GAAQ,KAAM,CAAA,IAAA,CAAA,IAAS,EAAC,CAAA;AAC9B,UAAM,KAAA,CAAA,IAAA,CAAA,CAAM,KAAK,GAAG,CAAA,CAAA;AAAA,SAGxB,MAAA;AACI,UAAA,QAAA,CAAS,MAAM,GAAG,CAAA,CAAA;AAAA,SACtB;AAAA,OACH,CAAA,CAAA;AAAA,KACJ,CAAA,CAAA;AAED,IAAO,OAAA,IAAA,CAAA;AAAA,GACX;AAAA,EASA,MAAA,CAAO,IAAqB,EAAA,KAAA,EAAyB,QACrD,EAAA;AACI,IAAA,MAAM,cAAc,IAAK,CAAA,YAAA,CAAA;AACzB,IAAA,MAAM,iBAAiB,IAAK,CAAA,eAAA,CAAA;AAG5B,IAAI,IAAA,WAAA,CAAY,IAAS,CAAA,IAAA,cAAA,CAAe,IACxC,CAAA,EAAA;AACI,MAAM,MAAA,IAAI,KAAM,CAAA,CAAA,eAAA,EAAkB,IAA4B,CAAA,sBAAA,CAAA,CAAA,CAAA;AAAA,KAClE;AAGA,IAAA,WAAA,CAAY,IAAQ,CAAA,GAAA,KAAA,CAAA;AACpB,IAAA,cAAA,CAAe,IAAQ,CAAA,GAAA,QAAA,CAAA;AAGvB,IAAA,MAAM,QAAQ,IAAK,CAAA,MAAA,CAAA;AAGnB,IAAA,IAAI,MAAM,IACV,CAAA,EAAA;AACI,MAAA,KAAA,CAAM,MAAM,OAAQ,CAAA,CAAC,GAAQ,KAAA,KAAA,CAAM,GAAG,CAAC,CAAA,CAAA;AACvC,MAAA,OAAO,KAAM,CAAA,IAAA,CAAA,CAAA;AAAA,KACjB;AAEA,IAAO,OAAA,IAAA,CAAA;AAAA,GACX;AAAA,EAQA,WAAA,CAAY,MAAqB,GACjC,EAAA;AACI,IAAA,OAAO,IAAK,CAAA,MAAA,CAAO,IACf,EAAA,CAAC,SACD,KAAA;AACI,MAAI,GAAA,CAAA,SAAA,CAAU,QAAQ,SAAU,CAAA,GAAA,CAAA;AAAA,KACpC,EACA,CAAC,SACD,KAAA;AACI,MAAA,OAAO,IAAI,SAAU,CAAA,IAAA,CAAA,CAAA;AAAA,KAE7B,CAAA,CAAA;AAAA,GACJ;AAAA,EASA,YAAa,CAAA,IAAA,EAAqB,IAAa,EAAA,eAAA,GAAkB,CACjE,CAAA,EAAA;AACI,IAAA,OAAO,IAAK,CAAA,MAAA,CACR,IACA,EAAA,CAAC,SACD,KAAA;AACI,MAAA,IAAI,IAAK,CAAA,QAAA,CAAS,SAAU,CAAA,GAAG,CAC/B,EAAA;AACI,QAAA,OAAA;AAAA,OACJ;AAEA,MAAK,IAAA,CAAA,IAAA,CAAK,UAAU,GAAG,CAAA,CAAA;AACvB,MAAK,IAAA,CAAA,IAAA,CAAK,CAAC,CAAA,EAAG,CAAM,KAAA,iBAAA,CAAkB,CAAG,EAAA,eAAe,CAAI,GAAA,iBAAA,CAAkB,CAAG,EAAA,eAAe,CAAC,CAAA,CAAA;AAAA,KACrG,EACA,CAAC,SACD,KAAA;AACI,MAAA,MAAM,KAAQ,GAAA,IAAA,CAAK,OAAQ,CAAA,SAAA,CAAU,GAAG,CAAA,CAAA;AAExC,MAAA,IAAI,UAAU,CACd,CAAA,EAAA;AACI,QAAK,IAAA,CAAA,MAAA,CAAO,OAAO,CAAC,CAAA,CAAA;AAAA,OACxB;AAAA,KAER,CAAA,CAAA;AAAA,GACJ;AACJ;;;;"}