@design-edito/tools 0.1.65 → 0.1.66
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/agnostic/arrays/index.js +7 -7
- package/agnostic/arrays/random-pick/index.js +4 -4
- package/agnostic/colors/index.js +9 -9
- package/agnostic/css/index.js +8 -8
- package/agnostic/css/styles-set/index.js +4 -4
- package/agnostic/errors/index.js +2 -2
- package/agnostic/html/index.js +9 -9
- package/agnostic/html/sanitize/index.js +4 -4
- package/agnostic/html/selector-to-element/index.js +4 -4
- package/agnostic/html/string-to-nodes/index.js +5 -5
- package/agnostic/misc/assert/index.js +3 -3
- package/agnostic/misc/index.js +15 -15
- package/agnostic/misc/logs/index.js +2 -2
- package/agnostic/misc/lorem-ipsum/index.js +8 -8
- package/agnostic/numbers/index.js +4 -4
- package/agnostic/objects/index.js +8 -8
- package/agnostic/optim/index.js +3 -3
- package/agnostic/strings/index.js +3 -3
- package/agnostic/time/index.js +3 -3
- package/chunks/chunk-2KT7AKRW.js +17 -0
- package/chunks/chunk-3UM5CZA5.js +18 -0
- package/chunks/chunk-662SOZWA.js +19 -0
- package/chunks/chunk-6EIF24H5.js +35 -0
- package/chunks/chunk-6IZ5HUJJ.js +21 -0
- package/chunks/chunk-7Z7CKAOH.js +98 -0
- package/chunks/chunk-BGZ5OVVN.js +20 -0
- package/chunks/chunk-C3ZKLONL.js +21 -0
- package/chunks/chunk-C7SRAQMW.js +29 -0
- package/chunks/chunk-CM6AHRTS.js +16 -0
- package/chunks/chunk-CQEDNACN.js +28 -0
- package/chunks/chunk-D33KC6NN.js +18 -0
- package/chunks/chunk-D47ZPEUU.js +22 -0
- package/chunks/chunk-E3GK7YZ7.js +65 -0
- package/chunks/chunk-E4FJHD5R.js +67 -0
- package/chunks/chunk-FCLAFRIW.js +177 -0
- package/chunks/chunk-G2M3VECP.js +20 -0
- package/chunks/chunk-G3HAKMUB.js +79 -0
- package/chunks/chunk-HALUZA2X.js +16 -0
- package/chunks/chunk-KN23H4CI.js +20 -0
- package/chunks/chunk-LNSDOGTR.js +63 -0
- package/chunks/chunk-LSOHLSF5.js +32 -0
- package/chunks/chunk-MXGGOCLX.js +56 -0
- package/chunks/chunk-NAP2XNYN.js +23 -0
- package/chunks/chunk-P2H6PV4O.js +26 -0
- package/chunks/chunk-P5OGBBGM.js +37 -0
- package/chunks/chunk-PENYZ6S7.js +31 -0
- package/chunks/chunk-PSP2DKDH.js +151 -0
- package/chunks/chunk-RCWLMVSZ.js +164 -0
- package/chunks/chunk-RDQJSWRC.js +127 -0
- package/chunks/chunk-T2T5BYTW.js +18 -0
- package/chunks/chunk-U7R6TPHR.js +15 -0
- package/chunks/chunk-UNHNZAVP.js +18 -0
- package/chunks/chunk-VQUF2TSY.js +191 -0
- package/chunks/chunk-W6JPRXQ4.js +16 -0
- package/chunks/chunk-WR64YJNW.js +20 -0
- package/chunks/chunk-WRRA3BN4.js +31 -0
- package/chunks/chunk-X244JGZD.js +69 -0
- package/chunks/chunk-X5HMM3LD.js +35 -0
- package/chunks/chunk-XJ23DJY4.js +173 -0
- package/chunks/chunk-YCSC7QNV.js +30 -0
- package/chunks/chunk-YE67BQQN.js +4072 -0
- package/chunks/chunk-YEYXAV23.js +16 -0
- package/chunks/chunk-Z4PVE6SR.js +21 -0
- package/chunks/chunk-ZMMNN3QA.js +16 -0
- package/node/@aws-s3/index.js +3 -3
- package/node/@aws-s3/storage/file/index.js +4 -4
- package/node/@aws-s3/storage/index.js +3 -3
- package/node/@google-cloud/index.js +9 -9
- package/node/@google-cloud/storage/bucket/index.js +4 -4
- package/node/@google-cloud/storage/file/index.js +14 -14
- package/node/@google-cloud/storage/file/revoke-signed-urls/index.js +2 -2
- package/node/@google-cloud/storage/index.js +9 -9
- package/node/cloud-storage/index.js +12 -12
- package/node/cloud-storage/operations/index.js +8 -8
- package/node/encryption/index.js +3 -3
- package/node/ftps/file/index.js +4 -4
- package/node/ftps/index.js +2 -2
- package/node/images/index.js +34 -34
- package/node/images/prepare/index.js +34 -34
- package/node/images/transform/_utils/color-schema/index.js +2 -2
- package/node/images/transform/_utils/positions/index.js +2 -2
- package/node/images/transform/blur/index.js +2 -2
- package/node/images/transform/brighten/index.js +2 -2
- package/node/images/transform/compose/index.js +4 -4
- package/node/images/transform/extend/index.js +3 -3
- package/node/images/transform/extract/index.js +2 -2
- package/node/images/transform/flatten/index.js +3 -3
- package/node/images/transform/flip/index.js +2 -2
- package/node/images/transform/flop/index.js +2 -2
- package/node/images/transform/frame/backgrounds/create-line-background/index.js +2 -2
- package/node/images/transform/frame/backgrounds/create-tile-background/index.js +2 -2
- package/node/images/transform/frame/index.js +6 -6
- package/node/images/transform/hue-rotate/index.js +2 -2
- package/node/images/transform/index.js +33 -33
- package/node/images/transform/lighten/index.js +2 -2
- package/node/images/transform/lineate-levels/index.js +2 -2
- package/node/images/transform/modulate/index.js +2 -2
- package/node/images/transform/normalize/index.js +2 -2
- package/node/images/transform/operations/_utils/frame/backgrounds/create-line-background/index.js +3 -3
- package/node/images/transform/operations/_utils/frame/create-color-palette/index.js +4 -4
- package/node/images/transform/operations/_utils/frame/index.js +7 -7
- package/node/images/transform/resize/index.js +3 -3
- package/node/images/transform/rotate/index.js +2 -2
- package/node/images/transform/saturate/index.js +2 -2
- package/node/images/transform/scale/index.js +3 -3
- package/node/sftp/file/index.js +4 -4
- package/node/sftp/index.js +2 -2
- package/package.json +10 -11
@@ -0,0 +1,20 @@
|
|
1
|
+
import {
|
2
|
+
upload_exports
|
3
|
+
} from "./chunk-45WKBXSF.js";
|
4
|
+
import {
|
5
|
+
download_exports
|
6
|
+
} from "./chunk-V4S34MIM.js";
|
7
|
+
import {
|
8
|
+
__export
|
9
|
+
} from "./chunk-NZLE2WMY.js";
|
10
|
+
|
11
|
+
// src/node/sftp/file/index.ts
|
12
|
+
var file_exports = {};
|
13
|
+
__export(file_exports, {
|
14
|
+
Download: () => download_exports,
|
15
|
+
Upload: () => upload_exports
|
16
|
+
});
|
17
|
+
|
18
|
+
export {
|
19
|
+
file_exports
|
20
|
+
};
|
@@ -0,0 +1,63 @@
|
|
1
|
+
import {
|
2
|
+
lightenColor,
|
3
|
+
setColorLuminance
|
4
|
+
} from "./chunk-U57Q62IN.js";
|
5
|
+
import {
|
6
|
+
saturateColor,
|
7
|
+
setColorSaturation
|
8
|
+
} from "./chunk-MB7HWF22.js";
|
9
|
+
import {
|
10
|
+
complementColor
|
11
|
+
} from "./chunk-2POD3TAX.js";
|
12
|
+
|
13
|
+
// src/node/images/transform/operations/_utils/frame/backgrounds/create-line-background/index.ts
|
14
|
+
async function createLineBackground(background, dimensions, palette) {
|
15
|
+
const lineDimensions = {
|
16
|
+
widthPx: dimensions.widthPx,
|
17
|
+
heightPx: Math.round(dimensions.heightPx / background.params.nbLines)
|
18
|
+
};
|
19
|
+
const sharpOverlays = [];
|
20
|
+
const maxPaletteLength = palette.length;
|
21
|
+
const selectedColorIndex = background.params.colors.selectColorPaletteIndex === "first" ? 0 : background.params.colors.selectColorPaletteIndex === "last" ? palette.length - 1 : background.params.colors.selectColorPaletteIndex;
|
22
|
+
for (let i = 0; i < background.params.nbLines; i++) {
|
23
|
+
const indexPalette = Math.min(Math.max(0, selectedColorIndex), maxPaletteLength);
|
24
|
+
const RGBColor = palette[indexPalette] || [0, 0, 0];
|
25
|
+
const primaryRGBColor = applyColorTransformations(RGBColor, background.params.colors.primaryTransformations);
|
26
|
+
const secondaryRGBColor = applyColorTransformations(RGBColor, background.params.colors.secondaryTransformations);
|
27
|
+
const outputRGBColor = i % 2 === 0 ? primaryRGBColor : secondaryRGBColor;
|
28
|
+
const topPx = Math.min(lineDimensions.heightPx * i, dimensions.heightPx);
|
29
|
+
sharpOverlays.push({
|
30
|
+
input: {
|
31
|
+
create: {
|
32
|
+
width: lineDimensions.widthPx,
|
33
|
+
height: i === background.params.nbLines - 1 ? dimensions.heightPx - topPx : lineDimensions.heightPx,
|
34
|
+
channels: 4,
|
35
|
+
background: { r: outputRGBColor[0], g: outputRGBColor[1], b: outputRGBColor[2], alpha: 1 }
|
36
|
+
}
|
37
|
+
},
|
38
|
+
left: 0,
|
39
|
+
top: topPx
|
40
|
+
});
|
41
|
+
}
|
42
|
+
return sharpOverlays;
|
43
|
+
}
|
44
|
+
function applyColorTransformations(RGBColor, transformations) {
|
45
|
+
transformations.forEach((transformation) => {
|
46
|
+
RGBColor = transformColor(RGBColor, transformation);
|
47
|
+
});
|
48
|
+
return RGBColor;
|
49
|
+
}
|
50
|
+
function transformColor(RGBColor, transformation) {
|
51
|
+
switch (transformation.type) {
|
52
|
+
case "saturate":
|
53
|
+
return transformation.intensityMode === "add" ? saturateColor(RGBColor, transformation.intensity) : setColorSaturation(RGBColor, transformation.intensity);
|
54
|
+
case "lighten":
|
55
|
+
return transformation.intensityMode === "add" ? lightenColor(RGBColor, transformation.intensity) : setColorLuminance(RGBColor, transformation.intensity);
|
56
|
+
case "complement":
|
57
|
+
return complementColor(RGBColor);
|
58
|
+
}
|
59
|
+
}
|
60
|
+
|
61
|
+
export {
|
62
|
+
createLineBackground
|
63
|
+
};
|
@@ -0,0 +1,32 @@
|
|
1
|
+
import {
|
2
|
+
colorSchema
|
3
|
+
} from "./chunk-U7R6TPHR.js";
|
4
|
+
import {
|
5
|
+
OperationNames
|
6
|
+
} from "./chunk-MOVLLUDL.js";
|
7
|
+
import {
|
8
|
+
esm_default
|
9
|
+
} from "./chunk-YE67BQQN.js";
|
10
|
+
|
11
|
+
// src/node/images/transform/resize/index.ts
|
12
|
+
var resizeSchema = esm_default.object({
|
13
|
+
name: esm_default.literal(OperationNames.Resize),
|
14
|
+
params: esm_default.object({
|
15
|
+
width: esm_default.number().min(0),
|
16
|
+
height: esm_default.number().min(0),
|
17
|
+
options: esm_default.object({
|
18
|
+
background: esm_default.optional(colorSchema),
|
19
|
+
fit: esm_default.enum([
|
20
|
+
"contain",
|
21
|
+
"cover",
|
22
|
+
"fill",
|
23
|
+
"inside",
|
24
|
+
"outside"
|
25
|
+
]).optional()
|
26
|
+
}).optional()
|
27
|
+
})
|
28
|
+
});
|
29
|
+
|
30
|
+
export {
|
31
|
+
resizeSchema
|
32
|
+
};
|
@@ -0,0 +1,56 @@
|
|
1
|
+
import {
|
2
|
+
exists_exports
|
3
|
+
} from "./chunk-TXGV4KJD.js";
|
4
|
+
import {
|
5
|
+
get_permissions_exports
|
6
|
+
} from "./chunk-GXICX4F6.js";
|
7
|
+
import {
|
8
|
+
generate_signed_url_exports
|
9
|
+
} from "./chunk-OPU4CANL.js";
|
10
|
+
import {
|
11
|
+
revoke_signed_urls_exports
|
12
|
+
} from "./chunk-P5OGBBGM.js";
|
13
|
+
import {
|
14
|
+
erase_exports
|
15
|
+
} from "./chunk-7BCQCDGQ.js";
|
16
|
+
import {
|
17
|
+
move_exports
|
18
|
+
} from "./chunk-T55QIYYV.js";
|
19
|
+
import {
|
20
|
+
get_metadata_exports
|
21
|
+
} from "./chunk-KFMYB672.js";
|
22
|
+
import {
|
23
|
+
update_metadata_exports
|
24
|
+
} from "./chunk-YW5ASSIQ.js";
|
25
|
+
import {
|
26
|
+
copy_exports
|
27
|
+
} from "./chunk-SZQHLC4K.js";
|
28
|
+
import {
|
29
|
+
upload_exports
|
30
|
+
} from "./chunk-7FJKDVBE.js";
|
31
|
+
import {
|
32
|
+
download_exports
|
33
|
+
} from "./chunk-IARWH6LC.js";
|
34
|
+
import {
|
35
|
+
__export
|
36
|
+
} from "./chunk-NZLE2WMY.js";
|
37
|
+
|
38
|
+
// src/node/@google-cloud/storage/file/index.ts
|
39
|
+
var file_exports = {};
|
40
|
+
__export(file_exports, {
|
41
|
+
Copy: () => copy_exports,
|
42
|
+
Download: () => download_exports,
|
43
|
+
Erase: () => erase_exports,
|
44
|
+
Exists: () => exists_exports,
|
45
|
+
GenerateSignedUrl: () => generate_signed_url_exports,
|
46
|
+
GetMetaData: () => get_metadata_exports,
|
47
|
+
GetPermissions: () => get_permissions_exports,
|
48
|
+
Move: () => move_exports,
|
49
|
+
RevokeSignedUrls: () => revoke_signed_urls_exports,
|
50
|
+
UpdateMetadata: () => update_metadata_exports,
|
51
|
+
Upload: () => upload_exports
|
52
|
+
});
|
53
|
+
|
54
|
+
export {
|
55
|
+
file_exports
|
56
|
+
};
|
@@ -0,0 +1,23 @@
|
|
1
|
+
import {
|
2
|
+
colorSchema
|
3
|
+
} from "./chunk-U7R6TPHR.js";
|
4
|
+
import {
|
5
|
+
OperationNames
|
6
|
+
} from "./chunk-MOVLLUDL.js";
|
7
|
+
import {
|
8
|
+
esm_default
|
9
|
+
} from "./chunk-YE67BQQN.js";
|
10
|
+
|
11
|
+
// src/node/images/transform/scale/index.ts
|
12
|
+
var scaleSchema = esm_default.object({
|
13
|
+
name: esm_default.literal(OperationNames.Scale),
|
14
|
+
params: esm_default.object({
|
15
|
+
xRatio: esm_default.optional(esm_default.number().min(0).max(1)),
|
16
|
+
yRatio: esm_default.optional(esm_default.number().min(0).max(1)),
|
17
|
+
background: colorSchema
|
18
|
+
})
|
19
|
+
});
|
20
|
+
|
21
|
+
export {
|
22
|
+
scaleSchema
|
23
|
+
};
|
@@ -0,0 +1,26 @@
|
|
1
|
+
import {
|
2
|
+
Crossenv
|
3
|
+
} from "./chunk-FR5H2OCV.js";
|
4
|
+
import {
|
5
|
+
Errors
|
6
|
+
} from "./chunk-2KT7AKRW.js";
|
7
|
+
|
8
|
+
// src/shared/errors/index.ts
|
9
|
+
var register = Errors.Register.from({
|
10
|
+
["no-window-document-on-runtime" /* NO_DOCUMENT */]: {
|
11
|
+
message: `Runtime '${Crossenv.detectRuntime()}' does not provide a Document object, cannot complete.`,
|
12
|
+
detailsMaker: () => void 0
|
13
|
+
},
|
14
|
+
["no-window-document-on-runtime-please-provide" /* NO_DOCUMENT_PLEASE_PROVIDE */]: {
|
15
|
+
message: `Please provide a Document object since none are found on runtime '${Crossenv.detectRuntime()}'`,
|
16
|
+
detailsMaker: (tips) => tips
|
17
|
+
},
|
18
|
+
["impossible-to-pick-in-array" /* IMPOSSIBLE_TO_PICK_IN_ARRAY */]: {
|
19
|
+
message: "Impossible to pick",
|
20
|
+
detailsMaker: (array) => array.length === 0 ? "Array cannot be empty" : "Too many exclusions"
|
21
|
+
}
|
22
|
+
});
|
23
|
+
|
24
|
+
export {
|
25
|
+
register
|
26
|
+
};
|
@@ -0,0 +1,37 @@
|
|
1
|
+
import {
|
2
|
+
erase
|
3
|
+
} from "./chunk-7BCQCDGQ.js";
|
4
|
+
import {
|
5
|
+
upload
|
6
|
+
} from "./chunk-7FJKDVBE.js";
|
7
|
+
import {
|
8
|
+
download
|
9
|
+
} from "./chunk-IARWH6LC.js";
|
10
|
+
import {
|
11
|
+
Outcome
|
12
|
+
} from "./chunk-JMU5PDBD.js";
|
13
|
+
import {
|
14
|
+
__export
|
15
|
+
} from "./chunk-NZLE2WMY.js";
|
16
|
+
|
17
|
+
// src/node/@google-cloud/storage/file/revoke-signed-urls/index.ts
|
18
|
+
var revoke_signed_urls_exports = {};
|
19
|
+
__export(revoke_signed_urls_exports, {
|
20
|
+
revokeSignedUrls: () => revokeSignedUrls
|
21
|
+
});
|
22
|
+
async function revokeSignedUrls(sourcePath, bucket, options) {
|
23
|
+
const { downloadOptions, eraseOptions, uploadOptions } = options ?? {};
|
24
|
+
const downloadAttempt = await download(sourcePath, bucket, downloadOptions);
|
25
|
+
if (!downloadAttempt.success) return downloadAttempt;
|
26
|
+
const deletionAttempt = await erase(sourcePath, bucket, eraseOptions);
|
27
|
+
if (!deletionAttempt.success) return deletionAttempt;
|
28
|
+
const downloaded = downloadAttempt.payload;
|
29
|
+
const reuploadAttempt = await upload(downloaded, sourcePath, bucket, uploadOptions);
|
30
|
+
if (!reuploadAttempt.success) return reuploadAttempt;
|
31
|
+
return Outcome.makeSuccess(true);
|
32
|
+
}
|
33
|
+
|
34
|
+
export {
|
35
|
+
revokeSignedUrls,
|
36
|
+
revoke_signed_urls_exports
|
37
|
+
};
|
@@ -0,0 +1,31 @@
|
|
1
|
+
import {
|
2
|
+
shuffle
|
3
|
+
} from "./chunk-VJJIYJMY.js";
|
4
|
+
import {
|
5
|
+
findDuplicates
|
6
|
+
} from "./chunk-YS6WMSWC.js";
|
7
|
+
import {
|
8
|
+
isArrayOf
|
9
|
+
} from "./chunk-6RGDWX4A.js";
|
10
|
+
import {
|
11
|
+
make
|
12
|
+
} from "./chunk-RLAZR3NL.js";
|
13
|
+
import {
|
14
|
+
randomPick,
|
15
|
+
randomPickMany
|
16
|
+
} from "./chunk-C7SRAQMW.js";
|
17
|
+
|
18
|
+
// src/agnostic/arrays/index.tsx
|
19
|
+
var Arrays;
|
20
|
+
((Arrays2) => {
|
21
|
+
Arrays2.findDuplicates = findDuplicates;
|
22
|
+
Arrays2.isArrayOf = isArrayOf;
|
23
|
+
Arrays2.make = make;
|
24
|
+
Arrays2.randomPick = randomPick;
|
25
|
+
Arrays2.randomPickMany = randomPickMany;
|
26
|
+
Arrays2.shuffle = shuffle;
|
27
|
+
})(Arrays || (Arrays = {}));
|
28
|
+
|
29
|
+
export {
|
30
|
+
Arrays
|
31
|
+
};
|
@@ -0,0 +1,151 @@
|
|
1
|
+
import {
|
2
|
+
formatImage
|
3
|
+
} from "./chunk-SJFY537W.js";
|
4
|
+
import {
|
5
|
+
transform
|
6
|
+
} from "./chunk-FCLAFRIW.js";
|
7
|
+
import {
|
8
|
+
__export
|
9
|
+
} from "./chunk-NZLE2WMY.js";
|
10
|
+
|
11
|
+
// src/node/images/prepare/index.ts
|
12
|
+
var prepare_exports = {};
|
13
|
+
__export(prepare_exports, {
|
14
|
+
MAX_NB_OUTPUTS: () => MAX_NB_OUTPUTS,
|
15
|
+
OUTPUT_ZIP_FOLDER: () => OUTPUT_ZIP_FOLDER,
|
16
|
+
exportZipBuffer: () => exportZipBuffer,
|
17
|
+
prepareImage: () => prepareImage
|
18
|
+
});
|
19
|
+
import sharp from "sharp";
|
20
|
+
import { Writable } from "node:stream";
|
21
|
+
import archiver from "archiver";
|
22
|
+
var MAX_NB_OUTPUTS = 50;
|
23
|
+
var OUTPUT_ZIP_FOLDER = "./output-zips";
|
24
|
+
async function prepareImage(imageBuffer, customOptions) {
|
25
|
+
const sharpImage = sharp(imageBuffer);
|
26
|
+
const sharpImageMetadata = await sharpImage.metadata();
|
27
|
+
const imageBufferMetadata = {
|
28
|
+
width: sharpImageMetadata.width ?? 0,
|
29
|
+
height: sharpImageMetadata.height ?? 0,
|
30
|
+
format: sharpImageMetadata.format || "png"
|
31
|
+
};
|
32
|
+
const options = getOptions(imageBufferMetadata, customOptions);
|
33
|
+
const nbOutputs = options.qualities.length * (options.ratios.length + 1) * (options.widths.length + 1) * (options.heights.length + 1);
|
34
|
+
if (nbOutputs > MAX_NB_OUTPUTS) throw Error("Nb output exceeds supported max nb output");
|
35
|
+
let transformedBuffer = imageBuffer;
|
36
|
+
try {
|
37
|
+
transformedBuffer = await transform(imageBuffer, options.inputOperations, options.checkValidOperations);
|
38
|
+
} catch (e) {
|
39
|
+
console.log("Images:Prepare:Transform:Buffer:Error", { e });
|
40
|
+
}
|
41
|
+
const transformedBufferMetadata = await sharp(transformedBuffer).metadata();
|
42
|
+
const exportsBuffers = [
|
43
|
+
{
|
44
|
+
buffer: imageBuffer,
|
45
|
+
name: generateFileName({
|
46
|
+
...imageBufferMetadata,
|
47
|
+
quality: 100,
|
48
|
+
suffix: "original",
|
49
|
+
prefix: options.name
|
50
|
+
})
|
51
|
+
},
|
52
|
+
{
|
53
|
+
buffer: transformedBuffer,
|
54
|
+
name: generateFileName({
|
55
|
+
width: transformedBufferMetadata.width || 0,
|
56
|
+
height: transformedBufferMetadata.height || 0,
|
57
|
+
format: transformedBufferMetadata.format || "png",
|
58
|
+
quality: 100,
|
59
|
+
suffix: "transformed-unresized",
|
60
|
+
prefix: options.name
|
61
|
+
})
|
62
|
+
}
|
63
|
+
];
|
64
|
+
for (const width of options.widths) {
|
65
|
+
for (const height of options.heights) {
|
66
|
+
for (const quality of options.qualities) {
|
67
|
+
for (const format of options.formats) {
|
68
|
+
const exportBuffer = await formatImage(transformedBuffer, {
|
69
|
+
format,
|
70
|
+
quality,
|
71
|
+
width,
|
72
|
+
height
|
73
|
+
});
|
74
|
+
exportsBuffers.push({
|
75
|
+
buffer: exportBuffer,
|
76
|
+
name: generateFileName({
|
77
|
+
width,
|
78
|
+
height,
|
79
|
+
quality,
|
80
|
+
format,
|
81
|
+
prefix: options.name
|
82
|
+
})
|
83
|
+
});
|
84
|
+
}
|
85
|
+
}
|
86
|
+
}
|
87
|
+
}
|
88
|
+
console.log("Images:Transform:Export:ZIP", generateZipName(options.name));
|
89
|
+
const zipBuffer = exportZipBuffer(exportsBuffers, generateZipName(options.name));
|
90
|
+
return zipBuffer;
|
91
|
+
}
|
92
|
+
function exportZipBuffer(zipSources, zipDirectoryName) {
|
93
|
+
return new Promise(async (resolve) => {
|
94
|
+
const archive = archiver("zip", { zlib: { level: 9 } });
|
95
|
+
if (zipDirectoryName) {
|
96
|
+
archive.directory(zipDirectoryName + "/", false);
|
97
|
+
}
|
98
|
+
zipSources.forEach((zipSource) => {
|
99
|
+
const fileName = zipDirectoryName ? `${zipDirectoryName}/${zipSource.name}` : zipSource.name;
|
100
|
+
archive.append(zipSource.buffer, { name: fileName });
|
101
|
+
});
|
102
|
+
const chunks = [];
|
103
|
+
const writable = new Writable();
|
104
|
+
writable._write = (chunk, _enc, callback) => {
|
105
|
+
chunks.push(chunk);
|
106
|
+
callback();
|
107
|
+
};
|
108
|
+
archive.pipe(writable);
|
109
|
+
await archive.finalize();
|
110
|
+
const bufferZip = Buffer.concat(chunks);
|
111
|
+
resolve(bufferZip);
|
112
|
+
});
|
113
|
+
}
|
114
|
+
function getOptions(imageBufferMetadata, options) {
|
115
|
+
return {
|
116
|
+
center: [0.5, 0.5],
|
117
|
+
qualities: [100],
|
118
|
+
inputOperations: [],
|
119
|
+
...options,
|
120
|
+
checkValidOperations: options?.checkValidOperations ?? false,
|
121
|
+
name: options?.name ?? "",
|
122
|
+
formats: [imageBufferMetadata.format, ...options?.formats ? options.formats : []],
|
123
|
+
ratios: [...options?.ratios ? options.ratios : []],
|
124
|
+
widths: [imageBufferMetadata.width, ...options?.widths ? options.widths : []],
|
125
|
+
heights: [imageBufferMetadata.height, ...options?.heights ? options.heights : []]
|
126
|
+
};
|
127
|
+
}
|
128
|
+
function generateZipName(name = "") {
|
129
|
+
const date = /* @__PURE__ */ new Date();
|
130
|
+
return `${name}_image-exports_${date.toLocaleDateString()}_${date.toLocaleTimeString()}_${date.getTime()}`.replace(/\/|:/g, "-").replace(/ /g, "").trim();
|
131
|
+
}
|
132
|
+
function generateFileName({
|
133
|
+
width,
|
134
|
+
height,
|
135
|
+
quality,
|
136
|
+
format,
|
137
|
+
suffix,
|
138
|
+
prefix
|
139
|
+
}) {
|
140
|
+
prefix = prefix ? `${prefix}_` : "image-formats_";
|
141
|
+
suffix = `${suffix ? `_${suffix}` : ""}.${format}`;
|
142
|
+
return `${prefix}${width}x${height}_Q${quality}${suffix}`;
|
143
|
+
}
|
144
|
+
|
145
|
+
export {
|
146
|
+
MAX_NB_OUTPUTS,
|
147
|
+
OUTPUT_ZIP_FOLDER,
|
148
|
+
prepareImage,
|
149
|
+
exportZipBuffer,
|
150
|
+
prepare_exports
|
151
|
+
};
|
@@ -0,0 +1,164 @@
|
|
1
|
+
import {
|
2
|
+
createColorPalette
|
3
|
+
} from "./chunk-7Z7CKAOH.js";
|
4
|
+
import {
|
5
|
+
createLineBackground
|
6
|
+
} from "./chunk-LNSDOGTR.js";
|
7
|
+
import {
|
8
|
+
createTileBackground
|
9
|
+
} from "./chunk-CP454IJD.js";
|
10
|
+
import {
|
11
|
+
getRelativePxPositionsInWrapperFor
|
12
|
+
} from "./chunk-OCM3RLO6.js";
|
13
|
+
import {
|
14
|
+
clamp
|
15
|
+
} from "./chunk-OSAXBA7G.js";
|
16
|
+
|
17
|
+
// src/node/images/transform/operations/_utils/frame/index.ts
|
18
|
+
import sharp from "sharp";
|
19
|
+
async function frame(imageSharp, params) {
|
20
|
+
const imageMetadata = await imageSharp.metadata();
|
21
|
+
const imageDimensions = {
|
22
|
+
widthPx: imageMetadata.width ?? 0,
|
23
|
+
heightPx: imageMetadata.height ?? 0
|
24
|
+
};
|
25
|
+
const scaledImage = scaleImageToFrame(
|
26
|
+
imageSharp,
|
27
|
+
imageDimensions,
|
28
|
+
params.dimensions,
|
29
|
+
params.imageScale
|
30
|
+
);
|
31
|
+
imageSharp = scaledImage.sharpInstance;
|
32
|
+
imageDimensions.widthPx = scaledImage.widthPx;
|
33
|
+
imageDimensions.heightPx = scaledImage.heightPx;
|
34
|
+
const defaultBackgroundColorCreate = getDefaultBackgroundColor(params.background);
|
35
|
+
const imagePositions = getRelativePxPositionsInWrapperFor(imageDimensions, params.dimensions, params.positions);
|
36
|
+
const backgroundOverlays = await getBackgroundOverlays(
|
37
|
+
{
|
38
|
+
sharp: imageSharp,
|
39
|
+
dimensions: imageDimensions
|
40
|
+
},
|
41
|
+
params.background,
|
42
|
+
params.dimensions,
|
43
|
+
{
|
44
|
+
x: imagePositions.x,
|
45
|
+
y: imagePositions.y,
|
46
|
+
w: imageDimensions.widthPx,
|
47
|
+
h: imageDimensions.heightPx
|
48
|
+
}
|
49
|
+
);
|
50
|
+
const composition = [
|
51
|
+
...backgroundOverlays,
|
52
|
+
{
|
53
|
+
input: await imageSharp.toFormat("png").png({ quality: 100 }).toBuffer(),
|
54
|
+
/* Make sure we work with the best quality of our file */
|
55
|
+
left: imagePositions.x,
|
56
|
+
top: imagePositions.y
|
57
|
+
}
|
58
|
+
];
|
59
|
+
const frameSharpInstance = sharp({
|
60
|
+
create: {
|
61
|
+
background: defaultBackgroundColorCreate,
|
62
|
+
width: params.dimensions.widthPx,
|
63
|
+
height: params.dimensions.heightPx,
|
64
|
+
channels: 4
|
65
|
+
}
|
66
|
+
}).ensureAlpha(0).composite(composition).png({ quality: 100 });
|
67
|
+
return frameSharpInstance;
|
68
|
+
}
|
69
|
+
var scaleImageToFrame = (imageSharp, imageDimensions, frameDimensions, imageScale) => {
|
70
|
+
const scale = {
|
71
|
+
xRatio: 1,
|
72
|
+
yRatio: 1
|
73
|
+
};
|
74
|
+
const frameZoneDimensions = {
|
75
|
+
widthPx: frameDimensions.widthPx,
|
76
|
+
heightPx: frameDimensions.heightPx
|
77
|
+
};
|
78
|
+
if (imageScale) {
|
79
|
+
frameZoneDimensions.widthPx = frameDimensions.widthPx * (imageScale.xRatio || 1);
|
80
|
+
frameZoneDimensions.heightPx = frameDimensions.heightPx * (imageScale.yRatio || 1);
|
81
|
+
}
|
82
|
+
const containedRatiosPercents = getContainedRatios(
|
83
|
+
imageDimensions.widthPx,
|
84
|
+
imageDimensions.heightPx,
|
85
|
+
frameZoneDimensions.widthPx,
|
86
|
+
frameZoneDimensions.heightPx
|
87
|
+
);
|
88
|
+
if (imageScale || !imageScale && imageDimensions.widthPx < frameDimensions.widthPx && imageDimensions.heightPx < frameDimensions.heightPx) {
|
89
|
+
scale.xRatio = containedRatiosPercents.xPercent;
|
90
|
+
scale.yRatio = containedRatiosPercents.yPercent;
|
91
|
+
}
|
92
|
+
if (scale.xRatio !== 1 || scale.yRatio !== 1) {
|
93
|
+
imageDimensions.widthPx = clamp(Math.round(imageDimensions.widthPx * scale.xRatio), 0, frameDimensions.widthPx);
|
94
|
+
imageDimensions.heightPx = clamp(Math.round(imageDimensions.heightPx * scale.yRatio), 0, frameDimensions.heightPx);
|
95
|
+
imageSharp = imageSharp.resize({
|
96
|
+
width: imageDimensions.widthPx,
|
97
|
+
height: imageDimensions.heightPx,
|
98
|
+
fit: sharp.fit.inside,
|
99
|
+
position: "center",
|
100
|
+
fastShrinkOnLoad: false
|
101
|
+
});
|
102
|
+
}
|
103
|
+
return {
|
104
|
+
sharpInstance: imageSharp,
|
105
|
+
widthPx: imageDimensions.widthPx,
|
106
|
+
heightPx: imageDimensions.heightPx
|
107
|
+
};
|
108
|
+
};
|
109
|
+
var getDefaultBackgroundColor = (background) => {
|
110
|
+
if (background && (typeof background === "object" && "r" in background)) {
|
111
|
+
return {
|
112
|
+
r: background.r || 255,
|
113
|
+
g: background.g || 255,
|
114
|
+
b: background.b || 255,
|
115
|
+
alpha: background.alpha || 0
|
116
|
+
};
|
117
|
+
}
|
118
|
+
return { r: 255, g: 255, b: 255, alpha: 0 };
|
119
|
+
};
|
120
|
+
var getBackgroundOverlays = (imageInput, background, dimensions, imageCoordinates) => {
|
121
|
+
const backgroundOverlays = [];
|
122
|
+
return new Promise(async (resolve, reject) => {
|
123
|
+
if (!background || typeof background !== "object" || typeof background === "object" && !("type" in background)) {
|
124
|
+
resolve(backgroundOverlays);
|
125
|
+
return;
|
126
|
+
}
|
127
|
+
const imageBuffer = await imageInput.sharp.raw().toBuffer();
|
128
|
+
const nbImageChannels = (await imageInput.sharp.metadata()).channels || 3;
|
129
|
+
const colorPalette = createColorPalette(
|
130
|
+
{
|
131
|
+
buffer: imageBuffer,
|
132
|
+
nbChannels: nbImageChannels,
|
133
|
+
dimensions: imageInput.dimensions
|
134
|
+
},
|
135
|
+
background.colorPalette
|
136
|
+
);
|
137
|
+
switch (background.type) {
|
138
|
+
case "line":
|
139
|
+
return resolve(createLineBackground(background, dimensions, colorPalette));
|
140
|
+
case "tile":
|
141
|
+
return resolve(createTileBackground(background, dimensions, imageCoordinates, colorPalette));
|
142
|
+
default:
|
143
|
+
resolve(backgroundOverlays);
|
144
|
+
}
|
145
|
+
reject(new Error("Unknown background type"));
|
146
|
+
});
|
147
|
+
};
|
148
|
+
function getContainedRatios(widthPx, heightPx, wrapperWidthPx, wrapperHeightPx, withoutReduction) {
|
149
|
+
if (withoutReduction && widthPx <= wrapperWidthPx && heightPx <= wrapperHeightPx) {
|
150
|
+
return { xPercent: 100, yPercent: 100 };
|
151
|
+
}
|
152
|
+
const wrapperRatio = wrapperWidthPx / wrapperHeightPx;
|
153
|
+
const imgRatio = widthPx / heightPx;
|
154
|
+
const containRatio = clamp(imgRatio > wrapperRatio ? wrapperWidthPx / widthPx : wrapperHeightPx / heightPx, 0, 100);
|
155
|
+
return {
|
156
|
+
xPercent: containRatio,
|
157
|
+
yPercent: containRatio
|
158
|
+
};
|
159
|
+
}
|
160
|
+
|
161
|
+
export {
|
162
|
+
frame,
|
163
|
+
getContainedRatios
|
164
|
+
};
|