UNPKG

18.1 kBSource Map (JSON)View Raw
1{"version":3,"file":"icons.js","sourceRoot":"","sources":["../src/icons.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAAA,mDAA0F;AAC1F,wDAA0B;AAC1B,gDAAwB;AACxB,4DAA+B;AAC/B,gDAAwB;AACxB,oDAA4B;AAC5B,kDAA8B;AAC9B,gDAAwB;AACxB,kDAA0B;AAE1B,oDAA4B;AAC5B,qCAAqC;AACrC,mCAAuE;AACvE,8CAAsD;AAGtD,MAAM,kBAAkB,GAAG,CAAC,WAAW,EAAE,YAAY,EAAE,YAAY,CAAC,CAAC;AAErE,SAAS,YAAY,CAAC,WAA2D;IAC/E,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE;QACpB,MAAM,IAAI,kBAAS,CAAC,sBAAsB,CAAC,CAAC;KAC7C;IACD,MAAM,KAAK,GAAG,eAAO,CAAC,WAAW,CAAC,IAAI,IAAI,WAAW,CAAC,KAAK,CAAC,CAAC;IAC7D,IAAI,CAAC,KAAK,EAAE;QACV,MAAM,IAAI,kBAAS,CAAC,qBAAqB,CAAC,CAAC;KAC5C;IACD,OAAO;QACL,GAAG,EAAE,WAAW,CAAC,GAAG;QACpB,UAAU,EAAE,WAAW,CAAC,UAAU;QAClC,KAAK;QACL,KAAK,EAAE,WAAW,CAAC,KAAK;QACxB,WAAW,EAAE,WAAW,CAAC,WAAW;QACpC,GAAG,EAAE,WAAW,CAAC,GAAG;QACpB,KAAK,EAAE,WAAW,CAAC,KAAK;KACzB,CAAC;AACJ,CAAC;AAmBD,SAAe,sBAAsB,CACnC,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAQ,EAChC,QAAgB,EAChB,EAAE,KAAK,EAAE,MAAM,EAAa;;QAE5B,IAAI,SAAS,CAAC;QACd,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE;YAC1C,SAAS,GAAG,GAAG,CAAC;SACjB;aAAM;YACL,IAAI,QAAQ,GAAG,GAAG,CAAC;YAEnB,gEAAgE;YAChE,IAAI,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE;gBAC1B,QAAQ,GAAG,MAAM,aAAa,CAAC,GAAG,CAAC,CAAC;aACrC;YAED,SAAS,GAAG,MAAM,MAAM,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,KAAM,CAAC,CAAC;SACjF;QACD,IAAI;YACF,OAAO,MAAM,kBAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;SACrC;QAAC,OAAO,GAAG,EAAE;YACZ,MAAM,IAAI,kBAAS,CAAC,gCAAgC,GAAG,IAAI,CAAC,CAAC;SAC9D;IACH,CAAC;CAAA;AAED,SAAe,aAAa,CAAC,GAAW;;QACtC,MAAM,UAAU,GAAG,eAAS,CAAC,SAAS,EAAE,CAAC;QACzC,MAAM,SAAS,GAAG,cAAI,CAAC,IAAI,CAAC,UAAU,EAAE,cAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;QAE5D,MAAM,QAAQ,GAAG,MAAM,oBAAK,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE;YAChB,MAAM,IAAI,kBAAS,CAAC,uDAAuD,GAAG,GAAG,CAAC,CAAC;SACpF;QAED,yBAAyB;QACzB,MAAM,cAAc,GAAG,cAAI,CAAC,SAAS,CAAC,gBAAM,CAAC,QAAQ,CAAC,CAAC;QACvD,MAAM,cAAc,CAAC,QAAQ,CAAC,IAAI,EAAE,kBAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC,CAAC;QAErE,OAAO,SAAS,CAAC;IACnB,CAAC;CAAA;AAED,SAAe,oBAAoB,CAAC,WAAmB,EAAE,QAAgB;;QACvE,MAAM,WAAW,GAAG,cAAI,CAAC,IAAI,CAAC,WAAW,EAAE,mCAAmC,EAAE,QAAQ,CAAC,CAAC;QAC1F,MAAM,kBAAE,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;QAChC,OAAO,WAAW,CAAC;IACrB,CAAC;CAAA;AAED,SAAe,sBAAsB,CAAC,QAAgB,EAAE,QAAgB;;QACtE,IAAI;YACF,OAAO,MAAM,kBAAE,CAAC,QAAQ,CAAC,cAAI,CAAC,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC;SACvE;QAAC,OAAO,CAAC,EAAE;YACV,OAAO,IAAI,CAAC;SACb;IACH,CAAC;CAAA;AAED,SAAe,eAAe,CAAC,QAAgB,EAAE,MAAc,EAAE,QAAgB;;QAC/E,IAAI;YACF,MAAM,kBAAE,CAAC,SAAS,CAAC,cAAI,CAAC,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,CAAC;SACzE;QAAC,OAAO,EAAE,OAAO,EAAE,EAAE;YACpB,OAAO,CAAC,IAAI,CAAC,yBAAyB,QAAQ,MAAM,OAAO,EAAE,CAAC,CAAC;SAChE;IACH,CAAC;CAAA;AAED,SAAe,iBAAiB,CAC9B,IAAa,EACb,IAAU,EACV,UAAkB,EAClB,QAAgB;;QAEhB,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,cAAM,CAAC,IAAI,CAAC,CAAC;QACvC,IAAI,KAAK,IAAI,CAAC,IAAI,MAAM,IAAI,CAAC,EAAE;YAC7B,MAAM,KAAK,CAAC,uDAAuD,KAAK,aAAa,MAAM,GAAG,CAAC,CAAC;SACjG;QACD,MAAM,QAAQ,GAAG,cAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACxC,IAAI,CAAC,QAAQ,EAAE;YACb,MAAM,IAAI,KAAK,CAAC,2CAA2C,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;SACxE;QAED,MAAM,UAAU,GAAG,GAAG,KAAK,IAAI,MAAM,EAAE,CAAC;QACxC,MAAM,QAAQ,GAAG,QAAQ,UAAU,IAAI,cAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC;QAErE,IAAI,WAAW,GAAkB,MAAM,sBAAsB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAClF,IAAI,CAAC,WAAW,EAAE;YAChB,WAAW,GAAG,MAAM,sBAAsB,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;YAC9E,MAAM,eAAe,CAAC,QAAQ,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;SACxD;QAED,MAAM,aAAa,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,eAAO,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;QACxF,MAAM,aAAa,GAAG,eAAO,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;QAEzD,OAAO;YACL,YAAY,EAAE;gBACZ,GAAG,EAAE,aAAa;gBAClB,KAAK,EAAE,UAAU;gBACjB,IAAI,EAAE,QAAQ;aACf;YACD,YAAY,EAAE;gBACZ,MAAM,EAAE,aAAa;gBACrB,GAAG,EAAE,aAAa;gBAClB,MAAM,EAAE,WAAW;gBACnB,IAAI,EAAE,WAAW,CAAC,MAAM;gBACxB,GAAG,EAAE,IAAI,CAAC,GAAG;oBACX,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,aAAa,EAAE;oBAC/E,CAAC,CAAC,KAAK;gBACT,UAAU,EAAE,IAAI,CAAC,UAAU;gBAC3B,KAAK,EAAE,IAAI,CAAC,KAAK;aAClB;SACF,CAAC;IACJ,CAAC;CAAA;AAED,SAAS,mBAAmB,CAAC,QAAgB;IAC3C,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE;QAC7E,OAAO,QAAuB,CAAC;KAChC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAe,MAAM,CACnB,SAAiB,EACjB,QAAgB,EAChB,KAAa,EACb,MAAc,EACd,MAAkB,SAAS,EAC3B,UAAkB;;QAElB,MAAM,MAAM,GAAG,mBAAmB,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAE3D,IAAI;YACF,MAAM,UAAU,GAAG,eAAS,CAAC,SAAS,EAAE,CAAC;YACzC,MAAM,wBAAU,CACd;gBACE,KAAK,EAAE,SAAS;gBAChB,MAAM,EAAE,UAAU;gBAClB,MAAM;aACP,EACD;gBACE;oBACE,SAAS,EAAE,SAAS;oBACpB,UAAU;iBACX;gBACD;oBACE,SAAS,EAAE,QAAQ;oBACnB,KAAK;oBACL,MAAM;oBACN,GAAG;oBACH,UAAU;iBACX;aACF,CACF,CAAC;YACF,OAAO,cAAI,CAAC,IAAI,CAAC,UAAU,EAAE,cAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;SACxD;QAAC,OAAO,EAAE,OAAO,EAAE,EAAE;YACpB,MAAM,IAAI,kBAAS,CAAC,kDAAkD,SAAS,MAAM,OAAO,EAAE,CAAC,CAAC;SACjG;IACH,CAAC;CAAA;AAED,SAAgB,aAAa,CAAC,QAAyB;IACrD,qDAAqD;IACrD,MAAM,EAAE,aAAa,EAAE,KAAK,KAAgB,QAAQ,EAAtB,qDAAsB,CAAC;IACrD,MAAM,mBAAmB,GAAG,eAAO,CAAC,aAAa,CAAC,CAAC;IAEnD,IAAI,WAAW,GAAG,eAAO,CAAC,KAAK,CAAC,CAAC;IAEjC,IAAI,mBAAmB,CAAC,MAAM,EAAE;QAC9B,6CAA6C;QAC7C,MAAM,YAAY,GAAG,mBAAmB,CAAC,CAAC,CAAC,CAAC;QAC5C,WAAW,GAAG,CAAC,GAAG,WAAW,EAAE,GAAG,wBAAgB,CAAC,YAAY,CAAC,CAAC,CAAC;KACnE;IAED,MAAM,QAAQ,GAAW,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC;IACrE,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;AAC5B,CAAC;AAfD,sCAeC;AAED,kEAAkE;AAClE,SAAS,aAAa,CAAC,QAAgB;IACrC,MAAM,QAAQ,GAAG,kBAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;IAC3C,OAAO,gBAAM;SACV,UAAU,CAAC,QAAQ,CAAC;SACpB,MAAM,CAAC,QAAQ,CAAC;SAChB,MAAM,CAAC,KAAK,CAAC,CAAC;AACnB,CAAC;AAED,0DAA0D;AAC1D,SAAS,cAAc,CAAC,IAAU;IAChC,MAAM,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACrC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACvE,CAAC;AAED,MAAM,SAAS,GAA8B,EAAE,CAAC;AAEhD,SAAsB,eAAe,CACnC,WAAmB,EACnB,UAAkB,EAClB,UAAkB;;QAElB,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE;YACtB,OAAO,EAAE,CAAC;SACX;QAED,IAAI,CAAC,CAAC,MAAM,8BAAgB,EAAE,CAAC,EAAE;YAC/B,iGAAiG;YACjG,OAAO,CAAC,GAAG,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CACT,eAAK,CAAC,KAAK,CAAC,KAAK,CACf,wOAAwO,CACzO,CACF,CAAC;YACF,OAAO,CAAC,GAAG,CACT,eAAK,CAAC,GAAG,CACP,+OAA+O,CAChP,CACF,CAAC;YACF,OAAO,EAAE,CAAC;SACX;QAED,MAAM,KAAK,GAAmB,EAAE,CAAC;QACjC,MAAM,MAAM,GAAmB,EAAE,CAAC;QAElC,IAAI,QAAQ,GAAmB,EAAE,CAAC;QAElC,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE;YAC7B,MAAM,QAAQ,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;YACtC,IAAI,CAAC,CAAC,QAAQ,IAAI,SAAS,CAAC,EAAE;gBAC5B,SAAS,CAAC,QAAQ,CAAC,GAAG,MAAM,oBAAoB,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;aACzE;YAED,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC;YACvB,QAAQ,GAAG;gBACT,GAAG,QAAQ;gBACX,GAAG,KAAM,CAAC,GAAG,CAAC,CAAM,IAAI,EAAC,EAAE;oBACzB,MAAM,EAAE,YAAY,EAAE,YAAY,EAAE,GAAG,MAAM,iBAAiB,CAC5D,IAAI,EACJ,IAAI,EACJ,UAAU,EACV,QAAQ,CACT,CAAC;oBACF,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;oBACzB,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;gBAC5B,CAAC,CAAA,CAAC;aACH,CAAC;SACH;QACD,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAE5B,MAAM,sBAAsB,CAAC,WAAW,CAAC,CAAC;QAE1C,OAAO;YACL,KAAK,EAAE,eAAe,CAAC,KAAK,EAAE,OAAO,CAAC;YACtC,uEAAuE;YACvE,MAAM,EAAE,eAAe,CAAC,MAAM,EAAE,QAAQ,CAAC;SAC1C,CAAC;IACJ,CAAC;CAAA;AA5DD,0CA4DC;AAED,SAAS,eAAe,CAAC,GAAU,EAAE,GAAW;IAC9C,OAAO,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE;QACjD,IAAI,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC;YAAE,OAAO,CAAC,CAAC,CAAC;aACpC,IAAI,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC;YAAE,OAAO,CAAC,CAAC;QAC7C,OAAO,CAAC,CAAC;IACX,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAe,sBAAsB,CAAC,WAAmB;;QACvD,0BAA0B;QAC1B,MAAM,WAAW,GAAG,cAAI,CAAC,IAAI,CAAC,WAAW,EAAE,mCAAmC,CAAC,CAAC;QAChF,MAAM,aAAa,GAAG,MAAM,kBAAE,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QAEpD,MAAM,mBAAmB,GAAoB,EAAE,CAAC;QAChD,KAAK,MAAM,KAAK,IAAI,aAAa,EAAE;YACjC,sBAAsB;YACtB,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;gBACzB,SAAS;aACV;YAED,SAAS;YACT,IAAI,CAAC,CAAC,KAAK,IAAI,SAAS,CAAC,EAAE;gBACzB,mBAAmB,CAAC,IAAI,CAAC,kBAAE,CAAC,MAAM,CAAC,cAAI,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;aACpE;SACF;QAED,MAAM,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;IACzC,CAAC;CAAA","sourcesContent":["import { ImageFormat, ResizeMode, isAvailableAsync, sharpAsync } from '@expo/image-utils';\nimport fs from 'fs-extra';\nimport mime from 'mime';\nimport fetch from 'node-fetch';\nimport path from 'path';\nimport stream from 'stream';\nimport temporary from 'tempy';\nimport util from 'util';\nimport chalk from 'chalk';\n\nimport crypto from 'crypto';\nimport { IconError } from './Errors';\nimport { AnySize, ImageSize, joinURI, toArray, toSize } from './utils';\nimport { fromStartupImage } from './validators/Apple';\nimport { Icon, ManifestIcon, ManifestOptions } from './WebpackPWAManifestPlugin.types';\n\nconst supportedMimeTypes = ['image/png', 'image/jpeg', 'image/webp'];\n\nfunction sanitizeIcon(iconSnippet: Icon & { src?: string; size: any; sizes: any }): Icon {\n if (!iconSnippet.src) {\n throw new IconError('Unknown icon source.');\n }\n const sizes = toArray(iconSnippet.size || iconSnippet.sizes);\n if (!sizes) {\n throw new IconError('Unknown icon sizes.');\n }\n return {\n src: iconSnippet.src,\n resizeMode: iconSnippet.resizeMode,\n sizes,\n media: iconSnippet.media,\n destination: iconSnippet.destination,\n ios: iconSnippet.ios,\n color: iconSnippet.color,\n };\n}\n\ninterface WebpackAsset {\n output: string;\n url: string;\n source: any;\n size: any;\n ios:\n | boolean\n | {\n valid: any;\n media: any;\n size: string;\n href: string;\n };\n resizeMode: any;\n color: any;\n}\n\nasync function getBufferWithMimeAsync(\n { src, resizeMode, color }: Icon,\n mimeType: string,\n { width, height }: ImageSize\n): Promise<Buffer> {\n let imagePath;\n if (!supportedMimeTypes.includes(mimeType)) {\n imagePath = src;\n } else {\n let localSrc = src;\n\n // In case the icon is a remote URL we need to download it first\n if (src.startsWith('http')) {\n localSrc = await downloadImage(src);\n }\n\n imagePath = await resize(localSrc, mimeType, width, height, resizeMode, color!);\n }\n try {\n return await fs.readFile(imagePath);\n } catch (err) {\n throw new IconError(`It was not possible to read '${src}'.`);\n }\n}\n\nasync function downloadImage(url: string): Promise<string> {\n const outputPath = temporary.directory();\n const localPath = path.join(outputPath, path.basename(url));\n\n const response = await fetch(url);\n if (!response.ok) {\n throw new IconError(`It was not possible to download splash screen from '${url}'`);\n }\n\n // Download to local file\n const streamPipeline = util.promisify(stream.pipeline);\n await streamPipeline(response.body, fs.createWriteStream(localPath));\n\n return localPath;\n}\n\nasync function ensureCacheDirectory(projectRoot: string, cacheKey: string): Promise<string> {\n const cacheFolder = path.join(projectRoot, '.expo/web/cache/production/images', cacheKey);\n await fs.ensureDir(cacheFolder);\n return cacheFolder;\n}\n\nasync function getImageFromCacheAsync(fileName: string, cacheKey: string): Promise<null | Buffer> {\n try {\n return await fs.readFile(path.resolve(cacheKeys[cacheKey], fileName));\n } catch (_) {\n return null;\n }\n}\n\nasync function cacheImageAsync(fileName: string, buffer: Buffer, cacheKey: string): Promise<void> {\n try {\n await fs.writeFile(path.resolve(cacheKeys[cacheKey], fileName), buffer);\n } catch ({ message }) {\n console.warn(`error caching image: \"${fileName}\". ${message}`);\n }\n}\n\nasync function processImageAsync(\n size: AnySize,\n icon: Icon,\n publicPath: string,\n cacheKey: string\n): Promise<{ manifestIcon: ManifestIcon; webpackAsset: WebpackAsset }> {\n const { width, height } = toSize(size);\n if (width <= 0 || height <= 0) {\n throw Error(`Failed to process image with invalid size: { width: ${width}, height: ${height}}`);\n }\n const mimeType = mime.getType(icon.src);\n if (!mimeType) {\n throw new Error(`Invalid mimeType for image with source: ${icon.src}`);\n }\n\n const dimensions = `${width}x${height}`;\n const fileName = `icon_${dimensions}.${mime.getExtension(mimeType)}`;\n\n let imageBuffer: Buffer | null = await getImageFromCacheAsync(fileName, cacheKey);\n if (!imageBuffer) {\n imageBuffer = await getBufferWithMimeAsync(icon, mimeType, { width, height });\n await cacheImageAsync(fileName, imageBuffer, cacheKey);\n }\n\n const iconOutputDir = icon.destination ? joinURI(icon.destination, fileName) : fileName;\n const iconPublicUrl = joinURI(publicPath, iconOutputDir);\n\n return {\n manifestIcon: {\n src: iconPublicUrl,\n sizes: dimensions,\n type: mimeType,\n },\n webpackAsset: {\n output: iconOutputDir,\n url: iconPublicUrl,\n source: imageBuffer,\n size: imageBuffer.length,\n ios: icon.ios\n ? { valid: icon.ios, media: icon.media, size: dimensions, href: iconPublicUrl }\n : false,\n resizeMode: icon.resizeMode,\n color: icon.color,\n },\n };\n}\n\nfunction ensureValidMimeType(mimeType: string): ImageFormat {\n if (['input', 'jpeg', 'jpg', 'png', 'raw', 'tiff', 'webp'].includes(mimeType)) {\n return mimeType as ImageFormat;\n }\n return 'png';\n}\n\nasync function resize(\n inputPath: string,\n mimeType: string,\n width: number,\n height: number,\n fit: ResizeMode = 'contain',\n background: string\n) {\n const format = ensureValidMimeType(mimeType.split('/')[1]);\n\n try {\n const outputPath = temporary.directory();\n await sharpAsync(\n {\n input: inputPath,\n output: outputPath,\n format,\n },\n [\n {\n operation: 'flatten',\n background,\n },\n {\n operation: 'resize',\n width,\n height,\n fit,\n background,\n },\n ]\n );\n return path.join(outputPath, path.basename(inputPath));\n } catch ({ message }) {\n throw new IconError(`It was not possible to generate splash screen '${inputPath}'. ${message}`);\n }\n}\n\nexport function retrieveIcons(manifest: ManifestOptions): [Icon[], ManifestOptions] {\n // Remove these items so they aren't written to disk.\n const { startupImages, icons, ...config } = manifest;\n const parsedStartupImages = toArray(startupImages);\n\n let parsedIcons = toArray(icons);\n\n if (parsedStartupImages.length) {\n // TODO: Bacon: use all of the startup images\n const startupImage = parsedStartupImages[0];\n parsedIcons = [...parsedIcons, ...fromStartupImage(startupImage)];\n }\n\n const response: Icon[] = parsedIcons.map(icon => sanitizeIcon(icon));\n return [response, config];\n}\n\n// Calculate SHA256 Checksum value of a file based on its contents\nfunction calculateHash(filePath: string): string {\n const contents = fs.readFileSync(filePath);\n return crypto\n .createHash('sha256')\n .update(contents)\n .digest('hex');\n}\n\n// Create a hash key for caching the images between builds\nfunction createCacheKey(icon: Icon): string {\n const hash = calculateHash(icon.src);\n return [hash, icon.resizeMode, icon.color].filter(Boolean).join('-');\n}\n\nconst cacheKeys: { [key: string]: string } = {};\n\nexport async function parseIconsAsync(\n projectRoot: string,\n inputIcons: Icon[],\n publicPath: string\n): Promise<{ icons?: ManifestIcon[]; assets?: WebpackAsset[] }> {\n if (!inputIcons.length) {\n return {};\n }\n\n if (!(await isAvailableAsync())) {\n // TODO: Bacon: Fallback to nodejs image resizing as native doesn't work in the host environment.\n console.log();\n console.log(\n chalk.bgRed.black(\n `PWA Error: It was not possible to generate the images for your progressive web app (splash screens and icons) because the host computer does not have \\`sharp\\` installed, and \\`image-utils\\` was unable to install it automatically.`\n )\n );\n console.log(\n chalk.red(\n `- You may stop the process and try again after successfully running \\`npm install -g sharp\\`.\\n- If you are using \\`expo-cli\\` to build your project then you could use the \\`--no-pwa\\` flag to skip the PWA asset generation step entirely.`\n )\n );\n return {};\n }\n\n const icons: ManifestIcon[] = [];\n const assets: WebpackAsset[] = [];\n\n let promises: Promise<any>[] = [];\n\n for (const icon of inputIcons) {\n const cacheKey = createCacheKey(icon);\n if (!(cacheKey in cacheKeys)) {\n cacheKeys[cacheKey] = await ensureCacheDirectory(projectRoot, cacheKey);\n }\n\n const { sizes } = icon;\n promises = [\n ...promises,\n ...sizes!.map(async size => {\n const { manifestIcon, webpackAsset } = await processImageAsync(\n size,\n icon,\n publicPath,\n cacheKey\n );\n icons.push(manifestIcon);\n assets.push(webpackAsset);\n }),\n ];\n }\n await Promise.all(promises);\n\n await clearUnusedCachesAsync(projectRoot);\n\n return {\n icons: sortByAttribute(icons, 'sizes'),\n // startupImages: icons.filter(({ isStartupImage }) => isStartupImage),\n assets: sortByAttribute(assets, 'output'),\n };\n}\n\nfunction sortByAttribute(arr: any[], key: string): any[] {\n return arr.filter(Boolean).sort((valueA, valueB) => {\n if (valueA[key] < valueB[key]) return -1;\n else if (valueA[key] > valueB[key]) return 1;\n return 0;\n });\n}\n\nasync function clearUnusedCachesAsync(projectRoot: string): Promise<void> {\n // Clean up any old caches\n const cacheFolder = path.join(projectRoot, '.expo/web/cache/production/images');\n const currentCaches = await fs.readdir(cacheFolder);\n\n const deleteCachePromises: Promise<void>[] = [];\n for (const cache of currentCaches) {\n // skip hidden folders\n if (cache.startsWith('.')) {\n continue;\n }\n\n // delete\n if (!(cache in cacheKeys)) {\n deleteCachePromises.push(fs.remove(path.join(cacheFolder, cache)));\n }\n }\n\n await Promise.all(deleteCachePromises);\n}\n"]}
\No newline at end of file