@livestore/react 0.4.0-dev.21 → 0.4.0-dev.23

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 (125) hide show
  1. package/README.md +1 -1
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/StoreRegistryContext.d.ts +56 -0
  4. package/dist/StoreRegistryContext.d.ts.map +1 -0
  5. package/dist/StoreRegistryContext.js +61 -0
  6. package/dist/StoreRegistryContext.js.map +1 -0
  7. package/dist/__tests__/fixture.d.ts +8 -280
  8. package/dist/__tests__/fixture.d.ts.map +1 -1
  9. package/dist/__tests__/fixture.js +9 -84
  10. package/dist/__tests__/fixture.js.map +1 -1
  11. package/dist/experimental/components/LiveList.d.ts +4 -2
  12. package/dist/experimental/components/LiveList.d.ts.map +1 -1
  13. package/dist/experimental/components/LiveList.js +9 -7
  14. package/dist/experimental/components/LiveList.js.map +1 -1
  15. package/dist/experimental/mod.d.ts +0 -1
  16. package/dist/experimental/mod.d.ts.map +1 -1
  17. package/dist/experimental/mod.js +0 -1
  18. package/dist/experimental/mod.js.map +1 -1
  19. package/dist/mod.d.ts +8 -5
  20. package/dist/mod.d.ts.map +1 -1
  21. package/dist/mod.js +6 -4
  22. package/dist/mod.js.map +1 -1
  23. package/dist/useClientDocument.d.ts +1 -26
  24. package/dist/useClientDocument.d.ts.map +1 -1
  25. package/dist/useClientDocument.js +3 -17
  26. package/dist/useClientDocument.js.map +1 -1
  27. package/dist/useClientDocument.test.js +12 -4
  28. package/dist/useClientDocument.test.js.map +1 -1
  29. package/dist/useQuery.d.ts +4 -5
  30. package/dist/useQuery.d.ts.map +1 -1
  31. package/dist/useQuery.js +12 -85
  32. package/dist/useQuery.js.map +1 -1
  33. package/dist/useQuery.test.js +7 -8
  34. package/dist/useQuery.test.js.map +1 -1
  35. package/dist/useRcResource.d.ts.map +1 -1
  36. package/dist/useRcResource.js +9 -5
  37. package/dist/useRcResource.js.map +1 -1
  38. package/dist/useRcResource.test.js +1 -1
  39. package/dist/useRcResource.test.js.map +1 -1
  40. package/dist/useStore.d.ts +61 -46
  41. package/dist/useStore.d.ts.map +1 -1
  42. package/dist/useStore.js +75 -60
  43. package/dist/useStore.js.map +1 -1
  44. package/dist/useStore.test.d.ts.map +1 -0
  45. package/dist/{experimental/multi-store/useStore.test.js → useStore.test.js} +70 -27
  46. package/dist/useStore.test.js.map +1 -0
  47. package/dist/useSyncStatus.d.ts +22 -0
  48. package/dist/useSyncStatus.d.ts.map +1 -0
  49. package/dist/useSyncStatus.js +28 -0
  50. package/dist/useSyncStatus.js.map +1 -0
  51. package/package.json +69 -26
  52. package/src/StoreRegistryContext.tsx +70 -0
  53. package/src/__snapshots__/useClientDocument.test.tsx.snap +112 -78
  54. package/src/__tests__/fixture.tsx +23 -118
  55. package/src/experimental/components/LiveList.tsx +22 -9
  56. package/src/experimental/mod.ts +0 -1
  57. package/src/mod.ts +8 -12
  58. package/src/useClientDocument.test.tsx +16 -6
  59. package/src/useClientDocument.ts +7 -61
  60. package/src/useQuery.test.tsx +8 -8
  61. package/src/useQuery.ts +30 -119
  62. package/src/useRcResource.test.tsx +1 -1
  63. package/src/useRcResource.ts +10 -5
  64. package/src/{experimental/multi-store/useStore.test.tsx → useStore.test.tsx} +117 -39
  65. package/src/useStore.ts +106 -65
  66. package/src/useSyncStatus.ts +34 -0
  67. package/dist/LiveStoreContext.d.ts +0 -40
  68. package/dist/LiveStoreContext.d.ts.map +0 -1
  69. package/dist/LiveStoreContext.js +0 -21
  70. package/dist/LiveStoreContext.js.map +0 -1
  71. package/dist/LiveStoreProvider.d.ts +0 -73
  72. package/dist/LiveStoreProvider.d.ts.map +0 -1
  73. package/dist/LiveStoreProvider.js +0 -233
  74. package/dist/LiveStoreProvider.js.map +0 -1
  75. package/dist/LiveStoreProvider.test.d.ts +0 -2
  76. package/dist/LiveStoreProvider.test.d.ts.map +0 -1
  77. package/dist/LiveStoreProvider.test.js +0 -117
  78. package/dist/LiveStoreProvider.test.js.map +0 -1
  79. package/dist/experimental/multi-store/StoreRegistry.d.ts +0 -105
  80. package/dist/experimental/multi-store/StoreRegistry.d.ts.map +0 -1
  81. package/dist/experimental/multi-store/StoreRegistry.js +0 -184
  82. package/dist/experimental/multi-store/StoreRegistry.js.map +0 -1
  83. package/dist/experimental/multi-store/StoreRegistry.test.d.ts +0 -2
  84. package/dist/experimental/multi-store/StoreRegistry.test.d.ts.map +0 -1
  85. package/dist/experimental/multi-store/StoreRegistry.test.js +0 -381
  86. package/dist/experimental/multi-store/StoreRegistry.test.js.map +0 -1
  87. package/dist/experimental/multi-store/StoreRegistryContext.d.ts +0 -10
  88. package/dist/experimental/multi-store/StoreRegistryContext.d.ts.map +0 -1
  89. package/dist/experimental/multi-store/StoreRegistryContext.js +0 -15
  90. package/dist/experimental/multi-store/StoreRegistryContext.js.map +0 -1
  91. package/dist/experimental/multi-store/mod.d.ts +0 -6
  92. package/dist/experimental/multi-store/mod.d.ts.map +0 -1
  93. package/dist/experimental/multi-store/mod.js +0 -6
  94. package/dist/experimental/multi-store/mod.js.map +0 -1
  95. package/dist/experimental/multi-store/storeOptions.d.ts +0 -4
  96. package/dist/experimental/multi-store/storeOptions.d.ts.map +0 -1
  97. package/dist/experimental/multi-store/storeOptions.js +0 -4
  98. package/dist/experimental/multi-store/storeOptions.js.map +0 -1
  99. package/dist/experimental/multi-store/types.d.ts +0 -25
  100. package/dist/experimental/multi-store/types.d.ts.map +0 -1
  101. package/dist/experimental/multi-store/types.js +0 -2
  102. package/dist/experimental/multi-store/types.js.map +0 -1
  103. package/dist/experimental/multi-store/useStore.d.ts +0 -11
  104. package/dist/experimental/multi-store/useStore.d.ts.map +0 -1
  105. package/dist/experimental/multi-store/useStore.js +0 -16
  106. package/dist/experimental/multi-store/useStore.js.map +0 -1
  107. package/dist/experimental/multi-store/useStore.test.d.ts.map +0 -1
  108. package/dist/experimental/multi-store/useStore.test.js.map +0 -1
  109. package/dist/utils/stack-info.d.ts +0 -4
  110. package/dist/utils/stack-info.d.ts.map +0 -1
  111. package/dist/utils/stack-info.js +0 -10
  112. package/dist/utils/stack-info.js.map +0 -1
  113. package/src/LiveStoreContext.ts +0 -41
  114. package/src/LiveStoreProvider.test.tsx +0 -248
  115. package/src/LiveStoreProvider.tsx +0 -430
  116. package/src/ambient.d.ts +0 -1
  117. package/src/experimental/multi-store/StoreRegistry.test.ts +0 -518
  118. package/src/experimental/multi-store/StoreRegistry.ts +0 -253
  119. package/src/experimental/multi-store/StoreRegistryContext.tsx +0 -23
  120. package/src/experimental/multi-store/mod.ts +0 -5
  121. package/src/experimental/multi-store/storeOptions.ts +0 -8
  122. package/src/experimental/multi-store/types.ts +0 -37
  123. package/src/experimental/multi-store/useStore.ts +0 -26
  124. package/src/utils/stack-info.ts +0 -13
  125. /package/dist/{experimental/multi-store/useStore.test.d.ts → useStore.test.d.ts} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"useRcResource.js","sourceRoot":"","sources":["../src/useRcResource.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useRcResource.js","sourceRoot":"","sources":["../src/useRcResource.ts"],"names":[],"mappings":"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"}
