jazz-tools 0.18.16 → 0.18.18

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 (112) hide show
  1. package/.svelte-kit/__package__/jazz.class.svelte.d.ts +14 -0
  2. package/.svelte-kit/__package__/jazz.class.svelte.d.ts.map +1 -1
  3. package/.svelte-kit/__package__/jazz.class.svelte.js +37 -0
  4. package/.svelte-kit/__package__/media/image.svelte +104 -98
  5. package/.svelte-kit/__package__/media/image.svelte.d.ts.map +1 -1
  6. package/.svelte-kit/__package__/testing.d.ts +1 -1
  7. package/.svelte-kit/__package__/testing.d.ts.map +1 -1
  8. package/.svelte-kit/__package__/testing.js +1 -1
  9. package/.svelte-kit/__package__/tests/TestConnectionStatus.svelte +8 -0
  10. package/.svelte-kit/__package__/tests/TestConnectionStatus.svelte.d.ts +27 -0
  11. package/.svelte-kit/__package__/tests/TestConnectionStatus.svelte.d.ts.map +1 -0
  12. package/.svelte-kit/__package__/tests/media/image.svelte.test.js +16 -2
  13. package/.svelte-kit/__package__/tests/sync-connection-status.svelte.test.d.ts +2 -0
  14. package/.svelte-kit/__package__/tests/sync-connection-status.svelte.test.d.ts.map +1 -0
  15. package/.svelte-kit/__package__/tests/sync-connection-status.svelte.test.js +47 -0
  16. package/.turbo/turbo-build.log +52 -52
  17. package/CHANGELOG.md +27 -0
  18. package/dist/browser/BrowserContextManager.d.ts +4 -0
  19. package/dist/browser/BrowserContextManager.d.ts.map +1 -1
  20. package/dist/browser/createBrowserContext.d.ts +4 -0
  21. package/dist/browser/createBrowserContext.d.ts.map +1 -1
  22. package/dist/browser/index.js +36 -4
  23. package/dist/browser/index.js.map +1 -1
  24. package/dist/{chunk-GRN6OAUX.js → chunk-FHRKDKDY.js} +80 -6
  25. package/dist/chunk-FHRKDKDY.js.map +1 -0
  26. package/dist/index.js +1 -1
  27. package/dist/react/hooks.d.ts +1 -1
  28. package/dist/react/hooks.d.ts.map +1 -1
  29. package/dist/react/index.d.ts +1 -1
  30. package/dist/react/index.d.ts.map +1 -1
  31. package/dist/react/index.js +6 -2
  32. package/dist/react/index.js.map +1 -1
  33. package/dist/react/media/image.d.ts.map +1 -1
  34. package/dist/react-core/hooks.d.ts +26 -0
  35. package/dist/react-core/hooks.d.ts.map +1 -1
  36. package/dist/react-core/index.js +16 -1
  37. package/dist/react-core/index.js.map +1 -1
  38. package/dist/react-core/testing.d.ts +1 -1
  39. package/dist/react-core/testing.d.ts.map +1 -1
  40. package/dist/react-core/testing.js +3 -1
  41. package/dist/react-core/testing.js.map +1 -1
  42. package/dist/react-core/tests/useSyncConnectionStatus.test.d.ts +2 -0
  43. package/dist/react-core/tests/useSyncConnectionStatus.test.d.ts.map +1 -0
  44. package/dist/react-native-core/ReactNativeContextManager.d.ts +4 -0
  45. package/dist/react-native-core/ReactNativeContextManager.d.ts.map +1 -1
  46. package/dist/react-native-core/hooks.d.ts +1 -1
  47. package/dist/react-native-core/hooks.d.ts.map +1 -1
  48. package/dist/react-native-core/index.js +41 -7
  49. package/dist/react-native-core/index.js.map +1 -1
  50. package/dist/react-native-core/media/image.d.ts.map +1 -1
  51. package/dist/react-native-core/platform.d.ts +4 -0
  52. package/dist/react-native-core/platform.d.ts.map +1 -1
  53. package/dist/svelte/jazz.class.svelte.d.ts +14 -0
  54. package/dist/svelte/jazz.class.svelte.d.ts.map +1 -1
  55. package/dist/svelte/jazz.class.svelte.js +37 -0
  56. package/dist/svelte/media/image.svelte +104 -98
  57. package/dist/svelte/media/image.svelte.d.ts.map +1 -1
  58. package/dist/svelte/testing.d.ts +1 -1
  59. package/dist/svelte/testing.d.ts.map +1 -1
  60. package/dist/svelte/testing.js +1 -1
  61. package/dist/svelte/tests/TestConnectionStatus.svelte +8 -0
  62. package/dist/svelte/tests/TestConnectionStatus.svelte.d.ts +27 -0
  63. package/dist/svelte/tests/TestConnectionStatus.svelte.d.ts.map +1 -0
  64. package/dist/svelte/tests/media/image.svelte.test.js +16 -2
  65. package/dist/svelte/tests/sync-connection-status.svelte.test.d.ts +2 -0
  66. package/dist/svelte/tests/sync-connection-status.svelte.test.d.ts.map +1 -0
  67. package/dist/svelte/tests/sync-connection-status.svelte.test.js +47 -0
  68. package/dist/testing.js +34 -4
  69. package/dist/testing.js.map +1 -1
  70. package/dist/tools/implementation/ContextManager.d.ts +4 -0
  71. package/dist/tools/implementation/ContextManager.d.ts.map +1 -1
  72. package/dist/tools/implementation/refs.d.ts +1 -1
  73. package/dist/tools/implementation/refs.d.ts.map +1 -1
  74. package/dist/tools/subscribe/CoValueCoreSubscription.d.ts +4 -0
  75. package/dist/tools/subscribe/CoValueCoreSubscription.d.ts.map +1 -1
  76. package/dist/tools/subscribe/SubscriptionScope.d.ts +7 -0
  77. package/dist/tools/subscribe/SubscriptionScope.d.ts.map +1 -1
  78. package/dist/tools/subscribe/index.d.ts.map +1 -1
  79. package/dist/tools/testing.d.ts +8 -0
  80. package/dist/tools/testing.d.ts.map +1 -1
  81. package/dist/tools/types.d.ts +4 -0
  82. package/dist/tools/types.d.ts.map +1 -1
  83. package/package.json +4 -4
  84. package/src/browser/createBrowserContext.ts +34 -4
  85. package/src/react/hooks.tsx +1 -0
  86. package/src/react/index.ts +1 -0
  87. package/src/react/media/image.tsx +2 -0
  88. package/src/react/tests/media/image.test.tsx +20 -2
  89. package/src/react-core/hooks.ts +42 -0
  90. package/src/react-core/testing.tsx +1 -0
  91. package/src/react-core/tests/useAccountWithSelector.test.ts +98 -2
  92. package/src/react-core/tests/useSyncConnectionStatus.test.ts +48 -0
  93. package/src/react-native-core/hooks.tsx +1 -0
  94. package/src/react-native-core/media/image.tsx +4 -1
  95. package/src/react-native-core/platform.ts +32 -4
  96. package/src/svelte/jazz.class.svelte.ts +44 -0
  97. package/src/svelte/media/image.svelte +104 -98
  98. package/src/svelte/testing.ts +1 -0
  99. package/src/svelte/tests/TestConnectionStatus.svelte +8 -0
  100. package/src/svelte/tests/media/image.svelte.test.ts +18 -2
  101. package/src/svelte/tests/sync-connection-status.svelte.test.ts +61 -0
  102. package/src/tools/implementation/ContextManager.ts +8 -0
  103. package/src/tools/implementation/refs.ts +27 -3
  104. package/src/tools/subscribe/CoValueCoreSubscription.ts +14 -0
  105. package/src/tools/subscribe/SubscriptionScope.ts +67 -2
  106. package/src/tools/subscribe/index.ts +8 -0
  107. package/src/tools/testing.ts +29 -0
  108. package/src/tools/tests/ContextManager.test.ts +2 -2
  109. package/src/tools/tests/coMap.test.ts +42 -0
  110. package/src/tools/tests/subscribe.test.ts +1 -4
  111. package/src/tools/types.ts +4 -0
  112. package/dist/chunk-GRN6OAUX.js.map +0 -1
