jazz-tools 0.16.6 → 0.17.1

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.
Files changed (139) hide show
  1. package/.svelte-kit/__package__/index.d.ts +1 -0
  2. package/.svelte-kit/__package__/index.d.ts.map +1 -1
  3. package/.svelte-kit/__package__/index.js +1 -0
  4. package/.svelte-kit/__package__/media/image.svelte +131 -0
  5. package/.svelte-kit/__package__/media/image.svelte.d.ts +10 -0
  6. package/.svelte-kit/__package__/media/image.svelte.d.ts.map +1 -0
  7. package/.svelte-kit/__package__/media/index.d.ts +2 -0
  8. package/.svelte-kit/__package__/media/index.d.ts.map +1 -0
  9. package/.svelte-kit/__package__/media/index.js +1 -0
  10. package/.svelte-kit/__package__/tests/media/image.svelte.test.d.ts +2 -0
  11. package/.svelte-kit/__package__/tests/media/image.svelte.test.d.ts.map +1 -0
  12. package/.svelte-kit/__package__/tests/media/image.svelte.test.js +430 -0
  13. package/.svelte-kit/__package__/tests/testUtils.d.ts +11 -0
  14. package/.svelte-kit/__package__/tests/testUtils.d.ts.map +1 -0
  15. package/.svelte-kit/__package__/tests/testUtils.js +17 -0
  16. package/.svelte-kit/__package__/tests/types.d.ts +3 -0
  17. package/.turbo/turbo-build.log +47 -51
  18. package/CHANGELOG.md +24 -0
  19. package/dist/{chunk-R2VNCMG6.js → chunk-2SH44VLX.js} +33 -38
  20. package/dist/chunk-2SH44VLX.js.map +1 -0
  21. package/dist/index.js +1 -1
  22. package/dist/index.js.map +1 -1
  23. package/dist/media/chunk-JBLT443O.js +211 -0
  24. package/dist/media/chunk-JBLT443O.js.map +1 -0
  25. package/dist/media/create-image.d.ts +48 -0
  26. package/dist/media/create-image.d.ts.map +1 -0
  27. package/dist/media/create-image.test.d.ts +2 -0
  28. package/dist/media/create-image.test.d.ts.map +1 -0
  29. package/dist/media/index.browser.d.ts +15 -0
  30. package/dist/media/index.browser.d.ts.map +1 -0
  31. package/dist/media/index.browser.js +113 -0
  32. package/dist/media/index.browser.js.map +1 -0
  33. package/dist/media/index.d.ts +53 -0
  34. package/dist/media/index.d.ts.map +1 -0
  35. package/dist/media/index.js +13 -0
  36. package/dist/media/index.js.map +1 -0
  37. package/dist/media/index.native.d.ts +17 -0
  38. package/dist/media/index.native.d.ts.map +1 -0
  39. package/dist/media/index.native.js +126 -0
  40. package/dist/media/index.native.js.map +1 -0
  41. package/dist/media/utils.d.ts +17 -0
  42. package/dist/media/utils.d.ts.map +1 -0
  43. package/dist/media/utils.test.d.ts +2 -0
  44. package/dist/media/utils.test.d.ts.map +1 -0
  45. package/dist/react/index.d.ts +1 -2
  46. package/dist/react/index.d.ts.map +1 -1
  47. package/dist/react/index.js +176 -59
  48. package/dist/react/index.js.map +1 -1
  49. package/dist/react/media/image.d.ts +62 -0
  50. package/dist/react/media/image.d.ts.map +1 -0
  51. package/dist/react/tests/media/image.test.d.ts +2 -0
  52. package/dist/react/tests/media/image.test.d.ts.map +1 -0
  53. package/dist/react-core/tests/useDemoAuth.test.d.ts +2 -0
  54. package/dist/react-core/tests/useDemoAuth.test.d.ts.map +1 -0
  55. package/dist/react-native-core/index.d.ts +1 -1
  56. package/dist/react-native-core/index.d.ts.map +1 -1
  57. package/dist/react-native-core/index.js +84 -66
  58. package/dist/react-native-core/index.js.map +1 -1
  59. package/dist/react-native-core/media/image.d.ts +93 -0
  60. package/dist/react-native-core/media/image.d.ts.map +1 -0
  61. package/dist/react-native-core/testing.d.ts +2 -0
  62. package/dist/react-native-core/testing.d.ts.map +1 -0
  63. package/dist/svelte/index.d.ts +1 -0
  64. package/dist/svelte/index.d.ts.map +1 -1
  65. package/dist/svelte/index.js +1 -0
  66. package/dist/svelte/media/image.svelte +131 -0
  67. package/dist/svelte/media/image.svelte.d.ts +10 -0
  68. package/dist/svelte/media/image.svelte.d.ts.map +1 -0
  69. package/dist/svelte/media/index.d.ts +2 -0
  70. package/dist/svelte/media/index.d.ts.map +1 -0
  71. package/dist/svelte/media/index.js +1 -0
  72. package/dist/svelte/tests/media/image.svelte.test.d.ts +2 -0
  73. package/dist/svelte/tests/media/image.svelte.test.d.ts.map +1 -0
  74. package/dist/svelte/tests/media/image.svelte.test.js +430 -0
  75. package/dist/svelte/tests/testUtils.d.ts +11 -0
  76. package/dist/svelte/tests/testUtils.d.ts.map +1 -0
  77. package/dist/svelte/tests/testUtils.js +17 -0
  78. package/dist/svelte/tests/types.d.ts +3 -0
  79. package/dist/testing.js +1 -1
  80. package/dist/tools/coValues/coFeed.d.ts +15 -0
  81. package/dist/tools/coValues/coFeed.d.ts.map +1 -1
  82. package/dist/tools/coValues/extensions/imageDef.d.ts +3 -9
  83. package/dist/tools/coValues/extensions/imageDef.d.ts.map +1 -1
  84. package/dist/tools/coValues/request.d.ts +1 -1
  85. package/dist/tools/coValues/request.d.ts.map +1 -1
  86. package/dist/tools/exports.d.ts +1 -1
  87. package/dist/tools/exports.d.ts.map +1 -1
  88. package/dist/tools/implementation/zodSchema/schemaTypes/FileStreamSchema.d.ts +1 -0
  89. package/dist/tools/implementation/zodSchema/schemaTypes/FileStreamSchema.d.ts.map +1 -1
  90. package/package.json +12 -12
  91. package/src/media/create-image.test.ts +195 -0
  92. package/src/media/create-image.ts +180 -0
  93. package/src/media/index.browser.ts +150 -0
  94. package/src/media/index.native.ts +153 -0
  95. package/src/media/index.ts +61 -0
  96. package/src/media/utils.test.ts +373 -0
  97. package/src/media/utils.ts +205 -0
  98. package/src/react/index.ts +1 -2
  99. package/src/react/media/image.tsx +210 -0
  100. package/src/react/tests/media/image.test.tsx +588 -0
  101. package/src/react-native-core/index.ts +1 -1
  102. package/src/react-native-core/media/image.tsx +159 -0
  103. package/src/svelte/index.ts +1 -0
  104. package/src/svelte/media/image.svelte +131 -0
  105. package/src/svelte/media/index.ts +1 -0
  106. package/src/svelte/tests/media/image.svelte.test.ts +583 -0
  107. package/src/svelte/tests/testUtils.ts +33 -0
  108. package/src/svelte/tests/types.d.ts +3 -0
  109. package/src/tools/coValues/coFeed.ts +37 -5
  110. package/src/tools/coValues/extensions/imageDef.ts +3 -49
  111. package/src/tools/coValues/request.ts +1 -1
  112. package/src/tools/exports.ts +1 -0
  113. package/src/tools/implementation/zodSchema/schemaTypes/FileStreamSchema.ts +6 -0
  114. package/src/tools/tests/coMap.record.test.ts +3 -2
  115. package/src/tools/tests/coOptional.test.ts +3 -1
  116. package/tsconfig.json +1 -0
  117. package/tsup.config.ts +4 -9
  118. package/vitest.config.ts +14 -1
  119. package/dist/browser-media-images/index.d.ts +0 -9
  120. package/dist/browser-media-images/index.d.ts.map +0 -1
  121. package/dist/browser-media-images/index.js +0 -72
  122. package/dist/browser-media-images/index.js.map +0 -1
  123. package/dist/chunk-R2VNCMG6.js.map +0 -1
  124. package/dist/react/media.d.ts +0 -24
  125. package/dist/react/media.d.ts.map +0 -1
  126. package/dist/react-native-core/media.d.ts +0 -24
  127. package/dist/react-native-core/media.d.ts.map +0 -1
  128. package/dist/react-native-media-images/index.d.ts +0 -7
  129. package/dist/react-native-media-images/index.d.ts.map +0 -1
  130. package/dist/react-native-media-images/index.js +0 -177
  131. package/dist/react-native-media-images/index.js.map +0 -1
  132. package/dist/tools/tests/imageDef.test.d.ts +0 -2
  133. package/dist/tools/tests/imageDef.test.d.ts.map +0 -1
  134. package/src/browser-media-images/index.ts +0 -131
  135. package/src/react/media.tsx +0 -74
  136. package/src/react/scratch.tsx +0 -50
  137. package/src/react-native-core/media.tsx +0 -79
  138. package/src/react-native-media-images/index.ts +0 -238
  139. package/src/tools/tests/imageDef.test.ts +0 -278
