jazz-tools 0.16.6 → 0.17.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/.svelte-kit/__package__/index.d.ts +1 -0
- package/.svelte-kit/__package__/index.d.ts.map +1 -1
- package/.svelte-kit/__package__/index.js +1 -0
- package/.svelte-kit/__package__/media/image.svelte +131 -0
- package/.svelte-kit/__package__/media/image.svelte.d.ts +10 -0
- package/.svelte-kit/__package__/media/image.svelte.d.ts.map +1 -0
- package/.svelte-kit/__package__/media/index.d.ts +2 -0
- package/.svelte-kit/__package__/media/index.d.ts.map +1 -0
- package/.svelte-kit/__package__/media/index.js +1 -0
- package/.svelte-kit/__package__/tests/media/image.svelte.test.d.ts +2 -0
- package/.svelte-kit/__package__/tests/media/image.svelte.test.d.ts.map +1 -0
- package/.svelte-kit/__package__/tests/media/image.svelte.test.js +430 -0
- package/.svelte-kit/__package__/tests/testUtils.d.ts +11 -0
- package/.svelte-kit/__package__/tests/testUtils.d.ts.map +1 -0
- package/.svelte-kit/__package__/tests/testUtils.js +17 -0
- package/.svelte-kit/__package__/tests/types.d.ts +3 -0
- package/.turbo/turbo-build.log +42 -46
- package/CHANGELOG.md +12 -0
- package/dist/{chunk-R2VNCMG6.js → chunk-2SH44VLX.js} +33 -38
- package/dist/chunk-2SH44VLX.js.map +1 -0
- package/dist/index.js +1 -1
- package/dist/media/chunk-BBSS3NEY.js +211 -0
- package/dist/media/chunk-BBSS3NEY.js.map +1 -0
- package/dist/media/create-image.d.ts +48 -0
- package/dist/media/create-image.d.ts.map +1 -0
- package/dist/media/create-image.test.d.ts +2 -0
- package/dist/media/create-image.test.d.ts.map +1 -0
- package/dist/media/index.browser.d.ts +15 -0
- package/dist/media/index.browser.d.ts.map +1 -0
- package/dist/media/index.browser.js +113 -0
- package/dist/media/index.browser.js.map +1 -0
- package/dist/media/index.d.ts +53 -0
- package/dist/media/index.d.ts.map +1 -0
- package/dist/media/index.js +13 -0
- package/dist/media/index.js.map +1 -0
- package/dist/media/index.native.d.ts +17 -0
- package/dist/media/index.native.d.ts.map +1 -0
- package/dist/media/index.native.js +126 -0
- package/dist/media/index.native.js.map +1 -0
- package/dist/media/utils.d.ts +17 -0
- package/dist/media/utils.d.ts.map +1 -0
- package/dist/media/utils.test.d.ts +2 -0
- package/dist/media/utils.test.d.ts.map +1 -0
- package/dist/react/index.d.ts +1 -2
- package/dist/react/index.d.ts.map +1 -1
- package/dist/react/index.js +176 -59
- package/dist/react/index.js.map +1 -1
- package/dist/react/media/image.d.ts +62 -0
- package/dist/react/media/image.d.ts.map +1 -0
- package/dist/react/tests/media/image.test.d.ts +2 -0
- package/dist/react/tests/media/image.test.d.ts.map +1 -0
- package/dist/react-core/tests/useDemoAuth.test.d.ts +2 -0
- package/dist/react-core/tests/useDemoAuth.test.d.ts.map +1 -0
- package/dist/react-native-core/index.d.ts +1 -1
- package/dist/react-native-core/index.d.ts.map +1 -1
- package/dist/react-native-core/index.js +84 -66
- package/dist/react-native-core/index.js.map +1 -1
- package/dist/react-native-core/media/image.d.ts +93 -0
- package/dist/react-native-core/media/image.d.ts.map +1 -0
- package/dist/react-native-core/testing.d.ts +2 -0
- package/dist/react-native-core/testing.d.ts.map +1 -0
- package/dist/svelte/index.d.ts +1 -0
- package/dist/svelte/index.d.ts.map +1 -1
- package/dist/svelte/index.js +1 -0
- package/dist/svelte/media/image.svelte +131 -0
- package/dist/svelte/media/image.svelte.d.ts +10 -0
- package/dist/svelte/media/image.svelte.d.ts.map +1 -0
- package/dist/svelte/media/index.d.ts +2 -0
- package/dist/svelte/media/index.d.ts.map +1 -0
- package/dist/svelte/media/index.js +1 -0
- package/dist/svelte/tests/media/image.svelte.test.d.ts +2 -0
- package/dist/svelte/tests/media/image.svelte.test.d.ts.map +1 -0
- package/dist/svelte/tests/media/image.svelte.test.js +430 -0
- package/dist/svelte/tests/testUtils.d.ts +11 -0
- package/dist/svelte/tests/testUtils.d.ts.map +1 -0
- package/dist/svelte/tests/testUtils.js +17 -0
- package/dist/svelte/tests/types.d.ts +3 -0
- package/dist/testing.js +1 -1
- package/dist/tools/coValues/coFeed.d.ts +15 -0
- package/dist/tools/coValues/coFeed.d.ts.map +1 -1
- package/dist/tools/coValues/extensions/imageDef.d.ts +3 -9
- package/dist/tools/coValues/extensions/imageDef.d.ts.map +1 -1
- package/dist/tools/implementation/zodSchema/schemaTypes/FileStreamSchema.d.ts +1 -0
- package/dist/tools/implementation/zodSchema/schemaTypes/FileStreamSchema.d.ts.map +1 -1
- package/package.json +12 -12
- package/src/media/create-image.test.ts +195 -0
- package/src/media/create-image.ts +180 -0
- package/src/media/index.browser.ts +150 -0
- package/src/media/index.native.ts +153 -0
- package/src/media/index.ts +61 -0
- package/src/media/utils.test.ts +327 -0
- package/src/media/utils.ts +202 -0
- package/src/react/index.ts +1 -2
- package/src/react/media/image.tsx +210 -0
- package/src/react/tests/media/image.test.tsx +588 -0
- package/src/react-native-core/index.ts +1 -1
- package/src/react-native-core/media/image.tsx +159 -0
- package/src/svelte/index.ts +1 -0
- package/src/svelte/media/image.svelte +131 -0
- package/src/svelte/media/index.ts +1 -0
- package/src/svelte/tests/media/image.svelte.test.ts +583 -0
- package/src/svelte/tests/testUtils.ts +33 -0
- package/src/svelte/tests/types.d.ts +3 -0
- package/src/tools/coValues/coFeed.ts +37 -5
- package/src/tools/coValues/extensions/imageDef.ts +3 -49
- package/src/tools/implementation/zodSchema/schemaTypes/FileStreamSchema.ts +6 -0
- package/src/tools/tests/coMap.record.test.ts +3 -2
- package/src/tools/tests/coOptional.test.ts +3 -1
- package/tsconfig.json +1 -0
- package/tsup.config.ts +4 -9
- package/vitest.config.ts +14 -1
- package/dist/browser-media-images/index.d.ts +0 -9
- package/dist/browser-media-images/index.d.ts.map +0 -1
- package/dist/browser-media-images/index.js +0 -72
- package/dist/browser-media-images/index.js.map +0 -1
- package/dist/chunk-R2VNCMG6.js.map +0 -1
- package/dist/react/media.d.ts +0 -24
- package/dist/react/media.d.ts.map +0 -1
- package/dist/react-native-core/media.d.ts +0 -24
- package/dist/react-native-core/media.d.ts.map +0 -1
- package/dist/react-native-media-images/index.d.ts +0 -7
- package/dist/react-native-media-images/index.d.ts.map +0 -1
- package/dist/react-native-media-images/index.js +0 -177
- package/dist/react-native-media-images/index.js.map +0 -1
- package/dist/tools/tests/imageDef.test.d.ts +0 -2
- package/dist/tools/tests/imageDef.test.d.ts.map +0 -1
- package/src/browser-media-images/index.ts +0 -131
- package/src/react/media.tsx +0 -74
- package/src/react/scratch.tsx +0 -50
- package/src/react-native-core/media.tsx +0 -79
- package/src/react-native-media-images/index.ts +0 -238
- package/src/tools/tests/imageDef.test.ts +0 -278
@@ -3,58 +3,12 @@ import { Loaded, coFileStreamDefiner, coMapDefiner } from "../../internal.js";
|
|
3
3
|
|
4
4
|
// avoiding circularity by using the standalone definers instead of `co`
|
5
5
|
const ImageDefinitionBase = coMapDefiner({
|
6
|
+
original: coFileStreamDefiner(),
|
6
7
|
originalSize: z.tuple([z.number(), z.number()]),
|
7
8
|
placeholderDataURL: z.string().optional(),
|
9
|
+
progressive: z.boolean(),
|
8
10
|
}).catchall(coFileStreamDefiner());
|
9
11
|
|
10
12
|
/** @category Media */
|
11
|
-
export const ImageDefinition =
|
12
|
-
highestResAvailable(
|
13
|
-
imageDef: ImageDefinition,
|
14
|
-
options?: {
|
15
|
-
maxWidth?: number;
|
16
|
-
targetWidth?: number;
|
17
|
-
},
|
18
|
-
) {
|
19
|
-
const resolutions = Object.keys(imageDef).filter((key) =>
|
20
|
-
key.match(/^\d+x\d+$/),
|
21
|
-
) as `${number}x${number}`[];
|
22
|
-
|
23
|
-
let maxWidth = options?.maxWidth;
|
24
|
-
|
25
|
-
if (options?.targetWidth) {
|
26
|
-
const targetWidth = options.targetWidth;
|
27
|
-
const widths = resolutions.map((res) => Number(res.split("x")[0]));
|
28
|
-
|
29
|
-
maxWidth = Math.min(...widths.filter((w) => w >= targetWidth));
|
30
|
-
}
|
31
|
-
|
32
|
-
const validResolutions = resolutions.filter(
|
33
|
-
(key) => maxWidth === undefined || Number(key.split("x")[0]) <= maxWidth,
|
34
|
-
) as `${number}x${number}`[];
|
35
|
-
|
36
|
-
// Sort the resolutions by width, smallest to largest
|
37
|
-
validResolutions.sort((a, b) => {
|
38
|
-
const aWidth = Number(a.split("x")[0]);
|
39
|
-
const bWidth = Number(b.split("x")[0]);
|
40
|
-
return aWidth - bWidth; // Sort smallest to largest
|
41
|
-
});
|
42
|
-
|
43
|
-
let highestAvailableResolution: `${number}x${number}` | undefined;
|
44
|
-
|
45
|
-
for (const resolution of validResolutions) {
|
46
|
-
if (imageDef[resolution] && imageDef[resolution]?.getChunks()) {
|
47
|
-
highestAvailableResolution = resolution;
|
48
|
-
}
|
49
|
-
}
|
50
|
-
|
51
|
-
// Return the highest complete resolution if we found one
|
52
|
-
return (
|
53
|
-
highestAvailableResolution && {
|
54
|
-
res: highestAvailableResolution,
|
55
|
-
stream: imageDef[highestAvailableResolution]!,
|
56
|
-
}
|
57
|
-
);
|
58
|
-
},
|
59
|
-
});
|
13
|
+
export const ImageDefinition = ImageDefinitionBase;
|
60
14
|
export type ImageDefinition = Loaded<typeof ImageDefinition>;
|
@@ -42,6 +42,12 @@ export class FileStreamSchema implements CoreFileStreamSchema {
|
|
42
42
|
return this.coValueClass.createFromBlob(blob, options);
|
43
43
|
}
|
44
44
|
|
45
|
+
createFromArrayBuffer(
|
46
|
+
...args: Parameters<typeof FileStream.createFromArrayBuffer>
|
47
|
+
) {
|
48
|
+
return this.coValueClass.createFromArrayBuffer(...args);
|
49
|
+
}
|
50
|
+
|
45
51
|
loadAsBlob(
|
46
52
|
id: string,
|
47
53
|
options?: {
|
@@ -8,8 +8,7 @@ import {
|
|
8
8
|
test,
|
9
9
|
vi,
|
10
10
|
} from "vitest";
|
11
|
-
import { Group, co, z } from "../exports.js";
|
12
|
-
import { InstanceOrPrimitiveOfSchema } from "../implementation/zodSchema/typeConverters/InstanceOrPrimitiveOfSchema.js";
|
11
|
+
import { FileStream, Group, co, z } from "../exports.js";
|
13
12
|
import { Loaded } from "../implementation/zodSchema/zodSchema.js";
|
14
13
|
import { Account } from "../index.js";
|
15
14
|
import { createJazzTestAccount, setupJazzTestSync } from "../testing.js";
|
@@ -373,6 +372,8 @@ describe("CoMap.Record", async () => {
|
|
373
372
|
type: "repro",
|
374
373
|
name: "John",
|
375
374
|
image: co.image().create({
|
375
|
+
original: FileStream.create(),
|
376
|
+
progressive: false,
|
376
377
|
originalSize: [1920, 1080],
|
377
378
|
}),
|
378
379
|
});
|
@@ -1,5 +1,5 @@
|
|
1
1
|
import { beforeEach, describe, expect, test } from "vitest";
|
2
|
-
import { CoPlainText, co, z } from "../exports.js";
|
2
|
+
import { CoPlainText, FileStream, co, z } from "../exports.js";
|
3
3
|
import { createJazzTestAccount, setupJazzTestSync } from "../testing.js";
|
4
4
|
|
5
5
|
describe("co.optional", () => {
|
@@ -69,6 +69,8 @@ describe("co.optional", () => {
|
|
69
69
|
schema.fileStream = Schema.shape.fileStream.innerType.create();
|
70
70
|
schema.image = Schema.shape.image.innerType.create({
|
71
71
|
originalSize: [1920, 1080],
|
72
|
+
original: FileStream.create(),
|
73
|
+
progressive: false,
|
72
74
|
});
|
73
75
|
schema.record = Schema.shape.record.innerType.create({ field: "hello" });
|
74
76
|
schema.map = Schema.shape.map.innerType.create({ field: "hello" });
|
package/tsconfig.json
CHANGED
package/tsup.config.ts
CHANGED
@@ -29,9 +29,11 @@ export default defineConfig([
|
|
29
29
|
{
|
30
30
|
...cfg,
|
31
31
|
entry: {
|
32
|
-
index: "src/
|
32
|
+
index: "src/media/index.ts",
|
33
|
+
"index.browser": "src/media/index.browser.ts",
|
34
|
+
"index.native": "src/media/index.native.ts",
|
33
35
|
},
|
34
|
-
outDir: "dist/
|
36
|
+
outDir: "dist/media",
|
35
37
|
},
|
36
38
|
{
|
37
39
|
...cfg,
|
@@ -121,13 +123,6 @@ export default defineConfig([
|
|
121
123
|
},
|
122
124
|
outDir: "dist/react-native-core",
|
123
125
|
},
|
124
|
-
{
|
125
|
-
...cfg,
|
126
|
-
entry: {
|
127
|
-
index: "src/react-native-media-images/index.ts",
|
128
|
-
},
|
129
|
-
outDir: "dist/react-native-media-images",
|
130
|
-
},
|
131
126
|
{
|
132
127
|
...cfg,
|
133
128
|
entry: {
|
package/vitest.config.ts
CHANGED
@@ -1,9 +1,22 @@
|
|
1
|
+
import { svelte } from "@sveltejs/vite-plugin-svelte";
|
2
|
+
import { svelteTesting } from "@testing-library/svelte/vite";
|
1
3
|
import { defineProject } from "vitest/config";
|
2
4
|
|
3
5
|
export default defineProject({
|
6
|
+
plugins: [
|
7
|
+
svelte(),
|
8
|
+
svelteTesting({
|
9
|
+
resolveBrowser: false,
|
10
|
+
}),
|
11
|
+
],
|
12
|
+
resolve: {
|
13
|
+
// 'browser' for Svelte Testing Library
|
14
|
+
// 'node' for "msw/node"
|
15
|
+
conditions: ["browser", "node"],
|
16
|
+
},
|
4
17
|
test: {
|
5
18
|
name: "jazz-tools",
|
6
|
-
include: ["src/**/*.test.{js,ts,svelte}"],
|
19
|
+
include: ["src/**/*.test.{js,ts,tsx,svelte}"],
|
7
20
|
typecheck: {
|
8
21
|
enabled: true,
|
9
22
|
checker: "tsc",
|
@@ -1,9 +0,0 @@
|
|
1
|
-
import { Account, Group, ImageDefinition, Loaded } from "jazz-tools";
|
2
|
-
/** @category Image creation */
|
3
|
-
export declare function createImage(imageBlobOrFile: Blob | File, options?: {
|
4
|
-
owner?: Group | Account;
|
5
|
-
maxSize?: 256 | 1024 | 2048;
|
6
|
-
}): Promise<Loaded<typeof ImageDefinition, {
|
7
|
-
$each: true;
|
8
|
-
}>>;
|
9
|
-
//# sourceMappingURL=index.d.ts.map
|
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/browser-media-images/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,OAAO,EAEP,KAAK,EACL,eAAe,EACf,MAAM,EACP,MAAM,YAAY,CAAC;AAKpB,+BAA+B;AAC/B,wBAAsB,WAAW,CAC/B,eAAe,EAAE,IAAI,GAAG,IAAI,EAC5B,OAAO,CAAC,EAAE;IACR,KAAK,CAAC,EAAE,KAAK,GAAG,OAAO,CAAC;IACxB,OAAO,CAAC,EAAE,GAAG,GAAG,IAAI,GAAG,IAAI,CAAC;CAC7B,GACA,OAAO,CAAC,MAAM,CAAC,OAAO,eAAe,EAAE;IAAE,KAAK,EAAE,IAAI,CAAA;CAAE,CAAC,CAAC,CA8C1D"}
|
@@ -1,72 +0,0 @@
|
|
1
|
-
// src/browser-media-images/index.ts
|
2
|
-
import ImageBlobReduce from "image-blob-reduce";
|
3
|
-
import {
|
4
|
-
FileStream,
|
5
|
-
ImageDefinition
|
6
|
-
} from "jazz-tools";
|
7
|
-
import Pica from "pica";
|
8
|
-
var reducer;
|
9
|
-
async function createImage(imageBlobOrFile, options) {
|
10
|
-
const { width: originalWidth, height: originalHeight } = await getImageSize(imageBlobOrFile);
|
11
|
-
const highestDimension = Math.max(originalWidth, originalHeight);
|
12
|
-
const resizes = [256, 1024, 2048, highestDimension].filter((s) => s <= (options?.maxSize ?? highestDimension)).toSorted((a, b) => a - b);
|
13
|
-
const { width: finalWidth, height: finalHeight } = getNewDimensions(
|
14
|
-
originalWidth,
|
15
|
-
originalHeight,
|
16
|
-
resizes.at(-1)
|
17
|
-
);
|
18
|
-
const imageDefinition = ImageDefinition.create(
|
19
|
-
{ originalSize: [finalWidth, finalHeight] },
|
20
|
-
options?.owner
|
21
|
-
);
|
22
|
-
const owner = imageDefinition._owner;
|
23
|
-
imageDefinition.placeholderDataURL = await getPlaceholderBase64(imageBlobOrFile);
|
24
|
-
for (let size of resizes) {
|
25
|
-
const { width, height } = getNewDimensions(
|
26
|
-
originalWidth,
|
27
|
-
originalHeight,
|
28
|
-
size
|
29
|
-
);
|
30
|
-
const image = await resize(imageBlobOrFile, width, height);
|
31
|
-
const binaryStream = await FileStream.createFromBlob(image, owner);
|
32
|
-
imageDefinition[`${width}x${height}`] = binaryStream;
|
33
|
-
}
|
34
|
-
return imageDefinition;
|
35
|
-
}
|
36
|
-
async function getImageSize(imageBlobOrFile) {
|
37
|
-
const { width, height } = await new Promise((resolve, reject) => {
|
38
|
-
const img = new Image();
|
39
|
-
img.onload = () => {
|
40
|
-
resolve({ width: img.width, height: img.height });
|
41
|
-
URL.revokeObjectURL(img.src);
|
42
|
-
};
|
43
|
-
img.onerror = () => {
|
44
|
-
reject(new Error("Failed to load image"));
|
45
|
-
URL.revokeObjectURL(img.src);
|
46
|
-
};
|
47
|
-
img.src = URL.createObjectURL(imageBlobOrFile);
|
48
|
-
});
|
49
|
-
return { width, height };
|
50
|
-
}
|
51
|
-
async function getPlaceholderBase64(imageBlobOrFile) {
|
52
|
-
if (!reducer) {
|
53
|
-
reducer = new ImageBlobReduce({ pica: new Pica() });
|
54
|
-
}
|
55
|
-
const canvas = await reducer.toCanvas(imageBlobOrFile, { max: 8 });
|
56
|
-
return canvas.toDataURL("image/png");
|
57
|
-
}
|
58
|
-
async function resize(imageBlobOrFile, width, height) {
|
59
|
-
if (!reducer) {
|
60
|
-
reducer = new ImageBlobReduce({ pica: new Pica() });
|
61
|
-
}
|
62
|
-
return reducer.toBlob(imageBlobOrFile, { max: Math.max(width, height) });
|
63
|
-
}
|
64
|
-
var getNewDimensions = (originalWidth, originalHeight, maxSize) => {
|
65
|
-
const width = originalWidth > originalHeight ? maxSize : Math.round(maxSize * (originalWidth / originalHeight));
|
66
|
-
const height = originalHeight > originalWidth ? maxSize : Math.round(maxSize * (originalHeight / originalWidth));
|
67
|
-
return { width, height };
|
68
|
-
};
|
69
|
-
export {
|
70
|
-
createImage
|
71
|
-
};
|
72
|
-
//# sourceMappingURL=index.js.map
|
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"sources":["../../src/browser-media-images/index.ts"],"sourcesContent":["import ImageBlobReduce from \"image-blob-reduce\";\nimport {\n Account,\n FileStream,\n Group,\n ImageDefinition,\n Loaded,\n} from \"jazz-tools\";\nimport Pica from \"pica\";\n\nlet reducer: ImageBlobReduce.ImageBlobReduce | undefined;\n\n/** @category Image creation */\nexport async function createImage(\n imageBlobOrFile: Blob | File,\n options?: {\n owner?: Group | Account;\n maxSize?: 256 | 1024 | 2048;\n },\n): Promise<Loaded<typeof ImageDefinition, { $each: true }>> {\n // Get the original size of the image\n const { width: originalWidth, height: originalHeight } =\n await getImageSize(imageBlobOrFile);\n\n const highestDimension = Math.max(originalWidth, originalHeight);\n\n // Calculate the sizes to resize the image to\n const resizes = [256, 1024, 2048, highestDimension]\n .filter((s) => s <= (options?.maxSize ?? highestDimension))\n .toSorted((a, b) => a - b);\n\n // Get the highest resolution to use as final original size\n // In case of options.maxSize, it's not the originalWidth/Height\n const { width: finalWidth, height: finalHeight } = getNewDimensions(\n originalWidth,\n originalHeight,\n resizes.at(-1)!,\n );\n\n const imageDefinition = ImageDefinition.create(\n { originalSize: [finalWidth, finalHeight] },\n options?.owner,\n );\n const owner = imageDefinition._owner;\n\n // Placeholder 8x8\n imageDefinition.placeholderDataURL =\n await getPlaceholderBase64(imageBlobOrFile);\n\n // Resizes for progressive loading\n for (let size of resizes) {\n // Calculate width and height respecting the aspect ratio\n const { width, height } = getNewDimensions(\n originalWidth,\n originalHeight,\n size,\n );\n\n const image = await resize(imageBlobOrFile, width, height);\n\n const binaryStream = await FileStream.createFromBlob(image, owner);\n imageDefinition[`${width}x${height}`] = binaryStream;\n }\n\n return imageDefinition;\n}\n\nasync function getImageSize(\n imageBlobOrFile: Blob | File,\n): Promise<{ width: number; height: number }> {\n const { width, height } = await new Promise<{\n width: number;\n height: number;\n }>((resolve, reject) => {\n const img = new Image();\n img.onload = () => {\n resolve({ width: img.width, height: img.height });\n URL.revokeObjectURL(img.src);\n };\n img.onerror = () => {\n reject(new Error(\"Failed to load image\"));\n URL.revokeObjectURL(img.src);\n };\n img.src = URL.createObjectURL(imageBlobOrFile);\n });\n\n return { width, height };\n}\n\nasync function getPlaceholderBase64(\n imageBlobOrFile: Blob | File,\n): Promise<string> {\n // Inizialize Reducer here to not have module side effects\n if (!reducer) {\n reducer = new ImageBlobReduce({ pica: new Pica() });\n }\n\n const canvas = await reducer.toCanvas(imageBlobOrFile, { max: 8 });\n return canvas.toDataURL(\"image/png\");\n}\n\nasync function resize(\n imageBlobOrFile: Blob | File,\n width: number,\n height: number,\n): Promise<Blob> {\n // Inizialize Reducer here to not have module side effects\n if (!reducer) {\n reducer = new ImageBlobReduce({ pica: new Pica() });\n }\n\n return reducer.toBlob(imageBlobOrFile, { max: Math.max(width, height) });\n}\n\nconst getNewDimensions = (\n originalWidth: number,\n originalHeight: number,\n maxSize: number,\n) => {\n const width =\n originalWidth > originalHeight\n ? maxSize\n : Math.round(maxSize * (originalWidth / originalHeight));\n\n const height =\n originalHeight > originalWidth\n ? maxSize\n : Math.round(maxSize * (originalHeight / originalWidth));\n\n return { width, height };\n};\n"],"mappings":";AAAA,OAAO,qBAAqB;AAC5B;AAAA,EAEE;AAAA,EAEA;AAAA,OAEK;AACP,OAAO,UAAU;AAEjB,IAAI;AAGJ,eAAsB,YACpB,iBACA,SAI0D;AAE1D,QAAM,EAAE,OAAO,eAAe,QAAQ,eAAe,IACnD,MAAM,aAAa,eAAe;AAEpC,QAAM,mBAAmB,KAAK,IAAI,eAAe,cAAc;AAG/D,QAAM,UAAU,CAAC,KAAK,MAAM,MAAM,gBAAgB,EAC/C,OAAO,CAAC,MAAM,MAAM,SAAS,WAAW,iBAAiB,EACzD,SAAS,CAAC,GAAG,MAAM,IAAI,CAAC;AAI3B,QAAM,EAAE,OAAO,YAAY,QAAQ,YAAY,IAAI;AAAA,IACjD;AAAA,IACA;AAAA,IACA,QAAQ,GAAG,EAAE;AAAA,EACf;AAEA,QAAM,kBAAkB,gBAAgB;AAAA,IACtC,EAAE,cAAc,CAAC,YAAY,WAAW,EAAE;AAAA,IAC1C,SAAS;AAAA,EACX;AACA,QAAM,QAAQ,gBAAgB;AAG9B,kBAAgB,qBACd,MAAM,qBAAqB,eAAe;AAG5C,WAAS,QAAQ,SAAS;AAExB,UAAM,EAAE,OAAO,OAAO,IAAI;AAAA,MACxB;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,UAAM,QAAQ,MAAM,OAAO,iBAAiB,OAAO,MAAM;AAEzD,UAAM,eAAe,MAAM,WAAW,eAAe,OAAO,KAAK;AACjE,oBAAgB,GAAG,KAAK,IAAI,MAAM,EAAE,IAAI;AAAA,EAC1C;AAEA,SAAO;AACT;AAEA,eAAe,aACb,iBAC4C;AAC5C,QAAM,EAAE,OAAO,OAAO,IAAI,MAAM,IAAI,QAGjC,CAAC,SAAS,WAAW;AACtB,UAAM,MAAM,IAAI,MAAM;AACtB,QAAI,SAAS,MAAM;AACjB,cAAQ,EAAE,OAAO,IAAI,OAAO,QAAQ,IAAI,OAAO,CAAC;AAChD,UAAI,gBAAgB,IAAI,GAAG;AAAA,IAC7B;AACA,QAAI,UAAU,MAAM;AAClB,aAAO,IAAI,MAAM,sBAAsB,CAAC;AACxC,UAAI,gBAAgB,IAAI,GAAG;AAAA,IAC7B;AACA,QAAI,MAAM,IAAI,gBAAgB,eAAe;AAAA,EAC/C,CAAC;AAED,SAAO,EAAE,OAAO,OAAO;AACzB;AAEA,eAAe,qBACb,iBACiB;AAEjB,MAAI,CAAC,SAAS;AACZ,cAAU,IAAI,gBAAgB,EAAE,MAAM,IAAI,KAAK,EAAE,CAAC;AAAA,EACpD;AAEA,QAAM,SAAS,MAAM,QAAQ,SAAS,iBAAiB,EAAE,KAAK,EAAE,CAAC;AACjE,SAAO,OAAO,UAAU,WAAW;AACrC;AAEA,eAAe,OACb,iBACA,OACA,QACe;AAEf,MAAI,CAAC,SAAS;AACZ,cAAU,IAAI,gBAAgB,EAAE,MAAM,IAAI,KAAK,EAAE,CAAC;AAAA,EACpD;AAEA,SAAO,QAAQ,OAAO,iBAAiB,EAAE,KAAK,KAAK,IAAI,OAAO,MAAM,EAAE,CAAC;AACzE;AAEA,IAAM,mBAAmB,CACvB,eACA,gBACA,YACG;AACH,QAAM,QACJ,gBAAgB,iBACZ,UACA,KAAK,MAAM,WAAW,gBAAgB,eAAe;AAE3D,QAAM,SACJ,iBAAiB,gBACb,UACA,KAAK,MAAM,WAAW,iBAAiB,cAAc;AAE3D,SAAO,EAAE,OAAO,OAAO;AACzB;","names":[]}
|