{"version":3,"file":"spritesheetAsset.mjs","sources":["../src/spritesheetAsset.ts"],"sourcesContent":["import { copySearchParams, LoaderParserPriority } from 'pixijs/assets';\nimport { extensions, ExtensionType, settings, utils } from 'pixijs/core';\nimport { Spritesheet } from './Spritesheet';\n\nimport type { AssetExtension, LoadAsset, Loader, ResolveAsset } from 'pixijs/assets';\nimport type { Texture } from 'pixijs/core';\nimport type { ISpritesheetData } from './Spritesheet';\n\ninterface SpriteSheetJson extends ISpritesheetData\n{\n    meta: {\n        image: string;\n        scale: string;\n        // eslint-disable-next-line camelcase\n        related_multi_packs?: string[];\n    };\n}\n\nconst validImages = ['jpg', 'png', 'jpeg', 'avif', 'webp'];\n\nfunction getCacheableAssets(keys: string[], asset: Spritesheet, ignoreMultiPack: boolean)\n{\n    const out: Record<string, any> = {};\n\n    keys.forEach((key: string) =>\n    {\n        out[key] = asset;\n    });\n\n    Object.keys(asset.textures).forEach((key) =>\n    {\n        out[key] = asset.textures[key];\n    });\n\n    if (!ignoreMultiPack)\n    {\n        const basePath = utils.path.dirname(keys[0]);\n\n        asset.linkedSheets.forEach((item: Spritesheet, i) =>\n        {\n            const out2 = getCacheableAssets([`${basePath}/${asset.data.meta.related_multi_packs[i]}`], item, true);\n\n            Object.assign(out, out2);\n        });\n    }\n\n    return out;\n}\n\n/**\n * Asset extension for loading spritesheets.\n * @memberof PIXI\n */\nexport const spritesheetAsset = {\n    extension: ExtensionType.Asset,\n    /** Handle the caching of the related Spritesheet Textures */\n    cache: {\n        test: (asset: Spritesheet) => asset instanceof Spritesheet,\n        getCacheableAssets: (keys: string[], asset: Spritesheet) => getCacheableAssets(keys, asset, false),\n    },\n    /** Resolve the the resolution of the asset. */\n    resolver: {\n        test: (value: string): boolean =>\n        {\n            const tempURL = value.split('?')[0];\n            const split = tempURL.split('.');\n            const extension = split.pop();\n            const format = split.pop();\n\n            return extension === 'json' && validImages.includes(format);\n        },\n        parse: (value: string): ResolveAsset =>\n        {\n            const split = value.split('.');\n\n            return {\n                resolution: parseFloat(settings.RETINA_PREFIX.exec(value)?.[1] ?? '1'),\n                format: split[split.length - 2],\n                src: value,\n            };\n        },\n    },\n    /**\n     * Loader plugin that parses sprite sheets!\n     * once the JSON has been loaded this checks to see if the JSON is spritesheet data.\n     * If it is, we load the spritesheets image and parse the data into PIXI.Spritesheet\n     * All textures in the sprite sheet are then added to the cache\n     * @ignore\n     */\n    loader: {\n        extension: {\n            type: ExtensionType.LoadParser,\n            priority: LoaderParserPriority.Normal,\n        },\n\n        async testParse(asset: SpriteSheetJson, options: LoadAsset): Promise<boolean>\n        {\n            return (utils.path.extname(options.src).toLowerCase() === '.json' && !!asset.frames);\n        },\n\n        async parse(asset: SpriteSheetJson, options: LoadAsset, loader: Loader): Promise<Spritesheet>\n        {\n            let basePath = utils.path.dirname(options.src);\n\n            if (basePath && basePath.lastIndexOf('/') !== (basePath.length - 1))\n            {\n                basePath += '/';\n            }\n\n            let imagePath = basePath + asset.meta.image;\n\n            imagePath = copySearchParams(imagePath, options.src);\n\n            const assets = await loader.load<Texture>([imagePath]);\n            const texture = assets[imagePath];\n            const spritesheet = new Spritesheet(\n                texture.baseTexture,\n                asset,\n                options.src,\n            );\n\n            await spritesheet.parse();\n\n            // Check and add the multi atlas\n            // Heavily influenced and based on https://github.com/rocket-ua/pixi-tps-loader/blob/master/src/ResourceLoader.js\n            // eslint-disable-next-line camelcase\n            const multiPacks = asset?.meta?.related_multi_packs;\n\n            if (Array.isArray(multiPacks))\n            {\n                const promises: Promise<Spritesheet>[] = [];\n\n                for (const item of multiPacks)\n                {\n                    if (typeof item !== 'string')\n                    {\n                        continue;\n                    }\n\n                    let itemUrl = basePath + item;\n\n                    // Check if the file wasn't already added as multipack\n                    if (options.data?.ignoreMultiPack)\n                    {\n                        continue;\n                    }\n\n                    itemUrl = copySearchParams(itemUrl, options.src);\n\n                    promises.push(loader.load<Spritesheet>({\n                        src: itemUrl,\n                        data: {\n                            ignoreMultiPack: true,\n                        }\n                    }));\n                }\n\n                const res = await Promise.all(promises);\n\n                spritesheet.linkedSheets = res;\n                res.forEach((item) =>\n                {\n                    item.linkedSheets = [spritesheet].concat(spritesheet.linkedSheets.filter((sp) => (sp !== item)));\n                });\n            }\n\n            return spritesheet;\n        },\n\n        unload(spritesheet: Spritesheet)\n        {\n            spritesheet.destroy(true);\n        },\n    },\n} as AssetExtension<Spritesheet | SpriteSheetJson>;\n\nextensions.add(spritesheetAsset);\n"],"names":[],"mappings":"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"}