@expo/image-utils 0.3.14 → 0.3.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/Download.js +3 -2
- package/build/Download.js.map +1 -1
- package/build/Image.js +5 -3
- package/build/Image.js.map +1 -1
- package/build/jimp.d.ts +1 -1
- package/build/jimp.js +27 -16
- package/build/jimp.js.map +1 -1
- package/build/sharp.js +25 -5
- package/build/sharp.js.map +1 -1
- package/package.json +4 -6
package/build/Download.js
CHANGED
|
@@ -5,7 +5,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.downloadImage = exports.downloadOrUseCachedImage = void 0;
|
|
7
7
|
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
8
|
-
|
|
8
|
+
// @ts-ignore
|
|
9
|
+
const jimp_compact_1 = __importDefault(require("jimp-compact"));
|
|
9
10
|
const node_fetch_1 = __importDefault(require("node-fetch"));
|
|
10
11
|
const path_1 = __importDefault(require("path"));
|
|
11
12
|
const stream_1 = __importDefault(require("stream"));
|
|
@@ -40,7 +41,7 @@ async function downloadImage(url) {
|
|
|
40
41
|
const localPath = path_1.default.join(outputPath, path_1.default.basename(stripQueryParams(url)));
|
|
41
42
|
await streamPipeline(response.body, fs_extra_1.default.createWriteStream(localPath));
|
|
42
43
|
// If an image URL doesn't have a name, get the mime type and move the file.
|
|
43
|
-
const img = await
|
|
44
|
+
const img = await jimp_compact_1.default.read(localPath);
|
|
44
45
|
const mime = img.getMIME().split('/').pop();
|
|
45
46
|
if (!localPath.endsWith(mime)) {
|
|
46
47
|
const newPath = path_1.default.join(outputPath, `image.${mime}`);
|
package/build/Download.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Download.js","sourceRoot":"","sources":["../src/Download.ts"],"names":[],"mappings":";;;;;;AAAA,wDAA0B;AAC1B,
|
|
1
|
+
{"version":3,"file":"Download.js","sourceRoot":"","sources":["../src/Download.ts"],"names":[],"mappings":";;;;;;AAAA,wDAA0B;AAC1B,aAAa;AACb,gEAAgC;AAChC,4DAA+B;AAC/B,gDAAwB;AACxB,oDAA4B;AAC5B,kDAA8B;AAC9B,gDAAwB;AAExB,sCAAsC;AACtC,MAAM,mBAAmB,GAA2B,EAAE,CAAC;AAEvD,SAAS,gBAAgB,CAAC,GAAW;IACnC,OAAO,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AACzC,CAAC;AAEM,KAAK,UAAU,wBAAwB,CAAC,GAAW;IACxD,IAAI,GAAG,IAAI,mBAAmB,EAAE;QAC9B,OAAO,mBAAmB,CAAC,GAAG,CAAC,CAAC;KACjC;IACD,IAAI,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE;QAC1B,mBAAmB,CAAC,GAAG,CAAC,GAAG,MAAM,aAAa,CAAC,GAAG,CAAC,CAAC;KACrD;SAAM;QACL,mBAAmB,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;KAChC;IACD,OAAO,mBAAmB,CAAC,GAAG,CAAC,CAAC;AAClC,CAAC;AAVD,4DAUC;AAEM,KAAK,UAAU,aAAa,CAAC,GAAW;IAC7C,MAAM,UAAU,GAAG,eAAS,CAAC,SAAS,EAAE,CAAC;IAEzC,MAAM,QAAQ,GAAG,MAAM,oBAAK,CAAC,GAAG,CAAC,CAAC;IAClC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE;QAChB,MAAM,IAAI,KAAK,CAAC,+CAA+C,GAAG,GAAG,CAAC,CAAC;KACxE;IAED,yBAAyB;IACzB,MAAM,cAAc,GAAG,cAAI,CAAC,SAAS,CAAC,gBAAM,CAAC,QAAQ,CAAC,CAAC;IACvD,MAAM,SAAS,GAAG,cAAI,CAAC,IAAI,CAAC,UAAU,EAAE,cAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAC9E,MAAM,cAAc,CAAC,QAAQ,CAAC,IAAI,EAAE,kBAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC,CAAC;IAErE,4EAA4E;IAC5E,MAAM,GAAG,GAAG,MAAM,sBAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACvC,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAG,CAAC;IAC7C,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;QAC7B,MAAM,OAAO,GAAG,cAAI,CAAC,IAAI,CAAC,UAAU,EAAE,SAAS,IAAI,EAAE,CAAC,CAAC;QACvD,MAAM,kBAAE,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAClC,OAAO,OAAO,CAAC;KAChB;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAvBD,sCAuBC","sourcesContent":["import fs from 'fs-extra';\n// @ts-ignore\nimport Jimp from 'jimp-compact';\nimport fetch from 'node-fetch';\nimport path from 'path';\nimport stream from 'stream';\nimport temporary from 'tempy';\nimport util from 'util';\n\n// cache downloaded images into memory\nconst cacheDownloadedKeys: Record<string, string> = {};\n\nfunction stripQueryParams(url: string): string {\n return url.split('?')[0].split('#')[0];\n}\n\nexport async function downloadOrUseCachedImage(url: string): Promise<string> {\n if (url in cacheDownloadedKeys) {\n return cacheDownloadedKeys[url];\n }\n if (url.startsWith('http')) {\n cacheDownloadedKeys[url] = await downloadImage(url);\n } else {\n cacheDownloadedKeys[url] = url;\n }\n return cacheDownloadedKeys[url];\n}\n\nexport async function downloadImage(url: string): Promise<string> {\n const outputPath = temporary.directory();\n\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`It was not possible to download image from '${url}'`);\n }\n\n // Download to local file\n const streamPipeline = util.promisify(stream.pipeline);\n const localPath = path.join(outputPath, path.basename(stripQueryParams(url)));\n await streamPipeline(response.body, fs.createWriteStream(localPath));\n\n // If an image URL doesn't have a name, get the mime type and move the file.\n const img = await Jimp.read(localPath);\n const mime = img.getMIME().split('/').pop()!;\n if (!localPath.endsWith(mime)) {\n const newPath = path.join(outputPath, `image.${mime}`);\n await fs.move(localPath, newPath);\n return newPath;\n }\n\n return localPath;\n}\n"]}
|
package/build/Image.js
CHANGED
|
@@ -114,9 +114,7 @@ async function maybeWarnAboutInstallingSharpAsync() {
|
|
|
114
114
|
// Putting the warning here will prevent the warning from showing if all images were reused from the cache
|
|
115
115
|
if (!hasWarned && !(await Sharp.isAvailableAsync())) {
|
|
116
116
|
hasWarned = true;
|
|
117
|
-
console.
|
|
118
|
-
console.log(chalk_1.default.bgYellow.black(`Using node to generate images. This is much slower than using native packages.`));
|
|
119
|
-
console.log(chalk_1.default.yellow(`\u203A Optionally you can stop the process and try again after successfully running \`npm install -g sharp-cli\`.\n`));
|
|
117
|
+
console.warn(chalk_1.default.yellow(`Using node to generate images. This is much slower than using native packages.\n\u203A Optionally you can stop the process and try again after successfully running \`npm install -g sharp-cli\`.\n`));
|
|
120
118
|
}
|
|
121
119
|
}
|
|
122
120
|
async function ensureImageOptionsAsync(imageOptions) {
|
|
@@ -124,6 +122,10 @@ async function ensureImageOptionsAsync(imageOptions) {
|
|
|
124
122
|
...imageOptions,
|
|
125
123
|
src: await Download.downloadOrUseCachedImage(imageOptions.src),
|
|
126
124
|
};
|
|
125
|
+
// Default to contain
|
|
126
|
+
if (!icon.resizeMode) {
|
|
127
|
+
icon.resizeMode = 'contain';
|
|
128
|
+
}
|
|
127
129
|
const mimeType = mime_1.default.getType(icon.src);
|
|
128
130
|
if (!mimeType) {
|
|
129
131
|
throw new Error(`Invalid mimeType for image with source: ${icon.src}`);
|
package/build/Image.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Image.js","sourceRoot":"","sources":["../src/Image.ts"],"names":[],"mappings":"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","sourcesContent":["import chalk from 'chalk';\nimport mime from 'mime';\n\nimport * as Cache from './Cache';\nimport * as Download from './Download';\nimport * as Ico from './Ico';\nimport { ImageOptions } from './Image.types';\nimport * as Jimp from './jimp';\nimport * as Sharp from './sharp';\n\nconst supportedMimeTypes = ['image/png', 'image/jpeg', 'image/webp', 'image/gif'];\n\nlet hasWarned: boolean = false;\n\nasync function resizeImagesAsync(buffer: Buffer, sizes: number[]): Promise<Buffer[]> {\n const sharp = await getSharpAsync();\n if (!sharp) {\n return Jimp.resizeBufferAsync(buffer, sizes);\n }\n return Sharp.resizeBufferAsync(buffer, sizes);\n}\n\nasync function resizeAsync(imageOptions: ImageOptions): Promise<Buffer> {\n const sharp: any = await getSharpAsync();\n const { width, height, backgroundColor, resizeMode } = imageOptions;\n if (!sharp) {\n const inputOptions: any = { input: imageOptions.src, quality: 100 };\n const jimp = await Jimp.resize(inputOptions, {\n width,\n height,\n fit: resizeMode,\n background: backgroundColor,\n });\n\n if (imageOptions.removeTransparency) {\n jimp.colorType(2);\n }\n if (imageOptions.borderRadius) {\n // TODO: support setting border radius with Jimp. Currently only support making the image a circle\n await Jimp.circleAsync(jimp);\n }\n\n const imgBuffer = await jimp.getBufferAsync(jimp.getMIME());\n return imgBuffer;\n }\n try {\n let sharpBuffer = sharp(imageOptions.src)\n .ensureAlpha()\n .resize(width, height, { fit: resizeMode, background: 'transparent' });\n\n // Skip an extra step if the background is explicitly transparent.\n if (backgroundColor && backgroundColor !== 'transparent') {\n // Add the background color to the image\n sharpBuffer = sharpBuffer.composite([\n {\n // create a background color\n input: {\n create: {\n width,\n height,\n // allow alpha colors\n channels: imageOptions.removeTransparency ? 3 : 4,\n background: backgroundColor,\n },\n },\n // dest-over makes the first image (input) appear on top of the created image (background color)\n blend: 'dest-over',\n },\n ]);\n } else if (imageOptions.removeTransparency) {\n sharpBuffer.flatten();\n }\n\n if (imageOptions.borderRadius) {\n const mask = Buffer.from(\n `<svg><rect x=\"0\" y=\"0\" width=\"${width}\" height=\"${height}\" \n rx=\"${imageOptions.borderRadius}\" ry=\"${imageOptions.borderRadius}\" \n fill=\"${\n backgroundColor && backgroundColor !== 'transparent' ? backgroundColor : 'none'\n }\" /></svg>`\n );\n sharpBuffer.composite([{ input: mask, blend: 'dest-over' }]);\n }\n\n return await sharpBuffer.png().toBuffer();\n } catch ({ message }) {\n throw new Error(\n `It was not possible to generate splash screen '${imageOptions.src}'. ${message}`\n );\n }\n}\n\nasync function getSharpAsync(): Promise<any> {\n let sharp: any;\n if (await Sharp.isAvailableAsync()) sharp = await Sharp.findSharpInstanceAsync();\n return sharp;\n}\n\nfunction getDimensionsId(imageOptions: Pick<ImageOptions, 'width' | 'height'>): string {\n return imageOptions.width === imageOptions.height\n ? `${imageOptions.width}`\n : `${imageOptions.width}x${imageOptions.height}`;\n}\n\nasync function maybeWarnAboutInstallingSharpAsync() {\n // Putting the warning here will prevent the warning from showing if all images were reused from the cache\n if (!hasWarned && !(await Sharp.isAvailableAsync())) {\n hasWarned = true;\n console.log();\n console.log(\n chalk.bgYellow.black(\n `Using node to generate images. This is much slower than using native packages.`\n )\n );\n console.log(\n chalk.yellow(\n `\\u203A Optionally you can stop the process and try again after successfully running \\`npm install -g sharp-cli\\`.\\n`\n )\n );\n }\n}\n\nasync function ensureImageOptionsAsync(imageOptions: ImageOptions): Promise<ImageOptions> {\n const icon = {\n ...imageOptions,\n src: await Download.downloadOrUseCachedImage(imageOptions.src),\n };\n\n const mimeType = mime.getType(icon.src);\n\n if (!mimeType) {\n throw new Error(`Invalid mimeType for image with source: ${icon.src}`);\n }\n if (!supportedMimeTypes.includes(mimeType)) {\n throw new Error(`Supplied image is not a supported image type: ${imageOptions.src}`);\n }\n\n if (!icon.name) {\n icon.name = `icon_${getDimensionsId(imageOptions)}.${mime.getExtension(mimeType)}`;\n }\n\n return icon;\n}\n\nexport async function generateImageAsync(\n options: { projectRoot: string; cacheType?: string },\n imageOptions: ImageOptions\n): Promise<{ source: Buffer; name: string }> {\n const icon = await ensureImageOptionsAsync(imageOptions);\n\n if (!options.cacheType) {\n await maybeWarnAboutInstallingSharpAsync();\n return { name: icon.name!, source: await resizeAsync(icon) };\n }\n\n const cacheKey = await Cache.createCacheKeyWithDirectoryAsync(\n options.projectRoot,\n options.cacheType,\n icon\n );\n\n const name = icon.name!;\n let source: Buffer | null = await Cache.getImageFromCacheAsync(name, cacheKey);\n\n if (!source) {\n await maybeWarnAboutInstallingSharpAsync();\n source = await resizeAsync(icon);\n await Cache.cacheImageAsync(name, source, cacheKey);\n }\n\n return { name, source };\n}\n\nexport async function generateFaviconAsync(\n pngImageBuffer: Buffer,\n sizes: number[] = [16, 32, 48]\n): Promise<Buffer> {\n const buffers = await resizeImagesAsync(pngImageBuffer, sizes);\n return await Ico.generateAsync(buffers);\n}\n\n/**\n * Layers the provided foreground image over the provided background image.\n *\n * @param foregroundImageBuffer\n * @param foregroundImageBuffer\n * @param x pixel offset from the left edge, defaults to 0.\n * @param y pixel offset from the top edge, defaults to 0.\n */\nexport async function compositeImagesAsync({\n foreground,\n background,\n x = 0,\n y = 0,\n}: {\n foreground: Buffer;\n background: Buffer;\n x?: number;\n y?: number;\n}): Promise<Buffer> {\n const sharp: any = await getSharpAsync();\n if (!sharp) {\n const image = (await Jimp.getJimpImageAsync(background)).composite(\n await Jimp.getJimpImageAsync(foreground),\n x,\n y\n );\n return await image.getBufferAsync(image.getMIME());\n }\n return await sharp(background)\n .composite([{ input: foreground, left: x, top: y }])\n .toBuffer();\n}\n"]}
|
|
1
|
+
{"version":3,"file":"Image.js","sourceRoot":"","sources":["../src/Image.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAAA,kDAA0B;AAC1B,gDAAwB;AAExB,+CAAiC;AACjC,qDAAuC;AACvC,2CAA6B;AAE7B,6CAA+B;AAC/B,+CAAiC;AAEjC,MAAM,kBAAkB,GAAG,CAAC,WAAW,EAAE,YAAY,EAAE,YAAY,EAAE,WAAW,CAAC,CAAC;AAElF,IAAI,SAAS,GAAY,KAAK,CAAC;AAE/B,KAAK,UAAU,iBAAiB,CAAC,MAAc,EAAE,KAAe;IAC9D,MAAM,KAAK,GAAG,MAAM,aAAa,EAAE,CAAC;IACpC,IAAI,CAAC,KAAK,EAAE;QACV,OAAO,IAAI,CAAC,iBAAiB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;KAC9C;IACD,OAAO,KAAK,CAAC,iBAAiB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AAChD,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,YAA0B;IACnD,MAAM,KAAK,GAAQ,MAAM,aAAa,EAAE,CAAC;IACzC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,UAAU,EAAE,GAAG,YAAY,CAAC;IACpE,IAAI,CAAC,KAAK,EAAE;QACV,MAAM,YAAY,GAAQ,EAAE,KAAK,EAAE,YAAY,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;QACpE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE;YAC3C,KAAK;YACL,MAAM;YACN,GAAG,EAAE,UAAU;YACf,UAAU,EAAE,eAAe;SAC5B,CAAC,CAAC;QAEH,IAAI,YAAY,CAAC,kBAAkB,EAAE;YACnC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;SACnB;QACD,IAAI,YAAY,CAAC,YAAY,EAAE;YAC7B,kGAAkG;YAClG,MAAM,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;SAC9B;QAED,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;QAC5D,OAAO,SAAS,CAAC;KAClB;IACD,IAAI;QACF,IAAI,WAAW,GAAG,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC;aACtC,WAAW,EAAE;aACb,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,UAAU,EAAE,UAAU,EAAE,aAAa,EAAE,CAAC,CAAC;QAEzE,kEAAkE;QAClE,IAAI,eAAe,IAAI,eAAe,KAAK,aAAa,EAAE;YACxD,wCAAwC;YACxC,WAAW,GAAG,WAAW,CAAC,SAAS,CAAC;gBAClC;oBACE,4BAA4B;oBAC5B,KAAK,EAAE;wBACL,MAAM,EAAE;4BACN,KAAK;4BACL,MAAM;4BACN,qBAAqB;4BACrB,QAAQ,EAAE,YAAY,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;4BACjD,UAAU,EAAE,eAAe;yBAC5B;qBACF;oBACD,gGAAgG;oBAChG,KAAK,EAAE,WAAW;iBACnB;aACF,CAAC,CAAC;SACJ;aAAM,IAAI,YAAY,CAAC,kBAAkB,EAAE;YAC1C,WAAW,CAAC,OAAO,EAAE,CAAC;SACvB;QAED,IAAI,YAAY,CAAC,YAAY,EAAE;YAC7B,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CACtB,iCAAiC,KAAK,aAAa,MAAM;cACnD,YAAY,CAAC,YAAY,SAAS,YAAY,CAAC,YAAY;gBAE/D,eAAe,IAAI,eAAe,KAAK,aAAa,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,MAC3E,YAAY,CACb,CAAC;YACF,WAAW,CAAC,SAAS,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC;SAC9D;QAED,OAAO,MAAM,WAAW,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC;KAC3C;IAAC,OAAO,EAAE,OAAO,EAAE,EAAE;QACpB,MAAM,IAAI,KAAK,CACb,kDAAkD,YAAY,CAAC,GAAG,MAAM,OAAO,EAAE,CAClF,CAAC;KACH;AACH,CAAC;AAED,KAAK,UAAU,aAAa;IAC1B,IAAI,KAAU,CAAC;IACf,IAAI,MAAM,KAAK,CAAC,gBAAgB,EAAE;QAAE,KAAK,GAAG,MAAM,KAAK,CAAC,sBAAsB,EAAE,CAAC;IACjF,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,eAAe,CAAC,YAAoD;IAC3E,OAAO,YAAY,CAAC,KAAK,KAAK,YAAY,CAAC,MAAM;QAC/C,CAAC,CAAC,GAAG,YAAY,CAAC,KAAK,EAAE;QACzB,CAAC,CAAC,GAAG,YAAY,CAAC,KAAK,IAAI,YAAY,CAAC,MAAM,EAAE,CAAC;AACrD,CAAC;AAED,KAAK,UAAU,kCAAkC;IAC/C,0GAA0G;IAC1G,IAAI,CAAC,SAAS,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,gBAAgB,EAAE,CAAC,EAAE;QACnD,SAAS,GAAG,IAAI,CAAC;QACjB,OAAO,CAAC,IAAI,CACV,eAAK,CAAC,MAAM,CACV,qMAAqM,CACtM,CACF,CAAC;KACH;AACH,CAAC;AAED,KAAK,UAAU,uBAAuB,CAAC,YAA0B;IAC/D,MAAM,IAAI,GAAG;QACX,GAAG,YAAY;QACf,GAAG,EAAE,MAAM,QAAQ,CAAC,wBAAwB,CAAC,YAAY,CAAC,GAAG,CAAC;KAC/D,CAAC;IAEF,qBAAqB;IACrB,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;QACpB,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;KAC7B;IAED,MAAM,QAAQ,GAAG,cAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAExC,IAAI,CAAC,QAAQ,EAAE;QACb,MAAM,IAAI,KAAK,CAAC,2CAA2C,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;KACxE;IACD,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE;QAC1C,MAAM,IAAI,KAAK,CAAC,iDAAiD,YAAY,CAAC,GAAG,EAAE,CAAC,CAAC;KACtF;IAED,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;QACd,IAAI,CAAC,IAAI,GAAG,QAAQ,eAAe,CAAC,YAAY,CAAC,IAAI,cAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC;KACpF;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAEM,KAAK,UAAU,kBAAkB,CACtC,OAAoD,EACpD,YAA0B;IAE1B,MAAM,IAAI,GAAG,MAAM,uBAAuB,CAAC,YAAY,CAAC,CAAC;IAEzD,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE;QACtB,MAAM,kCAAkC,EAAE,CAAC;QAC3C,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC;KAC9D;IAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,gCAAgC,CAC3D,OAAO,CAAC,WAAW,EACnB,OAAO,CAAC,SAAS,EACjB,IAAI,CACL,CAAC;IAEF,MAAM,IAAI,GAAG,IAAI,CAAC,IAAK,CAAC;IACxB,IAAI,MAAM,GAAkB,MAAM,KAAK,CAAC,sBAAsB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAE/E,IAAI,CAAC,MAAM,EAAE;QACX,MAAM,kCAAkC,EAAE,CAAC;QAC3C,MAAM,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,CAAC;QACjC,MAAM,KAAK,CAAC,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;KACrD;IAED,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AAC1B,CAAC;AA3BD,gDA2BC;AAEM,KAAK,UAAU,oBAAoB,CACxC,cAAsB,EACtB,QAAkB,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;IAE9B,MAAM,OAAO,GAAG,MAAM,iBAAiB,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;IAC/D,OAAO,MAAM,GAAG,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;AAC1C,CAAC;AAND,oDAMC;AAED;;;;;;;GAOG;AACI,KAAK,UAAU,oBAAoB,CAAC,EACzC,UAAU,EACV,UAAU,EACV,CAAC,GAAG,CAAC,EACL,CAAC,GAAG,CAAC,GAMN;IACC,MAAM,KAAK,GAAQ,MAAM,aAAa,EAAE,CAAC;IACzC,IAAI,CAAC,KAAK,EAAE;QACV,MAAM,KAAK,GAAG,CAAC,MAAM,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAChE,MAAM,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,EACxC,CAAC,EACD,CAAC,CACF,CAAC;QACF,OAAO,MAAM,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;KACpD;IACD,OAAO,MAAM,KAAK,CAAC,UAAU,CAAC;SAC3B,SAAS,CAAC,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;SACnD,QAAQ,EAAE,CAAC;AAChB,CAAC;AAvBD,oDAuBC","sourcesContent":["import chalk from 'chalk';\nimport mime from 'mime';\n\nimport * as Cache from './Cache';\nimport * as Download from './Download';\nimport * as Ico from './Ico';\nimport { ImageOptions } from './Image.types';\nimport * as Jimp from './jimp';\nimport * as Sharp from './sharp';\n\nconst supportedMimeTypes = ['image/png', 'image/jpeg', 'image/webp', 'image/gif'];\n\nlet hasWarned: boolean = false;\n\nasync function resizeImagesAsync(buffer: Buffer, sizes: number[]): Promise<Buffer[]> {\n const sharp = await getSharpAsync();\n if (!sharp) {\n return Jimp.resizeBufferAsync(buffer, sizes);\n }\n return Sharp.resizeBufferAsync(buffer, sizes);\n}\n\nasync function resizeAsync(imageOptions: ImageOptions): Promise<Buffer> {\n const sharp: any = await getSharpAsync();\n const { width, height, backgroundColor, resizeMode } = imageOptions;\n if (!sharp) {\n const inputOptions: any = { input: imageOptions.src, quality: 100 };\n const jimp = await Jimp.resize(inputOptions, {\n width,\n height,\n fit: resizeMode,\n background: backgroundColor,\n });\n\n if (imageOptions.removeTransparency) {\n jimp.colorType(2);\n }\n if (imageOptions.borderRadius) {\n // TODO: support setting border radius with Jimp. Currently only support making the image a circle\n await Jimp.circleAsync(jimp);\n }\n\n const imgBuffer = await jimp.getBufferAsync(jimp.getMIME());\n return imgBuffer;\n }\n try {\n let sharpBuffer = sharp(imageOptions.src)\n .ensureAlpha()\n .resize(width, height, { fit: resizeMode, background: 'transparent' });\n\n // Skip an extra step if the background is explicitly transparent.\n if (backgroundColor && backgroundColor !== 'transparent') {\n // Add the background color to the image\n sharpBuffer = sharpBuffer.composite([\n {\n // create a background color\n input: {\n create: {\n width,\n height,\n // allow alpha colors\n channels: imageOptions.removeTransparency ? 3 : 4,\n background: backgroundColor,\n },\n },\n // dest-over makes the first image (input) appear on top of the created image (background color)\n blend: 'dest-over',\n },\n ]);\n } else if (imageOptions.removeTransparency) {\n sharpBuffer.flatten();\n }\n\n if (imageOptions.borderRadius) {\n const mask = Buffer.from(\n `<svg><rect x=\"0\" y=\"0\" width=\"${width}\" height=\"${height}\" \n rx=\"${imageOptions.borderRadius}\" ry=\"${imageOptions.borderRadius}\" \n fill=\"${\n backgroundColor && backgroundColor !== 'transparent' ? backgroundColor : 'none'\n }\" /></svg>`\n );\n sharpBuffer.composite([{ input: mask, blend: 'dest-over' }]);\n }\n\n return await sharpBuffer.png().toBuffer();\n } catch ({ message }) {\n throw new Error(\n `It was not possible to generate splash screen '${imageOptions.src}'. ${message}`\n );\n }\n}\n\nasync function getSharpAsync(): Promise<any> {\n let sharp: any;\n if (await Sharp.isAvailableAsync()) sharp = await Sharp.findSharpInstanceAsync();\n return sharp;\n}\n\nfunction getDimensionsId(imageOptions: Pick<ImageOptions, 'width' | 'height'>): string {\n return imageOptions.width === imageOptions.height\n ? `${imageOptions.width}`\n : `${imageOptions.width}x${imageOptions.height}`;\n}\n\nasync function maybeWarnAboutInstallingSharpAsync() {\n // Putting the warning here will prevent the warning from showing if all images were reused from the cache\n if (!hasWarned && !(await Sharp.isAvailableAsync())) {\n hasWarned = true;\n console.warn(\n chalk.yellow(\n `Using node to generate images. This is much slower than using native packages.\\n\\u203A Optionally you can stop the process and try again after successfully running \\`npm install -g sharp-cli\\`.\\n`\n )\n );\n }\n}\n\nasync function ensureImageOptionsAsync(imageOptions: ImageOptions): Promise<ImageOptions> {\n const icon = {\n ...imageOptions,\n src: await Download.downloadOrUseCachedImage(imageOptions.src),\n };\n\n // Default to contain\n if (!icon.resizeMode) {\n icon.resizeMode = 'contain';\n }\n\n const mimeType = mime.getType(icon.src);\n\n if (!mimeType) {\n throw new Error(`Invalid mimeType for image with source: ${icon.src}`);\n }\n if (!supportedMimeTypes.includes(mimeType)) {\n throw new Error(`Supplied image is not a supported image type: ${imageOptions.src}`);\n }\n\n if (!icon.name) {\n icon.name = `icon_${getDimensionsId(imageOptions)}.${mime.getExtension(mimeType)}`;\n }\n\n return icon;\n}\n\nexport async function generateImageAsync(\n options: { projectRoot: string; cacheType?: string },\n imageOptions: ImageOptions\n): Promise<{ source: Buffer; name: string }> {\n const icon = await ensureImageOptionsAsync(imageOptions);\n\n if (!options.cacheType) {\n await maybeWarnAboutInstallingSharpAsync();\n return { name: icon.name!, source: await resizeAsync(icon) };\n }\n\n const cacheKey = await Cache.createCacheKeyWithDirectoryAsync(\n options.projectRoot,\n options.cacheType,\n icon\n );\n\n const name = icon.name!;\n let source: Buffer | null = await Cache.getImageFromCacheAsync(name, cacheKey);\n\n if (!source) {\n await maybeWarnAboutInstallingSharpAsync();\n source = await resizeAsync(icon);\n await Cache.cacheImageAsync(name, source, cacheKey);\n }\n\n return { name, source };\n}\n\nexport async function generateFaviconAsync(\n pngImageBuffer: Buffer,\n sizes: number[] = [16, 32, 48]\n): Promise<Buffer> {\n const buffers = await resizeImagesAsync(pngImageBuffer, sizes);\n return await Ico.generateAsync(buffers);\n}\n\n/**\n * Layers the provided foreground image over the provided background image.\n *\n * @param foregroundImageBuffer\n * @param foregroundImageBuffer\n * @param x pixel offset from the left edge, defaults to 0.\n * @param y pixel offset from the top edge, defaults to 0.\n */\nexport async function compositeImagesAsync({\n foreground,\n background,\n x = 0,\n y = 0,\n}: {\n foreground: Buffer;\n background: Buffer;\n x?: number;\n y?: number;\n}): Promise<Buffer> {\n const sharp: any = await getSharpAsync();\n if (!sharp) {\n const image = (await Jimp.getJimpImageAsync(background)).composite(\n await Jimp.getJimpImageAsync(foreground),\n x,\n y\n );\n return await image.getBufferAsync(image.getMIME());\n }\n return await sharp(background)\n .composite([{ input: foreground, left: x, top: y }])\n .toBuffer();\n}\n"]}
|
package/build/jimp.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
|
-
import Jimp from 'jimp
|
|
2
|
+
import Jimp from 'jimp-compact';
|
|
3
3
|
import { ResizeOptions, SharpCommandOptions, SharpGlobalOptions } from './sharp.types';
|
|
4
4
|
declare type JimpGlobalOptions = Omit<SharpGlobalOptions, 'input'> & {
|
|
5
5
|
input: string | Buffer | Jimp;
|
package/build/jimp.js
CHANGED
|
@@ -24,13 +24,14 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
24
24
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
25
25
|
exports.resize = exports.getJimpImageAsync = exports.circleAsync = exports.isFolderAsync = exports.jimpAsync = exports.convertFormat = exports.resizeBufferAsync = void 0;
|
|
26
26
|
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
27
|
-
|
|
27
|
+
// @ts-ignore
|
|
28
|
+
const jimp_compact_1 = __importDefault(require("jimp-compact"));
|
|
28
29
|
const path = __importStar(require("path"));
|
|
29
30
|
async function resizeBufferAsync(buffer, sizes) {
|
|
30
31
|
return Promise.all(sizes.map(async (size) => {
|
|
31
32
|
// Parse the buffer each time to prevent mutable copies.
|
|
32
33
|
// Parse the buffer each time to prevent mutable copies.
|
|
33
|
-
const jimpImage = await
|
|
34
|
+
const jimpImage = await jimp_compact_1.default.read(buffer);
|
|
34
35
|
const mime = jimpImage.getMIME();
|
|
35
36
|
return jimpImage.resize(size, size).getBufferAsync(mime);
|
|
36
37
|
}));
|
|
@@ -115,12 +116,22 @@ exports.circleAsync = circleAsync;
|
|
|
115
116
|
async function getJimpImageAsync(input) {
|
|
116
117
|
// @ts-ignore: Jimp types are broken
|
|
117
118
|
if (typeof input === 'string' || input instanceof Buffer)
|
|
118
|
-
return await
|
|
119
|
+
return await jimp_compact_1.default.read(input);
|
|
119
120
|
return input;
|
|
120
121
|
}
|
|
121
122
|
exports.getJimpImageAsync = getJimpImageAsync;
|
|
122
|
-
async function resize({ input, quality = 100 }, { background, position, fit, width, height
|
|
123
|
+
async function resize({ input, quality = 100 }, { background, position, fit, width, height }) {
|
|
123
124
|
let initialImage = await getJimpImageAsync(input);
|
|
125
|
+
if (width && !height) {
|
|
126
|
+
height = jimp_compact_1.default.AUTO;
|
|
127
|
+
}
|
|
128
|
+
else if (!width && height) {
|
|
129
|
+
width = jimp_compact_1.default.AUTO;
|
|
130
|
+
}
|
|
131
|
+
else if (!width && !height) {
|
|
132
|
+
width = initialImage.bitmap.width;
|
|
133
|
+
height = initialImage.bitmap.height;
|
|
134
|
+
}
|
|
124
135
|
const jimpPosition = convertPosition(position);
|
|
125
136
|
const jimpQuality = typeof quality !== 'number' ? 100 : quality;
|
|
126
137
|
if (fit === 'cover') {
|
|
@@ -133,8 +144,8 @@ async function resize({ input, quality = 100 }, { background, position, fit, wid
|
|
|
133
144
|
throw new Error(`Unsupported fit: ${fit}. Please choose either 'cover', or 'contain' when using Jimp`);
|
|
134
145
|
}
|
|
135
146
|
if (background) {
|
|
136
|
-
initialImage = initialImage.composite(new
|
|
137
|
-
mode:
|
|
147
|
+
initialImage = initialImage.composite(new jimp_compact_1.default(width, height, background), 0, 0, {
|
|
148
|
+
mode: jimp_compact_1.default.BLEND_DESTINATION_OVER,
|
|
138
149
|
opacitySource: 1,
|
|
139
150
|
opacityDest: 1,
|
|
140
151
|
});
|
|
@@ -145,7 +156,7 @@ exports.resize = resize;
|
|
|
145
156
|
async function flatten({ input, quality = 100 }, { background }) {
|
|
146
157
|
const initialImage = await getJimpImageAsync(input);
|
|
147
158
|
const jimpQuality = typeof quality !== 'number' ? 100 : quality;
|
|
148
|
-
return initialImage.quality(jimpQuality).background(
|
|
159
|
+
return initialImage.quality(jimpQuality).background(jimp_compact_1.default.cssColorToHex(background));
|
|
149
160
|
}
|
|
150
161
|
/**
|
|
151
162
|
* Convert sharp position to Jimp position.
|
|
@@ -158,31 +169,31 @@ function convertPosition(position) {
|
|
|
158
169
|
switch (position) {
|
|
159
170
|
case 'center':
|
|
160
171
|
case 'centre':
|
|
161
|
-
return
|
|
172
|
+
return jimp_compact_1.default.VERTICAL_ALIGN_MIDDLE | jimp_compact_1.default.HORIZONTAL_ALIGN_CENTER;
|
|
162
173
|
case 'north':
|
|
163
174
|
case 'top':
|
|
164
|
-
return
|
|
175
|
+
return jimp_compact_1.default.VERTICAL_ALIGN_TOP | jimp_compact_1.default.HORIZONTAL_ALIGN_CENTER;
|
|
165
176
|
case 'east':
|
|
166
177
|
case 'right':
|
|
167
|
-
return
|
|
178
|
+
return jimp_compact_1.default.VERTICAL_ALIGN_MIDDLE | jimp_compact_1.default.HORIZONTAL_ALIGN_RIGHT;
|
|
168
179
|
case 'south':
|
|
169
180
|
case 'bottom':
|
|
170
|
-
return
|
|
181
|
+
return jimp_compact_1.default.VERTICAL_ALIGN_BOTTOM | jimp_compact_1.default.HORIZONTAL_ALIGN_CENTER;
|
|
171
182
|
case 'west':
|
|
172
183
|
case 'left':
|
|
173
|
-
return
|
|
184
|
+
return jimp_compact_1.default.VERTICAL_ALIGN_MIDDLE | jimp_compact_1.default.HORIZONTAL_ALIGN_LEFT;
|
|
174
185
|
case 'northeast':
|
|
175
186
|
case 'right top':
|
|
176
|
-
return
|
|
187
|
+
return jimp_compact_1.default.VERTICAL_ALIGN_TOP | jimp_compact_1.default.HORIZONTAL_ALIGN_RIGHT;
|
|
177
188
|
case 'southeast':
|
|
178
189
|
case 'right bottom':
|
|
179
|
-
return
|
|
190
|
+
return jimp_compact_1.default.VERTICAL_ALIGN_BOTTOM | jimp_compact_1.default.HORIZONTAL_ALIGN_RIGHT;
|
|
180
191
|
case 'southwest':
|
|
181
192
|
case 'left bottom':
|
|
182
|
-
return
|
|
193
|
+
return jimp_compact_1.default.VERTICAL_ALIGN_BOTTOM | jimp_compact_1.default.HORIZONTAL_ALIGN_LEFT;
|
|
183
194
|
case 'northwest':
|
|
184
195
|
case 'left top':
|
|
185
|
-
return
|
|
196
|
+
return jimp_compact_1.default.VERTICAL_ALIGN_TOP | jimp_compact_1.default.HORIZONTAL_ALIGN_LEFT;
|
|
186
197
|
case 'entropy':
|
|
187
198
|
case 'attention':
|
|
188
199
|
throw new Error(`Position: '${position}' is not supported`);
|
package/build/jimp.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jimp.js","sourceRoot":"","sources":["../src/jimp.ts"],"names":[],"mappings":"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","sourcesContent":["import fs from 'fs-extra';\nimport Jimp from 'jimp/es';\nimport * as path from 'path';\n\nimport {\n FlattenOptions,\n Position,\n ResizeOptions,\n SharpCommandOptions,\n SharpGlobalOptions,\n} from './sharp.types';\n\ntype JimpGlobalOptions = Omit<SharpGlobalOptions, 'input'> & {\n input: string | Buffer | Jimp;\n originalInput: string;\n};\n\nexport async function resizeBufferAsync(buffer: Buffer, sizes: number[]): Promise<Buffer[]> {\n return Promise.all(\n sizes.map(async size => {\n // Parse the buffer each time to prevent mutable copies.\n // Parse the buffer each time to prevent mutable copies.\n const jimpImage = await Jimp.read(buffer);\n const mime = jimpImage.getMIME();\n\n return jimpImage.resize(size, size).getBufferAsync(mime);\n })\n );\n}\n\nexport function convertFormat(format?: string): string | undefined {\n if (typeof format === 'undefined') return format;\n\n const input = format?.toLowerCase();\n switch (input) {\n case 'png':\n case 'webp':\n case 'jpeg':\n return `image/${input}`;\n case 'jpg':\n return `image/jpeg`;\n }\n return undefined;\n}\n\nexport async function jimpAsync(\n options: JimpGlobalOptions,\n commands: SharpCommandOptions[] = []\n): Promise<Buffer> {\n if (commands.length) {\n const command = commands.shift();\n if (command) {\n let input: Jimp;\n if (command.operation === 'resize') {\n input = await resize(options, command);\n } else if (command.operation === 'flatten') {\n input = await flatten(options, command);\n } else {\n throw new Error(`The operation: '${command.operation}' is not supported with Jimp`);\n }\n // @ts-ignore\n return jimpAsync({ ...options, input }, commands);\n }\n }\n\n const image = await getJimpImageAsync(options.input);\n const mime = typeof options.format === 'string' ? options.format : image.getMIME();\n const imgBuffer = await image.getBufferAsync(mime);\n\n if (typeof options.output === 'string') {\n if (await isFolderAsync(options.output)) {\n await fs.writeFile(\n path.join(options.output, path.basename(options.originalInput)),\n imgBuffer\n );\n } else {\n await fs.writeFile(options.output, imgBuffer);\n }\n }\n return imgBuffer;\n}\n\nexport async function isFolderAsync(path: string): Promise<boolean> {\n try {\n return (await fs.stat(path)).isDirectory();\n } catch (e) {\n return false;\n }\n}\n\nexport function circleAsync(jimp: Jimp): Promise<Jimp> {\n const radius = Math.min(jimp.bitmap.width, jimp.bitmap.height) / 2;\n\n const center = {\n x: jimp.bitmap.width / 2,\n y: jimp.bitmap.height / 2,\n };\n\n return new Promise(resolve => {\n jimp.scanQuiet(0, 0, jimp.bitmap.width, jimp.bitmap.height, (x, y, idx) => {\n const curR = Math.sqrt(Math.pow(x - center.x, 2) + Math.pow(y - center.y, 2));\n\n if (radius - curR <= 0.0) {\n jimp.bitmap.data[idx + 3] = 0;\n } else if (radius - curR < 1.0) {\n jimp.bitmap.data[idx + 3] = 255 * (radius - curR);\n }\n resolve(jimp);\n });\n });\n}\n\nexport async function getJimpImageAsync(input: string | Buffer | Jimp): Promise<Jimp> {\n // @ts-ignore: Jimp types are broken\n if (typeof input === 'string' || input instanceof Buffer) return await Jimp.read(input);\n\n return input;\n}\n\nexport async function resize(\n { input, quality = 100 }: JimpGlobalOptions,\n { background, position, fit, width, height = Jimp.AUTO }: Omit<ResizeOptions, 'operation'>\n): Promise<Jimp> {\n let initialImage = await getJimpImageAsync(input);\n const jimpPosition = convertPosition(position);\n const jimpQuality = typeof quality !== 'number' ? 100 : quality;\n if (fit === 'cover') {\n initialImage = initialImage.cover(width, height, jimpPosition);\n } else if (fit === 'contain') {\n initialImage = initialImage.contain(width, height, jimpPosition);\n } else {\n throw new Error(\n `Unsupported fit: ${fit}. Please choose either 'cover', or 'contain' when using Jimp`\n );\n }\n if (background) {\n initialImage = initialImage.composite(new Jimp(width, height, background), 0, 0, {\n mode: Jimp.BLEND_DESTINATION_OVER,\n opacitySource: 1,\n opacityDest: 1,\n });\n }\n\n return await initialImage.quality(jimpQuality);\n}\n\nasync function flatten(\n { input, quality = 100 }: JimpGlobalOptions,\n { background }: Omit<FlattenOptions, 'operation'>\n): Promise<Jimp> {\n const initialImage = await getJimpImageAsync(input);\n const jimpQuality = typeof quality !== 'number' ? 100 : quality;\n return initialImage.quality(jimpQuality).background(Jimp.cssColorToHex(background));\n}\n\n/**\n * Convert sharp position to Jimp position.\n *\n * @param position\n */\nfunction convertPosition(position?: Position): number {\n if (!position) return convertPosition('center');\n\n switch (position) {\n case 'center':\n case 'centre':\n return Jimp.VERTICAL_ALIGN_MIDDLE | Jimp.HORIZONTAL_ALIGN_CENTER;\n case 'north':\n case 'top':\n return Jimp.VERTICAL_ALIGN_TOP | Jimp.HORIZONTAL_ALIGN_CENTER;\n case 'east':\n case 'right':\n return Jimp.VERTICAL_ALIGN_MIDDLE | Jimp.HORIZONTAL_ALIGN_RIGHT;\n case 'south':\n case 'bottom':\n return Jimp.VERTICAL_ALIGN_BOTTOM | Jimp.HORIZONTAL_ALIGN_CENTER;\n case 'west':\n case 'left':\n return Jimp.VERTICAL_ALIGN_MIDDLE | Jimp.HORIZONTAL_ALIGN_LEFT;\n case 'northeast':\n case 'right top':\n return Jimp.VERTICAL_ALIGN_TOP | Jimp.HORIZONTAL_ALIGN_RIGHT;\n case 'southeast':\n case 'right bottom':\n return Jimp.VERTICAL_ALIGN_BOTTOM | Jimp.HORIZONTAL_ALIGN_RIGHT;\n case 'southwest':\n case 'left bottom':\n return Jimp.VERTICAL_ALIGN_BOTTOM | Jimp.HORIZONTAL_ALIGN_LEFT;\n case 'northwest':\n case 'left top':\n return Jimp.VERTICAL_ALIGN_TOP | Jimp.HORIZONTAL_ALIGN_LEFT;\n case 'entropy':\n case 'attention':\n throw new Error(`Position: '${position}' is not supported`);\n default:\n throw new Error(`Unknown position: '${position}'`);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"jimp.js","sourceRoot":"","sources":["../src/jimp.ts"],"names":[],"mappings":"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","sourcesContent":["import fs from 'fs-extra';\n// @ts-ignore\nimport Jimp from 'jimp-compact';\nimport * as path from 'path';\n\nimport {\n FlattenOptions,\n Position,\n ResizeOptions,\n SharpCommandOptions,\n SharpGlobalOptions,\n} from './sharp.types';\n\ntype JimpGlobalOptions = Omit<SharpGlobalOptions, 'input'> & {\n input: string | Buffer | Jimp;\n originalInput: string;\n};\n\nexport async function resizeBufferAsync(buffer: Buffer, sizes: number[]): Promise<Buffer[]> {\n return Promise.all(\n sizes.map(async size => {\n // Parse the buffer each time to prevent mutable copies.\n // Parse the buffer each time to prevent mutable copies.\n const jimpImage = await Jimp.read(buffer);\n const mime = jimpImage.getMIME();\n\n return jimpImage.resize(size, size).getBufferAsync(mime);\n })\n );\n}\n\nexport function convertFormat(format?: string): string | undefined {\n if (typeof format === 'undefined') return format;\n\n const input = format?.toLowerCase();\n switch (input) {\n case 'png':\n case 'webp':\n case 'jpeg':\n return `image/${input}`;\n case 'jpg':\n return `image/jpeg`;\n }\n return undefined;\n}\n\nexport async function jimpAsync(\n options: JimpGlobalOptions,\n commands: SharpCommandOptions[] = []\n): Promise<Buffer> {\n if (commands.length) {\n const command = commands.shift();\n if (command) {\n let input: Jimp;\n if (command.operation === 'resize') {\n input = await resize(options, command);\n } else if (command.operation === 'flatten') {\n input = await flatten(options, command);\n } else {\n throw new Error(`The operation: '${command.operation}' is not supported with Jimp`);\n }\n // @ts-ignore\n return jimpAsync({ ...options, input }, commands);\n }\n }\n\n const image = await getJimpImageAsync(options.input);\n const mime = typeof options.format === 'string' ? options.format : image.getMIME();\n const imgBuffer = await image.getBufferAsync(mime);\n\n if (typeof options.output === 'string') {\n if (await isFolderAsync(options.output)) {\n await fs.writeFile(\n path.join(options.output, path.basename(options.originalInput)),\n imgBuffer\n );\n } else {\n await fs.writeFile(options.output, imgBuffer);\n }\n }\n return imgBuffer;\n}\n\nexport async function isFolderAsync(path: string): Promise<boolean> {\n try {\n return (await fs.stat(path)).isDirectory();\n } catch (e) {\n return false;\n }\n}\n\nexport function circleAsync(jimp: Jimp): Promise<Jimp> {\n const radius = Math.min(jimp.bitmap.width, jimp.bitmap.height) / 2;\n\n const center = {\n x: jimp.bitmap.width / 2,\n y: jimp.bitmap.height / 2,\n };\n\n return new Promise(resolve => {\n jimp.scanQuiet(\n 0,\n 0,\n jimp.bitmap.width,\n jimp.bitmap.height,\n (x: number, y: number, idx: number) => {\n const curR = Math.sqrt(Math.pow(x - center.x, 2) + Math.pow(y - center.y, 2));\n\n if (radius - curR <= 0.0) {\n jimp.bitmap.data[idx + 3] = 0;\n } else if (radius - curR < 1.0) {\n jimp.bitmap.data[idx + 3] = 255 * (radius - curR);\n }\n resolve(jimp);\n }\n );\n });\n}\n\nexport async function getJimpImageAsync(input: string | Buffer | Jimp): Promise<Jimp> {\n // @ts-ignore: Jimp types are broken\n if (typeof input === 'string' || input instanceof Buffer) return await Jimp.read(input);\n\n return input;\n}\n\nexport async function resize(\n { input, quality = 100 }: JimpGlobalOptions,\n { background, position, fit, width, height }: Omit<ResizeOptions, 'operation'>\n): Promise<Jimp> {\n let initialImage = await getJimpImageAsync(input);\n\n if (width && !height) {\n height = Jimp.AUTO;\n } else if (!width && height) {\n width = Jimp.AUTO;\n } else if (!width && !height) {\n width = initialImage.bitmap.width;\n height = initialImage.bitmap.height;\n }\n\n const jimpPosition = convertPosition(position);\n const jimpQuality = typeof quality !== 'number' ? 100 : quality;\n if (fit === 'cover') {\n initialImage = initialImage.cover(width, height, jimpPosition);\n } else if (fit === 'contain') {\n initialImage = initialImage.contain(width, height, jimpPosition);\n } else {\n throw new Error(\n `Unsupported fit: ${fit}. Please choose either 'cover', or 'contain' when using Jimp`\n );\n }\n if (background) {\n initialImage = initialImage.composite(new Jimp(width, height, background), 0, 0, {\n mode: Jimp.BLEND_DESTINATION_OVER,\n opacitySource: 1,\n opacityDest: 1,\n });\n }\n\n return await initialImage.quality(jimpQuality);\n}\n\nasync function flatten(\n { input, quality = 100 }: JimpGlobalOptions,\n { background }: Omit<FlattenOptions, 'operation'>\n): Promise<Jimp> {\n const initialImage = await getJimpImageAsync(input);\n const jimpQuality = typeof quality !== 'number' ? 100 : quality;\n return initialImage.quality(jimpQuality).background(Jimp.cssColorToHex(background));\n}\n\n/**\n * Convert sharp position to Jimp position.\n *\n * @param position\n */\nfunction convertPosition(position?: Position): number {\n if (!position) return convertPosition('center');\n\n switch (position) {\n case 'center':\n case 'centre':\n return Jimp.VERTICAL_ALIGN_MIDDLE | Jimp.HORIZONTAL_ALIGN_CENTER;\n case 'north':\n case 'top':\n return Jimp.VERTICAL_ALIGN_TOP | Jimp.HORIZONTAL_ALIGN_CENTER;\n case 'east':\n case 'right':\n return Jimp.VERTICAL_ALIGN_MIDDLE | Jimp.HORIZONTAL_ALIGN_RIGHT;\n case 'south':\n case 'bottom':\n return Jimp.VERTICAL_ALIGN_BOTTOM | Jimp.HORIZONTAL_ALIGN_CENTER;\n case 'west':\n case 'left':\n return Jimp.VERTICAL_ALIGN_MIDDLE | Jimp.HORIZONTAL_ALIGN_LEFT;\n case 'northeast':\n case 'right top':\n return Jimp.VERTICAL_ALIGN_TOP | Jimp.HORIZONTAL_ALIGN_RIGHT;\n case 'southeast':\n case 'right bottom':\n return Jimp.VERTICAL_ALIGN_BOTTOM | Jimp.HORIZONTAL_ALIGN_RIGHT;\n case 'southwest':\n case 'left bottom':\n return Jimp.VERTICAL_ALIGN_BOTTOM | Jimp.HORIZONTAL_ALIGN_LEFT;\n case 'northwest':\n case 'left top':\n return Jimp.VERTICAL_ALIGN_TOP | Jimp.HORIZONTAL_ALIGN_LEFT;\n case 'entropy':\n case 'attention':\n throw new Error(`Position: '${position}' is not supported`);\n default:\n throw new Error(`Unknown position: '${position}'`);\n }\n}\n"]}
|
package/build/sharp.js
CHANGED
|
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
6
6
|
exports.findSharpInstanceAsync = exports.sharpAsync = exports.isAvailableAsync = exports.resizeBufferAsync = void 0;
|
|
7
7
|
const spawn_async_1 = __importDefault(require("@expo/spawn-async"));
|
|
8
8
|
const getenv_1 = require("getenv");
|
|
9
|
+
const path_1 = __importDefault(require("path"));
|
|
9
10
|
const resolve_from_1 = __importDefault(require("resolve-from"));
|
|
10
11
|
const semver_1 = __importDefault(require("semver"));
|
|
11
12
|
const SHARP_HELP_PATTERN = /\n\nSpecify --help for available options/g;
|
|
@@ -152,14 +153,30 @@ async function findSharpInstanceAsync() {
|
|
|
152
153
|
catch { }
|
|
153
154
|
// Attempt to resolve the sharp instance used by the global CLI
|
|
154
155
|
let sharpCliPath;
|
|
155
|
-
|
|
156
|
-
|
|
156
|
+
if (process.platform !== 'win32') {
|
|
157
|
+
try {
|
|
158
|
+
sharpCliPath = (await spawn_async_1.default('which', ['sharp'])).stdout.toString().trim();
|
|
159
|
+
}
|
|
160
|
+
catch { }
|
|
157
161
|
}
|
|
158
|
-
|
|
159
|
-
|
|
162
|
+
else {
|
|
163
|
+
// On Windows systems, nested dependencies aren't linked to the paths within `require.resolve.paths`.
|
|
164
|
+
// Yarn installs these modules in a different folder, let's add yarn to the other attempts.
|
|
165
|
+
// See: https://github.com/expo/expo-cli/issues/2708
|
|
166
|
+
let yarnGlobalPath = '';
|
|
167
|
+
try {
|
|
168
|
+
yarnGlobalPath = path_1.default.join((await spawn_async_1.default('yarn', ['global', 'dir'])).stdout.toString().trim(), 'node_modules');
|
|
169
|
+
}
|
|
170
|
+
catch { }
|
|
171
|
+
try {
|
|
172
|
+
sharpCliPath = require.resolve('sharp-cli/package.json', {
|
|
173
|
+
paths: (require.resolve.paths('sharp-cli') || []).concat(yarnGlobalPath),
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
catch { }
|
|
160
177
|
}
|
|
161
178
|
// resolve sharp from the sharp-cli package
|
|
162
|
-
const sharpPath = resolve_from_1.default.silent(sharpCliPath, 'sharp');
|
|
179
|
+
const sharpPath = resolve_from_1.default.silent(sharpCliPath || '', 'sharp');
|
|
163
180
|
if (sharpPath) {
|
|
164
181
|
try {
|
|
165
182
|
// attempt to require the global sharp package
|
|
@@ -167,6 +184,9 @@ async function findSharpInstanceAsync() {
|
|
|
167
184
|
}
|
|
168
185
|
catch { }
|
|
169
186
|
}
|
|
187
|
+
if (!_sharpInstance) {
|
|
188
|
+
throw new Error(`Failed to find the instance of sharp used by the global sharp-cli package.`);
|
|
189
|
+
}
|
|
170
190
|
return _sharpInstance;
|
|
171
191
|
}
|
|
172
192
|
exports.findSharpInstanceAsync = findSharpInstanceAsync;
|
package/build/sharp.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sharp.js","sourceRoot":"","sources":["../src/sharp.ts"],"names":[],"mappings":"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","sourcesContent":["import spawnAsync from '@expo/spawn-async';\nimport { boolish } from 'getenv';\nimport resolveFrom from 'resolve-from';\nimport semver from 'semver';\n\nimport { Options, SharpCommandOptions, SharpGlobalOptions } from './sharp.types';\n\nconst SHARP_HELP_PATTERN = /\\n\\nSpecify --help for available options/g;\nconst SHARP_REQUIRED_VERSION = '^1.10.0';\n\nexport async function resizeBufferAsync(buffer: Buffer, sizes: number[]): Promise<Buffer[]> {\n const sharp = await findSharpInstanceAsync();\n\n const metadata = await sharp(buffer).metadata();\n // Create buffer for each size\n const resizedBuffers = await Promise.all(\n sizes.map(dimension => {\n const density = (dimension / Math.max(metadata.width, metadata.height)) * metadata.density;\n return sharp(buffer, {\n density: isNaN(density) ? undefined : Math.ceil(density),\n })\n .resize(dimension, dimension, { fit: 'contain', background: 'transparent' })\n .toBuffer();\n })\n );\n\n return resizedBuffers;\n}\n\nconst isSharpDisabled = boolish('EXPO_IMAGE_UTILS_NO_SHARP', false);\n\n/**\n * Returns `true` if a global sharp instance can be found.\n * This functionality can be overridden with `process.env.EXPO_IMAGE_UTILS_NO_SHARP=1`.\n */\nexport async function isAvailableAsync(): Promise<boolean> {\n if (isSharpDisabled) {\n return false;\n }\n try {\n return !!(await findSharpBinAsync());\n } catch {\n return false;\n }\n}\n\nexport async function sharpAsync(\n options: SharpGlobalOptions,\n commands: SharpCommandOptions[] = []\n): Promise<string[]> {\n const bin = await findSharpBinAsync();\n try {\n const { stdout } = await spawnAsync(bin, [\n ...getOptions(options),\n ...getCommandOptions(commands),\n ]);\n const outputFilePaths = stdout.trim().split('\\n');\n return outputFilePaths;\n } catch (error) {\n if (error.stderr) {\n throw new Error(\n '\\nProcessing images using sharp-cli failed: ' +\n error.message +\n '\\nOutput: ' +\n error.stderr.replace(SHARP_HELP_PATTERN, '')\n );\n } else {\n throw error;\n }\n }\n}\n\nfunction getOptions(options: Options): string[] {\n const args = [];\n for (const [key, value] of Object.entries(options)) {\n if (value != null && value !== false) {\n if (typeof value === 'boolean') {\n args.push(`--${key}`);\n } else if (typeof value === 'number') {\n args.push(`--${key}`, value.toFixed());\n } else {\n args.push(`--${key}`, value);\n }\n }\n }\n return args;\n}\n\nfunction getCommandOptions(commands: SharpCommandOptions[]): string[] {\n const args: string[] = [];\n for (const command of commands) {\n if (command.operation === 'resize') {\n const { operation, width, ...namedOptions } = command;\n args.push(operation, width.toFixed(), ...getOptions(namedOptions));\n } else {\n const { operation, ...namedOptions } = command;\n args.push(operation, ...getOptions(namedOptions));\n }\n args.push('--');\n }\n return args;\n}\n\nlet _sharpBin: string | null = null;\nlet _sharpInstance: any | null = null;\n\nasync function findSharpBinAsync(): Promise<string> {\n if (_sharpBin) {\n return _sharpBin;\n }\n try {\n const sharpCliPackage = require('sharp-cli/package.json');\n const libVipsVersion = require('sharp').versions.vips;\n if (\n sharpCliPackage &&\n semver.satisfies(sharpCliPackage.version, SHARP_REQUIRED_VERSION) &&\n typeof sharpCliPackage.bin.sharp === 'string' &&\n typeof libVipsVersion === 'string'\n ) {\n _sharpBin = require.resolve(`sharp-cli/${sharpCliPackage.bin.sharp}`);\n return _sharpBin;\n }\n } catch (e) {\n // fall back to global sharp-cli\n }\n\n let installedCliVersion;\n try {\n installedCliVersion = (await spawnAsync('sharp', ['--version'])).stdout.toString().trim();\n } catch (e) {\n throw notFoundError(SHARP_REQUIRED_VERSION);\n }\n\n if (!semver.satisfies(installedCliVersion, SHARP_REQUIRED_VERSION)) {\n showVersionMismatchWarning(SHARP_REQUIRED_VERSION, installedCliVersion);\n }\n _sharpBin = 'sharp';\n return _sharpBin;\n}\n\n/**\n * Returns the instance of `sharp` installed by the global `sharp-cli` package.\n * This method will throw errors if the `sharp` instance cannot be found, these errors can be circumvented by ensuring `isAvailableAsync()` resolves to `true`.\n */\nexport async function findSharpInstanceAsync(): Promise<any | null> {\n if (isSharpDisabled) {\n throw new Error(\n 'Global instance of sharp-cli cannot be retrieved because sharp-cli has been disabled with the environment variable `EXPO_IMAGE_UTILS_NO_SHARP`'\n );\n }\n if (_sharpInstance) {\n return _sharpInstance;\n }\n // Ensure sharp-cli version is correct\n await findSharpBinAsync();\n\n // Attempt to use local sharp package\n try {\n const sharp = require('sharp');\n _sharpInstance = sharp;\n return sharp;\n } catch {}\n\n // Attempt to resolve the sharp instance used by the global CLI\n let sharpCliPath;\n try {\n sharpCliPath = (await spawnAsync('which', ['sharp'])).stdout.toString().trim();\n } catch (e) {\n throw new Error(`Failed to find the instance of sharp used by the global sharp-cli package.`);\n }\n\n // resolve sharp from the sharp-cli package\n const sharpPath = resolveFrom.silent(sharpCliPath, 'sharp');\n\n if (sharpPath) {\n try {\n // attempt to require the global sharp package\n _sharpInstance = require(sharpPath);\n } catch {}\n }\n\n return _sharpInstance;\n}\n\nfunction notFoundError(requiredCliVersion: string): Error {\n return new Error(\n `This command requires version ${requiredCliVersion} of \\`sharp-cli\\`. \\n` +\n `You can install it using \\`npm install -g sharp-cli@${requiredCliVersion}\\`. \\n` +\n '\\n' +\n 'For prerequisites, see: https://sharp.dimens.io/en/stable/install/#prerequisites'\n );\n}\n\nlet versionMismatchWarningShown = false;\n\nfunction showVersionMismatchWarning(requiredCliVersion: string, installedCliVersion: string) {\n if (versionMismatchWarningShown) {\n return;\n }\n console.warn(\n `Warning: This command requires version ${requiredCliVersion} of \\`sharp-cli\\`. \\n` +\n `Currently installed version: \"${installedCliVersion}\" \\n` +\n `Required version: \"${requiredCliVersion}\" \\n` +\n `You can install it using \\`npm install -g sharp-cli@${requiredCliVersion}\\`. \\n` +\n '\\n' +\n 'For prerequisites, see: https://sharp.dimens.io/en/stable/install/#prerequisites'\n );\n versionMismatchWarningShown = true;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"sharp.js","sourceRoot":"","sources":["../src/sharp.ts"],"names":[],"mappings":"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","sourcesContent":["import spawnAsync from '@expo/spawn-async';\nimport { boolish } from 'getenv';\nimport path from 'path';\nimport resolveFrom from 'resolve-from';\nimport semver from 'semver';\n\nimport { Options, SharpCommandOptions, SharpGlobalOptions } from './sharp.types';\n\nconst SHARP_HELP_PATTERN = /\\n\\nSpecify --help for available options/g;\nconst SHARP_REQUIRED_VERSION = '^1.10.0';\n\nexport async function resizeBufferAsync(buffer: Buffer, sizes: number[]): Promise<Buffer[]> {\n const sharp = await findSharpInstanceAsync();\n\n const metadata = await sharp(buffer).metadata();\n // Create buffer for each size\n const resizedBuffers = await Promise.all(\n sizes.map(dimension => {\n const density = (dimension / Math.max(metadata.width, metadata.height)) * metadata.density;\n return sharp(buffer, {\n density: isNaN(density) ? undefined : Math.ceil(density),\n })\n .resize(dimension, dimension, { fit: 'contain', background: 'transparent' })\n .toBuffer();\n })\n );\n\n return resizedBuffers;\n}\n\nconst isSharpDisabled = boolish('EXPO_IMAGE_UTILS_NO_SHARP', false);\n\n/**\n * Returns `true` if a global sharp instance can be found.\n * This functionality can be overridden with `process.env.EXPO_IMAGE_UTILS_NO_SHARP=1`.\n */\nexport async function isAvailableAsync(): Promise<boolean> {\n if (isSharpDisabled) {\n return false;\n }\n try {\n return !!(await findSharpBinAsync());\n } catch {\n return false;\n }\n}\n\nexport async function sharpAsync(\n options: SharpGlobalOptions,\n commands: SharpCommandOptions[] = []\n): Promise<string[]> {\n const bin = await findSharpBinAsync();\n try {\n const { stdout } = await spawnAsync(bin, [\n ...getOptions(options),\n ...getCommandOptions(commands),\n ]);\n const outputFilePaths = stdout.trim().split('\\n');\n return outputFilePaths;\n } catch (error) {\n if (error.stderr) {\n throw new Error(\n '\\nProcessing images using sharp-cli failed: ' +\n error.message +\n '\\nOutput: ' +\n error.stderr.replace(SHARP_HELP_PATTERN, '')\n );\n } else {\n throw error;\n }\n }\n}\n\nfunction getOptions(options: Options): string[] {\n const args = [];\n for (const [key, value] of Object.entries(options)) {\n if (value != null && value !== false) {\n if (typeof value === 'boolean') {\n args.push(`--${key}`);\n } else if (typeof value === 'number') {\n args.push(`--${key}`, value.toFixed());\n } else {\n args.push(`--${key}`, value);\n }\n }\n }\n return args;\n}\n\nfunction getCommandOptions(commands: SharpCommandOptions[]): string[] {\n const args: string[] = [];\n for (const command of commands) {\n if (command.operation === 'resize') {\n const { operation, width, ...namedOptions } = command;\n args.push(operation, width.toFixed(), ...getOptions(namedOptions));\n } else {\n const { operation, ...namedOptions } = command;\n args.push(operation, ...getOptions(namedOptions));\n }\n args.push('--');\n }\n return args;\n}\n\nlet _sharpBin: string | null = null;\nlet _sharpInstance: any | null = null;\n\nasync function findSharpBinAsync(): Promise<string> {\n if (_sharpBin) {\n return _sharpBin;\n }\n try {\n const sharpCliPackage = require('sharp-cli/package.json');\n const libVipsVersion = require('sharp').versions.vips;\n if (\n sharpCliPackage &&\n semver.satisfies(sharpCliPackage.version, SHARP_REQUIRED_VERSION) &&\n typeof sharpCliPackage.bin.sharp === 'string' &&\n typeof libVipsVersion === 'string'\n ) {\n _sharpBin = require.resolve(`sharp-cli/${sharpCliPackage.bin.sharp}`);\n return _sharpBin;\n }\n } catch (e) {\n // fall back to global sharp-cli\n }\n\n let installedCliVersion;\n try {\n installedCliVersion = (await spawnAsync('sharp', ['--version'])).stdout.toString().trim();\n } catch (e) {\n throw notFoundError(SHARP_REQUIRED_VERSION);\n }\n\n if (!semver.satisfies(installedCliVersion, SHARP_REQUIRED_VERSION)) {\n showVersionMismatchWarning(SHARP_REQUIRED_VERSION, installedCliVersion);\n }\n _sharpBin = 'sharp';\n return _sharpBin;\n}\n\n/**\n * Returns the instance of `sharp` installed by the global `sharp-cli` package.\n * This method will throw errors if the `sharp` instance cannot be found, these errors can be circumvented by ensuring `isAvailableAsync()` resolves to `true`.\n */\nexport async function findSharpInstanceAsync(): Promise<any | null> {\n if (isSharpDisabled) {\n throw new Error(\n 'Global instance of sharp-cli cannot be retrieved because sharp-cli has been disabled with the environment variable `EXPO_IMAGE_UTILS_NO_SHARP`'\n );\n }\n if (_sharpInstance) {\n return _sharpInstance;\n }\n // Ensure sharp-cli version is correct\n await findSharpBinAsync();\n\n // Attempt to use local sharp package\n try {\n const sharp = require('sharp');\n _sharpInstance = sharp;\n return sharp;\n } catch {}\n\n // Attempt to resolve the sharp instance used by the global CLI\n let sharpCliPath;\n if (process.platform !== 'win32') {\n try {\n sharpCliPath = (await spawnAsync('which', ['sharp'])).stdout.toString().trim();\n } catch {}\n } else {\n // On Windows systems, nested dependencies aren't linked to the paths within `require.resolve.paths`.\n // Yarn installs these modules in a different folder, let's add yarn to the other attempts.\n // See: https://github.com/expo/expo-cli/issues/2708\n let yarnGlobalPath = '';\n try {\n yarnGlobalPath = path.join(\n (await spawnAsync('yarn', ['global', 'dir'])).stdout.toString().trim(),\n 'node_modules'\n );\n } catch {}\n try {\n sharpCliPath = require.resolve('sharp-cli/package.json', {\n paths: (require.resolve.paths('sharp-cli') || []).concat(yarnGlobalPath),\n });\n } catch {}\n }\n\n // resolve sharp from the sharp-cli package\n const sharpPath = resolveFrom.silent(sharpCliPath || '', 'sharp');\n\n if (sharpPath) {\n try {\n // attempt to require the global sharp package\n _sharpInstance = require(sharpPath);\n } catch {}\n }\n\n if (!_sharpInstance) {\n throw new Error(`Failed to find the instance of sharp used by the global sharp-cli package.`);\n }\n\n return _sharpInstance;\n}\n\nfunction notFoundError(requiredCliVersion: string): Error {\n return new Error(\n `This command requires version ${requiredCliVersion} of \\`sharp-cli\\`. \\n` +\n `You can install it using \\`npm install -g sharp-cli@${requiredCliVersion}\\`. \\n` +\n '\\n' +\n 'For prerequisites, see: https://sharp.dimens.io/en/stable/install/#prerequisites'\n );\n}\n\nlet versionMismatchWarningShown = false;\n\nfunction showVersionMismatchWarning(requiredCliVersion: string, installedCliVersion: string) {\n if (versionMismatchWarningShown) {\n return;\n }\n console.warn(\n `Warning: This command requires version ${requiredCliVersion} of \\`sharp-cli\\`. \\n` +\n `Currently installed version: \"${installedCliVersion}\" \\n` +\n `Required version: \"${requiredCliVersion}\" \\n` +\n `You can install it using \\`npm install -g sharp-cli@${requiredCliVersion}\\`. \\n` +\n '\\n' +\n 'For prerequisites, see: https://sharp.dimens.io/en/stable/install/#prerequisites'\n );\n versionMismatchWarningShown = true;\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@expo/image-utils",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.18",
|
|
4
4
|
"description": "A package used by Expo CLI for processing images",
|
|
5
5
|
"main": "build/index.js",
|
|
6
6
|
"scripts": {
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
"bugs": {
|
|
23
23
|
"url": "https://github.com/expo/expo-cli/issues"
|
|
24
24
|
},
|
|
25
|
-
"homepage": "https://github.com/expo/expo-cli/tree/
|
|
25
|
+
"homepage": "https://github.com/expo/expo-cli/tree/main/packages/image-utils#readme",
|
|
26
26
|
"files": [
|
|
27
27
|
"build"
|
|
28
28
|
],
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
"chalk": "^4.0.0",
|
|
32
32
|
"fs-extra": "9.0.0",
|
|
33
33
|
"getenv": "^1.0.0",
|
|
34
|
-
"jimp": "0.
|
|
34
|
+
"jimp-compact": "0.16.1",
|
|
35
35
|
"mime": "^2.4.4",
|
|
36
36
|
"node-fetch": "^2.6.0",
|
|
37
37
|
"parse-png": "^2.1.0",
|
|
@@ -40,11 +40,9 @@
|
|
|
40
40
|
"tempy": "0.3.0"
|
|
41
41
|
},
|
|
42
42
|
"devDependencies": {
|
|
43
|
-
"@expo/babel-preset-cli": "0.2.20",
|
|
44
43
|
"@types/fs-extra": "^9.0.1",
|
|
45
44
|
"@types/getenv": "^0.7.0",
|
|
46
|
-
"@types/semver": "^6.0.0"
|
|
47
|
-
"rimraf": "^3.0.2"
|
|
45
|
+
"@types/semver": "^6.0.0"
|
|
48
46
|
},
|
|
49
47
|
"publishConfig": {
|
|
50
48
|
"access": "public"
|