@@ -6,7 +6,7 @@ describe.each([{ strictMode: true }, { strictMode: false }])('useRcResource (str
6
6
  beforeEach(() => {
7
7
  __resetUseRcResourceCache();
8
8
  });
9
- const wrapper = strictMode ? React.StrictMode : React.Fragment;
9
+ const wrapper = strictMode === true ? React.StrictMode : React.Fragment;
10
10
  it('should create a stateful entity using make and call cleanup on unmount', () => {
11
11
  const makeSpy = vi.fn(() => Symbol('statefulResource'));
12
12
  const cleanupSpy = vi.fn();
@@ -1 +1 @@
1
- {"version":3,"file":"useRcResource.test.js","sourceRoot":"","sources":["../src/useRcResource.test.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useRcResource.test.js","sourceRoot":"","sources":["../src/useRcResource.test.tsx"],"names":[],"mappings":"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"}
@@ -1,61 +1,76 @@
1
1
  import type { LiveStoreSchema } from '@livestore/common/schema';
2
- import type { Store } from '@livestore/livestore';
3
- import type { ReactApi } from './LiveStoreContext.ts';
2
+ import type { RegistryStoreOptions, Store, SyncStatus } from '@livestore/livestore';
3
+ import type { Schema } from '@livestore/utils/effect';
4
+ import { useClientDocument } from './useClientDocument.ts';
5
+ import { useQuery } from './useQuery.ts';
4
6
  /**
5
- * Augments a Store instance with React-specific methods (`useQuery`, `useClientDocument`).
6
- *
7
- * This is called automatically by `useStore()` and `LiveStoreProvider`. You typically
8
- * don't need to call it directly unless you're building custom integrations.
7
+ * Returns a store instance augmented with hooks (`store.useQuery()` and `store.useClientDocument()`) for reactive queries.
9
8
  *
10
9
  * @example
11
- * ```ts
12
- * // Usually not needed—useStore() does this automatically
13
- * const store = withReactApi(myStore)
14
- * const todos = store.useQuery(tables.todos.all())
15
- * ```
16
- */
17
- export declare const withReactApi: <TSchema extends LiveStoreSchema>(store: Store<TSchema>) => Store<TSchema> & ReactApi;
18
- /**
19
- * Returns the current Store instance from React context, augmented with React-specific methods.
10
+ * ```tsx
11
+ * function Issue() {
12
+ * // Suspends until loaded or returns immediately if already loaded
13
+ * const issueStore = useStore(issueStoreOptions('abc123'))
14
+ * const [issue] = issueStore.useQuery(queryDb(tables.issue.select()))
20
15
  *
21
- * Use this hook when you need direct access to the Store for operations like
22
- * `store.commit()`, `store.subscribe()`, or accessing `store.sessionId`.
16
+ * const toggleStatus = () =>
17
+ * issueStore.commit(
18
+ * issueEvents.issueStatusChanged({
19
+ * id: issue.id,
20
+ * status: issue.status === 'done' ? 'todo' : 'done',
21
+ * }),
22
+ * )
23
23
  *
24
- * For reactive queries, prefer `useQuery()` or `useClientDocument()` which handle
25
- * subscriptions and re-renders automatically.
24
+ * const preloadParentIssue = (issueId: string) =>
25
+ * storeRegistry.preload({
26
+ * ...issueStoreOptions(issueId),
27
+ * unusedCacheTime: 10_000,
28
+ * })
26
29
  *
27
- * @example
28
- * ```ts
29
- * const MyComponent = () => {
30
- * const { store } = useStore()
31
- *
32
- * const handleClick = () => {
33
- * store.commit(events.todoCreated({ id: nanoid(), text: 'New todo' }))
34
- * }
35
- *
36
- * return <button onClick={handleClick}>Add Todo</button>
30
+ * return (
31
+ * <>
32
+ * <h2>{issue.title}</h2>
33
+ * <button onClick={() => toggleStatus()}>Toggle Status</button>
34
+ * <button onMouseEnter={() => preloadParentIssue(issue.parentIssueId)}>Open Parent Issue</button>
35
+ * </>
36
+ * )
37
37
  * }
38
38
  * ```
39
39
  *
40
- * @example
41
- * ```ts
42
- * // Access store metadata
43
- * const { store } = useStore()
44
- * console.log('Session ID:', store.sessionId)
45
- * console.log('Client ID:', store.clientId)
46
- * ```
40
+ * @remarks
41
+ * - Suspends until the store is loaded.
42
+ * - Store is cached by its `storeId` in the `StoreRegistry`. Multiple calls with the same `storeId` return the same store instance.
43
+ * - Store is cached as long as it's being used, and after `unusedCacheTime` expires (default `60_000` ms in browser, `Infinity` in non-browser)
44
+ * - Default store options can be configured in `StoreRegistry` constructor.
45
+ * - Store options are only applied when the store is loaded. Subsequent calls with different options will not affect the store if it's already loaded and cached in the registry.
47
46
  *
48
- * @example
49
- * ```ts
50
- * // Use with an explicit store instance (bypasses context)
51
- * const { store } = useStore({ store: myExternalStore })
52
- * ```
47
+ * @typeParam TSchema - The schema type for the store
48
+ * @returns The loaded store instance augmented with React hooks
49
+ * @throws unknown - store loading error or if called outside `<StoreRegistryProvider>`
50
+ */
51
+ export declare const useStore: <TSchema extends LiveStoreSchema, TContext = {}, TSyncPayloadSchema extends Schema.Schema<any> = typeof Schema.JsonValue>(options: RegistryStoreOptions<TSchema, TContext, TSyncPayloadSchema>) => Store<TSchema, TContext> & ReactApi;
52
+ /**
53
+ * React-specific methods added to the Store when used via React hooks.
53
54
  *
54
- * @throws Error if called outside of `<LiveStoreProvider>` or before the store is running
55
+ * These methods are attached by `withReactApi()` and `useStore()`, allowing you
56
+ * to call `store.useQuery()` and `store.useClientDocument()` directly on the
57
+ * Store instance.
55
58
  */
56
- export declare const useStore: (options?: {
57
- store?: Store;
58
- }) => {
59
- store: Store & ReactApi;
59
+ export type ReactApi = {
60
+ /** Hook version of query subscription—re-renders component when query result changes */
61
+ useQuery: typeof useQuery;
62
+ /** Hook for reading and writing client-document tables with React state semantics */
63
+ useClientDocument: typeof useClientDocument;
64
+ /** Hook for subscribing to sync status changes */
65
+ useSyncStatus: () => SyncStatus;
60
66
  };
67
+ /**
68
+ * Augments a Store instance with React-specific methods (`useQuery`, `useClientDocument`).
69
+ *
70
+ * This is called automatically by `useStore()`. You typically don't need to call it
71
+ * directly unless you're building custom integrations.
72
+ *
73
+ * @internal
74
+ */
75
+ export declare const withReactApi: <TSchema extends LiveStoreSchema, TContext = {}>(store: Store<TSchema, TContext>) => Store<TSchema, TContext> & ReactApi;
61
76
  //# sourceMappingURL=useStore.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useStore.d.ts","sourceRoot":"","sources":["../src/useStore.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAA;AAC/D,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAA;AAGjD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AAKrD;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,YAAY,GAAI,OAAO,SAAS,eAAe,EAAE,OAAO,KAAK,CAAC,OAAO,CAAC,KAAG,KAAK,CAAC,OAAO,CAAC,GAAG,QAQtG,CAAA;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AACH,eAAO,MAAM,QAAQ,GAAI,UAAU;IAAE,KAAK,CAAC,EAAE,KAAK,CAAA;CAAE,KAAG;IAAE,KAAK,EAAE,KAAK,GAAG,QAAQ,CAAA;CAiB/E,CAAA"}
1
+ {"version":3,"file":"useStore.d.ts","sourceRoot":"","sources":["../src/useStore.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAA;AAC/D,OAAO,KAAK,EAAE,oBAAoB,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AACnF,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAGrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC1D,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAGxC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4CG;AACH,eAAO,MAAM,QAAQ,GACnB,OAAO,SAAS,eAAe,EAC/B,QAAQ,GAAG,EAAE,EACb,kBAAkB,SAAS,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,OAAO,MAAM,CAAC,SAAS,EAEvE,SAAS,oBAAoB,CAAC,OAAO,EAAE,QAAQ,EAAE,kBAAkB,CAAC,KACnE,KAAK,CAAC,OAAO,EAAE,QAAQ,CAAC,GAAG,QA2B7B,CAAA;AAED;;;;;;GAMG;AACH,MAAM,MAAM,QAAQ,GAAG;IACrB,wFAAwF;IACxF,QAAQ,EAAE,OAAO,QAAQ,CAAA;IACzB,qFAAqF;IACrF,iBAAiB,EAAE,OAAO,iBAAiB,CAAA;IAC3C,kDAAkD;IAClD,aAAa,EAAE,MAAM,UAAU,CAAA;CAChC,CAAA;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,YAAY,GAAI,OAAO,SAAS,eAAe,EAAE,QAAQ,GAAG,EAAE,EACzE,OAAO,KAAK,CAAC,OAAO,EAAE,QAAQ,CAAC,KAC9B,KAAK,CAAC,OAAO,EAAE,QAAQ,CAAC,GAAG,QAW7B,CAAA"}
package/dist/useStore.js CHANGED
@@ -1,77 +1,92 @@
1
1
  import React from 'react';
2
- import { LiveStoreContext } from "./LiveStoreContext.js";
2
+ import { useStoreRegistry } from "./StoreRegistryContext.js";
3
3
  import { useClientDocument } from "./useClientDocument.js";
4
4
  import { useQuery } from "./useQuery.js";
5
+ import { useSyncStatus } from "./useSyncStatus.js";
5
6
  /**
6
- * Augments a Store instance with React-specific methods (`useQuery`, `useClientDocument`).
7
- *
8
- * This is called automatically by `useStore()` and `LiveStoreProvider`. You typically
9
- * don't need to call it directly unless you're building custom integrations.
7
+ * Returns a store instance augmented with hooks (`store.useQuery()` and `store.useClientDocument()`) for reactive queries.
10
8
  *
11
9
  * @example
12
- * ```ts
13
- * // Usually not needed—useStore() does this automatically
14
- * const store = withReactApi(myStore)
15
- * const todos = store.useQuery(tables.todos.all())
16
- * ```
17
- */
18
- export const withReactApi = (store) => {
19
- // @ts-expect-error TODO properly implement this
20
- store.useQuery = (queryable) => useQuery(queryable, { store });
21
- // @ts-expect-error TODO properly implement this
22
- store.useClientDocument = (table, idOrOptions, options) => useClientDocument(table, idOrOptions, options, { store });
23
- return store;
24
- };
25
- /**
26
- * Returns the current Store instance from React context, augmented with React-specific methods.
27
- *
28
- * Use this hook when you need direct access to the Store for operations like
29
- * `store.commit()`, `store.subscribe()`, or accessing `store.sessionId`.
10
+ * ```tsx
11
+ * function Issue() {
12
+ * // Suspends until loaded or returns immediately if already loaded
13
+ * const issueStore = useStore(issueStoreOptions('abc123'))
14
+ * const [issue] = issueStore.useQuery(queryDb(tables.issue.select()))
30
15
  *
31
- * For reactive queries, prefer `useQuery()` or `useClientDocument()` which handle
32
- * subscriptions and re-renders automatically.
16
+ * const toggleStatus = () =>
17
+ * issueStore.commit(
18
+ * issueEvents.issueStatusChanged({
19
+ * id: issue.id,
20
+ * status: issue.status === 'done' ? 'todo' : 'done',
21
+ * }),
22
+ * )
33
23
  *
34
- * @example
35
- * ```ts
36
- * const MyComponent = () => {
37
- * const { store } = useStore()
38
- *
39
- * const handleClick = () => {
40
- * store.commit(events.todoCreated({ id: nanoid(), text: 'New todo' }))
41
- * }
24
+ * const preloadParentIssue = (issueId: string) =>
25
+ * storeRegistry.preload({
26
+ * ...issueStoreOptions(issueId),
27
+ * unusedCacheTime: 10_000,
28
+ * })
42
29
  *
43
- * return <button onClick={handleClick}>Add Todo</button>
30
+ * return (
31
+ * <>
32
+ * <h2>{issue.title}</h2>
33
+ * <button onClick={() => toggleStatus()}>Toggle Status</button>
34
+ * <button onMouseEnter={() => preloadParentIssue(issue.parentIssueId)}>Open Parent Issue</button>
35
+ * </>
36
+ * )
44
37
  * }
45
38
  * ```
46
39
  *
47
- * @example
48
- * ```ts
49
- * // Access store metadata
50
- * const { store } = useStore()
51
- * console.log('Session ID:', store.sessionId)
52
- * console.log('Client ID:', store.clientId)
53
- * ```
40
+ * @remarks
41
+ * - Suspends until the store is loaded.
42
+ * - Store is cached by its `storeId` in the `StoreRegistry`. Multiple calls with the same `storeId` return the same store instance.
43
+ * - Store is cached as long as it's being used, and after `unusedCacheTime` expires (default `60_000` ms in browser, `Infinity` in non-browser)
44
+ * - Default store options can be configured in `StoreRegistry` constructor.
45
+ * - Store options are only applied when the store is loaded. Subsequent calls with different options will not affect the store if it's already loaded and cached in the registry.
54
46
  *
55
- * @example
56
- * ```ts
57
- * // Use with an explicit store instance (bypasses context)
58
- * const { store } = useStore({ store: myExternalStore })
59
- * ```
60
- *
61
- * @throws Error if called outside of `<LiveStoreProvider>` or before the store is running
47
+ * @typeParam TSchema - The schema type for the store
48
+ * @returns The loaded store instance augmented with React hooks
49
+ * @throws unknown - store loading error or if called outside `<StoreRegistryProvider>`
62
50
  */
63
51
  export const useStore = (options) => {
64
- if (options?.store !== undefined) {
65
- return { store: withReactApi(options.store) };
66
- }
67
- // biome-ignore lint/correctness/useHookAtTopLevel: store is stable
68
- const storeContext = React.useContext(LiveStoreContext);
69
- if (storeContext === undefined) {
70
- throw new Error(`useStore can only be used inside StoreContext.Provider`);
71
- }
72
- if (storeContext.stage !== 'running') {
73
- throw new Error(`useStore can only be used after the store is running`);
74
- }
75
- return { store: withReactApi(storeContext.store) };
52
+ const storeRegistry = useStoreRegistry();
53
+ // Called on every render (intentionally not memoized). For already-loaded stores this returns
54
+ // the Store synchronously, so React.use() is skipped entirely. Caching the initial Promise via
55
+ // useMemo would cause React.use() to be called with a resolved Promise on subsequent renders,
56
+ // which blocks React transitions from committing.
57
+ const storeOrPromise = storeRegistry.getOrLoadPromise(options);
58
+ const store = storeOrPromise instanceof Promise ? React.use(storeOrPromise) : storeOrPromise;
59
+ // NOTE: retain() must be declared AFTER the React.use() call above. When React.use() suspends
60
+ // the component, any hooks declared before it get committed while hooks after the suspension
61
+ // point (including those in the caller) don't. On re-render when the store resolves synchronously,
62
+ // those late hooks appear for the first time, causing a hook-order violation in strict mode.
63
+ // By placing useEffect after React.use(), no effect hooks are committed during suspension,
64
+ // so React treats all effects as fresh mounts on the first successful render.
65
+ //
66
+ // retain() is called in useEffect (after render), while getOrLoadPromise() is called during
67
+ // render. This creates a timing gap where with very short unusedCacheTime values (e.g., 0),
68
+ // the store could theoretically be disposed before the effect fires. In practice, this is not
69
+ // an issue with the default 60s cache time, but it becomes an issue when `unusedCacheTime` is
70
+ // configured to values less than ~100ms.
71
+ // See https://github.com/livestorejs/livestore/issues/916
72
+ React.useEffect(() => storeRegistry.retain(options), [storeRegistry, options]);
73
+ return withReactApi(store);
74
+ };
75
+ /**
76
+ * Augments a Store instance with React-specific methods (`useQuery`, `useClientDocument`).
77
+ *
78
+ * This is called automatically by `useStore()`. You typically don't need to call it
79
+ * directly unless you're building custom integrations.
80
+ *
81
+ * @internal
82
+ */
83
+ export const withReactApi = (store) => {
84
+ // @ts-expect-error TODO properly implement this
85
+ store.useQuery = (queryable) => useQuery(queryable, { store });
86
+ // @ts-expect-error TODO properly implement this
87
+ store.useClientDocument = (table, idOrOptions, options) => useClientDocument(table, idOrOptions, options, { store });
88
+ // @ts-expect-error TODO properly implement this
89
+ store.useSyncStatus = () => useSyncStatus({ store });
90
+ return store;
76
91
  };
77
92
  //# sourceMappingURL=useStore.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useStore.js","sourceRoot":"","sources":["../src/useStore.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,OAAO,CAAA;AAGzB,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC1D,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAExC;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAkC,KAAqB,EAA6B,EAAE;IAChH,gDAAgD;IAEhD,KAAK,CAAC,QAAQ,GAAG,CAAC,SAAS,EAAE,EAAE,CAAC,QAAQ,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,CAAC,CAAA;IAC9D,gDAAgD;IAEhD,KAAK,CAAC,iBAAiB,GAAG,CAAC,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,EAAE,CAAC,iBAAiB,CAAC,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,CAAA;IACpH,OAAO,KAAkC,CAAA;AAC3C,CAAC,CAAA;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,OAA2B,EAA+B,EAAE;IACnF,IAAI,OAAO,EAAE,KAAK,KAAK,SAAS,EAAE,CAAC;QACjC,OAAO,EAAE,KAAK,EAAE,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAA;IAC/C,CAAC;IAED,mEAAmE;IACnE,MAAM,YAAY,GAAG,KAAK,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAA;IAEvD,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAA;IAC3E,CAAC;IAED,IAAI,YAAY,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QACrC,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAA;IACzE,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,YAAY,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,CAAA;AACpD,CAAC,CAAA"}
1
+ {"version":3,"file":"useStore.js","sourceRoot":"","sources":["../src/useStore.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAMzB,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA4B,CAAA;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC1D,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAElD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4CG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,CAKtB,OAAoE,EAC/B,EAAE;IACvC,MAAM,aAAa,GAAG,gBAAgB,EAAE,CAAA;IAExC,8FAA8F;IAC9F,+FAA+F;IAC/F,8FAA8F;IAC9F,kDAAkD;IAClD,MAAM,cAAc,GAAG,aAAa,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAA;IAE9D,MAAM,KAAK,GAAG,cAAc,YAAY,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,cAAc,CAAA;IAE5F,8FAA8F;IAC9F,6FAA6F;IAC7F,mGAAmG;IACnG,6FAA6F;IAC7F,2FAA2F;IAC3F,8EAA8E;IAC9E,EAAE;IACF,4FAA4F;IAC5F,4FAA4F;IAC5F,8FAA8F;IAC9F,8FAA8F;IAC9F,yCAAyC;IACzC,0DAA0D;IAC1D,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC,CAAA;IAE9E,OAAO,YAAY,CAAC,KAAK,CAAC,CAAA;AAC5B,CAAC,CAAA;AAkBD;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAC1B,KAA+B,EACM,EAAE;IACvC,gDAAgD;IAChD,KAAK,CAAC,QAAQ,GAAG,CAAC,SAAS,EAAE,EAAE,CAAC,QAAQ,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,CAAC,CAAA;IAE9D,gDAAgD;IAChD,KAAK,CAAC,iBAAiB,GAAG,CAAC,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,EAAE,CAAC,iBAAiB,CAAC,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,CAAA;IAEpH,gDAAgD;IAChD,KAAK,CAAC,aAAa,GAAG,GAAG,EAAE,CAAC,aAAa,CAAC,EAAE,KAAK,EAAE,CAAC,CAAA;IAEpD,OAAO,KAA4C,CAAA;AACrD,CAAC,CAAA"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useStore.test.d.ts","sourceRoot":"","sources":["../src/useStore.test.tsx"],"names":[],"mappings":""}
@@ -1,22 +1,20 @@
1
- import { jsx as _jsx } from "react/jsx-runtime";
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { makeInMemoryAdapter } from '@livestore/adapter-web';
3
- import { StoreInternalsSymbol } from '@livestore/livestore';
3
+ import { StoreInternalsSymbol, StoreRegistry, storeOptions, } from '@livestore/livestore';
4
4
  import { shouldNeverHappen } from '@livestore/utils';
5
- import { act, render, renderHook, waitFor } from '@testing-library/react';
5
+ import { act, fireEvent, render, renderHook, waitFor } from '@testing-library/react';
6
6
  import * as React from 'react';
7
- import { describe, expect, it } from 'vitest';
8
- import { schema } from "../../__tests__/fixture.js";
9
- import { StoreRegistry } from "./StoreRegistry.js";
7
+ import { describe, expect, it, vi } from 'vitest';
8
+ import { schema } from "./__tests__/fixture.js";
10
9
  import { StoreRegistryProvider } from "./StoreRegistryContext.js";
11
- import { storeOptions } from "./storeOptions.js";
12
10
  import { useStore } from "./useStore.js";
13
11
  describe('experimental useStore', () => {
14
12
  it('should return the same promise instance for concurrent getOrLoadStore calls', async () => {
15
- const registry = new StoreRegistry();
13
+ const storeRegistry = new StoreRegistry();
16
14
  const options = testStoreOptions();
17
15
  // Make two concurrent calls during loading
18
- const firstStore = registry.getOrLoadPromise(options);
19
- const secondStore = registry.getOrLoadPromise(options);
16
+ const firstStore = storeRegistry.getOrLoadPromise(options);
17
+ const secondStore = storeRegistry.getOrLoadPromise(options);
20
18
  // Both should be promises (store is loading)
21
19
  expect(firstStore).toBeInstanceOf(Promise);
22
20
  expect(secondStore).toBeInstanceOf(Promise);
@@ -28,11 +26,11 @@ describe('experimental useStore', () => {
28
26
  await cleanupAfterUnmount(() => { });
29
27
  });
30
28
  it('works with Suspense boundary', async () => {
31
- const registry = new StoreRegistry();
29
+ const storeRegistry = new StoreRegistry();
32
30
  const options = testStoreOptions();
33
31
  let view;
34
32
  await act(async () => {
35
- view = render(_jsx(StoreRegistryProvider, { storeRegistry: registry, children: _jsx(React.Suspense, { fallback: _jsx("div", { "data-testid": "fallback" }), children: _jsx(StoreConsumer, { options: options }) }) }));
33
+ view = render(_jsx(StoreRegistryProvider, { storeRegistry: storeRegistry, children: _jsx(React.Suspense, { fallback: makeSuspenseFallback(), children: _jsx(StoreConsumer, { options: options }) }) }));
36
34
  });
37
35
  const renderedView = view ?? shouldNeverHappen('render failed');
38
36
  // After loading completes, should show the actual content
@@ -41,9 +39,9 @@ describe('experimental useStore', () => {
41
39
  await cleanupAfterUnmount(() => renderedView.unmount());
42
40
  });
43
41
  it('does not re-suspend on subsequent renders when store is already loaded', async () => {
44
- const registry = new StoreRegistry();
42
+ const storeRegistry = new StoreRegistry();
45
43
  const options = testStoreOptions();
46
- const Wrapper = ({ opts }) => (_jsx(StoreRegistryProvider, { storeRegistry: registry, children: _jsx(React.Suspense, { fallback: _jsx("div", { "data-testid": "fallback" }), children: _jsx(StoreConsumer, { options: opts }) }) }));
44
+ const Wrapper = ({ opts }) => (_jsx(StoreRegistryProvider, { storeRegistry: storeRegistry, children: _jsx(React.Suspense, { fallback: makeSuspenseFallback(), children: _jsx(StoreConsumer, { options: opts }) }) }));
47
45
  let view;
48
46
  await act(async () => {
49
47
  view = render(_jsx(Wrapper, { opts: options }));
@@ -53,8 +51,9 @@ describe('experimental useStore', () => {
53
51
  await waitForSuspenseResolved(renderedView);
54
52
  expect(renderedView.getByTestId('ready')).toBeDefined();
55
53
  // Rerender with new options object (but same storeId)
54
+ const rerenderOptions = cloneStoreOptions(options);
56
55
  await act(async () => {
57
- renderedView.rerender(_jsx(Wrapper, { opts: { ...options } }));
56
+ renderedView.rerender(_jsx(Wrapper, { opts: rerenderOptions }));
58
57
  });
59
58
  // Should not show fallback
60
59
  expect(renderedView.queryByTestId('fallback')).toBeNull();
@@ -62,28 +61,28 @@ describe('experimental useStore', () => {
62
61
  await cleanupAfterUnmount(() => renderedView.unmount());
63
62
  });
64
63
  it('throws when store loading fails', async () => {
65
- const registry = new StoreRegistry();
64
+ const storeRegistry = new StoreRegistry();
66
65
  const badOptions = testStoreOptions({
67
66
  // @ts-expect-error - intentionally passing invalid adapter to trigger error
68
67
  adapter: null,
69
68
  });
70
69
  // Pre-load the store to cache the error (error happens synchronously)
71
- expect(() => registry.getOrLoadPromise(badOptions)).toThrow();
70
+ expect(() => storeRegistry.getOrLoadPromise(badOptions)).toThrow();
72
71
  // Now when useStore tries to get it, it should throw synchronously
73
72
  expect(() => renderHook(() => useStore(badOptions), {
74
- wrapper: makeProvider(registry),
73
+ wrapper: makeProvider(storeRegistry),
75
74
  })).toThrow();
76
75
  });
77
76
  it.each([
78
77
  { label: 'non-strict mode', strictMode: false },
79
78
  { label: 'strict mode', strictMode: true },
80
79
  ])('works in $label', async ({ strictMode }) => {
81
- const registry = new StoreRegistry();
80
+ const storeRegistry = new StoreRegistry();
82
81
  const options = testStoreOptions();
83
82
  let hook;
84
83
  await act(async () => {
85
84
  hook = renderHook(() => useStore(options), {
86
- wrapper: makeProvider(registry, { suspense: true }),
85
+ wrapper: makeProvider(storeRegistry, { suspense: true }),
87
86
  reactStrictMode: strictMode,
88
87
  });
89
88
  });
@@ -94,14 +93,14 @@ describe('experimental useStore', () => {
94
93
  await cleanupAfterUnmount(unmount);
95
94
  });
96
95
  it('handles switching between different storeId values', async () => {
97
- const registry = new StoreRegistry();
96
+ const storeRegistry = new StoreRegistry();
98
97
  const optionsA = testStoreOptions({ storeId: 'store-a' });
99
98
  const optionsB = testStoreOptions({ storeId: 'store-b' });
100
99
  let hook;
101
100
  await act(async () => {
102
101
  hook = renderHook((opts) => useStore(opts), {
103
102
  initialProps: optionsA,
104
- wrapper: makeProvider(registry, { suspense: true }),
103
+ wrapper: makeProvider(storeRegistry, { suspense: true }),
105
104
  });
106
105
  });
107
106
  const { result, rerender, unmount } = hook ?? shouldNeverHappen('renderHook failed');
@@ -123,10 +122,42 @@ describe('experimental useStore', () => {
123
122
  expect(storeB).not.toBe(storeA);
124
123
  await cleanupAfterUnmount(unmount);
125
124
  });
125
+ it('does not block useActionState transitions from committing', async () => {
126
+ const storeRegistry = new StoreRegistry();
127
+ const options = testStoreOptions();
128
+ const getOrLoadSpy = vi.spyOn(storeRegistry, 'getOrLoadPromise');
129
+ let view;
130
+ await act(async () => {
131
+ view = render(_jsx(StoreRegistryProvider, { storeRegistry: storeRegistry, children: _jsx(React.Suspense, { fallback: makeSuspenseFallback(), children: _jsx(StoreWithActionState, { options: options }) }) }));
132
+ });
133
+ const renderedView = view ?? shouldNeverHappen('render failed');
134
+ // Wait for store to load
135
+ await waitForSuspenseResolved(renderedView);
136
+ expect(renderedView.getByTestId('state').textContent).toBe('none');
137
+ expect(renderedView.getByTestId('pending').textContent).toBe('false');
138
+ // After store is loaded, clear spy to only track calls during the transition render
139
+ getOrLoadSpy.mockClear();
140
+ // Trigger a useActionState transition
141
+ await act(async () => {
142
+ fireEvent.click(renderedView.getByTestId('submit'));
143
+ });
144
+ // getOrLoadPromise must be called on each render (not cached via useMemo).
145
+ // When the initial Promise is cached, React.use() is called with a resolved Promise
146
+ // on every subsequent render, which blocks React transitions (e.g. useActionState)
147
+ // from ever committing in browser environments.
148
+ expect(getOrLoadSpy).toHaveBeenCalled();
149
+ // The transition should commit: state updates and isPending returns to false
150
+ await waitFor(() => {
151
+ expect(renderedView.getByTestId('state').textContent).toBe('updated');
152
+ expect(renderedView.getByTestId('pending').textContent).toBe('false');
153
+ });
154
+ getOrLoadSpy.mockRestore();
155
+ await cleanupAfterUnmount(() => renderedView.unmount());
156
+ });
126
157
  // useStore doesn't handle unusedCacheTime=0 correctly because retain is called in useEffect (after render)
127
158
  // See https://github.com/livestorejs/livestore/issues/916
128
159
  it.skip('should load store with unusedCacheTime set to 0', async () => {
129
- const registry = new StoreRegistry({ defaultOptions: { unusedCacheTime: 0 } });
160
+ const storeRegistry = new StoreRegistry({ defaultOptions: { unusedCacheTime: 0 } });
130
161
  const options = testStoreOptions({ unusedCacheTime: 0 });
131
162
  const StoreConsumerWithVerification = ({ opts }) => {
132
163
  const store = useStore(opts);
@@ -136,7 +167,7 @@ describe('experimental useStore', () => {
136
167
  };
137
168
  let view;
138
169
  await act(async () => {
139
- view = render(_jsx(StoreRegistryProvider, { storeRegistry: registry, children: _jsx(React.Suspense, { fallback: _jsx("div", { "data-testid": "fallback" }), children: _jsx(StoreConsumerWithVerification, { opts: options }) }) }));
170
+ view = render(_jsx(StoreRegistryProvider, { storeRegistry: storeRegistry, children: _jsx(React.Suspense, { fallback: makeSuspenseFallback(), children: _jsx(StoreConsumerWithVerification, { opts: options }) }) }));
140
171
  });
141
172
  const renderedView = view ?? shouldNeverHappen('render failed');
142
173
  await waitForSuspenseResolved(renderedView);
@@ -154,9 +185,21 @@ const StoreConsumer = ({ options }) => {
154
185
  useStore(options);
155
186
  return _jsx("div", { "data-testid": "ready" });
156
187
  };
157
- const makeProvider = (registry, { suspense = false } = {}) => ({ children }) => {
158
- let content = _jsx(StoreRegistryProvider, { storeRegistry: registry, children: children });
159
- if (suspense) {
188
+ /** Component that combines useStore with useActionState to test transition compatibility. */
189
+ const StoreWithActionState = ({ options }) => {
190
+ useStore(options);
191
+ const [state, dispatch, isPending] = React.useActionState((_prev, value) => value, undefined);
192
+ return (_jsxs("div", { children: [_jsx("button", { "data-testid": "submit",
193
+ // eslint-disable-next-line react-perf/jsx-no-new-function-as-prop -- test component
194
+ onClick: () => React.startTransition(() => dispatch('updated')), children: "Submit" }), _jsx("div", { "data-testid": "state", children: state ?? 'none' }), _jsx("div", { "data-testid": "pending", children: String(isPending) })] }));
195
+ };
196
+ const makeSuspenseFallback = () => React.createElement('div', { 'data-testid': 'fallback' });
197
+ const cloneStoreOptions = (options) => {
198
+ return { ...options };
199
+ };
200
+ const makeProvider = (storeRegistry, { suspense = false } = {}) => ({ children }) => {
201
+ let content = _jsx(StoreRegistryProvider, { storeRegistry: storeRegistry, children: children });
202
+ if (suspense !== undefined) {
160
203
  content = _jsx(React.Suspense, { fallback: null, children: content });
161
204
  }
162
205
  return content;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useStore.test.js","sourceRoot":"","sources":["../src/useStore.test.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { Store, SyncStatus } from '@livestore/livestore';
2
+ /**
3
+ * React hook that subscribes to sync status changes.
4
+ *
5
+ * Returns the current synchronization status between the client session and
6
+ * the leader thread. The component re-renders whenever the sync status changes.
7
+ *
8
+ * @example
9
+ * ```tsx
10
+ * function SyncIndicator() {
11
+ * const status = store.useSyncStatus()
12
+ * return <span>{status.isSynced ? '✓ Synced' : `Syncing (${status.pendingCount} pending)...`}</span>
13
+ * }
14
+ * ```
15
+ *
16
+ * @param options - Options containing the store instance
17
+ * @returns The current sync status
18
+ */
19
+ export declare const useSyncStatus: (options: {
20
+ store: Store<any>;
21
+ }) => SyncStatus;
22
+ //# sourceMappingURL=useSyncStatus.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useSyncStatus.d.ts","sourceRoot":"","sources":["../src/useSyncStatus.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAE7D;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,aAAa,GAAI,SAAS;IAAE,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAA;CAAE,KAAG,UAY9D,CAAA"}