@laboverwire/stitch 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (136) hide show
  1. package/CHANGELOG.md +90 -0
  2. package/LICENSE +201 -0
  3. package/README.md +39 -0
  4. package/dist/index.d.ts +10 -0
  5. package/dist/index.d.ts.map +1 -0
  6. package/dist/index.js +9 -0
  7. package/dist/index.js.map +1 -0
  8. package/dist/internal-list-apply.d.ts +5 -0
  9. package/dist/internal-list-apply.d.ts.map +1 -0
  10. package/dist/internal-list-apply.js +30 -0
  11. package/dist/internal-list-apply.js.map +1 -0
  12. package/dist/internal-utils.d.ts +3 -0
  13. package/dist/internal-utils.d.ts.map +1 -0
  14. package/dist/internal-utils.js +15 -0
  15. package/dist/internal-utils.js.map +1 -0
  16. package/dist/internal-wasm-error.d.ts +9 -0
  17. package/dist/internal-wasm-error.d.ts.map +1 -0
  18. package/dist/internal-wasm-error.js +48 -0
  19. package/dist/internal-wasm-error.js.map +1 -0
  20. package/dist/memory-store.d.ts +3 -0
  21. package/dist/memory-store.d.ts.map +1 -0
  22. package/dist/memory-store.js +572 -0
  23. package/dist/memory-store.js.map +1 -0
  24. package/dist/offline-queue.d.ts +6 -0
  25. package/dist/offline-queue.d.ts.map +1 -0
  26. package/dist/offline-queue.js +361 -0
  27. package/dist/offline-queue.js.map +1 -0
  28. package/dist/persistence-layer.d.ts +7 -0
  29. package/dist/persistence-layer.d.ts.map +1 -0
  30. package/dist/persistence-layer.js +409 -0
  31. package/dist/persistence-layer.js.map +1 -0
  32. package/dist/react/context.d.ts +10 -0
  33. package/dist/react/context.d.ts.map +1 -0
  34. package/dist/react/context.js +9 -0
  35. package/dist/react/context.js.map +1 -0
  36. package/dist/react/hooks/useChildCounts.d.ts +3 -0
  37. package/dist/react/hooks/useChildCounts.d.ts.map +1 -0
  38. package/dist/react/hooks/useChildCounts.js +85 -0
  39. package/dist/react/hooks/useChildCounts.js.map +1 -0
  40. package/dist/react/hooks/useConnectionStatus.d.ts +3 -0
  41. package/dist/react/hooks/useConnectionStatus.d.ts.map +1 -0
  42. package/dist/react/hooks/useConnectionStatus.js +9 -0
  43. package/dist/react/hooks/useConnectionStatus.js.map +1 -0
  44. package/dist/react/hooks/useEntitySnapshot.d.ts +4 -0
  45. package/dist/react/hooks/useEntitySnapshot.d.ts.map +1 -0
  46. package/dist/react/hooks/useEntitySnapshot.js +33 -0
  47. package/dist/react/hooks/useEntitySnapshot.js.map +1 -0
  48. package/dist/react/hooks/useRootEntityList.d.ts +9 -0
  49. package/dist/react/hooks/useRootEntityList.d.ts.map +1 -0
  50. package/dist/react/hooks/useRootEntityList.js +69 -0
  51. package/dist/react/hooks/useRootEntityList.js.map +1 -0
  52. package/dist/react/hooks/useScopedEntities.d.ts +9 -0
  53. package/dist/react/hooks/useScopedEntities.d.ts.map +1 -0
  54. package/dist/react/hooks/useScopedEntities.js +82 -0
  55. package/dist/react/hooks/useScopedEntities.js.map +1 -0
  56. package/dist/react/hooks/useSyncScope.d.ts +8 -0
  57. package/dist/react/hooks/useSyncScope.d.ts.map +1 -0
  58. package/dist/react/hooks/useSyncScope.js +49 -0
  59. package/dist/react/hooks/useSyncScope.js.map +1 -0
  60. package/dist/react/hooks/useTopLevelEntities.d.ts +7 -0
  61. package/dist/react/hooks/useTopLevelEntities.d.ts.map +1 -0
  62. package/dist/react/hooks/useTopLevelEntities.js +52 -0
  63. package/dist/react/hooks/useTopLevelEntities.js.map +1 -0
  64. package/dist/react/index.d.ts +11 -0
  65. package/dist/react/index.d.ts.map +1 -0
  66. package/dist/react/index.js +10 -0
  67. package/dist/react/index.js.map +1 -0
  68. package/dist/react/provider.d.ts +32 -0
  69. package/dist/react/provider.d.ts.map +1 -0
  70. package/dist/react/provider.js +94 -0
  71. package/dist/react/provider.js.map +1 -0
  72. package/dist/remote-sync-layer.d.ts +8 -0
  73. package/dist/remote-sync-layer.d.ts.map +1 -0
  74. package/dist/remote-sync-layer.js +439 -0
  75. package/dist/remote-sync-layer.js.map +1 -0
  76. package/dist/store.d.ts +3 -0
  77. package/dist/store.d.ts.map +1 -0
  78. package/dist/store.js +779 -0
  79. package/dist/store.js.map +1 -0
  80. package/dist/sync-engine.d.ts +3 -0
  81. package/dist/sync-engine.d.ts.map +1 -0
  82. package/dist/sync-engine.js +643 -0
  83. package/dist/sync-engine.js.map +1 -0
  84. package/dist/types.d.ts +263 -0
  85. package/dist/types.d.ts.map +1 -0
  86. package/dist/types.js +7 -0
  87. package/dist/types.js.map +1 -0
  88. package/dist/vue/StitchAuth.d.ts +58 -0
  89. package/dist/vue/StitchAuth.d.ts.map +1 -0
  90. package/dist/vue/StitchAuth.js +39 -0
  91. package/dist/vue/StitchAuth.js.map +1 -0
  92. package/dist/vue/StoreRoot.d.ts +41 -0
  93. package/dist/vue/StoreRoot.d.ts.map +1 -0
  94. package/dist/vue/StoreRoot.js +94 -0
  95. package/dist/vue/StoreRoot.js.map +1 -0
  96. package/dist/vue/composables/useChildCounts.d.ts +4 -0
  97. package/dist/vue/composables/useChildCounts.d.ts.map +1 -0
  98. package/dist/vue/composables/useChildCounts.js +85 -0
  99. package/dist/vue/composables/useChildCounts.js.map +1 -0
  100. package/dist/vue/composables/useConnectionStatus.d.ts +4 -0
  101. package/dist/vue/composables/useConnectionStatus.d.ts.map +1 -0
  102. package/dist/vue/composables/useConnectionStatus.js +12 -0
  103. package/dist/vue/composables/useConnectionStatus.js.map +1 -0
  104. package/dist/vue/composables/useEntitySnapshot.d.ts +5 -0
  105. package/dist/vue/composables/useEntitySnapshot.d.ts.map +1 -0
  106. package/dist/vue/composables/useEntitySnapshot.js +41 -0
  107. package/dist/vue/composables/useEntitySnapshot.js.map +1 -0
  108. package/dist/vue/composables/useRootEntityList.d.ts +10 -0
  109. package/dist/vue/composables/useRootEntityList.d.ts.map +1 -0
  110. package/dist/vue/composables/useRootEntityList.js +76 -0
  111. package/dist/vue/composables/useRootEntityList.js.map +1 -0
  112. package/dist/vue/composables/useScopedEntities.d.ts +10 -0
  113. package/dist/vue/composables/useScopedEntities.d.ts.map +1 -0
  114. package/dist/vue/composables/useScopedEntities.js +91 -0
  115. package/dist/vue/composables/useScopedEntities.js.map +1 -0
  116. package/dist/vue/composables/useStore.d.ts +3 -0
  117. package/dist/vue/composables/useStore.d.ts.map +1 -0
  118. package/dist/vue/composables/useStore.js +9 -0
  119. package/dist/vue/composables/useStore.js.map +1 -0
  120. package/dist/vue/composables/useSyncScope.d.ts +9 -0
  121. package/dist/vue/composables/useSyncScope.d.ts.map +1 -0
  122. package/dist/vue/composables/useSyncScope.js +50 -0
  123. package/dist/vue/composables/useSyncScope.js.map +1 -0
  124. package/dist/vue/composables/useTopLevelEntities.d.ts +8 -0
  125. package/dist/vue/composables/useTopLevelEntities.d.ts.map +1 -0
  126. package/dist/vue/composables/useTopLevelEntities.js +58 -0
  127. package/dist/vue/composables/useTopLevelEntities.js.map +1 -0
  128. package/dist/vue/index.d.ts +13 -0
  129. package/dist/vue/index.d.ts.map +1 -0
  130. package/dist/vue/index.js +12 -0
  131. package/dist/vue/index.js.map +1 -0
  132. package/dist/vue/injection-key.d.ts +10 -0
  133. package/dist/vue/injection-key.d.ts.map +1 -0
  134. package/dist/vue/injection-key.js +2 -0
  135. package/dist/vue/injection-key.js.map +1 -0
  136. package/package.json +111 -0