@@ -34,5 +34,19 @@ export declare class AccountCoState<A extends (AccountClass<Account> & CoValueFr
34
34
  get agent(): import("jazz-tools").AnonymousJazzAgent | InstanceOfSchema<A>;
35
35
  get isAuthenticated(): boolean;
36
36
  }
37
+ /**
38
+ * Class that provides the current connection status to the Jazz sync server.
39
+ *
40
+ * @returns `true` when connected to the server, `false` when disconnected
41
+ *
42
+ * @remarks
43
+ * On connection drop, this will return `false` only when Jazz detects the disconnection
44
+ * after 5 seconds of not receiving a ping from the server.
45
+ */
46
+ export declare class SyncConnectionStatus {
47
+ #private;
48
+ constructor();
49
+ get current(): boolean;
50
+ }
37
51
  export {};
38
52
  //# sourceMappingURL=jazz.class.svelte.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"jazz.class.svelte.d.ts","sourceRoot":"","sources":["../../../src/svelte/jazz.class.svelte.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,OAAO,EACP,YAAY,EACZ,gBAAgB,EAChB,gBAAgB,EAChB,oBAAoB,EACpB,cAAc,EACd,gBAAgB,EAChB,MAAM,EACN,YAAY,EACZ,kBAAkB,EACnB,MAAM,YAAY,CAAC;AAUpB,KAAK,cAAc,CAAC,CAAC,SAAS,oBAAoB,EAAE,CAAC,SAAS,YAAY,CAAC,CAAC,CAAC,IAAI;IAC/E,OAAO,CAAC,EAAE,kBAAkB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACnC;;;;;;;;;;;;;;MAcE;IACF,eAAe,CAAC,EAAE,gBAAgB,CAAA;CACnC,CAAC;AAEF,KAAK,SAAS,GAAG,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC;AAE3C,qBAAa,OAAO,CAClB,CAAC,SAAS,oBAAoB,EAC9B,CAAC,SAAS,YAAY,CAAC,CAAC,CAAC,GAAG,IAAI;;gBAU9B,MAAM,EAAE,CAAC,EACT,EAAE,EAAE,SAAS,GAAG,CAAC,MAAM,SAAS,CAAC,EACjC,OAAO,CAAC,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAgD/D,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,SAAS,GAAG,IAAI;IAM7C,IAAI,OAAO,oCAGV;CACF;AAED,qBAAa,cAAc,CACzB,CAAC,SACC,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC,GACjD,gBAAgB,EAClB,CAAC,SAAS,YAAY,CAAC,CAAC,CAAC,GAAG,IAAI;;gBAQpB,MAAM,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IA8CpF,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,SAAS,GAAG,IAAI;IAM7C,MAAM,aAEJ;IAEF,IAAI,OAAO,oCAIV;IAED,IAAI,KAAK,kEAQR;IAID,IAAI,eAAe,YAElB;CACF"}