@@ -0,0 +1,113 @@
1
+ import {
2
+ createImageFactory,
3
+ highestResAvailable,
4
+ loadImage,
5
+ loadImageBySize
6
+ } from "./chunk-JBLT443O.js";
7
+
8
+ // src/media/index.browser.ts
9
+ import { FileStream } from "jazz-tools";
10
+ async function createImage(imageBlobOrFile, options) {
11
+ return createImageFactory({
12
+ createFileStreamFromSource,
13
+ getImageSize,
14
+ getPlaceholderBase64,
15
+ resize
16
+ })(imageBlobOrFile, options || {});
17
+ }
18
+ async function createFileStreamFromSource(imageBlobOrFile, owner) {
19
+ if (typeof imageBlobOrFile === "string") {
20
+ throw new Error(
21
+ "createFileStreamFromSource(string) is not supported on this platform"
22
+ );
23
+ }
24
+ return FileStream.createFromBlob(imageBlobOrFile, owner);
25
+ }
26
+ function getImageFromBlob(blob) {
27
+ return new Promise((resolve, reject) => {
28
+ const img = new Image();
29
+ img.onload = () => {
30
+ resolve(img);
31
+ URL.revokeObjectURL(img.src);
32
+ };
33
+ img.onerror = () => {
34
+ reject(new Error("Failed to load image"));
35
+ URL.revokeObjectURL(img.src);
36
+ };
37
+ img.src = URL.createObjectURL(blob);
38
+ });
39
+ }
40
+ async function getImageSize(imageBlobOrFile) {
41
+ if (typeof imageBlobOrFile === "string") {
42
+ throw new Error("getImageSize(string) is not supported on browser");
43
+ }
44
+ const image = await getImageFromBlob(imageBlobOrFile);
45
+ return { width: image.width, height: image.height };
46
+ }
47
+ async function getPlaceholderBase64(imageBlobOrFile) {
48
+ if (typeof imageBlobOrFile === "string") {
49
+ throw new Error("getPlaceholderBase64(string) is not supported on browser");
50
+ }
51
+ const image = await getImageFromBlob(imageBlobOrFile);
52
+ const { width, height } = resizeDimensionsKeepingAspectRatio(
53
+ image.width,
54
+ image.height,
55
+ 8
56
+ );
57
+ const canvas = document.createElement("canvas");
58
+ canvas.width = width;
59
+ canvas.height = height;
60
+ const ctx = canvas.getContext("2d");
61
+ if (!ctx) {
62
+ throw new Error("Failed to get context");
63
+ }
64
+ ctx.drawImage(image, 0, 0, width, height);
65
+ return canvas.toDataURL("image/png");
66
+ }
67
+ var resizeDimensionsKeepingAspectRatio = (width, height, maxSize) => {
68
+ if (width <= maxSize && height <= maxSize) {
69
+ return { width, height };
70
+ }
71
+ const aspectRatio = width / height;
72
+ if (width >= height) {
73
+ return { width: maxSize, height: Math.round(maxSize / aspectRatio) };
74
+ } else {
75
+ return { width: Math.round(maxSize * aspectRatio), height: maxSize };
76
+ }
77
+ };
78
+ async function resize(imageBlobOrFile, width, height) {
79
+ if (typeof imageBlobOrFile === "string") {
80
+ throw new Error("resize(string) is not supported on browser");
81
+ }
82
+ const mimeType = imageBlobOrFile.type;
83
+ const image = await getImageFromBlob(imageBlobOrFile);
84
+ const canvas = document.createElement("canvas");
85
+ canvas.width = width;
86
+ canvas.height = height;
87
+ const ctx = canvas.getContext("2d");
88
+ if (!ctx) {
89
+ throw new Error("Failed to get context");
90
+ }
91
+ ctx.drawImage(image, 0, 0, width, height);
92
+ return new Promise((resolve, reject) => {
93
+ canvas.toBlob(
94
+ (blob) => {
95
+ if (!blob) {
96
+ reject(new Error("Failed to convert canvas to blob"));
97
+ return;
98
+ }
99
+ resolve(blob);
100
+ },
101
+ mimeType,
102
+ 0.8
103
+ );
104
+ });
105
+ }
106
+ export {
107
+ createImage,
108
+ createImageFactory,
109
+ highestResAvailable,
110
+ loadImage,
111
+ loadImageBySize
112
+ };
113
+ //# sourceMappingURL=index.browser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/media/index.browser.ts"],"sourcesContent":["import { Account, FileStream, Group, ImageDefinition } from \"jazz-tools\";\nimport { CreateImageOptions, createImageFactory } from \"./create-image.js\";\n\nexport { highestResAvailable, loadImage, loadImageBySize } from \"./utils.js\";\n\nexport { createImageFactory };\n\nexport async function createImage(\n imageBlobOrFile: Blob | File | string,\n options?: CreateImageOptions,\n) {\n return createImageFactory({\n createFileStreamFromSource,\n getImageSize,\n getPlaceholderBase64,\n resize,\n })(imageBlobOrFile, options || {});\n}\n\n// Image Manipulations\nasync function createFileStreamFromSource(\n imageBlobOrFile: Blob | File | string,\n owner?: Account | Group,\n): Promise<FileStream> {\n if (typeof imageBlobOrFile === \"string\") {\n throw new Error(\n \"createFileStreamFromSource(string) is not supported on this platform\",\n );\n }\n\n return FileStream.createFromBlob(imageBlobOrFile, owner);\n}\n\n// using createImageBitmap is ~10x slower than Image object\n// Image object: 640 milliseconds\n// createImageBitmap: 8128 milliseconds\nfunction getImageFromBlob(blob: Blob): Promise<HTMLImageElement> {\n return new Promise((resolve, reject) => {\n const img = new Image();\n img.onload = () => {\n resolve(img);\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(blob);\n });\n}\n\nasync function getImageSize(\n imageBlobOrFile: Blob | File | string,\n): Promise<{ width: number; height: number }> {\n if (typeof imageBlobOrFile === \"string\") {\n throw new Error(\"getImageSize(string) is not supported on browser\");\n }\n\n const image = await getImageFromBlob(imageBlobOrFile);\n\n return { width: image.width, height: image.height };\n}\n\nasync function getPlaceholderBase64(\n imageBlobOrFile: Blob | File | string,\n): Promise<string> {\n if (typeof imageBlobOrFile === \"string\") {\n throw new Error(\"getPlaceholderBase64(string) is not supported on browser\");\n }\n\n const image = await getImageFromBlob(imageBlobOrFile);\n\n const { width, height } = resizeDimensionsKeepingAspectRatio(\n image.width,\n image.height,\n 8,\n );\n\n const canvas = document.createElement(\"canvas\");\n canvas.width = width;\n canvas.height = height;\n\n const ctx = canvas.getContext(\"2d\");\n\n if (!ctx) {\n throw new Error(\"Failed to get context\");\n }\n\n ctx.drawImage(image, 0, 0, width, height);\n\n return canvas.toDataURL(\"image/png\");\n}\n\nconst resizeDimensionsKeepingAspectRatio = (\n width: number,\n height: number,\n maxSize: number,\n): { width: number; height: number } => {\n if (width <= maxSize && height <= maxSize) {\n return { width, height };\n }\n\n const aspectRatio = width / height;\n\n if (width >= height) {\n return { width: maxSize, height: Math.round(maxSize / aspectRatio) };\n } else {\n return { width: Math.round(maxSize * aspectRatio), height: maxSize };\n }\n};\n\nasync function resize(\n imageBlobOrFile: Blob | File | string,\n width: number,\n height: number,\n): Promise<Blob> {\n if (typeof imageBlobOrFile === \"string\") {\n throw new Error(\"resize(string) is not supported on browser\");\n }\n\n const mimeType = imageBlobOrFile.type;\n\n const image = await getImageFromBlob(imageBlobOrFile);\n\n const canvas = document.createElement(\"canvas\");\n canvas.width = width;\n canvas.height = height;\n\n const ctx = canvas.getContext(\"2d\");\n\n if (!ctx) {\n throw new Error(\"Failed to get context\");\n }\n\n ctx.drawImage(image, 0, 0, width, height);\n\n return new Promise<Blob>((resolve, reject) => {\n canvas.toBlob(\n (blob) => {\n if (!blob) {\n reject(new Error(\"Failed to convert canvas to blob\"));\n return;\n }\n resolve(blob);\n },\n mimeType,\n 0.8,\n );\n });\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,53 @@
1
+ import type { ImageDefinition } from "jazz-tools";
2
+ import { CreateImageOptions, SourceType, createImageFactory } from "./create-image.js";
3
+ export { highestResAvailable, loadImage, loadImageBySize } from "./utils.js";
4
+ export { createImageFactory };
5
+ /**
6
+ * Creates an ImageDefinition from an image file or blob with built-in UX features.
7
+ *
8
+ * This function creates a specialized CoValue for managing images in Jazz applications.
9
+ * It supports blurry placeholders, built-in resizing, and progressive loading patterns.
10
+ *
11
+ * @returns Promise that resolves to an ImageDefinition
12
+ *
13
+ * @example
14
+ * ```ts
15
+ * import { createImage } from "jazz-tools/media";
16
+ *
17
+ * // Create an image from a file input
18
+ * async function handleFileUpload(event: React.ChangeEvent<HTMLInputElement>) {
19
+ * const file = event.target.files?.[0];
20
+ * if (file) {
21
+ * // Creates ImageDefinition with a blurry placeholder, limited to 1024px
22
+ * // on the longest side, and multiple resolutions automatically
23
+ * const image = await createImage(file, {
24
+ * owner: me._owner,
25
+ * maxSize: 1024,
26
+ * placeholder: "blur",
27
+ * progressive: true,
28
+ * });
29
+ *
30
+ * // Store the image in your application data
31
+ * me.profile.image = image;
32
+ * }
33
+ * }
34
+ * ```
35
+ *
36
+ * @example
37
+ * ```ts
38
+ * // React Native example
39
+ * import { createImage } from "jazz-tools/media";
40
+ *
41
+ * async function uploadImageFromCamera(imagePath: string) {
42
+ * const image = await createImage(imagePath, {
43
+ * maxSize: 800,
44
+ * placeholder: "blur",
45
+ * progressive: false,
46
+ * });
47
+ *
48
+ * return image;
49
+ * }
50
+ * ```
51
+ */
52
+ export declare function createImage(imageBlobOrFile: SourceType, options?: CreateImageOptions): Promise<ImageDefinition>;
53
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/media/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EACL,kBAAkB,EAClB,UAAU,EACV,kBAAkB,EACnB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,mBAAmB,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7E,OAAO,EAAE,kBAAkB,EAAE,CAAC;AAE9B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AACH,MAAM,CAAC,OAAO,UAAU,WAAW,CACjC,eAAe,EAAE,UAAU,EAC3B,OAAO,CAAC,EAAE,kBAAkB,GAC3B,OAAO,CAAC,eAAe,CAAC,CAAC"}
@@ -0,0 +1,13 @@
1
+ import {
2
+ createImageFactory,
3
+ highestResAvailable,
4
+ loadImage,
5
+ loadImageBySize
6
+ } from "./chunk-JBLT443O.js";
7
+ export {
8
+ createImageFactory,
9
+ highestResAvailable,
10
+ loadImage,
11
+ loadImageBySize
12
+ };
13
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,17 @@
1
+ import type { Account, Group } from "jazz-tools";
2
+ import { FileStream } from "jazz-tools";
3
+ import { CreateImageOptions, SourceType, createImageFactory } from "./create-image.js";
4
+ export { highestResAvailable, loadImage, loadImageBySize } from "./utils.js";
5
+ export { createImageFactory };
6
+ export declare function createImage(imageBlobOrFile: Blob | File | string, options?: CreateImageOptions): Promise<{
7
+ [key: string]: FileStream;
8
+ } & {
9
+ original: FileStream | null;
10
+ originalSize: [number, number];
11
+ placeholderDataURL: string | undefined;
12
+ progressive: boolean;
13
+ } & {
14
+ [key: string]: FileStream | null;
15
+ } & import("jazz-tools").CoMap>;
16
+ export declare function createFileStreamFromSource(filePath: SourceType, owner?: Account | Group): Promise<FileStream>;
17
+ //# sourceMappingURL=index.native.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.native.d.ts","sourceRoot":"","sources":["../../src/media/index.native.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,KAAK,EAAmB,MAAM,YAAY,CAAC;AAClE,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExC,OAAO,EACL,kBAAkB,EAClB,UAAU,EACV,kBAAkB,EACnB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,mBAAmB,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7E,OAAO,EAAE,kBAAkB,EAAE,CAAC;AAE9B,wBAAsB,WAAW,CAC/B,eAAe,EAAE,IAAI,GAAG,IAAI,GAAG,MAAM,EACrC,OAAO,CAAC,EAAE,kBAAkB;;;;;;;;;gCAQ7B;AAmFD,wBAAsB,0BAA0B,CAC9C,QAAQ,EAAE,UAAU,EACpB,KAAK,CAAC,EAAE,OAAO,GAAG,KAAK,GACtB,OAAO,CAAC,UAAU,CAAC,CAarB"}
@@ -0,0 +1,126 @@
1
+ import {
2
+ createImageFactory,
3
+ highestResAvailable,
4
+ loadImage,
5
+ loadImageBySize
6
+ } from "./chunk-JBLT443O.js";
7
+
8
+ // src/media/index.native.ts
9
+ import ImageResizer from "@bam.tech/react-native-image-resizer";
10
+ import { FileStream } from "jazz-tools";
11
+ import { Image } from "react-native";
12
+ async function createImage(imageBlobOrFile, options) {
13
+ return createImageFactory({
14
+ getImageSize,
15
+ getPlaceholderBase64,
16
+ createFileStreamFromSource,
17
+ resize
18
+ })(imageBlobOrFile, options || {});
19
+ }
20
+ async function getImageSize(filePath) {
21
+ if (typeof filePath !== "string") {
22
+ throw new Error(
23
+ "createImage(Blob | File) is not supported on this platform"
24
+ );
25
+ }
26
+ const { width, height } = await Image.getSize(filePath);
27
+ return { width, height };
28
+ }
29
+ async function getPlaceholderBase64(filePath) {
30
+ if (typeof filePath !== "string") {
31
+ throw new Error(
32
+ "createImage(Blob | File) is not supported on this platform"
33
+ );
34
+ }
35
+ if (typeof ImageResizer === "undefined" || ImageResizer === null) {
36
+ throw new Error(
37
+ "ImageResizer is not installed, please run `npm install @bam.tech/react-native-image-resizer`"
38
+ );
39
+ }
40
+ const { uri } = await ImageResizer.createResizedImage(
41
+ filePath,
42
+ 8,
43
+ 8,
44
+ "PNG",
45
+ 100
46
+ );
47
+ return imageUrlToBase64(uri);
48
+ }
49
+ async function resize(filePath, width, height) {
50
+ if (typeof filePath !== "string") {
51
+ throw new Error(
52
+ "createImage(Blob | File) is not supported on this platform"
53
+ );
54
+ }
55
+ if (typeof ImageResizer === "undefined" || ImageResizer === null) {
56
+ throw new Error(
57
+ "ImageResizer is not installed, please run `npm install @bam.tech/react-native-image-resizer`"
58
+ );
59
+ }
60
+ const mimeType = await getMimeType(filePath);
61
+ const { uri } = await ImageResizer.createResizedImage(
62
+ filePath,
63
+ width,
64
+ height,
65
+ contentTypeToFormat(mimeType),
66
+ 80
67
+ );
68
+ return uri;
69
+ }
70
+ function getMimeType(filePath) {
71
+ return fetch(filePath).then((res) => res.blob()).then((blob) => blob.type);
72
+ }
73
+ function contentTypeToFormat(contentType) {
74
+ if (contentType.includes("image/png")) return "PNG";
75
+ if (contentType.includes("image/jpeg")) return "JPEG";
76
+ if (contentType.includes("image/webp")) return "WEBP";
77
+ return "PNG";
78
+ }
79
+ async function createFileStreamFromSource(filePath, owner) {
80
+ if (typeof filePath !== "string") {
81
+ throw new Error(
82
+ "createImage(Blob | File) is not supported on this platform"
83
+ );
84
+ }
85
+ const blob = await fetch(filePath).then((res) => res.blob());
86
+ const arrayBuffer = await toArrayBuffer(blob);
87
+ return FileStream.createFromArrayBuffer(arrayBuffer, blob.type, void 0, {
88
+ owner
89
+ });
90
+ }
91
+ function toArrayBuffer(blob) {
92
+ return new Promise((resolve, reject) => {
93
+ const reader = new FileReader();
94
+ reader.onloadend = () => {
95
+ resolve(reader.result);
96
+ };
97
+ reader.onerror = (error) => {
98
+ reject(error);
99
+ };
100
+ reader.readAsArrayBuffer(blob);
101
+ });
102
+ }
103
+ async function imageUrlToBase64(url) {
104
+ const response = await fetch(url);
105
+ const blob = await response.blob();
106
+ return new Promise((onSuccess, onError) => {
107
+ try {
108
+ const reader = new FileReader();
109
+ reader.onload = function() {
110
+ onSuccess(reader.result);
111
+ };
112
+ reader.readAsDataURL(blob);
113
+ } catch (e) {
114
+ onError(e);
115
+ }
116
+ });
117
+ }
118
+ export {
119
+ createFileStreamFromSource,
120
+ createImage,
121
+ createImageFactory,
122
+ highestResAvailable,
123
+ loadImage,
124
+ loadImageBySize
125
+ };
126
+ //# sourceMappingURL=index.native.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/media/index.native.ts"],"sourcesContent":["import ImageResizer from \"@bam.tech/react-native-image-resizer\";\nimport type { Account, Group, ImageDefinition } from \"jazz-tools\";\nimport { FileStream } from \"jazz-tools\";\nimport { Image } from \"react-native\";\nimport {\n CreateImageOptions,\n SourceType,\n createImageFactory,\n} from \"./create-image.js\";\n\nexport { highestResAvailable, loadImage, loadImageBySize } from \"./utils.js\";\nexport { createImageFactory };\n\nexport async function createImage(\n imageBlobOrFile: Blob | File | string,\n options?: CreateImageOptions,\n) {\n return createImageFactory({\n getImageSize,\n getPlaceholderBase64,\n createFileStreamFromSource,\n resize,\n })(imageBlobOrFile, options || {});\n}\n\nasync function getImageSize(\n filePath: SourceType,\n): Promise<{ width: number; height: number }> {\n if (typeof filePath !== \"string\") {\n throw new Error(\n \"createImage(Blob | File) is not supported on this platform\",\n );\n }\n\n const { width, height } = await Image.getSize(filePath);\n\n return { width, height };\n}\n\nasync function getPlaceholderBase64(filePath: SourceType): Promise<string> {\n if (typeof filePath !== \"string\") {\n throw new Error(\n \"createImage(Blob | File) is not supported on this platform\",\n );\n }\n\n if (typeof ImageResizer === \"undefined\" || ImageResizer === null) {\n throw new Error(\n \"ImageResizer is not installed, please run `npm install @bam.tech/react-native-image-resizer`\",\n );\n }\n\n const { uri } = await ImageResizer.createResizedImage(\n filePath,\n 8,\n 8,\n \"PNG\",\n 100,\n );\n\n return imageUrlToBase64(uri);\n}\n\nasync function resize(\n filePath: SourceType,\n width: number,\n height: number,\n): Promise<string> {\n if (typeof filePath !== \"string\") {\n throw new Error(\n \"createImage(Blob | File) is not supported on this platform\",\n );\n }\n\n if (typeof ImageResizer === \"undefined\" || ImageResizer === null) {\n throw new Error(\n \"ImageResizer is not installed, please run `npm install @bam.tech/react-native-image-resizer`\",\n );\n }\n\n const mimeType = await getMimeType(filePath);\n\n const { uri } = await ImageResizer.createResizedImage(\n filePath,\n width,\n height,\n contentTypeToFormat(mimeType),\n 80,\n );\n\n return uri;\n}\n\nfunction getMimeType(filePath: string): Promise<string> {\n return fetch(filePath)\n .then((res) => res.blob())\n .then((blob) => blob.type);\n}\n\nfunction contentTypeToFormat(contentType: string) {\n if (contentType.includes(\"image/png\")) return \"PNG\";\n if (contentType.includes(\"image/jpeg\")) return \"JPEG\";\n if (contentType.includes(\"image/webp\")) return \"WEBP\";\n return \"PNG\";\n}\n\nexport async function createFileStreamFromSource(\n filePath: SourceType,\n owner?: Account | Group,\n): Promise<FileStream> {\n if (typeof filePath !== \"string\") {\n throw new Error(\n \"createImage(Blob | File) is not supported on this platform\",\n );\n }\n\n const blob = await fetch(filePath).then((res) => res.blob());\n const arrayBuffer = await toArrayBuffer(blob);\n\n return FileStream.createFromArrayBuffer(arrayBuffer, blob.type, undefined, {\n owner,\n });\n}\n\n// TODO: look for more efficient way to do this as React Native hasn't blob.arrayBuffer()\nfunction toArrayBuffer(blob: Blob): Promise<ArrayBuffer> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onloadend = () => {\n resolve(reader.result as ArrayBuffer);\n };\n reader.onerror = (error) => {\n reject(error);\n };\n reader.readAsArrayBuffer(blob);\n });\n}\n\nasync function imageUrlToBase64(url: string): Promise<string> {\n const response = await fetch(url);\n const blob = await response.blob();\n return new Promise((onSuccess, onError) => {\n try {\n const reader = new FileReader();\n reader.onload = function () {\n onSuccess(reader.result as string);\n };\n reader.readAsDataURL(blob);\n } catch (e) {\n onError(e);\n }\n });\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,17 @@
1
+ import { FileStream, ImageDefinition } from "jazz-tools";
2
+ export declare function highestResAvailable(image: ImageDefinition, wantedWidth: number, wantedHeight: number): {
3
+ width: number;
4
+ height: number;
5
+ image: FileStream;
6
+ } | null;
7
+ export declare function loadImage(imageOrId: ImageDefinition | string): Promise<{
8
+ width: number;
9
+ height: number;
10
+ image: FileStream;
11
+ } | null>;
12
+ export declare function loadImageBySize(imageOrId: ImageDefinition | string, wantedWidth: number, wantedHeight: number): Promise<{
13
+ width: number;
14
+ height: number;
15
+ image: FileStream;
16
+ } | null>;
17
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/media/utils.ts"],"names":[],"mappings":"AACA,OAAO,EAAW,UAAU,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElE,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,eAAe,EACtB,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,GACnB;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,UAAU,CAAA;CAAE,GAAG,IAAI,CAuE7D;AA6BD,wBAAsB,SAAS,CAC7B,SAAS,EAAE,eAAe,GAAG,MAAM,GAClC,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,UAAU,CAAA;CAAE,GAAG,IAAI,CAAC,CAoCtE;AAED,wBAAsB,eAAe,CACnC,SAAS,EAAE,eAAe,GAAG,MAAM,EACnC,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,UAAU,CAAA;CAAE,GAAG,IAAI,CAAC,CAqDtE"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=utils.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.test.d.ts","sourceRoot":"","sources":["../../src/media/utils.test.ts"],"names":[],"mappings":""}
@@ -3,6 +3,5 @@ export type { JazzProviderProps } from "./provider.js";
3
3
  export { useAccount, useCoState, useAcceptInvite, experimental_useInboxSender, useJazzContext, useAuthSecretStorage, } from "./hooks.js";
4
4
  export { createInviteLink, parseInviteLink } from "jazz-tools/browser";
5
5
  export * from "./auth/auth.js";
6
- export * from "./media.js";
7
- export { createImage } from "jazz-tools/browser-media-images";
6
+ export * from "./media/image.js";
8
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,YAAY,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EACL,UAAU,EACV,UAAU,EACV,eAAe,EACf,2BAA2B,EAC3B,cAAc,EACd,oBAAoB,GACrB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAEvE,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,YAAY,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EACL,UAAU,EACV,UAAU,EACV,eAAe,EACf,2BAA2B,EAC3B,cAAc,EACd,oBAAoB,GACrB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAEvE,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC"}