jazz-tools 0.19.20 → 0.19.22

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 (105) hide show
  1. package/.svelte-kit/__package__/server.d.ts.map +1 -1
  2. package/.svelte-kit/__package__/server.js +9 -7
  3. package/.turbo/turbo-build.log +56 -56
  4. package/CHANGELOG.md +15 -0
  5. package/dist/better-auth/auth/server.d.ts.map +1 -1
  6. package/dist/better-auth/auth/server.js +4 -4
  7. package/dist/better-auth/auth/server.js.map +1 -1
  8. package/dist/better-auth/database-adapter/index.js.map +1 -1
  9. package/dist/better-auth/database-adapter/repository/generic.d.ts +3 -3
  10. package/dist/better-auth/database-adapter/repository/session.d.ts +2 -2
  11. package/dist/better-auth/database-adapter/schema.d.ts +3 -3
  12. package/dist/better-auth/database-adapter/schema.d.ts.map +1 -1
  13. package/dist/{chunk-MI24YFCY.js → chunk-QCTQH5RS.js} +1 -1
  14. package/dist/chunk-QCTQH5RS.js.map +1 -0
  15. package/dist/index.js +36 -1
  16. package/dist/index.js.map +1 -1
  17. package/dist/media/{chunk-3LKBM3G3.js → chunk-IRL3KNPO.js} +2 -2
  18. package/dist/media/{chunk-3LKBM3G3.js.map → chunk-IRL3KNPO.js.map} +1 -1
  19. package/dist/media/create-image/react-native.d.ts +1 -1
  20. package/dist/media/create-image/react-native.d.ts.map +1 -1
  21. package/dist/media/index.browser.js +1 -1
  22. package/dist/media/index.js +1 -1
  23. package/dist/media/index.native.js +5 -5
  24. package/dist/media/index.native.js.map +1 -1
  25. package/dist/media/index.server.js +1 -1
  26. package/dist/react/hooks.d.ts +1 -2
  27. package/dist/react/hooks.d.ts.map +1 -1
  28. package/dist/react/index.js +7 -2
  29. package/dist/react/index.js.map +1 -1
  30. package/dist/react-core/hooks.d.ts +92 -1
  31. package/dist/react-core/hooks.d.ts.map +1 -1
  32. package/dist/react-core/index.js +126 -57
  33. package/dist/react-core/index.js.map +1 -1
  34. package/dist/react-core/tests/useCoStates.test.d.ts +2 -0
  35. package/dist/react-core/tests/useCoStates.test.d.ts.map +1 -0
  36. package/dist/react-native/index.js +4 -0
  37. package/dist/react-native/index.js.map +1 -1
  38. package/dist/react-native-core/hooks.d.ts +1 -1
  39. package/dist/react-native-core/hooks.d.ts.map +1 -1
  40. package/dist/react-native-core/index.js +4 -0
  41. package/dist/react-native-core/index.js.map +1 -1
  42. package/dist/svelte/auth/ClerkAuth.svelte.d.ts +38 -0
  43. package/dist/svelte/auth/ClerkAuth.svelte.d.ts.map +1 -0
  44. package/dist/svelte/auth/ClerkAuth.svelte.js +47 -0
  45. package/dist/svelte/auth/JazzSvelteProviderWithClerk.svelte +156 -0
  46. package/dist/svelte/auth/JazzSvelteProviderWithClerk.svelte.d.ts +67 -0
  47. package/dist/svelte/auth/JazzSvelteProviderWithClerk.svelte.d.ts.map +1 -0
  48. package/dist/svelte/auth/RegisterClerkAuth.svelte +27 -0
  49. package/dist/svelte/auth/RegisterClerkAuth.svelte.d.ts +17 -0
  50. package/dist/svelte/auth/RegisterClerkAuth.svelte.d.ts.map +1 -0
  51. package/dist/svelte/auth/index.d.ts +2 -0
  52. package/dist/svelte/auth/index.d.ts.map +1 -1
  53. package/dist/svelte/auth/index.js +2 -0
  54. package/dist/svelte/tests/ClerkAuth.svelte.test.d.ts +2 -0
  55. package/dist/svelte/tests/ClerkAuth.svelte.test.d.ts.map +1 -0
  56. package/dist/svelte/tests/ClerkAuth.svelte.test.js +202 -0
  57. package/dist/svelte/tests/TestClerkAuthWrapper.svelte +16 -0
  58. package/dist/svelte/tests/TestClerkAuthWrapper.svelte.d.ts +8 -0
  59. package/dist/svelte/tests/TestClerkAuthWrapper.svelte.d.ts.map +1 -0
  60. package/dist/svelte/tests/testUtils.d.ts +1 -0
  61. package/dist/svelte/tests/testUtils.d.ts.map +1 -1
  62. package/dist/svelte/tests/testUtils.js +3 -1
  63. package/dist/testing.js +1 -1
  64. package/dist/tools/auth/clerk/index.d.ts +1 -1
  65. package/dist/tools/auth/clerk/types.d.ts +1 -1
  66. package/dist/tools/auth/clerk/types.d.ts.map +1 -1
  67. package/dist/tools/exports.d.ts +1 -0
  68. package/dist/tools/exports.d.ts.map +1 -1
  69. package/dist/tools/subscribe/types.d.ts +1 -1
  70. package/dist/tools/subscribe/types.d.ts.map +1 -1
  71. package/dist/worker/JazzMessageChannel.d.ts +36 -0
  72. package/dist/worker/JazzMessageChannel.d.ts.map +1 -0
  73. package/dist/worker/index.d.ts +7 -1
  74. package/dist/worker/index.d.ts.map +1 -1
  75. package/dist/worker/index.js +28 -17
  76. package/dist/worker/index.js.map +1 -1
  77. package/package.json +4 -4
  78. package/src/better-auth/auth/server.ts +9 -7
  79. package/src/better-auth/database-adapter/repository/generic.ts +3 -3
  80. package/src/better-auth/database-adapter/repository/session.ts +2 -2
  81. package/src/better-auth/database-adapter/schema.ts +5 -5
  82. package/src/media/create-image/react-native.ts +9 -7
  83. package/src/media/create-image-factory.test.ts +1 -1
  84. package/src/media/create-image-factory.ts +1 -1
  85. package/src/react/hooks.tsx +4 -2
  86. package/src/react-core/hooks.ts +321 -76
  87. package/src/react-core/tests/testUtils.tsx +2 -2
  88. package/src/react-core/tests/useCoState.selector.test.ts +309 -22
  89. package/src/react-core/tests/useCoStates.test.tsx +414 -0
  90. package/src/react-native-core/hooks.tsx +2 -0
  91. package/src/svelte/auth/ClerkAuth.svelte.ts +67 -0
  92. package/src/svelte/auth/JazzSvelteProviderWithClerk.svelte +156 -0
  93. package/src/svelte/auth/RegisterClerkAuth.svelte +27 -0
  94. package/src/svelte/auth/index.ts +2 -0
  95. package/src/svelte/tests/ClerkAuth.svelte.test.ts +305 -0
  96. package/src/svelte/tests/TestClerkAuthWrapper.svelte +16 -0
  97. package/src/svelte/tests/testUtils.ts +4 -1
  98. package/src/tools/auth/clerk/types.ts +1 -1
  99. package/src/tools/exports.ts +5 -0
  100. package/src/tools/subscribe/types.ts +1 -1
  101. package/src/tools/tests/inbox.test.ts +7 -7
  102. package/src/tools/tests/testStorage.ts +2 -2
  103. package/src/worker/JazzMessageChannel.ts +73 -0
  104. package/src/worker/index.ts +36 -17
  105. package/dist/chunk-MI24YFCY.js.map +0 -1