1
+ {"version":3,"file":"jazz.class.svelte.d.ts","sourceRoot":"","sources":["../../../src/svelte/jazz.class.svelte.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,OAAO,EACP,YAAY,EACZ,gBAAgB,EAChB,gBAAgB,EAChB,oBAAoB,EACpB,cAAc,EACd,gBAAgB,EAChB,MAAM,EACN,YAAY,EACZ,kBAAkB,EACnB,MAAM,YAAY,CAAC;AAUpB,KAAK,cAAc,CAAC,CAAC,SAAS,oBAAoB,EAAE,CAAC,SAAS,YAAY,CAAC,CAAC,CAAC,IAAI;IAC/E,OAAO,CAAC,EAAE,kBAAkB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACnC;;;;;;;;;;;;;;MAcE;IACF,eAAe,CAAC,EAAE,gBAAgB,CAAA;CACnC,CAAC;AAEF,KAAK,SAAS,GAAG,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC;AAE3C,qBAAa,OAAO,CAClB,CAAC,SAAS,oBAAoB,EAC9B,CAAC,SAAS,YAAY,CAAC,CAAC,CAAC,GAAG,IAAI;;gBAU9B,MAAM,EAAE,CAAC,EACT,EAAE,EAAE,SAAS,GAAG,CAAC,MAAM,SAAS,CAAC,EACjC,OAAO,CAAC,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAgD/D,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,SAAS,GAAG,IAAI;IAM7C,IAAI,OAAO,oCAGV;CACF;AAED,qBAAa,cAAc,CACzB,CAAC,SACC,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC,GACjD,gBAAgB,EAClB,CAAC,SAAS,YAAY,CAAC,CAAC,CAAC,GAAG,IAAI;;gBAQpB,MAAM,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IA8CpF,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,SAAS,GAAG,IAAI;IAM7C,MAAM,aAEJ;IAEF,IAAI,OAAO,oCAIV;IAED,IAAI,KAAK,kEAQR;IAID,IAAI,eAAe,YAElB;CACF;AAED;;;;;;;;GAQG;AACH,qBAAa,oBAAoB;;;IA6B/B,IAAI,OAAO,YAGV;CACF"}
@@ -123,3 +123,40 @@ export class AccountCoState {
123
123
  return this.#isAuthenticated.current;
124
124
  }
125
125
  }
126
+ /**
127
+ * Class that provides the current connection status to the Jazz sync server.
128
+ *
129
+ * @returns `true` when connected to the server, `false` when disconnected
130
+ *
131
+ * @remarks
132
+ * On connection drop, this will return `false` only when Jazz detects the disconnection
133
+ * after 5 seconds of not receiving a ping from the server.
134
+ */
135
+ export class SyncConnectionStatus {
136
+ #ctx = getJazzContext();
137
+ #subscribe;
138
+ #update = () => { };
139
+ constructor() {
140
+ this.#subscribe = createSubscriber((update) => {
141
+ this.#update = update;
142
+ });
143
+ $effect.pre(() => {
144
+ const ctx = this.#ctx.current;
145
+ return untrack(() => {
146
+ if (!ctx) {
147
+ return;
148
+ }
149
+ const unsubscribe = ctx.addConnectionListener(() => {
150
+ this.#update();
151
+ });
152
+ return () => {
153
+ unsubscribe();
154
+ };
155
+ });
156
+ });
157
+ }
158
+ get current() {
159
+ this.#subscribe();
160
+ return this.#ctx.current?.connected() ?? false;
161
+ }
162
+ }
@@ -1,118 +1,122 @@
1
1
  <script lang="ts">
