@depup/expo__image-utils 0.8.12-depup.0
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/LICENSE +21 -0
- package/README.md +32 -0
- package/build/Cache.d.ts +7 -0
- package/build/Cache.js +81 -0
- package/build/Cache.js.map +1 -0
- package/build/Download.d.ts +2 -0
- package/build/Download.js +68 -0
- package/build/Download.js.map +1 -0
- package/build/Ico.d.ts +1 -0
- package/build/Ico.js +97 -0
- package/build/Ico.js.map +1 -0
- package/build/Image.d.ts +33 -0
- package/build/Image.js +263 -0
- package/build/Image.js.map +1 -0
- package/build/Image.types.d.ts +13 -0
- package/build/Image.types.js +3 -0
- package/build/Image.types.js.map +1 -0
- package/build/env.d.ts +8 -0
- package/build/env.js +16 -0
- package/build/env.js.map +1 -0
- package/build/index.d.ts +9 -0
- package/build/index.js +59 -0
- package/build/index.js.map +1 -0
- package/build/jimp.d.ts +22 -0
- package/build/jimp.js +230 -0
- package/build/jimp.js.map +1 -0
- package/build/resolveGlobal.d.ts +7 -0
- package/build/resolveGlobal.js +144 -0
- package/build/resolveGlobal.js.map +1 -0
- package/build/sharp.d.ts +13 -0
- package/build/sharp.js +188 -0
- package/build/sharp.js.map +1 -0
- package/build/sharp.types.d.ts +35 -0
- package/build/sharp.types.js +3 -0
- package/build/sharp.types.js.map +1 -0
- package/changes.json +14 -0
- package/package.json +70 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
The MIT License (MIT)
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2015-present 650 Industries, Inc. (aka Expo)
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# @depup/expo__image-utils
|
|
2
|
+
|
|
3
|
+
> Dependency-bumped version of [@expo/image-utils](https://www.npmjs.com/package/@expo/image-utils)
|
|
4
|
+
|
|
5
|
+
Generated by [DepUp](https://github.com/depup/npm) -- all production
|
|
6
|
+
dependencies bumped to latest versions.
|
|
7
|
+
|
|
8
|
+
## Installation
|
|
9
|
+
|
|
10
|
+
```bash
|
|
11
|
+
npm install @depup/expo__image-utils
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
| Field | Value |
|
|
15
|
+
|-------|-------|
|
|
16
|
+
| Original | [@expo/image-utils](https://www.npmjs.com/package/@expo/image-utils) @ 0.8.12 |
|
|
17
|
+
| Processed | 2026-03-17 |
|
|
18
|
+
| Smoke test | passed |
|
|
19
|
+
| Deps updated | 2 |
|
|
20
|
+
|
|
21
|
+
## Dependency Changes
|
|
22
|
+
|
|
23
|
+
| Dependency | From | To |
|
|
24
|
+
|------------|------|-----|
|
|
25
|
+
| chalk | ^4.0.0 | ^5.6.2 |
|
|
26
|
+
| semver | ^7.6.0 | ^7.7.4 |
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
Source: https://github.com/depup/npm | Original: https://www.npmjs.com/package/@expo/image-utils
|
|
31
|
+
|
|
32
|
+
License inherited from the original package.
|
package/build/Cache.d.ts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { ImageOptions } from './Image.types';
|
|
2
|
+
export declare function createCacheKey(fileSource: string, properties: string[]): string;
|
|
3
|
+
export declare function createCacheKeyWithDirectoryAsync(projectRoot: string, type: string, icon: ImageOptions): Promise<string>;
|
|
4
|
+
export declare function ensureCacheDirectory(projectRoot: string, type: string, cacheKey: string): Promise<string>;
|
|
5
|
+
export declare function getImageFromCacheAsync(fileName: string, cacheKey: string): Promise<null | Buffer>;
|
|
6
|
+
export declare function cacheImageAsync(fileName: string, buffer: Buffer, cacheKey: string): Promise<void>;
|
|
7
|
+
export declare function clearUnusedCachesAsync(projectRoot: string, type: string): Promise<void>;
|
package/build/Cache.js
ADDED
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.createCacheKey = createCacheKey;
|
|
7
|
+
exports.createCacheKeyWithDirectoryAsync = createCacheKeyWithDirectoryAsync;
|
|
8
|
+
exports.ensureCacheDirectory = ensureCacheDirectory;
|
|
9
|
+
exports.getImageFromCacheAsync = getImageFromCacheAsync;
|
|
10
|
+
exports.cacheImageAsync = cacheImageAsync;
|
|
11
|
+
exports.clearUnusedCachesAsync = clearUnusedCachesAsync;
|
|
12
|
+
const crypto_1 = __importDefault(require("crypto"));
|
|
13
|
+
const fs_1 = __importDefault(require("fs"));
|
|
14
|
+
const path_1 = require("path");
|
|
15
|
+
const CACHE_LOCATION = '.expo/web/cache/production/images';
|
|
16
|
+
const cacheKeys = {};
|
|
17
|
+
// Calculate SHA256 Checksum value of a file based on its contents
|
|
18
|
+
function calculateHash(filePath) {
|
|
19
|
+
const contents = filePath.startsWith('http') ? filePath : fs_1.default.readFileSync(filePath);
|
|
20
|
+
return crypto_1.default.createHash('sha256').update(contents).digest('hex');
|
|
21
|
+
}
|
|
22
|
+
// Create a hash key for caching the images between builds
|
|
23
|
+
function createCacheKey(fileSource, properties) {
|
|
24
|
+
const hash = calculateHash(fileSource);
|
|
25
|
+
return [hash].concat(properties).filter(Boolean).join('-');
|
|
26
|
+
}
|
|
27
|
+
async function createCacheKeyWithDirectoryAsync(projectRoot, type, icon) {
|
|
28
|
+
const iconProperties = [icon.resizeMode];
|
|
29
|
+
if (icon.backgroundColor) {
|
|
30
|
+
iconProperties.push(icon.backgroundColor);
|
|
31
|
+
}
|
|
32
|
+
const cacheKey = `${type}-${createCacheKey(icon.src, iconProperties)}`;
|
|
33
|
+
if (!(cacheKey in cacheKeys)) {
|
|
34
|
+
cacheKeys[cacheKey] = await ensureCacheDirectory(projectRoot, type, cacheKey);
|
|
35
|
+
}
|
|
36
|
+
return cacheKey;
|
|
37
|
+
}
|
|
38
|
+
async function ensureCacheDirectory(projectRoot, type, cacheKey) {
|
|
39
|
+
const cacheFolder = (0, path_1.join)(projectRoot, CACHE_LOCATION, type, cacheKey);
|
|
40
|
+
await fs_1.default.promises.mkdir(cacheFolder, { recursive: true });
|
|
41
|
+
return cacheFolder;
|
|
42
|
+
}
|
|
43
|
+
async function getImageFromCacheAsync(fileName, cacheKey) {
|
|
44
|
+
try {
|
|
45
|
+
return await fs_1.default.promises.readFile((0, path_1.resolve)(cacheKeys[cacheKey], fileName));
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
async function cacheImageAsync(fileName, buffer, cacheKey) {
|
|
52
|
+
try {
|
|
53
|
+
await fs_1.default.promises.writeFile((0, path_1.resolve)(cacheKeys[cacheKey], fileName), buffer);
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
console.warn(`Error caching image: "${fileName}". ${error.message}`);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
async function clearUnusedCachesAsync(projectRoot, type) {
|
|
60
|
+
// Clean up any old caches
|
|
61
|
+
const cacheFolder = (0, path_1.join)(projectRoot, CACHE_LOCATION, type);
|
|
62
|
+
await fs_1.default.promises.mkdir(cacheFolder, { recursive: true });
|
|
63
|
+
const currentCaches = await fs_1.default.promises.readdir(cacheFolder);
|
|
64
|
+
if (!Array.isArray(currentCaches)) {
|
|
65
|
+
console.warn('Failed to read the icon cache');
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
const deleteCachePromises = [];
|
|
69
|
+
for (const cache of currentCaches) {
|
|
70
|
+
// skip hidden folders
|
|
71
|
+
if (cache.startsWith('.')) {
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
// delete
|
|
75
|
+
if (!(cache in cacheKeys)) {
|
|
76
|
+
deleteCachePromises.push(fs_1.default.promises.rm((0, path_1.join)(cacheFolder, cache), { force: true, recursive: true }));
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
await Promise.all(deleteCachePromises);
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=Cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Cache.js","sourceRoot":"","sources":["../src/Cache.ts"],"names":[],"mappings":";;;;;AAiBA,wCAGC;AAED,4EAiBC;AAED,oDAQC;AAED,wDASC;AAED,0CAUC;AAED,wDA0BC;AApGD,oDAA4B;AAC5B,4CAAoB;AACpB,+BAAqC;AAIrC,MAAM,cAAc,GAAG,mCAAmC,CAAC;AAE3D,MAAM,SAAS,GAA8B,EAAE,CAAC;AAEhD,kEAAkE;AAClE,SAAS,aAAa,CAAC,QAAgB;IACrC,MAAM,QAAQ,GAAG,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,YAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;IACpF,OAAO,gBAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACpE,CAAC;AAED,0DAA0D;AAC1D,SAAgB,cAAc,CAAC,UAAkB,EAAE,UAAoB;IACrE,MAAM,IAAI,GAAG,aAAa,CAAC,UAAU,CAAC,CAAC;IACvC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC7D,CAAC;AAEM,KAAK,UAAU,gCAAgC,CACpD,WAAmB,EACnB,IAAY,EACZ,IAAkB;IAElB,MAAM,cAAc,GAAa,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAEnD,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;QACzB,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAC5C,CAAC;IAED,MAAM,QAAQ,GAAG,GAAG,IAAI,IAAI,cAAc,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,EAAE,CAAC;IACvE,IAAI,CAAC,CAAC,QAAQ,IAAI,SAAS,CAAC,EAAE,CAAC;QAC7B,SAAS,CAAC,QAAQ,CAAC,GAAG,MAAM,oBAAoB,CAAC,WAAW,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;IAChF,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAEM,KAAK,UAAU,oBAAoB,CACxC,WAAmB,EACnB,IAAY,EACZ,QAAgB;IAEhB,MAAM,WAAW,GAAG,IAAA,WAAI,EAAC,WAAW,EAAE,cAAc,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;IACtE,MAAM,YAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1D,OAAO,WAAW,CAAC;AACrB,CAAC;AAEM,KAAK,UAAU,sBAAsB,CAC1C,QAAgB,EAChB,QAAgB;IAEhB,IAAI,CAAC;QACH,OAAO,MAAM,YAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAA,cAAO,EAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC;IAC5E,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAEM,KAAK,UAAU,eAAe,CACnC,QAAgB,EAChB,MAAc,EACd,QAAgB;IAEhB,IAAI,CAAC;QACH,MAAM,YAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAA,cAAO,EAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,CAAC;IAC9E,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,OAAO,CAAC,IAAI,CAAC,yBAAyB,QAAQ,MAAM,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IACvE,CAAC;AACH,CAAC;AAEM,KAAK,UAAU,sBAAsB,CAAC,WAAmB,EAAE,IAAY;IAC5E,0BAA0B;IAC1B,MAAM,WAAW,GAAG,IAAA,WAAI,EAAC,WAAW,EAAE,cAAc,EAAE,IAAI,CAAC,CAAC;IAC5D,MAAM,YAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1D,MAAM,aAAa,GAAG,MAAM,YAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAE7D,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC;QAClC,OAAO,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;QAC9C,OAAO;IACT,CAAC;IACD,MAAM,mBAAmB,GAAoB,EAAE,CAAC;IAChD,KAAK,MAAM,KAAK,IAAI,aAAa,EAAE,CAAC;QAClC,sBAAsB;QACtB,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC1B,SAAS;QACX,CAAC;QAED,SAAS;QACT,IAAI,CAAC,CAAC,KAAK,IAAI,SAAS,CAAC,EAAE,CAAC;YAC1B,mBAAmB,CAAC,IAAI,CACtB,YAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAA,WAAI,EAAC,WAAW,EAAE,KAAK,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAC3E,CAAC;QACJ,CAAC;IACH,CAAC;IAED,MAAM,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;AACzC,CAAC"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.downloadOrUseCachedImage = downloadOrUseCachedImage;
|
|
7
|
+
exports.downloadImage = downloadImage;
|
|
8
|
+
const crypto_1 = require("crypto");
|
|
9
|
+
const fs_1 = __importDefault(require("fs"));
|
|
10
|
+
// @ts-ignore
|
|
11
|
+
const jimp_compact_1 = __importDefault(require("jimp-compact"));
|
|
12
|
+
const os_1 = __importDefault(require("os"));
|
|
13
|
+
const path_1 = __importDefault(require("path"));
|
|
14
|
+
const stream_1 = __importDefault(require("stream"));
|
|
15
|
+
const util_1 = __importDefault(require("util"));
|
|
16
|
+
// cache downloaded images into memory
|
|
17
|
+
const cacheDownloadedKeys = {};
|
|
18
|
+
function stripQueryParams(url) {
|
|
19
|
+
return url.split('?')[0].split('#')[0];
|
|
20
|
+
}
|
|
21
|
+
function temporaryDirectory() {
|
|
22
|
+
const directory = path_1.default.join(os_1.default.tmpdir(), (0, crypto_1.randomBytes)(16).toString('hex'));
|
|
23
|
+
fs_1.default.mkdirSync(directory, { recursive: true });
|
|
24
|
+
return directory;
|
|
25
|
+
}
|
|
26
|
+
async function downloadOrUseCachedImage(url) {
|
|
27
|
+
if (url in cacheDownloadedKeys) {
|
|
28
|
+
return cacheDownloadedKeys[url];
|
|
29
|
+
}
|
|
30
|
+
if (url.startsWith('http')) {
|
|
31
|
+
cacheDownloadedKeys[url] = await downloadImage(url);
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
cacheDownloadedKeys[url] = url;
|
|
35
|
+
}
|
|
36
|
+
return cacheDownloadedKeys[url];
|
|
37
|
+
}
|
|
38
|
+
async function downloadImage(url) {
|
|
39
|
+
const outputPath = temporaryDirectory();
|
|
40
|
+
const response = await fetch(url);
|
|
41
|
+
if (!response.ok) {
|
|
42
|
+
throw new Error(`It was not possible to download image from '${url}'`);
|
|
43
|
+
}
|
|
44
|
+
if (!response.body) {
|
|
45
|
+
throw new Error(`No response received from '${url}'`);
|
|
46
|
+
}
|
|
47
|
+
// Download to local file
|
|
48
|
+
const streamPipeline = util_1.default.promisify(stream_1.default.pipeline);
|
|
49
|
+
const localPath = path_1.default.join(outputPath, path_1.default.basename(stripQueryParams(url)));
|
|
50
|
+
// Type casting is required, see: https://github.com/DefinitelyTyped/DefinitelyTyped/discussions/65542
|
|
51
|
+
const readableBody = stream_1.default.Readable.fromWeb(response.body);
|
|
52
|
+
await streamPipeline(readableBody, fs_1.default.createWriteStream(localPath));
|
|
53
|
+
// If an image URL doesn't have a name, get the mime type and move the file.
|
|
54
|
+
const img = await jimp_compact_1.default.read(localPath);
|
|
55
|
+
const mime = img.getMIME().split('/').pop();
|
|
56
|
+
if (!localPath.endsWith(mime)) {
|
|
57
|
+
const newPath = path_1.default.join(outputPath, `image.${mime}`);
|
|
58
|
+
const parentPath = path_1.default.dirname(newPath);
|
|
59
|
+
if (!fs_1.default.existsSync(parentPath)) {
|
|
60
|
+
await fs_1.default.promises.mkdir(parentPath, { recursive: true });
|
|
61
|
+
}
|
|
62
|
+
// NOTE: EXDEV can't happen since we're just renaming the file in the same directory
|
|
63
|
+
await fs_1.default.promises.rename(localPath, newPath);
|
|
64
|
+
return newPath;
|
|
65
|
+
}
|
|
66
|
+
return localPath;
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=Download.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Download.js","sourceRoot":"","sources":["../src/Download.ts"],"names":[],"mappings":"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"}
|
package/build/Ico.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function generateAsync(buffers: Buffer[]): Promise<Buffer>;
|
package/build/Ico.js
ADDED
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.generateAsync = generateAsync;
|
|
7
|
+
// Inspired by https://github.com/kevva/to-ico but reuses existing packages to keep bundle size small.
|
|
8
|
+
const parse_png_1 = __importDefault(require("parse-png"));
|
|
9
|
+
const constants = {
|
|
10
|
+
directorySize: 16,
|
|
11
|
+
bitmapSize: 40,
|
|
12
|
+
headerSize: 6,
|
|
13
|
+
colorMode: 0,
|
|
14
|
+
};
|
|
15
|
+
function createHeader(header) {
|
|
16
|
+
const buffer = Buffer.alloc(constants.headerSize);
|
|
17
|
+
buffer.writeUInt16LE(0, 0);
|
|
18
|
+
buffer.writeUInt16LE(1, 2);
|
|
19
|
+
buffer.writeUInt16LE(header, 4);
|
|
20
|
+
return buffer;
|
|
21
|
+
}
|
|
22
|
+
function createDirectory(data, offset) {
|
|
23
|
+
const buffer = Buffer.alloc(constants.directorySize);
|
|
24
|
+
const size = data.data.length + constants.bitmapSize;
|
|
25
|
+
const width = data.width === 256 ? 0 : data.width;
|
|
26
|
+
const height = data.height === 256 ? 0 : data.height;
|
|
27
|
+
const bpp = data.bpp * 8;
|
|
28
|
+
buffer.writeUInt8(width, 0);
|
|
29
|
+
buffer.writeUInt8(height, 1);
|
|
30
|
+
buffer.writeUInt8(0, 2);
|
|
31
|
+
buffer.writeUInt8(0, 3);
|
|
32
|
+
buffer.writeUInt16LE(1, 4);
|
|
33
|
+
buffer.writeUInt16LE(bpp, 6);
|
|
34
|
+
buffer.writeUInt32LE(size, 8);
|
|
35
|
+
buffer.writeUInt32LE(offset, 12);
|
|
36
|
+
return buffer;
|
|
37
|
+
}
|
|
38
|
+
function createBitmap(data, compression) {
|
|
39
|
+
const buffer = Buffer.alloc(constants.bitmapSize);
|
|
40
|
+
buffer.writeUInt32LE(constants.bitmapSize, 0);
|
|
41
|
+
buffer.writeInt32LE(data.width, 4);
|
|
42
|
+
buffer.writeInt32LE(data.height * 2, 8);
|
|
43
|
+
buffer.writeUInt16LE(1, 12);
|
|
44
|
+
buffer.writeUInt16LE(data.bpp * 8, 14);
|
|
45
|
+
buffer.writeUInt32LE(compression, 16);
|
|
46
|
+
buffer.writeUInt32LE(data.data.length, 20);
|
|
47
|
+
buffer.writeInt32LE(0, 24);
|
|
48
|
+
buffer.writeInt32LE(0, 28);
|
|
49
|
+
buffer.writeUInt32LE(0, 32);
|
|
50
|
+
buffer.writeUInt32LE(0, 36);
|
|
51
|
+
return buffer;
|
|
52
|
+
}
|
|
53
|
+
function createDIB(data, width, height, bpp) {
|
|
54
|
+
const cols = width * bpp;
|
|
55
|
+
const rows = height * cols;
|
|
56
|
+
const end = rows - cols;
|
|
57
|
+
const buffer = Buffer.alloc(data.length);
|
|
58
|
+
for (let row = 0; row < rows; row += cols) {
|
|
59
|
+
for (let col = 0; col < cols; col += bpp) {
|
|
60
|
+
let pos = row + col;
|
|
61
|
+
const r = data.readUInt8(pos);
|
|
62
|
+
const g = data.readUInt8(pos + 1);
|
|
63
|
+
const b = data.readUInt8(pos + 2);
|
|
64
|
+
const a = data.readUInt8(pos + 3);
|
|
65
|
+
pos = end - row + col;
|
|
66
|
+
buffer.writeUInt8(b, pos);
|
|
67
|
+
buffer.writeUInt8(g, pos + 1);
|
|
68
|
+
buffer.writeUInt8(r, pos + 2);
|
|
69
|
+
buffer.writeUInt8(a, pos + 3);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return buffer;
|
|
73
|
+
}
|
|
74
|
+
function generateFromPNGs(pngs) {
|
|
75
|
+
const header = createHeader(pngs.length);
|
|
76
|
+
const arr = [header];
|
|
77
|
+
let len = header.length;
|
|
78
|
+
let offset = constants.headerSize + constants.directorySize * pngs.length;
|
|
79
|
+
for (const png of pngs) {
|
|
80
|
+
const dir = createDirectory(png, offset);
|
|
81
|
+
arr.push(dir);
|
|
82
|
+
len += dir.length;
|
|
83
|
+
offset += png.data.length + constants.bitmapSize;
|
|
84
|
+
}
|
|
85
|
+
for (const png of pngs) {
|
|
86
|
+
const header = createBitmap(png, constants.colorMode);
|
|
87
|
+
const dib = createDIB(png.data, png.width, png.height, png.bpp);
|
|
88
|
+
arr.push(header, dib);
|
|
89
|
+
len += header.length + dib.length;
|
|
90
|
+
}
|
|
91
|
+
return Buffer.concat(arr, len);
|
|
92
|
+
}
|
|
93
|
+
async function generateAsync(buffers) {
|
|
94
|
+
const pngs = await Promise.all(buffers.map((x) => (0, parse_png_1.default)(x)));
|
|
95
|
+
return generateFromPNGs(pngs);
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=Ico.js.map
|
package/build/Ico.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Ico.js","sourceRoot":"","sources":["../src/Ico.ts"],"names":[],"mappings":"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"}
|
package/build/Image.d.ts
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { ImageOptions } from './Image.types';
|
|
2
|
+
export declare function getMimeType(srcPath: string): string | null;
|
|
3
|
+
export declare function generateImageBackgroundAsync(imageOptions: Omit<ImageOptions, 'src'>): Promise<Buffer>;
|
|
4
|
+
export declare function generateImageAsync(options: {
|
|
5
|
+
projectRoot: string;
|
|
6
|
+
cacheType?: string;
|
|
7
|
+
}, imageOptions: ImageOptions): Promise<{
|
|
8
|
+
source: Buffer;
|
|
9
|
+
name: string;
|
|
10
|
+
}>;
|
|
11
|
+
export declare function generateFaviconAsync(pngImageBuffer: Buffer, sizes?: number[]): Promise<Buffer>;
|
|
12
|
+
/**
|
|
13
|
+
* Layers the provided foreground image over the provided background image.
|
|
14
|
+
*
|
|
15
|
+
* @param foregroundImageBuffer
|
|
16
|
+
* @param foregroundImageBuffer
|
|
17
|
+
* @param x pixel offset from the left edge, defaults to 0.
|
|
18
|
+
* @param y pixel offset from the top edge, defaults to 0.
|
|
19
|
+
*/
|
|
20
|
+
export declare function compositeImagesAsync({ foreground, background, x, y, }: {
|
|
21
|
+
foreground: Buffer;
|
|
22
|
+
background: Buffer;
|
|
23
|
+
x?: number;
|
|
24
|
+
y?: number;
|
|
25
|
+
}): Promise<Buffer>;
|
|
26
|
+
type PNGInfo = {
|
|
27
|
+
data: Buffer;
|
|
28
|
+
width: number;
|
|
29
|
+
height: number;
|
|
30
|
+
bpp: number;
|
|
31
|
+
};
|
|
32
|
+
export declare function getPngInfo(src: string): Promise<PNGInfo>;
|
|
33
|
+
export {};
|
package/build/Image.js
ADDED
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.getMimeType = getMimeType;
|
|
40
|
+
exports.generateImageBackgroundAsync = generateImageBackgroundAsync;
|
|
41
|
+
exports.generateImageAsync = generateImageAsync;
|
|
42
|
+
exports.generateFaviconAsync = generateFaviconAsync;
|
|
43
|
+
exports.compositeImagesAsync = compositeImagesAsync;
|
|
44
|
+
exports.getPngInfo = getPngInfo;
|
|
45
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
46
|
+
const fs_1 = __importDefault(require("fs"));
|
|
47
|
+
const parse_png_1 = __importDefault(require("parse-png"));
|
|
48
|
+
const path_1 = __importDefault(require("path"));
|
|
49
|
+
const Cache = __importStar(require("./Cache"));
|
|
50
|
+
const Download = __importStar(require("./Download"));
|
|
51
|
+
const Ico = __importStar(require("./Ico"));
|
|
52
|
+
const env_1 = require("./env");
|
|
53
|
+
const Jimp = __importStar(require("./jimp"));
|
|
54
|
+
const Sharp = __importStar(require("./sharp"));
|
|
55
|
+
let hasWarned = false;
|
|
56
|
+
async function resizeImagesAsync(buffer, sizes) {
|
|
57
|
+
const sharp = await getSharpAsync();
|
|
58
|
+
if (!sharp) {
|
|
59
|
+
return Jimp.resizeBufferAsync(buffer, sizes);
|
|
60
|
+
}
|
|
61
|
+
return Sharp.resizeBufferAsync(buffer, sizes);
|
|
62
|
+
}
|
|
63
|
+
async function resizeAsync(imageOptions) {
|
|
64
|
+
const sharp = await getSharpAsync();
|
|
65
|
+
const { width, height, backgroundColor, resizeMode } = imageOptions;
|
|
66
|
+
if (!sharp) {
|
|
67
|
+
const inputOptions = { input: imageOptions.src, quality: 100 };
|
|
68
|
+
const jimp = await Jimp.resize(inputOptions, {
|
|
69
|
+
width,
|
|
70
|
+
height,
|
|
71
|
+
fit: resizeMode,
|
|
72
|
+
background: backgroundColor,
|
|
73
|
+
});
|
|
74
|
+
if (imageOptions.removeTransparency) {
|
|
75
|
+
jimp.colorType(2);
|
|
76
|
+
}
|
|
77
|
+
if (imageOptions.borderRadius) {
|
|
78
|
+
// TODO: support setting border radius with Jimp. Currently only support making the image a circle
|
|
79
|
+
await Jimp.circleAsync(jimp);
|
|
80
|
+
}
|
|
81
|
+
// Convert to png buffer
|
|
82
|
+
return jimp.getBufferAsync('image/png');
|
|
83
|
+
}
|
|
84
|
+
try {
|
|
85
|
+
let sharpBuffer = sharp(imageOptions.src)
|
|
86
|
+
.keepIccProfile()
|
|
87
|
+
.ensureAlpha()
|
|
88
|
+
.resize(width, height, { fit: resizeMode, background: 'transparent' });
|
|
89
|
+
// Skip an extra step if the background is explicitly transparent.
|
|
90
|
+
if (backgroundColor && backgroundColor !== 'transparent') {
|
|
91
|
+
// Add the background color to the image
|
|
92
|
+
sharpBuffer = sharpBuffer.composite([
|
|
93
|
+
{
|
|
94
|
+
// create a background color
|
|
95
|
+
input: {
|
|
96
|
+
create: {
|
|
97
|
+
width,
|
|
98
|
+
height,
|
|
99
|
+
// allow alpha colors
|
|
100
|
+
channels: imageOptions.removeTransparency ? 3 : 4,
|
|
101
|
+
background: backgroundColor,
|
|
102
|
+
},
|
|
103
|
+
},
|
|
104
|
+
// dest-over makes the first image (input) appear on top of the created image (background color)
|
|
105
|
+
blend: 'dest-over',
|
|
106
|
+
},
|
|
107
|
+
]);
|
|
108
|
+
}
|
|
109
|
+
else if (imageOptions.removeTransparency) {
|
|
110
|
+
sharpBuffer.flatten();
|
|
111
|
+
}
|
|
112
|
+
if (imageOptions.borderRadius) {
|
|
113
|
+
const mask = Buffer.from(`<svg><rect x="0" y="0" width="${width}" height="${height}"
|
|
114
|
+
rx="${imageOptions.borderRadius}" ry="${imageOptions.borderRadius}"
|
|
115
|
+
fill="${backgroundColor && backgroundColor !== 'transparent' ? backgroundColor : 'none'}" /></svg>`);
|
|
116
|
+
sharpBuffer.composite([{ input: mask, blend: 'dest-in' }]);
|
|
117
|
+
}
|
|
118
|
+
return await sharpBuffer.png().toBuffer();
|
|
119
|
+
}
|
|
120
|
+
catch (error) {
|
|
121
|
+
throw new Error(`It was not possible to generate splash screen '${imageOptions.src}'. ${error.message}`);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
async function getSharpAsync() {
|
|
125
|
+
if (await Sharp.isAvailableAsync()) {
|
|
126
|
+
return await Sharp.findSharpInstanceAsync();
|
|
127
|
+
}
|
|
128
|
+
return null;
|
|
129
|
+
}
|
|
130
|
+
function getDimensionsId(imageOptions) {
|
|
131
|
+
return imageOptions.width === imageOptions.height
|
|
132
|
+
? `${imageOptions.width}`
|
|
133
|
+
: `${imageOptions.width}x${imageOptions.height}`;
|
|
134
|
+
}
|
|
135
|
+
async function maybeWarnAboutInstallingSharpAsync() {
|
|
136
|
+
if (env_1.env.EXPO_IMAGE_UTILS_NO_SHARP) {
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
if (env_1.env.EXPO_IMAGE_UTILS_DEBUG && !hasWarned && !(await Sharp.isAvailableAsync())) {
|
|
140
|
+
hasWarned = true;
|
|
141
|
+
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`));
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
const types = {
|
|
145
|
+
png: 'image/png',
|
|
146
|
+
jpeg: 'image/jpeg',
|
|
147
|
+
jpg: 'image/jpeg',
|
|
148
|
+
jpe: 'image/jpeg',
|
|
149
|
+
webp: 'image/webp',
|
|
150
|
+
gif: 'image/gif',
|
|
151
|
+
};
|
|
152
|
+
const inverseMimeTypes = {
|
|
153
|
+
'image/png': 'png',
|
|
154
|
+
'image/jpeg': 'jpg',
|
|
155
|
+
'image/webp': 'webp',
|
|
156
|
+
'image/gif': 'gif',
|
|
157
|
+
};
|
|
158
|
+
function getMimeType(srcPath) {
|
|
159
|
+
if (typeof srcPath !== 'string')
|
|
160
|
+
return null;
|
|
161
|
+
try {
|
|
162
|
+
// If the path is a URL, use the pathname
|
|
163
|
+
const url = new URL(srcPath);
|
|
164
|
+
srcPath = url.pathname;
|
|
165
|
+
}
|
|
166
|
+
catch { }
|
|
167
|
+
const ext = path_1.default.extname(srcPath).replace(/^\./, '');
|
|
168
|
+
return types[ext] ?? null;
|
|
169
|
+
}
|
|
170
|
+
async function ensureImageOptionsAsync(imageOptions) {
|
|
171
|
+
const icon = {
|
|
172
|
+
...imageOptions,
|
|
173
|
+
src: await Download.downloadOrUseCachedImage(imageOptions.src),
|
|
174
|
+
};
|
|
175
|
+
// Default to contain
|
|
176
|
+
if (!icon.resizeMode) {
|
|
177
|
+
icon.resizeMode = 'contain';
|
|
178
|
+
}
|
|
179
|
+
const mimeType = getMimeType(icon.src);
|
|
180
|
+
if (!mimeType) {
|
|
181
|
+
throw new Error(`Invalid mimeType for image with source: ${icon.src}`);
|
|
182
|
+
}
|
|
183
|
+
if (!icon.name) {
|
|
184
|
+
icon.name = `icon_${getDimensionsId(imageOptions)}.${inverseMimeTypes[mimeType]}`;
|
|
185
|
+
}
|
|
186
|
+
return icon;
|
|
187
|
+
}
|
|
188
|
+
async function generateImageBackgroundAsync(imageOptions) {
|
|
189
|
+
const { width, height, backgroundColor, borderRadius } = imageOptions;
|
|
190
|
+
const sharp = await getSharpAsync();
|
|
191
|
+
if (!sharp) {
|
|
192
|
+
const jimp = await Jimp.createSquareAsync({
|
|
193
|
+
size: width,
|
|
194
|
+
color: backgroundColor,
|
|
195
|
+
});
|
|
196
|
+
if (borderRadius) {
|
|
197
|
+
const image = await Jimp.getJimpImageAsync(jimp);
|
|
198
|
+
// TODO: support setting border radius with Jimp. Currently only support making the image a circle
|
|
199
|
+
return await Jimp.circleAsync(image);
|
|
200
|
+
}
|
|
201
|
+
return jimp;
|
|
202
|
+
}
|
|
203
|
+
const sharpBuffer = sharp({
|
|
204
|
+
create: {
|
|
205
|
+
width,
|
|
206
|
+
height,
|
|
207
|
+
channels: 4,
|
|
208
|
+
// TODO(cedric): this background color has to be defined for Sharp, but it's optionally typed here
|
|
209
|
+
// When we rework `@expo/image-utils`, this needs to be taken into account.
|
|
210
|
+
background: backgroundColor,
|
|
211
|
+
},
|
|
212
|
+
});
|
|
213
|
+
if (imageOptions.borderRadius) {
|
|
214
|
+
const mask = Buffer.from(`<svg><rect x="0" y="0" width="${width}" height="${height}"
|
|
215
|
+
rx="${borderRadius}" ry="${borderRadius}"
|
|
216
|
+
fill="${backgroundColor && backgroundColor !== 'transparent' ? backgroundColor : 'none'}" /></svg>`);
|
|
217
|
+
sharpBuffer.composite([{ input: mask, blend: 'dest-in' }]);
|
|
218
|
+
}
|
|
219
|
+
return await sharpBuffer.png().toBuffer();
|
|
220
|
+
}
|
|
221
|
+
async function generateImageAsync(options, imageOptions) {
|
|
222
|
+
const icon = await ensureImageOptionsAsync(imageOptions);
|
|
223
|
+
if (!options.cacheType) {
|
|
224
|
+
await maybeWarnAboutInstallingSharpAsync();
|
|
225
|
+
return { name: icon.name, source: await resizeAsync(icon) };
|
|
226
|
+
}
|
|
227
|
+
const cacheKey = await Cache.createCacheKeyWithDirectoryAsync(options.projectRoot, options.cacheType, icon);
|
|
228
|
+
const name = icon.name;
|
|
229
|
+
let source = await Cache.getImageFromCacheAsync(name, cacheKey);
|
|
230
|
+
if (!source) {
|
|
231
|
+
await maybeWarnAboutInstallingSharpAsync();
|
|
232
|
+
source = await resizeAsync(icon);
|
|
233
|
+
await Cache.cacheImageAsync(name, source, cacheKey);
|
|
234
|
+
}
|
|
235
|
+
return { name, source };
|
|
236
|
+
}
|
|
237
|
+
async function generateFaviconAsync(pngImageBuffer, sizes = [16, 32, 48]) {
|
|
238
|
+
const buffers = await resizeImagesAsync(pngImageBuffer, sizes);
|
|
239
|
+
return await Ico.generateAsync(buffers);
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* Layers the provided foreground image over the provided background image.
|
|
243
|
+
*
|
|
244
|
+
* @param foregroundImageBuffer
|
|
245
|
+
* @param foregroundImageBuffer
|
|
246
|
+
* @param x pixel offset from the left edge, defaults to 0.
|
|
247
|
+
* @param y pixel offset from the top edge, defaults to 0.
|
|
248
|
+
*/
|
|
249
|
+
async function compositeImagesAsync({ foreground, background, x = 0, y = 0, }) {
|
|
250
|
+
const sharp = await getSharpAsync();
|
|
251
|
+
if (!sharp) {
|
|
252
|
+
const image = (await Jimp.getJimpImageAsync(background)).composite(await Jimp.getJimpImageAsync(foreground), x, y);
|
|
253
|
+
return await image.getBufferAsync(image.getMIME());
|
|
254
|
+
}
|
|
255
|
+
return await sharp(background)
|
|
256
|
+
.keepIccProfile()
|
|
257
|
+
.composite([{ input: foreground, left: x, top: y }])
|
|
258
|
+
.toBuffer();
|
|
259
|
+
}
|
|
260
|
+
async function getPngInfo(src) {
|
|
261
|
+
return await (0, parse_png_1.default)(fs_1.default.readFileSync(src));
|
|
262
|
+
}
|
|
263
|
+
//# sourceMappingURL=Image.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Image.js","sourceRoot":"","sources":["../src/Image.ts"],"names":[],"mappings":"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"}
|