@@ -1,12 +1,12 @@
1
1
  // @vitest-environment happy-dom
2
2
 
3
3
  import { cojsonInternals } from "cojson";
4
- import { Account, co, Loaded, z } from "jazz-tools";
4
+ import { Account, co, z } from "jazz-tools";
5
5
  import { beforeEach, describe, expect, expectTypeOf, it } from "vitest";
6
- import { useCoState } from "../index.js";
6
+ import { useCoState, useCoStates, useSuspenseCoStates } from "../index.js";
7
7
  import { createJazzTestAccount, setupJazzTestSync } from "../testing.js";
8
- import { renderHook, waitFor } from "./testUtils.js";
9
- import { useRef } from "react";
8
+ import { act, renderHook, waitFor } from "./testUtils.js";
9
+ import React, { Suspense, useRef } from "react";
10
10
 
11
11
  beforeEach(async () => {
12
12
  await setupJazzTestSync();
@@ -28,15 +28,15 @@ const useRenderCount = <T>(hook: () => T) => {
28
28
  };
29
29
  };
30
30
 
31
+ const TestMap = co.map({
32
+ value: z.string(),
33
+ get nested() {
34
+ return TestMap.optional();
35
+ },
36
+ });
37
+
31
38
  describe("useCoState", () => {
32
39
  it("should not re-render when a nested coValue is updated and not selected", async () => {
33
- const TestMap = co.map({
34
- value: z.string(),
35
- get nested() {
36
- return TestMap.optional();
37
- },
38
- });
39
-
40
40
  const map = TestMap.create({
41
41
  value: "1",
42
42
  nested: TestMap.create({
@@ -74,13 +74,6 @@ describe("useCoState", () => {
74
74
  });
75
75
 
76
76
  it("should re-render when a nested coValue is updated and selected", async () => {
77
- const TestMap = co.map({
78
- value: z.string(),
79
- get nested() {
80
- return TestMap.optional();
81
- },
82
- });
83
-
84
77
  const map = TestMap.create({
85
78
  value: "1",
86
79
  nested: TestMap.create({
@@ -122,6 +115,42 @@ describe("useCoState", () => {
122
115
  });
123
116
 
124
117
  it("should not re-render when equalityFn always returns true", async () => {
118
+ const map = TestMap.create({
119
+ value: "1",
120
+ nested: TestMap.create({
121
+ value: "1",
122
+ }),
123
+ });
124
+
125
+ const { result } = renderHook(() =>
126
+ useRenderCount(() =>
127
+ useCoState(TestMap, map.$jazz.id, {
128
+ resolve: {
129
+ nested: true,
130
+ },
131
+ select: (v) => {
132
+ if (!v.$isLoaded) {
133
+ return undefined;
134
+ }
135
+ return v.nested?.value;
136
+ },
137
+ equalityFn: () => true,
138
+ }),
139
+ ),
140
+ );
141
+
142
+ for (let i = 1; i <= 100; i++) {
143
+ map.nested!.$jazz.set("value", `${i}`);
144
+ await Account.getMe().$jazz.waitForAllCoValuesSync();
145
+ }
146
+
147
+ expect(result.current.result).toEqual("1");
148
+ expect(result.current.renderCount).toEqual(1);
149
+ });
150
+ });
151
+
152
+ describe("useCoStates", () => {
153
+ it("should not re-render when a nested coValue is updated and not selected", async () => {
125
154
  const TestMap = co.map({
126
155
  value: z.string(),
127
156
  get nested() {
@@ -129,16 +158,114 @@ describe("useCoState", () => {
129
158
  },
130
159
  });
131
160
 
132
- const map = TestMap.create({
161
+ const map1 = TestMap.create({
133
162
  value: "1",
134
163
  nested: TestMap.create({
135
164
  value: "1",
136
165
  }),
137
166
  });
167
+ const map2 = TestMap.create({
168
+ value: "2",
169
+ nested: TestMap.create({
170
+ value: "2",
171
+ }),
172
+ });
138
173
 
139
174
  const { result } = renderHook(() =>
140
175
  useRenderCount(() =>
141
- useCoState(TestMap, map.$jazz.id, {
176
+ useCoStates(TestMap, [map1.$jazz.id, map2.$jazz.id], {
177
+ resolve: {
178
+ nested: true,
179
+ },
180
+ select: (v) => {
181
+ if (!v.$isLoaded) {
182
+ return undefined;
183
+ }
184
+ return v.value;
185
+ },
186
+ }),
187
+ ),
188
+ );
189
+
190
+ await waitFor(() => {
191
+ expect(result.current.result).not.toBeUndefined();
192
+ });
193
+
194
+ for (let i = 1; i <= 100; i++) {
195
+ map1.nested!.$jazz.set("value", `${i}`);
196
+ map2.nested!.$jazz.set("value", `${i}`);
197
+ await Account.getMe().$jazz.waitForAllCoValuesSync();
198
+ }
199
+
200
+ expect(result.current.result).toEqual(["1", "2"]);
201
+ expect(result.current.renderCount).toEqual(1);
202
+ });
203
+
204
+ it("should re-render when a nested coValue is updated and selected", async () => {
205
+ const map1 = TestMap.create({
206
+ value: "1",
207
+ nested: TestMap.create({
208
+ value: "1",
209
+ }),
210
+ });
211
+ const map2 = TestMap.create({
212
+ value: "1",
213
+ nested: TestMap.create({
214
+ value: "1",
215
+ }),
216
+ });
217
+
218
+ const { result } = renderHook(() =>
219
+ useRenderCount(() =>
220
+ useCoStates(TestMap, [map1.$jazz.id, map2.$jazz.id], {
221
+ resolve: {
222
+ nested: true,
223
+ },
224
+ select: (v) => {
225
+ if (!v.$isLoaded) {
226
+ return undefined;
227
+ }
228
+ return v.nested?.value;
229
+ },
230
+ }),
231
+ ),
232
+ );
233
+
234
+ await waitFor(() => {
235
+ expect(result.current.result).not.toBeUndefined();
236
+ });
237
+
238
+ for (let i = 1; i <= 100; i++) {
239
+ map1.nested!.$jazz.set("value", `${i}`);
240
+ map2.nested!.$jazz.set("value", `${i}`);
241
+ await Account.getMe().$jazz.waitForAllCoValuesSync();
242
+ }
243
+
244
+ expect(result.current.result).toEqual(["100", "100"]);
245
+
246
+ // skips re-render on i = 1, only re-renders on i = [2,100], so initial render + 99 renders = 100
247
+ expect(result.current.renderCount).toEqual(100);
248
+
249
+ expectTypeOf(result.current.result).toEqualTypeOf<(string | undefined)[]>();
250
+ });
251
+
252
+ it("should not re-render when equalityFn always returns true", async () => {
253
+ const map1 = TestMap.create({
254
+ value: "1",
255
+ nested: TestMap.create({
256
+ value: "1",
257
+ }),
258
+ });
259
+ const map2 = TestMap.create({
260
+ value: "1",
261
+ nested: TestMap.create({
262
+ value: "1",
263
+ }),
264
+ });
265
+
266
+ const { result } = renderHook(() =>
267
+ useRenderCount(() =>
268
+ useCoStates(TestMap, [map1.$jazz.id, map2.$jazz.id], {
142
269
  resolve: {
143
270
  nested: true,
144
271
  },
@@ -154,11 +281,171 @@ describe("useCoState", () => {
154
281
  );
155
282
 
156
283
  for (let i = 1; i <= 100; i++) {
157
- map.nested!.$jazz.set("value", `${i}`);
284
+ map1.nested!.$jazz.set("value", `${i}`);
285
+ map2.nested!.$jazz.set("value", `${i}`);
158
286
  await Account.getMe().$jazz.waitForAllCoValuesSync();
159
287
  }
160
288
 
161
- expect(result.current.result).toEqual("1");
289
+ expect(result.current.result).toEqual(["1", "1"]);
290
+ expect(result.current.renderCount).toEqual(1);
291
+ });
292
+ });
293
+
294
+ describe("useSuspenseCoStates", () => {
295
+ it("should not re-render when a nested coValue is updated and not selected", async () => {
296
+ const map1 = TestMap.create({
297
+ value: "1",
298
+ nested: TestMap.create({
299
+ value: "1",
300
+ }),
301
+ });
302
+ const map2 = TestMap.create({
303
+ value: "2",
304
+ nested: TestMap.create({
305
+ value: "2",
306
+ }),
307
+ });
308
+
309
+ const wrapper = ({ children }: { children: React.ReactNode }) =>
310
+ React.createElement(
311
+ Suspense,
312
+ { fallback: React.createElement("div", null, "Loading...") },
313
+ children,
314
+ );
315
+
316
+ const { result } = await act(async () => {
317
+ return renderHook(
318
+ () =>
319
+ useRenderCount(() =>
320
+ useSuspenseCoStates(TestMap, [map1.$jazz.id, map2.$jazz.id], {
321
+ resolve: {
322
+ nested: true,
323
+ },
324
+ select: (v) => v.value,
325
+ }),
326
+ ),
327
+ {
328
+ wrapper,
329
+ },
330
+ );
331
+ });
332
+
333
+ await waitFor(() => {
334
+ expect(result.current.result).not.toBeUndefined();
335
+ });
336
+
337
+ for (let i = 1; i <= 100; i++) {
338
+ map1.nested!.$jazz.set("value", `${i}`);
339
+ map2.nested!.$jazz.set("value", `${i}`);
340
+ await Account.getMe().$jazz.waitForAllCoValuesSync();
341
+ }
342
+
343
+ expect(result.current.result).toEqual(["1", "2"]);
344
+ expect(result.current.renderCount).toEqual(1);
345
+ });
346
+
347
+ it("should re-render when a nested coValue is updated and selected", async () => {
348
+ const map1 = TestMap.create({
349
+ value: "1",
350
+ nested: TestMap.create({
351
+ value: "1",
352
+ }),
353
+ });
354
+ const map2 = TestMap.create({
355
+ value: "1",
356
+ nested: TestMap.create({
357
+ value: "1",
358
+ }),
359
+ });
360
+
361
+ const wrapper = ({ children }: { children: React.ReactNode }) =>
362
+ React.createElement(
363
+ Suspense,
364
+ { fallback: React.createElement("div", null, "Loading...") },
365
+ children,
366
+ );
367
+
368
+ const { result } = await act(async () => {
369
+ return renderHook(
370
+ () =>
371
+ useRenderCount(() =>
372
+ useSuspenseCoStates(TestMap, [map1.$jazz.id, map2.$jazz.id], {
373
+ resolve: {
374
+ nested: true,
375
+ },
376
+ select: (v) => v.nested?.value,
377
+ }),
378
+ ),
379
+ {
380
+ wrapper,
381
+ },
382
+ );
383
+ });
384
+
385
+ await waitFor(() => {
386
+ expect(result.current.result).not.toBeUndefined();
387
+ });
388
+
389
+ for (let i = 1; i <= 100; i++) {
390
+ map1.nested!.$jazz.set("value", `${i}`);
391
+ map2.nested!.$jazz.set("value", `${i}`);
392
+ await Account.getMe().$jazz.waitForAllCoValuesSync();
393
+ }
394
+
395
+ expect(result.current.result).toEqual(["100", "100"]);
396
+
397
+ // skips re-render on i = 1, only re-renders on i = [2,100], so initial render + 99 renders = 100
398
+ expect(result.current.renderCount).toEqual(100);
399
+
400
+ expectTypeOf(result.current.result).toEqualTypeOf<(string | undefined)[]>();
401
+ });
402
+
403
+ it("should not re-render when equalityFn always returns true", async () => {
404
+ const map1 = TestMap.create({
405
+ value: "1",
406
+ nested: TestMap.create({
407
+ value: "1",
408
+ }),
409
+ });
410
+ const map2 = TestMap.create({
411
+ value: "1",
412
+ nested: TestMap.create({
413
+ value: "1",
414
+ }),
415
+ });
416
+
417
+ const wrapper = ({ children }: { children: React.ReactNode }) =>
418
+ React.createElement(
419
+ Suspense,
420
+ { fallback: React.createElement("div", null, "Loading...") },
421
+ children,
422
+ );
423
+
424
+ const { result } = await act(async () => {
425
+ return renderHook(
426
+ () =>
427
+ useRenderCount(() =>
428
+ useSuspenseCoStates(TestMap, [map1.$jazz.id, map2.$jazz.id], {
429
+ resolve: {
430
+ nested: true,
431
+ },
432
+ select: (v) => v.nested?.value,
433
+ equalityFn: () => true,
434
+ }),
435
+ ),
436
+ {
437
+ wrapper,
438
+ },
439
+ );
440
+ });
441
+
442
+ for (let i = 1; i <= 100; i++) {
443
+ map1.nested!.$jazz.set("value", `${i}`);
444
+ map2.nested!.$jazz.set("value", `${i}`);
445
+ await Account.getMe().$jazz.waitForAllCoValuesSync();
446
+ }
447
+
448
+ expect(result.current.result).toEqual(["1", "1"]);
162
449
  expect(result.current.renderCount).toEqual(1);
163
450
  });
164
451
  });