@@ -0,0 +1,69 @@
1
+ import { useEffect, useState, useCallback } from 'react';
2
+ import { applyEvent } from "../../internal-list-apply.js";
3
+ export function useRootEntityList(store) {
4
+ const rootEntity = store.config.scope.rootEntity;
5
+ const [items, setItems] = useState([]);
6
+ const [loading, setLoading] = useState(true);
7
+ const [error, setError] = useState(null);
8
+ const refetch = useCallback(async () => {
9
+ setLoading(true);
10
+ setError(null);
11
+ try {
12
+ const entities = await store.listRootEntities();
13
+ setItems(entities);
14
+ }
15
+ catch (err) {
16
+ setError(err instanceof Error ? err : new Error('Failed to fetch root entities'));
17
+ }
18
+ finally {
19
+ setLoading(false);
20
+ }
21
+ }, [store]);
22
+ useEffect(() => {
23
+ let fetched = false;
24
+ let cancelled = false;
25
+ const buffer = [];
26
+ const fetchAll = () => {
27
+ store
28
+ .listRootEntities()
29
+ .then((entities) => {
30
+ if (cancelled)
31
+ return;
32
+ let result = entities;
33
+ for (const { entity, op } of buffer) {
34
+ result = applyEvent(result, entity, op);
35
+ }
36
+ buffer.length = 0;
37
+ fetched = true;
38
+ setItems(result);
39
+ setLoading(false);
40
+ })
41
+ .catch((err) => {
42
+ if (cancelled)
43
+ return;
44
+ fetched = true;
45
+ buffer.length = 0;
46
+ setError(err instanceof Error ? err : new Error('Failed to fetch root entities'));
47
+ setLoading(false);
48
+ });
49
+ };
50
+ const unsubscribe = store.subscribeToEntity(rootEntity, (entity, op) => {
51
+ if (entity === null) {
52
+ fetchAll();
53
+ return;
54
+ }
55
+ if (!fetched) {
56
+ buffer.push({ entity, op });
57
+ return;
58
+ }
59
+ setItems((prev) => applyEvent(prev, entity, op));
60
+ });
61
+ fetchAll();
62
+ return () => {
63
+ cancelled = true;
64
+ unsubscribe();
65
+ };
66
+ }, [store, rootEntity]);
67
+ return { items, loading, error, refetch };
68
+ }
69
+ //# sourceMappingURL=useRootEntityList.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useRootEntityList.js","sourceRoot":"","sources":["../../../src/react/hooks/useRootEntityList.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { Store } from '../../types.ts';
2
+ import { type ListItem } from '../../internal-list-apply.ts';
3
+ export declare function useScopedEntities(store: Store, scopeId: string | null, entity: string): {
4
+ data: ListItem[];
5
+ loading: boolean;
6
+ error: Error | null;
7
+ refetch: () => Promise<void>;
8
+ };
9
+ //# sourceMappingURL=useScopedEntities.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useScopedEntities.d.ts","sourceRoot":"","sources":["../../../src/react/hooks/useScopedEntities.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAc,KAAK,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAEzE,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,MAAM,GAAG,IAAI,EACtB,MAAM,EAAE,MAAM,GACb;IACD,IAAI,EAAE,QAAQ,EAAE,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B,CAyFA"}
@@ -0,0 +1,82 @@
1
+ import { useEffect, useState, useCallback } from 'react';
2
+ import { applyEvent } from "../../internal-list-apply.js";
3
+ export function useScopedEntities(store, scopeId, entity) {
4
+ const effectiveScopeField = store.config.scope.scopeField;
5
+ const [data, setData] = useState([]);
6
+ const [loading, setLoading] = useState(true);
7
+ const [error, setError] = useState(null);
8
+ const refetch = useCallback(async () => {
9
+ if (!scopeId) {
10
+ setData([]);
11
+ setLoading(false);
12
+ return;
13
+ }
14
+ setLoading(true);
15
+ setError(null);
16
+ try {
17
+ const entities = await store.list(entity, { scopeId });
18
+ setData(entities);
19
+ }
20
+ catch (err) {
21
+ setError(err instanceof Error ? err : new Error('Failed to fetch entities'));
22
+ }
23
+ finally {
24
+ setLoading(false);
25
+ }
26
+ }, [store, scopeId, entity]);
27
+ useEffect(() => {
28
+ if (!scopeId) {
29
+ Promise.resolve().then(() => setData([]));
30
+ return;
31
+ }
32
+ let fetched = false;
33
+ let cancelled = false;
34
+ const buffer = [];
35
+ const fetchAll = () => {
36
+ store
37
+ .list(entity, { scopeId })
38
+ .then((entities) => {
39
+ if (cancelled)
40
+ return;
41
+ let result = entities;
42
+ for (const { entity: e, op } of buffer) {
43
+ result = applyEvent(result, e, op);
44
+ }
45
+ buffer.length = 0;
46
+ fetched = true;
47
+ setData(result);
48
+ setLoading(false);
49
+ })
50
+ .catch((err) => {
51
+ if (cancelled)
52
+ return;
53
+ fetched = true;
54
+ buffer.length = 0;
55
+ setError(err instanceof Error ? err : new Error('Failed to fetch entities'));
56
+ setLoading(false);
57
+ });
58
+ };
59
+ const unsubscribe = store.subscribeToEntity(entity, (entityData, op) => {
60
+ if (entityData === null) {
61
+ fetchAll();
62
+ return;
63
+ }
64
+ const rec = entityData;
65
+ if (rec[effectiveScopeField] !== scopeId) {
66
+ return;
67
+ }
68
+ if (!fetched) {
69
+ buffer.push({ entity: entityData, op });
70
+ return;
71
+ }
72
+ setData((prev) => applyEvent(prev, entityData, op));
73
+ });
74
+ fetchAll();
75
+ return () => {
76
+ cancelled = true;
77
+ unsubscribe();
78
+ };
79
+ }, [store, scopeId, entity, effectiveScopeField]);
80
+ return { data, loading, error, refetch };
81
+ }
82
+ //# sourceMappingURL=useScopedEntities.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useScopedEntities.js","sourceRoot":"","sources":["../../../src/react/hooks/useScopedEntities.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { Store } from '../../types.ts';
2
+ export declare function useSyncScope(store: Store, scopeId: string | null): {
3
+ syncing: boolean;
4
+ syncError: Error | null;
5
+ openScope: () => Promise<void>;
6
+ closeScope: () => Promise<void>;
7
+ };
8
+ //# sourceMappingURL=useSyncScope.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useSyncScope.d.ts","sourceRoot":"","sources":["../../../src/react/hooks/useSyncScope.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAE5C,wBAAgB,YAAY,CAC1B,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,MAAM,GAAG,IAAI,GACrB;IACD,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,KAAK,GAAG,IAAI,CAAC;IACxB,SAAS,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,UAAU,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CACjC,CAiDA"}
@@ -0,0 +1,49 @@
1
+ import { useEffect, useState, useCallback, useRef } from 'react';
2
+ export function useSyncScope(store, scopeId) {
3
+ const [syncing, setSyncing] = useState(false);
4
+ const [syncError, setSyncError] = useState(null);
5
+ const openedRef = useRef(null);
6
+ const currentScopeIdRef = useRef(scopeId);
7
+ useEffect(() => {
8
+ currentScopeIdRef.current = scopeId;
9
+ }, [scopeId]);
10
+ const openScope = useCallback(async () => {
11
+ if (!scopeId || openedRef.current === scopeId)
12
+ return;
13
+ setSyncing(true);
14
+ setSyncError(null);
15
+ try {
16
+ await store.replaceScope(scopeId);
17
+ if (currentScopeIdRef.current === scopeId) {
18
+ openedRef.current = scopeId;
19
+ }
20
+ }
21
+ catch (err) {
22
+ setSyncError(err instanceof Error ? err : new Error('Failed to open scope'));
23
+ }
24
+ finally {
25
+ setSyncing(false);
26
+ }
27
+ }, [store, scopeId]);
28
+ const closeScope = useCallback(async () => {
29
+ if (!openedRef.current)
30
+ return;
31
+ try {
32
+ await store.closeScope(openedRef.current);
33
+ openedRef.current = null;
34
+ }
35
+ catch (err) {
36
+ console.error('[useSyncScope] Failed to close scope:', err);
37
+ }
38
+ }, [store]);
39
+ useEffect(() => {
40
+ return () => {
41
+ if (openedRef.current) {
42
+ store.closeScope(openedRef.current).catch(() => { });
43
+ openedRef.current = null;
44
+ }
45
+ };
46
+ }, [store, scopeId]);
47
+ return { syncing, syncError, openScope, closeScope };
48
+ }
49
+ //# sourceMappingURL=useSyncScope.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useSyncScope.js","sourceRoot":"","sources":["../../../src/react/hooks/useSyncScope.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAGjE,MAAM,UAAU,YAAY,CAC1B,KAAY,EACZ,OAAsB;IAOtB,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC9C,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAe,IAAI,CAAC,CAAC;IAC/D,MAAM,SAAS,GAAG,MAAM,CAAgB,IAAI,CAAC,CAAC;IAC9C,MAAM,iBAAiB,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;IAE1C,SAAS,CAAC,GAAG,EAAE;QACb,iBAAiB,CAAC,OAAO,GAAG,OAAO,CAAC;IACtC,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAEd,MAAM,SAAS,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QACvC,IAAI,CAAC,OAAO,IAAI,SAAS,CAAC,OAAO,KAAK,OAAO;YAAE,OAAO;QAEtD,UAAU,CAAC,IAAI,CAAC,CAAC;QACjB,YAAY,CAAC,IAAI,CAAC,CAAC;QAEnB,IAAI,CAAC;YACH,MAAM,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;YAClC,IAAI,iBAAiB,CAAC,OAAO,KAAK,OAAO,EAAE,CAAC;gBAC1C,SAAS,CAAC,OAAO,GAAG,OAAO,CAAC;YAC9B,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,YAAY,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC,CAAC;QAC/E,CAAC;gBAAS,CAAC;YACT,UAAU,CAAC,KAAK,CAAC,CAAC;QACpB,CAAC;IACH,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;IAErB,MAAM,UAAU,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QACxC,IAAI,CAAC,SAAS,CAAC,OAAO;YAAE,OAAO;QAE/B,IAAI,CAAC;YACH,MAAM,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;YAC1C,SAAS,CAAC,OAAO,GAAG,IAAI,CAAC;QAC3B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,uCAAuC,EAAE,GAAG,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAEZ,SAAS,CAAC,GAAG,EAAE;QACb,OAAO,GAAG,EAAE;YACV,IAAI,SAAS,CAAC,OAAO,EAAE,CAAC;gBACtB,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;gBACpD,SAAS,CAAC,OAAO,GAAG,IAAI,CAAC;YAC3B,CAAC;QACH,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;IAErB,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC;AACvD,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { Store } from '../../types.ts';
2
+ import { type ListItem } from '../../internal-list-apply.ts';
3
+ export declare function useTopLevelEntities(store: Store, entity: string): {
4
+ items: ListItem[];
5
+ loading: boolean;
6
+ };
7
+ //# sourceMappingURL=useTopLevelEntities.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useTopLevelEntities.d.ts","sourceRoot":"","sources":["../../../src/react/hooks/useTopLevelEntities.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAc,KAAK,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAEzE,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,MAAM,GACb;IACD,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;CAClB,CAuDA"}
@@ -0,0 +1,52 @@
1
+ import { useEffect, useState } from 'react';
2
+ import { applyEvent } from "../../internal-list-apply.js";
3
+ export function useTopLevelEntities(store, entity) {
4
+ const [items, setItems] = useState([]);
5
+ const [loading, setLoading] = useState(true);
6
+ useEffect(() => {
7
+ let fetched = false;
8
+ let cancelled = false;
9
+ const buffer = [];
10
+ const fetchAll = () => {
11
+ store
12
+ .list(entity)
13
+ .then((entities) => {
14
+ if (cancelled)
15
+ return;
16
+ let result = entities;
17
+ for (const { entity: e, op } of buffer) {
18
+ result = applyEvent(result, e, op);
19
+ }
20
+ buffer.length = 0;
21
+ fetched = true;
22
+ setItems(result);
23
+ setLoading(false);
24
+ })
25
+ .catch(() => {
26
+ if (cancelled)
27
+ return;
28
+ fetched = true;
29
+ buffer.length = 0;
30
+ setLoading(false);
31
+ });
32
+ };
33
+ const unsubscribe = store.subscribeToEntity(entity, (entityData, op) => {
34
+ if (entityData === null) {
35
+ fetchAll();
36
+ return;
37
+ }
38
+ if (!fetched) {
39
+ buffer.push({ entity: entityData, op });
40
+ return;
41
+ }
42
+ setItems((prev) => applyEvent(prev, entityData, op));
43
+ });
44
+ fetchAll();
45
+ return () => {
46
+ cancelled = true;
47
+ unsubscribe();
48
+ };
49
+ }, [store, entity]);
50
+ return { items, loading };
51
+ }
52
+ //# sourceMappingURL=useTopLevelEntities.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useTopLevelEntities.js","sourceRoot":"","sources":["../../../src/react/hooks/useTopLevelEntities.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAE5C,OAAO,EAAE,UAAU,EAAiB,MAAM,8BAA8B,CAAC;AAEzE,MAAM,UAAU,mBAAmB,CACjC,KAAY,EACZ,MAAc;IAKd,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAa,EAAE,CAAC,CAAC;IACnD,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAE7C,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,IAAI,SAAS,GAAG,KAAK,CAAC;QACtB,MAAM,MAAM,GAAmE,EAAE,CAAC;QAElF,MAAM,QAAQ,GAAG,GAAG,EAAE;YACpB,KAAK;iBACF,IAAI,CAAC,MAAM,CAAC;iBACZ,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE;gBACjB,IAAI,SAAS;oBAAE,OAAO;gBACtB,IAAI,MAAM,GAAG,QAAsB,CAAC;gBACpC,KAAK,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,IAAI,MAAM,EAAE,CAAC;oBACvC,MAAM,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;gBACrC,CAAC;gBACD,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;gBAClB,OAAO,GAAG,IAAI,CAAC;gBACf,QAAQ,CAAC,MAAM,CAAC,CAAC;gBACjB,UAAU,CAAC,KAAK,CAAC,CAAC;YACpB,CAAC,CAAC;iBACD,KAAK,CAAC,GAAG,EAAE;gBACV,IAAI,SAAS;oBAAE,OAAO;gBACtB,OAAO,GAAG,IAAI,CAAC;gBACf,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;gBAClB,UAAU,CAAC,KAAK,CAAC,CAAC;YACpB,CAAC,CAAC,CAAC;QACP,CAAC,CAAC;QAEF,MAAM,WAAW,GAAG,KAAK,CAAC,iBAAiB,CACzC,MAAM,EACN,CAAC,UAAmB,EAAE,EAAkC,EAAE,EAAE;YAC1D,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;gBACxB,QAAQ,EAAE,CAAC;gBACX,OAAO;YACT,CAAC;YACD,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC;gBACxC,OAAO;YACT,CAAC;YACD,QAAQ,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC;QACvD,CAAC,CACF,CAAC;QAEF,QAAQ,EAAE,CAAC;QAEX,OAAO,GAAG,EAAE;YACV,SAAS,GAAG,IAAI,CAAC;YACjB,WAAW,EAAE,CAAC;QAChB,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;IAEpB,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;AAC5B,CAAC"}
@@ -0,0 +1,11 @@
1
+ export { StoreContext, useStore } from './context.ts';
2
+ export type { StoreContextValue } from './context.ts';
3
+ export { StoreProvider, AuthProvider } from './provider.tsx';
4
+ export { useEntitySnapshot, useEntitySnapshotAsMap } from './hooks/useEntitySnapshot.ts';
5
+ export { useConnectionStatus } from './hooks/useConnectionStatus.ts';
6
+ export { useScopedEntities } from './hooks/useScopedEntities.ts';
7
+ export { useRootEntityList } from './hooks/useRootEntityList.ts';
8
+ export { useTopLevelEntities } from './hooks/useTopLevelEntities.ts';
9
+ export { useChildCounts } from './hooks/useChildCounts.ts';
10
+ export { useSyncScope } from './hooks/useSyncScope.ts';
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACtD,YAAY,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AACzF,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AACrE,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AACrE,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC"}
@@ -0,0 +1,10 @@
1
+ export { StoreContext, useStore } from "./context.js";
2
+ export { StoreProvider, AuthProvider } from "./provider.js";
3
+ export { useEntitySnapshot, useEntitySnapshotAsMap } from "./hooks/useEntitySnapshot.js";
4
+ export { useConnectionStatus } from "./hooks/useConnectionStatus.js";
5
+ export { useScopedEntities } from "./hooks/useScopedEntities.js";
6
+ export { useRootEntityList } from "./hooks/useRootEntityList.js";
7
+ export { useTopLevelEntities } from "./hooks/useTopLevelEntities.js";
8
+ export { useChildCounts } from "./hooks/useChildCounts.js";
9
+ export { useSyncScope } from "./hooks/useSyncScope.js";
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAEtD,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,eAAgB,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AACzF,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AACrE,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AACrE,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC"}
@@ -0,0 +1,32 @@
1
+ import { type ReactNode } from 'react';
2
+ import type { Store } from '../types.ts';
3
+ interface StoreProviderProps {
4
+ store: Store;
5
+ serverUrl?: string;
6
+ getTicket?: () => Promise<string>;
7
+ children: ReactNode;
8
+ }
9
+ /**
10
+ * Store lifecycle only — initializes the store, tracks connection status, and
11
+ * handles visibility-change reconnection. Authentication concerns (userId, session
12
+ * handlers, logout gating) live in {@link AuthProvider}; compose both if you need
13
+ * an auth-aware app.
14
+ */
15
+ export declare function StoreProvider({ store, serverUrl, getTicket, children }: StoreProviderProps): import("react/jsx-runtime").JSX.Element;
16
+ interface AuthProviderProps {
17
+ store: Store;
18
+ userId?: string;
19
+ /** When false, the store is torn down via `resetForLogout()` and remote sync disconnects. Defaults to `true`. */
20
+ authenticated?: boolean;
21
+ onSessionInvalid?: () => void;
22
+ onReconnectValidate?: () => Promise<void>;
23
+ children?: ReactNode;
24
+ }
25
+ /**
26
+ * Binds authentication-related state to the store. Nest inside a {@link StoreProvider}.
27
+ * Controls `setAuthenticatedUser`, session-invalid + reconnect-validator handlers, and
28
+ * tears down the store via `resetForLogout()` when `authenticated` transitions to false.
29
+ */
30
+ export declare function AuthProvider({ store, userId, authenticated, onSessionInvalid, onReconnectValidate, children, }: AuthProviderProps): import("react/jsx-runtime").JSX.Element;
31
+ export {};
32
+ //# sourceMappingURL=provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../src/react/provider.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAgC,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AACrE,OAAO,KAAK,EAAoB,KAAK,EAAE,MAAM,aAAa,CAAC;AAG3D,UAAU,kBAAkB;IAC1B,KAAK,EAAE,KAAK,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IAClC,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,kBAAkB,2CA8E1F;AAED,UAAU,iBAAiB;IACzB,KAAK,EAAE,KAAK,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iHAAiH;IACjH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,IAAI,CAAC;IAC9B,mBAAmB,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1C,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,EAC3B,KAAK,EACL,MAAM,EACN,aAAoB,EACpB,gBAAgB,EAChB,mBAAmB,EACnB,QAAQ,GACT,EAAE,iBAAiB,2CAanB"}
@@ -0,0 +1,94 @@
1
+ import { jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useEffect, useState, useMemo } from 'react';
3
+ import { StoreContext } from "./context.js";
4
+ /**
5
+ * Store lifecycle only — initializes the store, tracks connection status, and
6
+ * handles visibility-change reconnection. Authentication concerns (userId, session
7
+ * handlers, logout gating) live in {@link AuthProvider}; compose both if you need
8
+ * an auth-aware app.
9
+ */
10
+ export function StoreProvider({ store, serverUrl, getTicket, children }) {
11
+ const [initialized, setInitialized] = useState(false);
12
+ const [connectionStatus, setConnectionStatus] = useState('offline');
13
+ const [error, setError] = useState(null);
14
+ useEffect(() => {
15
+ let mounted = true;
16
+ async function init() {
17
+ try {
18
+ if (!store.ready) {
19
+ await store.initialize();
20
+ }
21
+ if (mounted)
22
+ setInitialized(true);
23
+ }
24
+ catch (err) {
25
+ console.error('[StoreProvider] Initialization failed:', err);
26
+ if (mounted) {
27
+ setError(err instanceof Error ? err : new Error('Store initialization failed'));
28
+ }
29
+ }
30
+ }
31
+ init();
32
+ return () => {
33
+ mounted = false;
34
+ };
35
+ }, [store]);
36
+ useEffect(() => {
37
+ const unsubscribe = store.subscribeToConnectionStatus((status) => {
38
+ setConnectionStatus(status);
39
+ });
40
+ function handleBeforeUnload() {
41
+ store.disconnect();
42
+ }
43
+ window.addEventListener('beforeunload', handleBeforeUnload);
44
+ return () => {
45
+ unsubscribe();
46
+ window.removeEventListener('beforeunload', handleBeforeUnload);
47
+ };
48
+ }, [store]);
49
+ useEffect(() => {
50
+ if (!initialized || !store.hasRemote)
51
+ return;
52
+ let lastHidden = 0;
53
+ const STALE_THRESHOLD_MS = 30_000;
54
+ function handleVisibilityChange() {
55
+ if (document.hidden) {
56
+ lastHidden = Date.now();
57
+ return;
58
+ }
59
+ if (lastHidden > 0 && Date.now() - lastHidden > STALE_THRESHOLD_MS && serverUrl) {
60
+ if (store.connectionStatus !== 'connected' && !store.isReconnecting) {
61
+ store
62
+ .reconnect(serverUrl, getTicket)
63
+ .catch((err) => console.error('[StoreProvider] Reconnect on wake failed:', err));
64
+ }
65
+ }
66
+ }
67
+ document.addEventListener('visibilitychange', handleVisibilityChange);
68
+ return () => document.removeEventListener('visibilitychange', handleVisibilityChange);
69
+ }, [initialized, store, serverUrl, getTicket]);
70
+ const contextValue = useMemo(() => ({ store, initialized, connectionStatus, error }), [store, initialized, connectionStatus, error]);
71
+ return _jsx(StoreContext.Provider, { value: contextValue, children: children });
72
+ }
73
+ /**
74
+ * Binds authentication-related state to the store. Nest inside a {@link StoreProvider}.
75
+ * Controls `setAuthenticatedUser`, session-invalid + reconnect-validator handlers, and
76
+ * tears down the store via `resetForLogout()` when `authenticated` transitions to false.
77
+ */
78
+ export function AuthProvider({ store, userId, authenticated = true, onSessionInvalid, onReconnectValidate, children, }) {
79
+ useEffect(() => {
80
+ if (!authenticated) {
81
+ store.disconnect();
82
+ store.resetForLogout();
83
+ return;
84
+ }
85
+ if (userId)
86
+ store.setAuthenticatedUser(userId);
87
+ if (onSessionInvalid)
88
+ store.setSessionInvalidHandler(onSessionInvalid);
89
+ if (onReconnectValidate)
90
+ store.setReconnectValidator(onReconnectValidate);
91
+ }, [store, userId, authenticated, onSessionInvalid, onReconnectValidate]);
92
+ return _jsx(_Fragment, { children: children });
93
+ }
94
+ //# sourceMappingURL=provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.js","sourceRoot":"","sources":["../../src/react/provider.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { StoreConfig, SyncMutation, ConnectionStatus, RemoteSyncLayer } from './types.ts';
2
+ export declare function createRemoteSyncLayer(config: StoreConfig): RemoteSyncLayer & {
3
+ setMutationCallback(cb: (mutation: SyncMutation) => void): void;
4
+ setConnectionChangeCallback(cb: (status: ConnectionStatus) => void): void;
5
+ setOnConnectedCallback(cb: () => void): void;
6
+ readonly isInitialSyncDone: boolean;
7
+ };
8
+ //# sourceMappingURL=remote-sync-layer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remote-sync-layer.d.ts","sourceRoot":"","sources":["../src/remote-sync-layer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EACX,YAAY,EAEZ,gBAAgB,EAGhB,eAAe,EAGhB,MAAM,YAAY,CAAC;AAuepB,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,WAAW,GAAG,eAAe,GAAG;IAC5E,mBAAmB,CAAC,EAAE,EAAE,CAAC,QAAQ,EAAE,YAAY,KAAK,IAAI,GAAG,IAAI,CAAC;IAChE,2BAA2B,CAAC,EAAE,EAAE,CAAC,MAAM,EAAE,gBAAgB,KAAK,IAAI,GAAG,IAAI,CAAC;IAC1E,sBAAsB,CAAC,EAAE,EAAE,MAAM,IAAI,GAAG,IAAI,CAAC;IAC7C,QAAQ,CAAC,iBAAiB,EAAE,OAAO,CAAC;CACrC,CAEA"}