amis-rpc-design/node_modules/@react-native-community/cli-plugin-metro/build/commands/bundle/saveAssets.js.map

1 line
7.3 KiB
Plaintext
Raw Normal View History

2023-10-07 19:42:30 +08:00
{"version":3,"names":["saveAssets","assets","platform","assetsDest","assetCatalogDest","logger","warn","filesToCopy","Object","create","getAssetDestPath","getAssetDestPathAndroid","getAssetDestPathIOS","addAssetToCopy","asset","validScales","Set","filterPlatformAssetScales","scales","forEach","scale","idx","has","src","files","dest","path","join","catalogDir","fs","existsSync","error","info","cleanAssetCatalog","isCatalogAsset","imageSet","getImageSet","writeImageSet","copyAll","queue","keys","length","Promise","resolve","reject","copyNext","shift","copy","callback","destDir","dirname","mkdir","recursive","err","createReadStream","pipe","createWriteStream","on"],"sources":["../../../src/commands/bundle/saveAssets.ts"],"sourcesContent":["/**\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\nimport {logger} from '@react-native-community/cli-tools';\nimport fs from 'fs';\nimport type {AssetData} from 'metro';\nimport path from 'path';\nimport {\n cleanAssetCatalog,\n getImageSet,\n isCatalogAsset,\n writeImageSet,\n} from './assetCatalogIOS';\nimport filterPlatformAssetScales from './filterPlatformAssetScales';\nimport getAssetDestPathAndroid from './getAssetDestPathAndroid';\nimport getAssetDestPathIOS from './getAssetDestPathIOS';\n\ninterface CopiedFiles {\n [src: string]: string;\n}\n\nfunction saveAssets(\n assets: ReadonlyArray<AssetData>,\n platform: string,\n assetsDest: string | undefined,\n assetCatalogDest: string | undefined,\n) {\n if (!assetsDest) {\n logger.warn('Assets destination folder is not set, skipping...');\n return;\n }\n\n const filesToCopy: CopiedFiles = Object.create(null); // Map src -> dest\n\n const getAssetDestPath =\n platform === 'android' ? getAssetDestPathAndroid : getAssetDestPathIOS;\n\n const addAssetToCopy = (asset: AssetData) => {\n const validScales = new Set(\n filterPlatformAssetScales(platform, asset.scales),\n );\n\n asset.scales.forEach((scale, idx) => {\n if (!validScales.has(scale)) {\n return;\n }\n const src = asset.files[idx];\n const dest = path.join(assetsDest, getAssetDestPath(asset, scale));\n filesToCopy[src] = dest;\n });\n };\n\n if (platform === 'ios' && assetCatalogDest != null) {\n // Use iOS Asset Catalog for images. This will allow Apple app thinning to\n // remove unused scales from the optimized bundle.\n const catalogDir = path.join(assetCatalogDest, 'RNAssets.xcassets');\n if (!fs.existsSync(catalogDir)) {\n logger.error(\n `Could not find asset catalog 'RNAssets.xcassets' in ${assetCatalogDest}. Make sure to create it if it does not exist.`,\n );\n return;\n }\n\n logger.info('Adding images to asset catalog', catalogDir);\n cleanAssetCatalog(catalogDir);\n for (const asset of assets) {\n if (isCatalogAsset(asset)) {\n const imageSet = getImageSet(\n catalogDir,\n asset,\n filterPlatformAssetScales(platform, asset.scales),\n );\n writeImageSet(imageSet);\n } else {\n addAssetToCopy(asset);\n }\n }\n logger.info('Done adding images to asset catalog');\n } else {\n assets.forEach(addAssetToCopy);\n }\n\n return copyAll(filesToCopy);\n}\n\nfunction copyAll(filesToCopy: CopiedFiles) {\n const queue = Object.keys(filesToCopy);\n if (queue.length === 0) {\n return Promise.resolve();\n }\n\n logger.info(`Copying ${queue.length} asset files`);\n return new Promise<void>((resolve, reject) => {\n const copyNext = (error?: NodeJS.ErrnoException) => {\n if (error) {\n reject(error);\n return;\n }\n if (queue.length === 0) {\n logger.info('Done copying assets');\n resolve();\n } else {\n // queue.length === 0 is checked in previous branch, so this is string\n const src = queue.shift() as string;\n const dest = filesToCopy[src];\n copy(src, de