jazz-tools 0.16.5 → 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 +44 -48
- package/CHANGELOG.md +28 -0
- package/dist/{chunk-H3BIFFQG.js → chunk-2SH44VLX.js} +35 -40
- package/dist/chunk-2SH44VLX.js.map +1 -0
- package/dist/index.js +1 -3
- package/dist/index.js.map +1 -1
- package/dist/inspector/{custom-element-TUXKXSZU.js → custom-element-I7L56H6B.js} +3 -5
- package/dist/inspector/{custom-element-TUXKXSZU.js.map → custom-element-I7L56H6B.js.map} +1 -1
- package/dist/inspector/index.js +2 -4
- package/dist/inspector/index.js.map +1 -1
- package/dist/inspector/register-custom-element.js +1 -1
- package/dist/inspector/viewer/co-plain-text-view.d.ts +1 -1
- package/dist/inspector/viewer/co-plain-text-view.d.ts.map +1 -1
- package/dist/inspector/viewer/role-display.d.ts.map +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/ssr.d.ts.map +1 -1
- package/dist/react/ssr.js.map +1 -1
- 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/tests/testUtils.d.ts.map +1 -1
- package/dist/react-core/auth/PassphraseAuth.d.ts +1 -1
- package/dist/react-core/auth/PassphraseAuth.d.ts.map +1 -1
- package/dist/react-core/index.js +1 -3
- package/dist/react-core/index.js.map +1 -1
- package/dist/react-core/tests/testUtils.d.ts.map +1 -1
- 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/testing.js.map +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/deepLoading.d.ts +10 -10
- package/dist/tools/coValues/deepLoading.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/dist/tools/index.d.ts +1 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/testing.d.ts.map +1 -1
- package/package.json +12 -12
- package/src/inspector/viewer/co-plain-text-view.tsx +1 -5
- package/src/inspector/viewer/co-stream-view.tsx +1 -1
- package/src/inspector/viewer/role-display.tsx +4 -1
- package/src/{browser-media-images/index.test.browser.ts → media/create-image.test.ts} +146 -24
- 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/ssr.ts +1 -3
- package/src/react/tests/media/image.test.tsx +588 -0
- package/src/react/tests/testUtils.tsx +2 -10
- package/src/react-core/auth/PassphraseAuth.tsx +1 -5
- package/src/react-core/tests/testUtils.tsx +2 -10
- 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 +40 -7
- package/src/tools/coValues/deepLoading.ts +46 -32
- package/src/tools/coValues/extensions/imageDef.ts +3 -49
- package/src/tools/implementation/zodSchema/schemaTypes/FileStreamSchema.ts +6 -0
- package/src/tools/index.ts +0 -1
- package/src/tools/testing.ts +3 -1
- package/src/tools/tests/coList.test.ts +1 -1
- package/src/tools/tests/coMap.record.test-d.ts +105 -0
- package/src/tools/tests/coMap.record.test.ts +48 -2
- package/src/tools/tests/coMap.test-d.ts +50 -0
- 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 -21
- 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/browser-media-images/index.test.browser.d.ts +0 -2
- package/dist/browser-media-images/index.test.browser.d.ts.map +0 -1
- package/dist/chunk-H3BIFFQG.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
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/svelte/media/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,gBAAgB,CAAC"}
|
@@ -0,0 +1 @@
|
|
1
|
+
export { default as Image } from "./image.svelte";
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"image.svelte.test.d.ts","sourceRoot":"","sources":["../../../../../src/svelte/tests/media/image.svelte.test.ts"],"names":[],"mappings":""}
|
@@ -0,0 +1,430 @@
|
|
1
|
+
// @vitest-environment happy-dom
|
2
|
+
import { FileStream, ImageDefinition } from "jazz-tools";
|
3
|
+
import { createJazzTestAccount } from "jazz-tools/testing";
|
4
|
+
import { describe, expect, it, vi } from "vitest";
|
5
|
+
import Image from "../../media/image.svelte";
|
6
|
+
import { render, screen, waitFor } from "../testUtils";
|
7
|
+
describe("Image", async () => {
|
8
|
+
const account = await createJazzTestAccount({
|
9
|
+
isCurrentActiveAccount: true,
|
10
|
+
});
|
11
|
+
const renderWithAccount = (props) => render(Image, props, { account });
|
12
|
+
describe("initial rendering", () => {
|
13
|
+
it("should render nothing if coValue is not found", async () => {
|
14
|
+
const { container } = renderWithAccount({
|
15
|
+
imageId: "co_zMTubMby3QiKDYnW9e2BEXW7Xaq",
|
16
|
+
alt: "test",
|
17
|
+
});
|
18
|
+
const img = container.querySelector("img");
|
19
|
+
expect(img).toBeDefined();
|
20
|
+
expect(img.getAttribute("width")).toBe(null);
|
21
|
+
expect(img.getAttribute("height")).toBe(null);
|
22
|
+
expect(img.alt).toBe("test");
|
23
|
+
expect(img.src).toBe("");
|
24
|
+
});
|
25
|
+
it("should render an empty image if the image is not loaded yet", async () => {
|
26
|
+
const original = FileStream.create({ owner: account._owner });
|
27
|
+
original.start({ mimeType: "image/jpeg" });
|
28
|
+
// Don't end original, so it has no chunks
|
29
|
+
const im = ImageDefinition.create({
|
30
|
+
original,
|
31
|
+
originalSize: [100, 100],
|
32
|
+
progressive: false,
|
33
|
+
}, {
|
34
|
+
owner: account,
|
35
|
+
});
|
36
|
+
const { container } = renderWithAccount({
|
37
|
+
imageId: im.id,
|
38
|
+
alt: "test",
|
39
|
+
});
|
40
|
+
const img = container.querySelector("img");
|
41
|
+
expect(img).toBeDefined();
|
42
|
+
expect(img.getAttribute("width")).toBe(null);
|
43
|
+
expect(img.getAttribute("height")).toBe(null);
|
44
|
+
expect(img.alt).toBe("test");
|
45
|
+
expect(img.src).toBe("");
|
46
|
+
});
|
47
|
+
it("should render the placeholder image if the image is not loaded yet", async () => {
|
48
|
+
const placeholderDataUrl = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNk+A8AAQUBAScY42YAAAAASUVORK5CYII=";
|
49
|
+
const original = FileStream.create({ owner: account._owner });
|
50
|
+
original.start({ mimeType: "image/jpeg" });
|
51
|
+
// Don't end original, so it has no chunks
|
52
|
+
const im = ImageDefinition.create({
|
53
|
+
original,
|
54
|
+
originalSize: [100, 100],
|
55
|
+
progressive: false,
|
56
|
+
placeholderDataURL: placeholderDataUrl,
|
57
|
+
}, {
|
58
|
+
owner: account,
|
59
|
+
});
|
60
|
+
const { container } = renderWithAccount({
|
61
|
+
imageId: im.id,
|
62
|
+
alt: "test",
|
63
|
+
});
|
64
|
+
const img = container.querySelector("img");
|
65
|
+
expect(img).toBeDefined();
|
66
|
+
expect(img.src).toBe(placeholderDataUrl);
|
67
|
+
});
|
68
|
+
it("should render the original image once loaded", async () => {
|
69
|
+
const createObjectURLSpy = vi
|
70
|
+
.spyOn(URL, "createObjectURL")
|
71
|
+
.mockImplementation((blob) => {
|
72
|
+
if (!(blob instanceof Blob)) {
|
73
|
+
throw new Error("Blob expected");
|
74
|
+
}
|
75
|
+
return `blob:test-${blob.size}`;
|
76
|
+
});
|
77
|
+
const im = ImageDefinition.create({
|
78
|
+
original: await createDummyFileStream(100, account),
|
79
|
+
originalSize: [100, 100],
|
80
|
+
progressive: false,
|
81
|
+
}, {
|
82
|
+
owner: account,
|
83
|
+
});
|
84
|
+
renderWithAccount({
|
85
|
+
imageId: im.id,
|
86
|
+
alt: "test-loading",
|
87
|
+
});
|
88
|
+
await waitFor(() => {
|
89
|
+
expect(screen.getByAltText("test-loading").src).toBe("blob:test-100");
|
90
|
+
});
|
91
|
+
expect(createObjectURLSpy).toHaveBeenCalledOnce();
|
92
|
+
});
|
93
|
+
});
|
94
|
+
describe("dimensions", () => {
|
95
|
+
it("should render the original image if the width and height are not set", async () => {
|
96
|
+
const im = ImageDefinition.create({
|
97
|
+
original: await createDummyFileStream(100, account),
|
98
|
+
originalSize: [100, 100],
|
99
|
+
progressive: false,
|
100
|
+
}, {
|
101
|
+
owner: account,
|
102
|
+
});
|
103
|
+
const { container } = renderWithAccount({
|
104
|
+
imageId: im.id,
|
105
|
+
alt: "test",
|
106
|
+
});
|
107
|
+
const img = container.querySelector("img");
|
108
|
+
expect(img).toBeDefined();
|
109
|
+
expect(img.getAttribute("width")).toBe(null);
|
110
|
+
expect(img.getAttribute("height")).toBe(null);
|
111
|
+
});
|
112
|
+
it("should render the original sizes", async () => {
|
113
|
+
const im = ImageDefinition.create({
|
114
|
+
original: await createDummyFileStream(100, account),
|
115
|
+
originalSize: [100, 100],
|
116
|
+
progressive: false,
|
117
|
+
}, {
|
118
|
+
owner: account,
|
119
|
+
});
|
120
|
+
const { container } = renderWithAccount({
|
121
|
+
imageId: im.id,
|
122
|
+
alt: "test",
|
123
|
+
width: "original",
|
124
|
+
height: "original",
|
125
|
+
});
|
126
|
+
const img = container.querySelector("img");
|
127
|
+
expect(img).toBeDefined();
|
128
|
+
expect(img.getAttribute("width")).toBe("100");
|
129
|
+
expect(img.getAttribute("height")).toBe("100");
|
130
|
+
});
|
131
|
+
it("should render the original size keeping the aspect ratio", async () => {
|
132
|
+
const im = ImageDefinition.create({
|
133
|
+
original: await createDummyFileStream(100, account),
|
134
|
+
originalSize: [100, 100],
|
135
|
+
progressive: false,
|
136
|
+
}, {
|
137
|
+
owner: account,
|
138
|
+
});
|
139
|
+
const { container } = renderWithAccount({
|
140
|
+
imageId: im.id,
|
141
|
+
alt: "test",
|
142
|
+
width: "original",
|
143
|
+
height: 300,
|
144
|
+
});
|
145
|
+
const img = container.querySelector("img");
|
146
|
+
expect(img).toBeDefined();
|
147
|
+
expect(img.getAttribute("width")).toBe("300");
|
148
|
+
expect(img.getAttribute("height")).toBe("300");
|
149
|
+
});
|
150
|
+
it("should render the width attribute if it is set", async () => {
|
151
|
+
const im = ImageDefinition.create({
|
152
|
+
original: await createDummyFileStream(100, account),
|
153
|
+
originalSize: [100, 100],
|
154
|
+
progressive: false,
|
155
|
+
}, {
|
156
|
+
owner: account,
|
157
|
+
});
|
158
|
+
const { container } = renderWithAccount({
|
159
|
+
imageId: im.id,
|
160
|
+
alt: "test",
|
161
|
+
width: 50,
|
162
|
+
});
|
163
|
+
const img = container.querySelector("img");
|
164
|
+
expect(img).toBeDefined();
|
165
|
+
expect(img.getAttribute("width")).toBe("50");
|
166
|
+
expect(img.getAttribute("height")).toBeNull();
|
167
|
+
});
|
168
|
+
it("should render the height attribute if it is set", async () => {
|
169
|
+
const im = ImageDefinition.create({
|
170
|
+
original: await createDummyFileStream(100, account),
|
171
|
+
originalSize: [100, 100],
|
172
|
+
progressive: false,
|
173
|
+
}, {
|
174
|
+
owner: account,
|
175
|
+
});
|
176
|
+
const { container } = renderWithAccount({
|
177
|
+
imageId: im.id,
|
178
|
+
alt: "test",
|
179
|
+
height: 50,
|
180
|
+
});
|
181
|
+
const img = container.querySelector("img");
|
182
|
+
expect(img).toBeDefined();
|
183
|
+
expect(img.getAttribute("width")).toBeNull();
|
184
|
+
expect(img.getAttribute("height")).toBe("50");
|
185
|
+
});
|
186
|
+
it("should render the class attribute if it is set", async () => {
|
187
|
+
const im = ImageDefinition.create({
|
188
|
+
original: await createDummyFileStream(100, account),
|
189
|
+
originalSize: [100, 100],
|
190
|
+
progressive: false,
|
191
|
+
}, {
|
192
|
+
owner: account,
|
193
|
+
});
|
194
|
+
const { container } = renderWithAccount({
|
195
|
+
imageId: im.id,
|
196
|
+
alt: "test",
|
197
|
+
class: "test-class",
|
198
|
+
});
|
199
|
+
const img = container.querySelector("img");
|
200
|
+
expect(img).toBeDefined();
|
201
|
+
expect(img.classList.contains("test-class")).toBe(true);
|
202
|
+
});
|
203
|
+
});
|
204
|
+
describe("progressive loading", () => {
|
205
|
+
it("should render the resized image if progressive loading is enabled", async () => {
|
206
|
+
const createObjectURLSpy = vi
|
207
|
+
.spyOn(URL, "createObjectURL")
|
208
|
+
.mockImplementation((blob) => {
|
209
|
+
if (!(blob instanceof Blob)) {
|
210
|
+
throw new Error("Blob expected");
|
211
|
+
}
|
212
|
+
return `blob:test-${blob.size}`;
|
213
|
+
});
|
214
|
+
const original = await createDummyFileStream(500, account);
|
215
|
+
const im = ImageDefinition.create({
|
216
|
+
original,
|
217
|
+
originalSize: [500, 500],
|
218
|
+
progressive: true,
|
219
|
+
}, {
|
220
|
+
owner: account,
|
221
|
+
});
|
222
|
+
im["500x500"] = original;
|
223
|
+
im["256x256"] = await createDummyFileStream(256, account);
|
224
|
+
const { container } = renderWithAccount({
|
225
|
+
imageId: im.id,
|
226
|
+
alt: "test-progressive",
|
227
|
+
width: 300,
|
228
|
+
});
|
229
|
+
await waitFor(() => {
|
230
|
+
expect(container.querySelector("img").src).toBe("blob:test-500");
|
231
|
+
});
|
232
|
+
expect(createObjectURLSpy).toHaveBeenCalledOnce();
|
233
|
+
});
|
234
|
+
it("should show the highest resolution images as they are loaded", async () => {
|
235
|
+
const createObjectURLSpy = vi
|
236
|
+
.spyOn(URL, "createObjectURL")
|
237
|
+
.mockImplementation((blob) => {
|
238
|
+
if (!(blob instanceof Blob)) {
|
239
|
+
throw new Error("Blob expected");
|
240
|
+
}
|
241
|
+
return `blob:test-${blob.size}`;
|
242
|
+
});
|
243
|
+
const original = await createDummyFileStream(1920, account);
|
244
|
+
const im = ImageDefinition.create({
|
245
|
+
original,
|
246
|
+
originalSize: [1920, 1080],
|
247
|
+
progressive: true,
|
248
|
+
}, {
|
249
|
+
owner: account,
|
250
|
+
});
|
251
|
+
im["1920x1080"] = original;
|
252
|
+
im["256x256"] = await createDummyFileStream(256, account);
|
253
|
+
const { container } = renderWithAccount({
|
254
|
+
imageId: im.id,
|
255
|
+
alt: "test-progressive",
|
256
|
+
width: 1024,
|
257
|
+
});
|
258
|
+
await waitFor(() => {
|
259
|
+
expect(container.querySelector("img").src).toBe("blob:test-1920");
|
260
|
+
});
|
261
|
+
expect(createObjectURLSpy).toHaveBeenCalledTimes(1);
|
262
|
+
// Load higher resolution image
|
263
|
+
im["1024x1024"] = await createDummyFileStream(1024, account);
|
264
|
+
await waitFor(() => {
|
265
|
+
expect(container.querySelector("img").src).toBe("blob:test-1024");
|
266
|
+
});
|
267
|
+
expect(createObjectURLSpy).toHaveBeenCalledTimes(2);
|
268
|
+
});
|
269
|
+
it("should show the best loaded resolution if width is set", async () => {
|
270
|
+
const createObjectURLSpy = vi
|
271
|
+
.spyOn(URL, "createObjectURL")
|
272
|
+
.mockImplementation((blob) => {
|
273
|
+
if (!(blob instanceof Blob)) {
|
274
|
+
throw new Error("Blob expected");
|
275
|
+
}
|
276
|
+
return `blob:test-${blob.size}`;
|
277
|
+
});
|
278
|
+
const original = await FileStream.createFromBlob(createDummyBlob(1), {
|
279
|
+
owner: account,
|
280
|
+
});
|
281
|
+
const im = ImageDefinition.create({
|
282
|
+
original,
|
283
|
+
originalSize: [100, 100],
|
284
|
+
progressive: true,
|
285
|
+
}, {
|
286
|
+
owner: account,
|
287
|
+
});
|
288
|
+
im["100x100"] = original;
|
289
|
+
im["256x256"] = await createDummyFileStream(256, account);
|
290
|
+
im["1024x1024"] = await createDummyFileStream(1024, account);
|
291
|
+
const { container } = renderWithAccount({
|
292
|
+
imageId: im.id,
|
293
|
+
alt: "test-progressive",
|
294
|
+
width: 256,
|
295
|
+
});
|
296
|
+
await waitFor(() => {
|
297
|
+
expect(container.querySelector("img").src).toBe("blob:test-256");
|
298
|
+
});
|
299
|
+
expect(createObjectURLSpy).toHaveBeenCalledTimes(1);
|
300
|
+
});
|
301
|
+
it("should show the original image if asked resolution matches", async () => {
|
302
|
+
const createObjectURLSpy = vi
|
303
|
+
.spyOn(URL, "createObjectURL")
|
304
|
+
.mockImplementation((blob) => {
|
305
|
+
if (!(blob instanceof Blob)) {
|
306
|
+
throw new Error("Blob expected");
|
307
|
+
}
|
308
|
+
return `blob:test-${blob.size}`;
|
309
|
+
});
|
310
|
+
const original = await createDummyFileStream(100, account);
|
311
|
+
const im = ImageDefinition.create({
|
312
|
+
original,
|
313
|
+
originalSize: [100, 100],
|
314
|
+
progressive: true,
|
315
|
+
}, {
|
316
|
+
owner: account,
|
317
|
+
});
|
318
|
+
im["100x100"] = original;
|
319
|
+
im["256x256"] = await createDummyFileStream(256, account);
|
320
|
+
const { container } = renderWithAccount({
|
321
|
+
imageId: im.id,
|
322
|
+
alt: "test-progressive",
|
323
|
+
width: 100,
|
324
|
+
});
|
325
|
+
await waitFor(() => {
|
326
|
+
expect(container.querySelector("img").src).toBe("blob:test-100");
|
327
|
+
});
|
328
|
+
expect(createObjectURLSpy).toHaveBeenCalledTimes(1);
|
329
|
+
});
|
330
|
+
it("should update to a higher resolution image when width/height props are changed at runtime", async () => {
|
331
|
+
const createObjectURLSpy = vi
|
332
|
+
.spyOn(URL, "createObjectURL")
|
333
|
+
.mockImplementation((blob) => {
|
334
|
+
if (!(blob instanceof Blob)) {
|
335
|
+
throw new Error("Blob expected");
|
336
|
+
}
|
337
|
+
return `blob:test-${blob.size}`;
|
338
|
+
});
|
339
|
+
const original = await createDummyFileStream(256, account);
|
340
|
+
const im = ImageDefinition.create({
|
341
|
+
original,
|
342
|
+
originalSize: [256, 256],
|
343
|
+
progressive: true,
|
344
|
+
}, {
|
345
|
+
owner: account,
|
346
|
+
});
|
347
|
+
im["256x256"] = original;
|
348
|
+
im["1024x1024"] = await createDummyFileStream(1024, account);
|
349
|
+
const { container, rerender } = renderWithAccount({
|
350
|
+
imageId: im.id,
|
351
|
+
alt: "test-dynamic",
|
352
|
+
width: 256,
|
353
|
+
height: 256,
|
354
|
+
});
|
355
|
+
// Initially, should load 256x256
|
356
|
+
await waitFor(() => {
|
357
|
+
expect(container.querySelector("img").src).toBe("blob:test-256");
|
358
|
+
});
|
359
|
+
expect(createObjectURLSpy).toHaveBeenCalledTimes(1);
|
360
|
+
rerender({
|
361
|
+
imageId: im.id,
|
362
|
+
alt: "test-dynamic",
|
363
|
+
width: 1024,
|
364
|
+
height: 1024,
|
365
|
+
});
|
366
|
+
// After prop change, should load 1024x1024
|
367
|
+
await waitFor(() => {
|
368
|
+
expect(container.querySelector("img").src).toBe("blob:test-1024");
|
369
|
+
});
|
370
|
+
expect(createObjectURLSpy).toHaveBeenCalledTimes(2);
|
371
|
+
});
|
372
|
+
});
|
373
|
+
describe("lazy loading", () => {
|
374
|
+
it("should return an empty png if loading is lazy and placeholder is not set", async () => {
|
375
|
+
const im = ImageDefinition.create({
|
376
|
+
original: await createDummyFileStream(100, account),
|
377
|
+
originalSize: [100, 100],
|
378
|
+
progressive: false,
|
379
|
+
}, {
|
380
|
+
owner: account,
|
381
|
+
});
|
382
|
+
const { container } = renderWithAccount({
|
383
|
+
imageId: im.id,
|
384
|
+
alt: "test",
|
385
|
+
loading: "lazy",
|
386
|
+
});
|
387
|
+
const img = container.querySelector("img");
|
388
|
+
expect(img).toBeDefined();
|
389
|
+
expect(img.src).toBe("blob:test-70");
|
390
|
+
});
|
391
|
+
it("should load the image when threshold is reached", async () => {
|
392
|
+
const createObjectURLSpy = vi
|
393
|
+
.spyOn(URL, "createObjectURL")
|
394
|
+
.mockImplementation((blob) => {
|
395
|
+
if (!(blob instanceof Blob)) {
|
396
|
+
throw new Error("Blob expected");
|
397
|
+
}
|
398
|
+
return `blob:test-${blob.size}`;
|
399
|
+
});
|
400
|
+
const im = ImageDefinition.create({
|
401
|
+
original: await createDummyFileStream(100, account),
|
402
|
+
originalSize: [100, 100],
|
403
|
+
progressive: false,
|
404
|
+
}, {
|
405
|
+
owner: account,
|
406
|
+
});
|
407
|
+
const { container } = renderWithAccount({
|
408
|
+
imageId: im.id,
|
409
|
+
alt: "test",
|
410
|
+
loading: "lazy",
|
411
|
+
});
|
412
|
+
const img = container.querySelector("img");
|
413
|
+
// simulate the load event when the browser's viewport reach the image
|
414
|
+
img.dispatchEvent(new Event("load"));
|
415
|
+
await waitFor(() => {
|
416
|
+
expect(container.querySelector("img").src).toBe("blob:test-100");
|
417
|
+
});
|
418
|
+
expect(createObjectURLSpy).toHaveBeenCalledTimes(2);
|
419
|
+
});
|
420
|
+
});
|
421
|
+
});
|
422
|
+
function createDummyBlob(size) {
|
423
|
+
const blob = new Blob([new Uint8Array(size)], { type: "image/png" });
|
424
|
+
return blob;
|
425
|
+
}
|
426
|
+
function createDummyFileStream(size, account) {
|
427
|
+
return FileStream.createFromBlob(createDummyBlob(size), {
|
428
|
+
owner: account,
|
429
|
+
});
|
430
|
+
}
|
@@ -0,0 +1,11 @@
|
|
1
|
+
import { Account, AnonymousJazzAgent } from "jazz-tools";
|
2
|
+
import { Component, ComponentProps } from "svelte";
|
3
|
+
type JazzExtendedOptions = {
|
4
|
+
account: Account | {
|
5
|
+
guest: AnonymousJazzAgent;
|
6
|
+
};
|
7
|
+
};
|
8
|
+
declare const render: <T extends Component>(component: T, props: ComponentProps<T>, jazzOptions: JazzExtendedOptions) => import("@testing-library/svelte").RenderResult<T, typeof import("@testing-library/dom/types/queries")>;
|
9
|
+
export * from "@testing-library/svelte";
|
10
|
+
export { render };
|
11
|
+
//# sourceMappingURL=testUtils.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"testUtils.d.ts","sourceRoot":"","sources":["../../../../src/svelte/tests/testUtils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAEzD,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC;AAGnD,KAAK,mBAAmB,GAAG;IACzB,OAAO,EAAE,OAAO,GAAG;QAAE,KAAK,EAAE,kBAAkB,CAAA;KAAE,CAAC;CAClD,CAAC;AAEF,QAAA,MAAM,MAAM,GAAI,CAAC,SAAS,SAAS,aACtB,CAAC,SACL,cAAc,CAAC,CAAC,CAAC,eACX,mBAAmB,2GAejC,CAAC;AAEF,cAAc,yBAAyB,CAAC;AAExC,OAAO,EAAE,MAAM,EAAE,CAAC"}
|
@@ -0,0 +1,17 @@
|
|
1
|
+
import { render as renderSvelte } from "@testing-library/svelte";
|
2
|
+
import { TestJazzContextManager } from "jazz-tools/testing";
|
3
|
+
import { JAZZ_AUTH_CTX, JAZZ_CTX } from "../jazz.svelte";
|
4
|
+
const render = (component, props, jazzOptions) => {
|
5
|
+
const ctx = TestJazzContextManager.fromAccountOrGuest(jazzOptions.account);
|
6
|
+
return renderSvelte(
|
7
|
+
// @ts-expect-error Svelte new Component type is not compatible with @testing-library/svelte
|
8
|
+
component, {
|
9
|
+
props,
|
10
|
+
context: new Map([
|
11
|
+
[JAZZ_CTX, { current: ctx.getCurrentValue() }],
|
12
|
+
[JAZZ_AUTH_CTX, ctx.getAuthSecretStorage()],
|
13
|
+
]),
|
14
|
+
});
|
15
|
+
};
|
16
|
+
export * from "@testing-library/svelte";
|
17
|
+
export { render };
|
package/dist/testing.js
CHANGED
package/dist/testing.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"sources":["../src/tools/testing.ts"],"sourcesContent":["import { LocalNode } from \"cojson\";\nimport { cojsonInternals } from \"cojson\";\nimport { PureJSCrypto } from \"cojson/dist/crypto/PureJSCrypto\";\nimport {\n Account,\n AccountClass,\n type AnonymousJazzAgent,\n AuthCredentials,\n CoValueFromRaw,\n CoreAccountSchema,\n InstanceOfSchema,\n JazzContextManager,\n JazzContextManagerAuthProps,\n JazzContextManagerBaseProps,\n activeAccountContext,\n coValueClassFromCoValueClassOrSchema,\n createAnonymousJazzContext,\n createJazzContext,\n randomSessionProvider,\n} from \"./internal.js\";\n\nconst syncServer: { current: LocalNode | null; asyncPeers: boolean } = {\n current: null,\n asyncPeers: false,\n};\n\nexport class TestJSCrypto extends PureJSCrypto {\n static async create() {\n if (\"navigator\" in globalThis && navigator.userAgent?.includes(\"jsdom\")) {\n // Mocking crypto seal & encrypt to make it work with JSDom. Getting \"Error: Uint8Array expected\" there\n const crypto = new PureJSCrypto();\n\n crypto.seal = (options) =>\n `sealed_U${cojsonInternals.stableStringify(options.message)}` as any;\n crypto.unseal = (sealed) =>\n JSON.parse(sealed.substring(\"sealed_U\".length));\n crypto.encrypt = (message) =>\n `encrypted_U${cojsonInternals.stableStringify(message)}` as any;\n crypto.decryptRaw = (encrypted) =>\n encrypted.substring(\"encrypted_U\".length) as any;\n\n return crypto;\n }\n\n // For non-jsdom environments, we use the real crypto\n return new PureJSCrypto();\n }\n}\n\nexport function getPeerConnectedToTestSyncServer() {\n if (!syncServer.current) {\n throw new Error(\"Sync server not initialized\");\n }\n\n const [aPeer, bPeer] = cojsonInternals.connectedPeers(\n Math.random().toString(),\n Math.random().toString(),\n {\n peer1role: \"server\",\n peer2role: \"server\",\n },\n );\n\n if (syncServer.asyncPeers) {\n const push = aPeer.outgoing.push;\n\n aPeer.outgoing.push = (message) => {\n setTimeout(() => {\n push.call(aPeer.outgoing, message);\n });\n };\n\n bPeer.outgoing.push = (message) => {\n setTimeout(() => {\n push.call(bPeer.outgoing, message);\n });\n };\n }\n\n syncServer.current.syncManager.addPeer(aPeer);\n\n return bPeer;\n}\n\nconst SecretSeedMap = new Map<string, Uint8Array>();\nlet isMigrationActive = false;\n\nexport async function createJazzTestAccount<\n S extends\n | (AccountClass<Account> & CoValueFromRaw<Account>)\n | CoreAccountSchema,\n>(options?: {\n isCurrentActiveAccount?: boolean;\n AccountSchema?: S;\n creationProps?: Record<string, unknown>;\n}): Promise<InstanceOfSchema<S>> {\n const AccountClass = options?.AccountSchema\n ? coValueClassFromCoValueClassOrSchema(options.AccountSchema)\n : Account;\n const peers = [];\n if (syncServer.current) {\n peers.push(getPeerConnectedToTestSyncServer());\n }\n\n const crypto = await TestJSCrypto.create();\n const secretSeed = crypto.newRandomSecretSeed();\n\n const { node } = await LocalNode.withNewlyCreatedAccount({\n creationProps: {\n name: \"Test Account\",\n ...options?.creationProps,\n },\n initialAgentSecret: crypto.agentSecretFromSecretSeed(secretSeed),\n crypto,\n peersToLoadFrom: peers,\n migration: async (rawAccount, _node, creationProps) => {\n if (isMigrationActive) {\n throw new Error(\n \"It is not possible to create multiple accounts in parallel inside the test environment.\",\n );\n }\n\n isMigrationActive = true;\n\n // @ts-expect-error - AccountClass doesn't infer the fromRaw static method\n const account = AccountClass.fromRaw(rawAccount) as InstanceOfSchema<S>;\n\n // We need to set the account as current because the migration\n // will probably rely on the global me\n const prevActiveAccount = activeAccountContext.maybeGet();\n activeAccountContext.set(account);\n\n await account.applyMigration?.(creationProps);\n\n if (!options?.isCurrentActiveAccount) {\n activeAccountContext.set(prevActiveAccount);\n }\n\n isMigrationActive = false;\n },\n });\n\n const account = AccountClass.fromNode(node);\n SecretSeedMap.set(account.id, secretSeed);\n\n if (options?.isCurrentActiveAccount) {\n activeAccountContext.set(account);\n }\n\n return account as InstanceOfSchema<S>;\n}\n\nexport function setActiveAccount(account: Account) {\n activeAccountContext.set(account);\n}\n\nexport async function createJazzTestGuest() {\n const ctx = await createAnonymousJazzContext({\n crypto: await PureJSCrypto.create(),\n peersToLoadFrom: [],\n });\n\n return {\n guest: ctx.agent,\n };\n}\n\nexport type TestJazzContextManagerProps<Acc extends Account> =\n JazzContextManagerBaseProps<Acc> & {\n defaultProfileName?: string;\n AccountSchema?: AccountClass<Acc> & CoValueFromRaw<Acc>;\n isAuthenticated?: boolean;\n };\n\nexport class TestJazzContextManager<\n Acc extends Account,\n> extends JazzContextManager<Acc, TestJazzContextManagerProps<Acc>> {\n static fromAccountOrGuest<Acc extends Account>(\n account?: Acc | { guest: AnonymousJazzAgent },\n props?: TestJazzContextManagerProps<Acc>,\n ) {\n if (account && \"guest\" in account) {\n return this.fromGuest<Acc>(account, props);\n }\n\n return this.fromAccount<Acc>(account ?? (Account.getMe() as Acc), props);\n }\n\n static fromAccount<Acc extends Account>(\n account: Acc,\n props?: TestJazzContextManagerProps<Acc>,\n ) {\n const context = new TestJazzContextManager<Acc>();\n\n const provider = props?.isAuthenticated ? \"testProvider\" : \"anonymous\";\n const storage = context.getAuthSecretStorage();\n const node = account._raw.core.node;\n\n const credentials = {\n accountID: account.id,\n accountSecret: node.getCurrentAgent().agentSecret,\n secretSeed: SecretSeedMap.get(account.id),\n provider,\n } satisfies AuthCredentials;\n\n storage.set(credentials);\n\n context.updateContext(\n {\n AccountSchema: account.constructor as AccountClass<Acc> &\n CoValueFromRaw<Acc>,\n ...props,\n },\n {\n me: account,\n node,\n done: () => {\n node.gracefulShutdown();\n },\n logOut: async () => {\n await storage.clear();\n node.gracefulShutdown();\n },\n },\n {\n credentials,\n },\n );\n\n return context;\n }\n\n static fromGuest<Acc extends Account>(\n { guest }: { guest: AnonymousJazzAgent },\n props: TestJazzContextManagerProps<Acc> = {},\n ) {\n const context = new TestJazzContextManager<Acc>();\n const node = guest.node;\n\n context.updateContext(props, {\n guest,\n node,\n done: () => {\n node.gracefulShutdown();\n },\n logOut: async () => {\n node.gracefulShutdown();\n },\n });\n\n return context;\n }\n\n async getNewContext(\n props: TestJazzContextManagerProps<Acc>,\n authProps?: JazzContextManagerAuthProps,\n ) {\n if (!syncServer.current) {\n throw new Error(\n \"You need to setup a test sync server with setupJazzTestSync to use the Auth functions\",\n );\n }\n\n const context = await createJazzContext({\n credentials: authProps?.credentials,\n defaultProfileName: props.defaultProfileName,\n newAccountProps: authProps?.newAccountProps,\n peersToLoadFrom: [getPeerConnectedToTestSyncServer()],\n crypto: await TestJSCrypto.create(),\n sessionProvider: randomSessionProvider,\n authSecretStorage: this.getAuthSecretStorage(),\n AccountSchema: props.AccountSchema,\n });\n\n return {\n me: context.account,\n node: context.node,\n done: () => {\n context.done();\n },\n logOut: () => {\n return context.logOut();\n },\n };\n }\n}\n\nexport async function linkAccounts(\n a: Account,\n b: Account,\n aRole: \"server\" | \"client\" = \"server\",\n bRole: \"server\" | \"client\" = \"server\",\n) {\n const [aPeer, bPeer] = cojsonInternals.connectedPeers(b.id, a.id, {\n peer1role: aRole,\n peer2role: bRole,\n });\n\n a._raw.core.node.syncManager.addPeer(aPeer);\n b._raw.core.node.syncManager.addPeer(bPeer);\n\n await a.waitForAllCoValuesSync();\n await b.waitForAllCoValuesSync();\n}\n\nexport async function setupJazzTestSync({\n asyncPeers = false,\n}: { asyncPeers?: boolean } = {}) {\n if (syncServer.current) {\n syncServer.current.gracefulShutdown();\n }\n\n const account = await Account.create({\n creationProps: {\n name: \"Test Account\",\n },\n crypto: await TestJSCrypto.create(),\n });\n\n syncServer.current = account._raw.core.node;\n syncServer.asyncPeers = asyncPeers;\n\n return account;\n}\n"],"mappings":"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","names":["AccountClass","account"]}
|
1
|
+
{"version":3,"sources":["../src/tools/testing.ts"],"sourcesContent":["import { LocalNode } from \"cojson\";\nimport { cojsonInternals } from \"cojson\";\nimport { PureJSCrypto } from \"cojson/dist/crypto/PureJSCrypto\";\nimport {\n Account,\n AccountClass,\n type AnonymousJazzAgent,\n AuthCredentials,\n CoValueFromRaw,\n CoreAccountSchema,\n InstanceOfSchema,\n JazzContextManager,\n JazzContextManagerAuthProps,\n JazzContextManagerBaseProps,\n activeAccountContext,\n coValueClassFromCoValueClassOrSchema,\n createAnonymousJazzContext,\n createJazzContext,\n randomSessionProvider,\n} from \"./internal.js\";\n\nconst syncServer: { current: LocalNode | null; asyncPeers: boolean } = {\n current: null,\n asyncPeers: false,\n};\n\nexport class TestJSCrypto extends PureJSCrypto {\n static async create() {\n if (\"navigator\" in globalThis && navigator.userAgent?.includes(\"jsdom\")) {\n // Mocking crypto seal & encrypt to make it work with JSDom. Getting \"Error: Uint8Array expected\" there\n const crypto = new PureJSCrypto();\n\n crypto.seal = (options) =>\n `sealed_U${cojsonInternals.stableStringify(options.message)}` as any;\n crypto.unseal = (sealed) =>\n JSON.parse(sealed.substring(\"sealed_U\".length));\n crypto.encrypt = (message) =>\n `encrypted_U${cojsonInternals.stableStringify(message)}` as any;\n crypto.decryptRaw = (encrypted) =>\n encrypted.substring(\"encrypted_U\".length) as any;\n\n return crypto;\n }\n\n // For non-jsdom environments, we use the real crypto\n return new PureJSCrypto();\n }\n}\n\nexport function getPeerConnectedToTestSyncServer() {\n if (!syncServer.current) {\n throw new Error(\"Sync server not initialized\");\n }\n\n const [aPeer, bPeer] = cojsonInternals.connectedPeers(\n Math.random().toString(),\n Math.random().toString(),\n {\n peer1role: \"server\",\n peer2role: \"server\",\n },\n );\n\n if (syncServer.asyncPeers) {\n const push = aPeer.outgoing.push;\n\n aPeer.outgoing.push = (message) => {\n setTimeout(() => {\n push.call(aPeer.outgoing, message);\n });\n };\n\n bPeer.outgoing.push = (message) => {\n setTimeout(() => {\n push.call(bPeer.outgoing, message);\n });\n };\n }\n\n syncServer.current.syncManager.addPeer(aPeer);\n\n return bPeer;\n}\n\nconst SecretSeedMap = new Map<string, Uint8Array>();\nlet isMigrationActive = false;\n\nexport async function createJazzTestAccount<\n S extends\n | (AccountClass<Account> & CoValueFromRaw<Account>)\n | CoreAccountSchema,\n>(options?: {\n isCurrentActiveAccount?: boolean;\n AccountSchema?: S;\n creationProps?: Record<string, unknown>;\n}): Promise<InstanceOfSchema<S>> {\n const AccountClass = options?.AccountSchema\n ? coValueClassFromCoValueClassOrSchema(options.AccountSchema)\n : Account;\n const peers = [];\n if (syncServer.current) {\n peers.push(getPeerConnectedToTestSyncServer());\n }\n\n const crypto = await TestJSCrypto.create();\n const secretSeed = crypto.newRandomSecretSeed();\n\n const { node } = await LocalNode.withNewlyCreatedAccount({\n creationProps: {\n name: \"Test Account\",\n ...options?.creationProps,\n },\n initialAgentSecret: crypto.agentSecretFromSecretSeed(secretSeed),\n crypto,\n peersToLoadFrom: peers,\n migration: async (rawAccount, _node, creationProps) => {\n if (isMigrationActive) {\n throw new Error(\n \"It is not possible to create multiple accounts in parallel inside the test environment.\",\n );\n }\n\n isMigrationActive = true;\n\n // @ts-expect-error - AccountClass doesn't infer the fromRaw static method\n const account = AccountClass.fromRaw(rawAccount) as InstanceOfSchema<S>;\n\n // We need to set the account as current because the migration\n // will probably rely on the global me\n const prevActiveAccount = activeAccountContext.maybeGet();\n activeAccountContext.set(account);\n\n await account.applyMigration?.(creationProps);\n\n if (!options?.isCurrentActiveAccount) {\n activeAccountContext.set(prevActiveAccount);\n }\n\n isMigrationActive = false;\n },\n });\n\n const account = AccountClass.fromNode(node);\n SecretSeedMap.set(account.id, secretSeed);\n\n if (options?.isCurrentActiveAccount) {\n activeAccountContext.set(account);\n }\n\n return account as InstanceOfSchema<S>;\n}\n\nexport function setActiveAccount(account: Account) {\n activeAccountContext.set(account);\n}\n\nexport async function createJazzTestGuest() {\n const ctx = await createAnonymousJazzContext({\n crypto: await PureJSCrypto.create(),\n peersToLoadFrom: [],\n });\n\n return {\n guest: ctx.agent,\n };\n}\n\nexport type TestJazzContextManagerProps<Acc extends Account> =\n JazzContextManagerBaseProps<Acc> & {\n defaultProfileName?: string;\n AccountSchema?: AccountClass<Acc> & CoValueFromRaw<Acc>;\n isAuthenticated?: boolean;\n };\n\nexport class TestJazzContextManager<\n Acc extends Account,\n> extends JazzContextManager<Acc, TestJazzContextManagerProps<Acc>> {\n static fromAccountOrGuest<Acc extends Account>(\n account?: Acc | { guest: AnonymousJazzAgent },\n props?: TestJazzContextManagerProps<Acc>,\n ) {\n if (account && \"guest\" in account) {\n return this.fromGuest<Acc>(account, props);\n }\n\n return this.fromAccount<Acc>(account ?? (Account.getMe() as Acc), props);\n }\n\n static fromAccount<Acc extends Account>(\n account: Acc,\n props?: TestJazzContextManagerProps<Acc>,\n ) {\n const context = new TestJazzContextManager<Acc>();\n\n const provider = props?.isAuthenticated ? \"testProvider\" : \"anonymous\";\n const storage = context.getAuthSecretStorage();\n const node = account._raw.core.node;\n\n const credentials = {\n accountID: account.id,\n accountSecret: node.getCurrentAgent().agentSecret,\n secretSeed: SecretSeedMap.get(account.id),\n provider,\n } satisfies AuthCredentials;\n\n storage.set(credentials);\n\n context.updateContext(\n {\n AccountSchema: account.constructor as AccountClass<Acc> &\n CoValueFromRaw<Acc>,\n ...props,\n },\n {\n me: account,\n node,\n done: () => {\n node.gracefulShutdown();\n },\n logOut: async () => {\n await storage.clear();\n node.gracefulShutdown();\n },\n },\n {\n credentials,\n },\n );\n\n return context;\n }\n\n static fromGuest<Acc extends Account>(\n { guest }: { guest: AnonymousJazzAgent },\n props: TestJazzContextManagerProps<Acc> = {},\n ) {\n const context = new TestJazzContextManager<Acc>();\n const node = guest.node;\n\n context.updateContext(props, {\n guest,\n node,\n done: () => {\n node.gracefulShutdown();\n },\n logOut: async () => {\n node.gracefulShutdown();\n },\n });\n\n return context;\n }\n\n async getNewContext(\n props: TestJazzContextManagerProps<Acc>,\n authProps?: JazzContextManagerAuthProps,\n ) {\n if (!syncServer.current) {\n throw new Error(\n \"You need to setup a test sync server with setupJazzTestSync to use the Auth functions\",\n );\n }\n\n const context = await createJazzContext({\n credentials: authProps?.credentials,\n defaultProfileName: props.defaultProfileName,\n newAccountProps: authProps?.newAccountProps,\n peersToLoadFrom: [getPeerConnectedToTestSyncServer()],\n crypto: await TestJSCrypto.create(),\n sessionProvider: randomSessionProvider,\n authSecretStorage: this.getAuthSecretStorage(),\n AccountSchema: props.AccountSchema,\n });\n\n return {\n me: context.account,\n node: context.node,\n done: () => {\n context.done();\n },\n logOut: () => {\n return context.logOut();\n },\n };\n }\n}\n\nexport async function linkAccounts(\n a: Account,\n b: Account,\n aRole: \"server\" | \"client\" = \"server\",\n bRole: \"server\" | \"client\" = \"server\",\n) {\n const [aPeer, bPeer] = cojsonInternals.connectedPeers(b.id, a.id, {\n peer1role: aRole,\n peer2role: bRole,\n });\n\n a._raw.core.node.syncManager.addPeer(aPeer);\n b._raw.core.node.syncManager.addPeer(bPeer);\n\n await a.waitForAllCoValuesSync();\n await b.waitForAllCoValuesSync();\n}\n\nexport async function setupJazzTestSync({\n asyncPeers = false,\n}: {\n asyncPeers?: boolean;\n} = {}) {\n if (syncServer.current) {\n syncServer.current.gracefulShutdown();\n }\n\n const account = await Account.create({\n creationProps: {\n name: \"Test Account\",\n },\n crypto: await TestJSCrypto.create(),\n });\n\n syncServer.current = account._raw.core.node;\n syncServer.asyncPeers = asyncPeers;\n\n return account;\n}\n"],"mappings":"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","names":["AccountClass","account"]}
|
@@ -323,6 +323,21 @@ export declare class FileStream extends CoValueBase implements CoValue {
|
|
323
323
|
owner?: Group | Account;
|
324
324
|
onProgress?: (progress: number) => void;
|
325
325
|
} | Account | Group): Promise<FileStream>;
|
326
|
+
/**
|
327
|
+
* Create a `FileStream` from a `Blob` or `File`
|
328
|
+
*
|
329
|
+
* @example
|
330
|
+
* ```ts
|
331
|
+
* import { coField, FileStream } from "jazz-tools";
|
332
|
+
*
|
333
|
+
* const fileStream = await FileStream.createFromBlob(file, {owner: group})
|
334
|
+
* ```
|
335
|
+
* @category Content
|
336
|
+
*/
|
337
|
+
static createFromArrayBuffer(arrayBuffer: ArrayBuffer, mimeType: string, fileName: string | undefined, options?: {
|
338
|
+
owner?: Group | Account;
|
339
|
+
onProgress?: (progress: number) => void;
|
340
|
+
} | Account | Group): Promise<FileStream>;
|
326
341
|
/**
|
327
342
|
* Get a JSON representation of the `FileStream`
|
328
343
|
* @category Content
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"coFeed.d.ts","sourceRoot":"","sources":["../../../src/tools/coValues/coFeed.ts"],"names":[],"mappings":"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
|
1
|
+
{"version":3,"file":"coFeed.d.ts","sourceRoot":"","sources":["../../../src/tools/coValues/coFeed.ts"],"names":[],"mappings":"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"}
|