2
- import { ImageDefinition } from "jazz-tools";
3
- import { highestResAvailable } from "jazz-tools/media";
4
- import { onDestroy } from "svelte";
5
- import { CoState } from "../jazz.class.svelte";
6
- import type { ImageProps } from "./image.types.js";
7
-
8
- const { imageId, width, height, ...rest }: ImageProps = $props();
9
-
10
- const imageState = new CoState(ImageDefinition, () => imageId);
11
- let lastBestImage: [string, string] | null = null;
12
-
13
- /**
14
- * For lazy loading, we use the browser's strategy for images with loading="lazy".
15
- * We use an empty image, and when the browser triggers the load event, we load the best available image.
16
- * On page loading, if the image url is already in browser's cache, the load event is triggered immediately.
17
- * This is why we need to use a different blob url for every image.
18
- */
19
- let waitingLazyLoading = $state(rest.loading === "lazy");
20
- const lazyPlaceholder = $derived.by(() =>
21
- waitingLazyLoading ? URL.createObjectURL(emptyPixelBlob) : undefined,
22
- );
23
-
24
- const dimensions = $derived.by<{
25
- width: number | undefined;
26
- height: number | undefined;
27
- }>(() => {
28
- const originalWidth = imageState.current?.originalSize?.[0];
29
- const originalHeight = imageState.current?.originalSize?.[1];
30
-
31
- // Both width and height are "original"
32
- if (width === "original" && height === "original") {
33
- return { width: originalWidth, height: originalHeight };
34
- }
2
+ import { ImageDefinition } from "jazz-tools";
3
+ import { highestResAvailable } from "jazz-tools/media";
4
+ import { onDestroy } from "svelte";
5
+ import { CoState } from "../jazz.class.svelte";
6
+ import type { ImageProps } from "./image.types.js";
7
+
8
+ const { imageId, width, height, ...rest }: ImageProps = $props();
9
+
10
+ const imageState = new CoState(ImageDefinition, () => imageId);
11
+ let lastBestImage: [string, string] | null = null;
12
+
13
+ /**
14
+ * For lazy loading, we use the browser's strategy for images with loading="lazy".
15
+ * We use an empty image, and when the browser triggers the load event, we load the best available image.
16
+ * On page loading, if the image url is already in browser's cache, the load event is triggered immediately.
17
+ * This is why we need to use a different blob url for every image.
18
+ */
19
+ let waitingLazyLoading = $state(rest.loading === "lazy");
20
+ const lazyPlaceholder = $derived.by(() =>
21
+ waitingLazyLoading ? URL.createObjectURL(emptyPixelBlob) : undefined,
22
+ );
23
+
24
+ const dimensions = $derived.by<{
25
+ width: number | undefined;
26
+ height: number | undefined;
27
+ }>(() => {
28
+ const originalWidth = imageState.current?.originalSize?.[0];
29
+ const originalHeight = imageState.current?.originalSize?.[1];
35
30
 
36
- // Width is "original", height is a number
37
- if (width === "original" && typeof height === "number") {
38
- if (originalWidth && originalHeight) {
39
- return {
40
- width: Math.round((height * originalWidth) / originalHeight),
41
- height,
42
- };
31
+ // Both width and height are "original"
32
+ if (width === "original" && height === "original") {
33
+ return { width: originalWidth, height: originalHeight };
43
34
  }
44
- return { width: undefined, height };
45
- }
46
35
 
47
- // Height is "original", width is a number
48
- if (height === "original" && typeof width === "number") {
49
- if (originalWidth && originalHeight) {
50
- return {
51
- width,
52
- height: Math.round((width * originalHeight) / originalWidth),
53
- };
36
+ // Width is "original", height is a number
37
+ if (width === "original" && typeof height === "number") {
38
+ if (originalWidth && originalHeight) {
39
+ return {
40
+ width: Math.round((height * originalWidth) / originalHeight),
41
+ height,
42
+ };
43
+ }
44
+ return { width: undefined, height };
54
45
  }
55
- return { width, height: undefined };
56
- }
57
46
 
58
- // In all other cases, use the property value:
59
- return {
60
- width: width === "original" ? originalWidth : width,
61
- height: height === "original" ? originalHeight : height,
62
- };
63
- });
47
+ // Height is "original", width is a number
48
+ if (height === "original" && typeof width === "number") {
49
+ if (originalWidth && originalHeight) {
50
+ return {
51
+ width,
52
+ height: Math.round((width * originalHeight) / originalWidth),
53
+ };
54
+ }
55
+ return { width, height: undefined };
56
+ }
64
57
 
65
- const src = $derived.by(() => {
66
- if (waitingLazyLoading) {
67
- return lazyPlaceholder;
68
- }
58
+ // In all other cases, use the property value:
59
+ return {
60
+ width: width === "original" ? originalWidth : width,
61
+ height: height === "original" ? originalHeight : height,
62
+ };
63
+ });
69
64
 
70
- const image = imageState.current;
71
- if (!image) return undefined;
65
+ const src = $derived.by(() => {
66
+ if (waitingLazyLoading) {
67
+ return lazyPlaceholder;
68
+ }
72
69
 
73
- const bestImage = highestResAvailable(
74
- image,
75
- dimensions.width || dimensions.height || 9999,
76
- dimensions.height || dimensions.width || 9999,
77
- );
70
+ const image = imageState.current;
71
+ if (image === undefined)
72
+ return "data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==";
78
73
 
79
- if (!bestImage) return image.placeholderDataURL;
80
- if (lastBestImage?.[0] === bestImage.image.$jazz.id) return lastBestImage?.[1];
74
+ if (!image) return undefined;
81
75
 
82
- const blob = bestImage.image.toBlob();
76
+ const bestImage = highestResAvailable(
77
+ image,
78
+ dimensions.width || dimensions.height || 9999,
79
+ dimensions.height || dimensions.width || 9999,
80
+ );
83
81
 
84
- if (blob) {
85
- const url = URL.createObjectURL(blob);
86
- revokeObjectURL(lastBestImage?.[1]);
87
- lastBestImage = [bestImage.image.$jazz.id, url];
88
- return url;
89
- }
82
+ if (!bestImage) return image.placeholderDataURL;
83
+ if (lastBestImage?.[0] === bestImage.image.$jazz.id)
84
+ return lastBestImage?.[1];
85
+
86
+ const blob = bestImage.image.toBlob();
87
+
88
+ if (blob) {
89
+ const url = URL.createObjectURL(blob);
90
+ revokeObjectURL(lastBestImage?.[1]);
91
+ lastBestImage = [bestImage.image.$jazz.id, url];
92
+ return url;
93
+ }
90
94
 
91
- return image.placeholderDataURL;
92
- });
95
+ return image.placeholderDataURL;
96
+ });
93
97
 
94
- // Cleanup object URL on component destroy
95
- onDestroy(() => {
96
- revokeObjectURL(lastBestImage?.[1]);
97
- });
98
+ // Cleanup object URL on component destroy
99
+ onDestroy(() => {
100
+ revokeObjectURL(lastBestImage?.[1]);
101
+ });
98
102
 
99
- function revokeObjectURL(url: string | undefined) {
100
- if (url && url.startsWith("blob:")) {
101
- URL.revokeObjectURL(url);
103
+ function revokeObjectURL(url: string | undefined) {
104
+ if (url && url.startsWith("blob:")) {
105
+ URL.revokeObjectURL(url);
106
+ }
102
107
  }
103
- }
104
108
 
105
- const emptyPixelBlob = new Blob(
106
- [
107
- Uint8Array.from(
108
- atob(
109
- "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8/5+hHgAHggJ/PchI7wAAAABJRU5ErkJggg==",
109
+ const emptyPixelBlob = new Blob(
110
+ [
111
+ Uint8Array.from(
112
+ atob(
113
+ "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8/5+hHgAHggJ/PchI7wAAAABJRU5ErkJggg==",
114
+ ),
115
+ (c) => c.charCodeAt(0),
110
116
  ),
111
- (c) => c.charCodeAt(0),
112
- ),
113
- ],
114
- { type: "image/png" },
115
- );
117
+ ],
118
+ { type: "image/png" },
119
+ );
116
120
  </script>
117
121
 
118
122
  <img
@@ -120,6 +124,8 @@ const emptyPixelBlob = new Blob(
120
124
  width={dimensions.width}
121
125
  height={dimensions.height}
122
126
  alt={rest.alt}
123
- onload={() => {waitingLazyLoading = false}}
127
+ onload={() => {
128
+ waitingLazyLoading = false;
129
+ }}
124
130
  {...rest}
125
131
  />
@@ -1 +1 @@
1
- {"version":3,"file":"image.svelte.d.ts","sourceRoot":"","sources":["../../../../src/svelte/media/image.svelte.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AA2HnD,QAAA,MAAM,KAAK,gDAAsC,CAAC;AAClD,KAAK,KAAK,GAAG,UAAU,CAAC,OAAO,KAAK,CAAC,CAAC;AACtC,eAAe,KAAK,CAAC"}
1
+ {"version":3,"file":"image.svelte.d.ts","sourceRoot":"","sources":["../../../../src/svelte/media/image.svelte.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAiInD,QAAA,MAAM,KAAK,gDAAsC,CAAC;AAClD,KAAK,KAAK,GAAG,UAAU,CAAC,OAAO,KAAK,CAAC,CAAC;AACtC,eAAe,KAAK,CAAC"}
@@ -6,5 +6,5 @@ export declare function createJazzTestContext<Acc extends Account>(opts?: {
6
6
  };
7
7
  isAuthenticated?: boolean;
8
8
  }): Map<{} | {}, AuthSecretStorage | JazzContext<Acc>>;
9
- export { createJazzTestAccount, createJazzTestGuest, linkAccounts, setActiveAccount, setupJazzTestSync, } from "jazz-tools/testing";
9
+ export { createJazzTestAccount, createJazzTestGuest, linkAccounts, setActiveAccount, setupJazzTestSync, MockConnectionStatus, } from "jazz-tools/testing";
10
10
  //# sourceMappingURL=testing.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"testing.d.ts","sourceRoot":"","sources":["../../../src/svelte/testing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE5E,OAAO,EAA2B,KAAK,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE7E,wBAAgB,qBAAqB,CAAC,GAAG,SAAS,OAAO,EACvD,IAAI,GAAE;IACJ,OAAO,CAAC,EAAE,GAAG,GAAG;QAAE,KAAK,EAAE,kBAAkB,CAAA;KAAE,CAAC;IAC9C,eAAe,CAAC,EAAE,OAAO,CAAC;CACtB,sDAyBP;AAED,OAAO,EACL,qBAAqB,EACrB,mBAAmB,EACnB,YAAY,EACZ,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,oBAAoB,CAAC"}
1
+ {"version":3,"file":"testing.d.ts","sourceRoot":"","sources":["../../../src/svelte/testing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE5E,OAAO,EAA2B,KAAK,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE7E,wBAAgB,qBAAqB,CAAC,GAAG,SAAS,OAAO,EACvD,IAAI,GAAE;IACJ,OAAO,CAAC,EAAE,GAAG,GAAG;QAAE,KAAK,EAAE,kBAAkB,CAAA;KAAE,CAAC;IAC9C,eAAe,CAAC,EAAE,OAAO,CAAC;CACtB,sDAyBP;AAED,OAAO,EACL,qBAAqB,EACrB,mBAAmB,EACnB,YAAY,EACZ,gBAAgB,EAChB,iBAAiB,EACjB,oBAAoB,GACrB,MAAM,oBAAoB,CAAC"}
@@ -20,4 +20,4 @@ export function createJazzTestContext(opts = {}) {
20
20
  }
21
21
  return ctx;
22
22
  }
23
- export { createJazzTestAccount, createJazzTestGuest, linkAccounts, setActiveAccount, setupJazzTestSync, } from "jazz-tools/testing";
23
+ export { createJazzTestAccount, createJazzTestGuest, linkAccounts, setActiveAccount, setupJazzTestSync, MockConnectionStatus, } from "jazz-tools/testing";
@@ -0,0 +1,8 @@
1
+ <script>
2
+ import { SyncConnectionStatus } from "../jazz.class.svelte";
3
+ const connectionStatus = new SyncConnectionStatus();
4
+ </script>
5
+
6
+ <div>
7
+ <div data-testid="connected">{connectionStatus.current ? "true" : "false"}</div>
8
+ </div>
@@ -0,0 +1,27 @@
1
+ export default TestConnectionStatus;
2
+ type TestConnectionStatus = SvelteComponent<{
3
+ [x: string]: never;
4
+ }, {
5
+ [evt: string]: CustomEvent<any>;
6
+ }, {}> & {
7
+ $$bindings?: string | undefined;
8
+ };
9
+ declare const TestConnectionStatus: $$__sveltets_2_IsomorphicComponent<{
10
+ [x: string]: never;
11
+ }, {
12
+ [evt: string]: CustomEvent<any>;
13
+ }, {}, {}, string>;
14
+ interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
15
+ new (options: import("svelte").ComponentConstructorOptions<Props>): import("svelte").SvelteComponent<Props, Events, Slots> & {
16
+ $$bindings?: Bindings;
17
+ } & Exports;
18
+ (internal: unknown, props: {
19
+ $$events?: Events;
20
+ $$slots?: Slots;
21
+ }): Exports & {
22
+ $set?: any;
23
+ $on?: any;
24
+ };
25
+ z_$$bindings?: Bindings;
26
+ }
27
+ //# sourceMappingURL=TestConnectionStatus.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TestConnectionStatus.svelte.d.ts","sourceRoot":"","sources":["../../../../src/svelte/tests/TestConnectionStatus.svelte.js"],"names":[],"mappings":";;;;;;;;AAyBA;;;;mBAA8H;6CATjF,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,QAAQ,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,QAAQ,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,QAAQ,OAAO,OAAO,QAAQ;IAC3L,cAAc,OAAO,QAAQ,EAAE,2BAA2B,CAAC,KAAK,CAAC,GAAG,OAAO,QAAQ,EAAE,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,GAAG;QAAE,UAAU,CAAC,EAAE,QAAQ,CAAA;KAAE,GAAG,OAAO,CAAC;IACjK,WAAW,OAAO,SAAS;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,KAAK,CAAA;KAAC,GAAG,OAAO,GAAG;QAAE,IAAI,CAAC,EAAE,GAAG,CAAC;QAAC,GAAG,CAAC,EAAE,GAAG,CAAA;KAAE,CAAC;IACtG,eAAe,QAAQ,CAAC"}
@@ -10,7 +10,7 @@ describe("Image", async () => {
10
10
  });
11
11
  const renderWithAccount = (props) => render(Image, props, { account });
12
12
  describe("initial rendering", () => {
13
- it("should render nothing if coValue is not found", async () => {
13
+ it("should render a blank placeholder while waiting for the coValue to load", async () => {
14
14
  const { container } = renderWithAccount({
15
15
  imageId: "co_zMTubMby3QiKDYnW9e2BEXW7Xaq",
16
16
  alt: "test",
@@ -20,7 +20,21 @@ describe("Image", async () => {
20
20
  expect(img.getAttribute("width")).toBe(null);
21
21
  expect(img.getAttribute("height")).toBe(null);
22
22
  expect(img.alt).toBe("test");
23
- expect(img.src).toBe("");
23
+ expect(img.src).toBe("data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==");
24
+ });
25
+ it("should render nothing if coValue is not found", async () => {
26
+ const { container } = renderWithAccount({
27
+ imageId: "co_zMTubMby3QiKDYnW9e2BEXW7Xaq",
28
+ alt: "test",
29
+ });
30
+ await waitFor(() => {
31
+ const img = container.querySelector("img");
32
+ expect(img).toBeDefined();
33
+ expect(img.getAttribute("width")).toBe(null);
34
+ expect(img.getAttribute("height")).toBe(null);
35
+ expect(img.alt).toBe("test");
36
+ expect(img.src).toBe("");
37
+ });
24
38
  });
25
39
  it("should render an empty image if the image is not loaded yet", async () => {
26
40
  const original = FileStream.create({ owner: account.$jazz.owner });
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=sync-connection-status.svelte.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync-connection-status.svelte.test.d.ts","sourceRoot":"","sources":["../../../../src/svelte/tests/sync-connection-status.svelte.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,47 @@
1
+ // @vitest-environment happy-dom
2
+ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
3
+ import { createJazzTestAccount, setupJazzTestSync, MockConnectionStatus, } from "../testing";
4
+ import { render, screen, waitFor } from "./testUtils";
5
+ import TestConnectionStatus from "./TestConnectionStatus.svelte";
6
+ describe("SyncConnectionStatus", () => {
7
+ beforeEach(async () => {
8
+ await setupJazzTestSync();
9
+ await createJazzTestAccount({
10
+ isCurrentActiveAccount: true,
11
+ });
12
+ });
13
+ afterEach(() => {
14
+ vi.clearAllMocks();
15
+ });
16
+ it("should return true by default in the test environment", async () => {
17
+ const { container } = render(TestConnectionStatus, {}, {
18
+ account: await createJazzTestAccount({
19
+ isCurrentActiveAccount: true,
20
+ }),
21
+ });
22
+ await waitFor(() => {
23
+ expect(screen.getByTestId("connected").textContent).toBe("true");
24
+ });
25
+ });
26
+ it("should handle updates", async () => {
27
+ const { container } = render(TestConnectionStatus, {}, {
28
+ account: await createJazzTestAccount({
29
+ isCurrentActiveAccount: true,
30
+ }),
31
+ });
32
+ // Initially should be connected
33
+ await waitFor(() => {
34
+ expect(screen.getByTestId("connected").textContent).toBe("true");
35
+ });
36
+ // Simulate disconnection
37
+ MockConnectionStatus.setIsConnected(false);
38
+ await waitFor(() => {
39
+ expect(screen.getByTestId("connected").textContent).toBe("false");
40
+ });
41
+ // Simulate reconnection
42
+ MockConnectionStatus.setIsConnected(true);
43
+ await waitFor(() => {
44
+ expect(screen.getByTestId("connected").textContent).toBe("true");
45
+ });
46
+ });
47
+ });
@@ -1,5 +1,5 @@
1
1
 
2
- > jazz-tools@0.18.16 build /home/runner/_work/jazz/jazz/packages/jazz-tools
2
+ > jazz-tools@0.18.18 build /home/runner/_work/jazz/jazz/packages/jazz-tools
3
3
  > tsup && pnpm types && pnpm build:svelte
4
4
 
5
5
  CLI Building entry: {"index":"src/index.ts","testing":"src/testing.ts"}
@@ -114,98 +114,98 @@
114
114
  ESM Build start
115
115
  CLI Cleaning output folder
116
116
  ESM Build start
117
- ESM dist/tiptap/index.js 564.00 B
118
- ESM dist/tiptap/index.js.map 1.21 KB
119
- ESM ⚡️ Build success in 13ms
120
117
  ESM dist/react/ssr.js 688.00 B
121
118
  ESM dist/react/ssr.js.map 1.12 KB
122
- ESM ⚡️ Build success in 15ms
119
+ ESM ⚡️ Build success in 28ms
120
+ ESM dist/tiptap/index.js 564.00 B
121
+ ESM dist/tiptap/index.js.map 1.21 KB
122
+ ESM ⚡️ Build success in 25ms
123
123
  ESM dist/worker/index.js 3.19 KB
124
124
  ESM dist/worker/edge-wasm.js 215.00 B
125
125
  ESM dist/worker/index.js.map 6.17 KB
126
126
  ESM dist/worker/edge-wasm.js.map 434.00 B
127
- ESM ⚡️ Build success in 20ms
127
+ ESM ⚡️ Build success in 27ms
128
128
  ESM dist/better-auth/auth/client.js 4.44 KB
129
- ESM dist/better-auth/auth/react.js 799.00 B
130
129
  ESM dist/better-auth/auth/server.js 8.36 KB
130
+ ESM dist/better-auth/auth/react.js 799.00 B
131
131
  ESM dist/better-auth/auth/client.js.map 8.24 KB
132
- ESM dist/better-auth/auth/react.js.map 2.04 KB
133
132
  ESM dist/better-auth/auth/server.js.map 15.29 KB
134
- ESM ⚡️ Build success in 18ms
133
+ ESM dist/better-auth/auth/react.js.map 2.04 KB
134
+ ESM ⚡️ Build success in 29ms
135
+ ESM dist/react-core/index.js 11.07 KB
136
+ ESM dist/react-core/testing.js 1.22 KB
137
+ ESM dist/react-core/chunk-7DYMJ74I.js 279.00 B
138
+ ESM dist/react-core/index.js.map 35.67 KB
139
+ ESM dist/react-core/testing.js.map 1.86 KB
140
+ ESM dist/react-core/chunk-7DYMJ74I.js.map 533.00 B
141
+ ESM ⚡️ Build success in 34ms
135
142
  ESM dist/media/index.js 236.00 B
136
- ESM dist/media/index.browser.js 2.79 KB
137
143
  ESM dist/media/index.native.js 2.90 KB
138
- ESM dist/media/index.server.js 2.95 KB
139
144
  ESM dist/media/chunk-W3S526L3.js 6.47 KB
145
+ ESM dist/media/index.server.js 2.95 KB
146
+ ESM dist/media/index.browser.js 2.79 KB
140
147
  ESM dist/media/index.js.map 71.00 B
141
- ESM dist/media/index.browser.js.map 6.15 KB
142
148
  ESM dist/media/index.native.js.map 6.09 KB
143
149
  ESM dist/media/index.server.js.map 6.37 KB
144
150
  ESM dist/media/chunk-W3S526L3.js.map 16.57 KB
145
- ESM ⚡️ Build success in 34ms
146
- ESM dist/react-core/index.js 10.72 KB
147
- ESM dist/react-core/testing.js 1.17 KB
148
- ESM dist/react-core/chunk-7DYMJ74I.js 279.00 B
149
- ESM dist/react-core/index.js.map 33.90 KB
150
- ESM dist/react-core/testing.js.map 1.82 KB
151
- ESM dist/react-core/chunk-7DYMJ74I.js.map 533.00 B
152
- ESM ⚡️ Build success in 36ms
153
- ESM dist/expo/index.js 4.68 KB
154
- ESM dist/expo/testing.js 112.00 B
155
- ESM dist/expo/crypto.js 153.00 B
156
- ESM dist/expo/index.js.map 10.23 KB
157
- ESM dist/expo/testing.js.map 168.00 B
158
- ESM dist/expo/crypto.js.map 189.00 B
159
- ESM ⚡️ Build success in 42ms
151
+ ESM dist/media/index.browser.js.map 6.15 KB
152
+ ESM ⚡️ Build success in 39ms
153
+ ESM dist/browser/index.js 14.13 KB
154
+ ESM dist/browser/index.js.map 30.00 KB
155
+ ESM ⚡️ Build success in 49ms
160
156
  ESM dist/react-native/index.js 2.53 KB
161
157
  ESM dist/react-native/crypto.js 161.00 B
162
158
  ESM dist/react-native/testing.js 120.00 B
163
159
  ESM dist/react-native/index.js.map 5.68 KB
164
160
  ESM dist/react-native/crypto.js.map 197.00 B
165
161
  ESM dist/react-native/testing.js.map 176.00 B
166
- ESM ⚡️ Build success in 38ms
167
- ESM dist/browser/index.js 13.64 KB
168
- ESM dist/browser/index.js.map 29.14 KB
169
- ESM ⚡️ Build success in 43ms
170
- ESM dist/better-auth/database-adapter/index.js 26.34 KB
171
- ESM dist/better-auth/database-adapter/index.js.map 57.62 KB
172
- ESM ⚡️ Build success in 43ms
173
- ESM dist/react/testing.js 122.00 B
174
- ESM dist/react/index.js 24.76 KB
175
- ESM dist/react/testing.js.map 165.00 B
176
- ESM dist/react/index.js.map 53.56 KB
177
- ESM ⚡️ Build success in 49ms
178
- ESM dist/react-native-core/index.js 18.03 KB
162
+ ESM ⚡️ Build success in 46ms
163
+ ESM dist/expo/index.js 4.68 KB
164
+ ESM dist/expo/testing.js 112.00 B
165
+ ESM dist/expo/crypto.js 153.00 B
166
+ ESM dist/expo/index.js.map 10.23 KB
167
+ ESM dist/expo/testing.js.map 168.00 B
168
+ ESM dist/expo/crypto.js.map 189.00 B
169
+ ESM ⚡️ Build success in 51ms
170
+ ESM dist/react-native-core/index.js 18.65 KB
179
171
  ESM dist/react-native-core/testing.js 119.00 B
180
172
  ESM dist/react-native-core/crypto.js 2.10 KB
181
- ESM dist/react-native-core/index.js.map 36.85 KB
173
+ ESM dist/react-native-core/index.js.map 37.83 KB
182
174
  ESM dist/react-native-core/testing.js.map 175.00 B
183
175
  ESM dist/react-native-core/crypto.js.map 4.25 KB
184
- ESM ⚡️ Build success in 49ms
176
+ ESM ⚡️ Build success in 48ms
177
+ ESM dist/better-auth/database-adapter/index.js 26.34 KB
178
+ ESM dist/better-auth/database-adapter/index.js.map 57.62 KB
179
+ ESM ⚡️ Build success in 51ms
180
+ ESM dist/react/testing.js 122.00 B
181
+ ESM dist/react/index.js 24.93 KB
182
+ ESM dist/react/testing.js.map 165.00 B
183
+ ESM dist/react/index.js.map 53.78 KB
184
+ ESM ⚡️ Build success in 55ms
185
185
  ESM dist/prosemirror/index.js 77.76 KB
186
186
  ESM dist/prosemirror/index.js.map 307.20 KB
187
- ESM ⚡️ Build success in 52ms
187
+ ESM ⚡️ Build success in 70ms
188
188
  ESM dist/inspector/index.js 69.71 KB
189
189
  ESM dist/inspector/index.js.map 121.38 KB
190
- ESM ⚡️ Build success in 63ms
191
- ESM dist/testing.js 7.17 KB
190
+ ESM ⚡️ Build success in 84ms
192
191
  ESM dist/index.js 26.13 KB
193
- ESM dist/chunk-GRN6OAUX.js 174.37 KB
194
- ESM dist/testing.js.map 14.10 KB
192
+ ESM dist/testing.js 8.33 KB
193
+ ESM dist/chunk-FHRKDKDY.js 176.29 KB
194
+ ESM dist/testing.js.map 15.87 KB
195
195
  ESM dist/index.js.map 52.92 KB
196
- ESM dist/chunk-GRN6OAUX.js.map 415.70 KB
197
- ESM ⚡️ Build success in 80ms
196
+ ESM dist/chunk-FHRKDKDY.js.map 420.15 KB
197
+ ESM ⚡️ Build success in 104ms
198
198
  ESM dist/inspector/register-custom-element.js 218.00 B
199
199
  ESM dist/inspector/register-custom-element.js.map 314.00 B
200
200
  ESM dist/inspector/custom-element-G6SPZEBR.js 1.54 MB
201
201
  ESM dist/inspector/custom-element-G6SPZEBR.js.map 2.36 MB
202
- ESM ⚡️ Build success in 122ms
202
+ ESM ⚡️ Build success in 155ms
203
203
 
204
- > jazz-tools@0.18.16 types /home/runner/_work/jazz/jazz/packages/jazz-tools
204
+ > jazz-tools@0.18.18 types /home/runner/_work/jazz/jazz/packages/jazz-tools
205
205
  > tsc --outDir dist
206
206
 
207
207
 
208
- > jazz-tools@0.18.16 build:svelte /home/runner/_work/jazz/jazz/packages/jazz-tools
208
+ > jazz-tools@0.18.18 build:svelte /home/runner/_work/jazz/jazz/packages/jazz-tools
209
209
  > rm -rf dist/svelte && svelte-package -i src/svelte -o dist/svelte --tsconfig tsconfig.svelte.json
210
210
 
211
211
  src/svelte -> dist/svelte