@livestore/livestore 0.4.0-dev.21 → 0.4.0-dev.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/effect/LiveStore.d.ts +123 -2
  3. package/dist/effect/LiveStore.d.ts.map +1 -1
  4. package/dist/effect/LiveStore.js +195 -1
  5. package/dist/effect/LiveStore.js.map +1 -1
  6. package/dist/effect/mod.d.ts +1 -1
  7. package/dist/effect/mod.d.ts.map +1 -1
  8. package/dist/effect/mod.js +3 -1
  9. package/dist/effect/mod.js.map +1 -1
  10. package/dist/mod.d.ts +1 -0
  11. package/dist/mod.d.ts.map +1 -1
  12. package/dist/mod.js +1 -0
  13. package/dist/mod.js.map +1 -1
  14. package/dist/store/StoreRegistry.d.ts +190 -0
  15. package/dist/store/StoreRegistry.d.ts.map +1 -0
  16. package/dist/store/StoreRegistry.js +244 -0
  17. package/dist/store/StoreRegistry.js.map +1 -0
  18. package/dist/store/StoreRegistry.test.d.ts +2 -0
  19. package/dist/store/StoreRegistry.test.d.ts.map +1 -0
  20. package/dist/store/StoreRegistry.test.js +380 -0
  21. package/dist/store/StoreRegistry.test.js.map +1 -0
  22. package/dist/store/create-store.d.ts +50 -4
  23. package/dist/store/create-store.d.ts.map +1 -1
  24. package/dist/store/create-store.js +19 -0
  25. package/dist/store/create-store.js.map +1 -1
  26. package/dist/store/devtools.d.ts.map +1 -1
  27. package/dist/store/devtools.js +13 -0
  28. package/dist/store/devtools.js.map +1 -1
  29. package/dist/store/store-types.d.ts +10 -25
  30. package/dist/store/store-types.d.ts.map +1 -1
  31. package/dist/store/store-types.js.map +1 -1
  32. package/dist/store/store.d.ts +23 -6
  33. package/dist/store/store.d.ts.map +1 -1
  34. package/dist/store/store.js +20 -2
  35. package/dist/store/store.js.map +1 -1
  36. package/docs/building-with-livestore/complex-ui-state/index.md +0 -2
  37. package/docs/building-with-livestore/crud/index.md +0 -2
  38. package/docs/building-with-livestore/data-modeling/index.md +29 -0
  39. package/docs/building-with-livestore/examples/todo-workspaces/index.md +0 -6
  40. package/docs/building-with-livestore/opentelemetry/index.md +25 -6
  41. package/docs/building-with-livestore/rules-for-ai-agents/index.md +2 -2
  42. package/docs/building-with-livestore/state/sql-queries/index.md +22 -0
  43. package/docs/building-with-livestore/state/sqlite-schema/index.md +2 -2
  44. package/docs/building-with-livestore/store/index.md +344 -0
  45. package/docs/framework-integrations/react-integration/index.md +380 -361
  46. package/docs/framework-integrations/vue-integration/index.md +2 -2
  47. package/docs/getting-started/expo/index.md +189 -43
  48. package/docs/getting-started/react-web/index.md +77 -24
  49. package/docs/getting-started/vue/index.md +3 -3
  50. package/docs/index.md +1 -2
  51. package/docs/llms.txt +0 -1
  52. package/docs/misc/troubleshooting/index.md +3 -3
  53. package/docs/overview/how-livestore-works/index.md +1 -1
  54. package/docs/overview/introduction/index.md +409 -1
  55. package/docs/overview/why-livestore/index.md +108 -2
  56. package/docs/patterns/auth/index.md +185 -34
  57. package/docs/patterns/effect/index.md +11 -1
  58. package/docs/patterns/storybook/index.md +43 -26
  59. package/docs/platform-adapters/expo-adapter/index.md +36 -19
  60. package/docs/platform-adapters/web-adapter/index.md +71 -2
  61. package/docs/tutorial/1-setup-starter-project/index.md +5 -5
  62. package/docs/tutorial/3-read-and-write-todos-via-livestore/index.md +54 -35
  63. package/docs/tutorial/5-expand-business-logic/index.md +1 -1
  64. package/docs/tutorial/6-persist-ui-state/index.md +12 -12
  65. package/package.json +6 -6
  66. package/src/effect/LiveStore.ts +385 -3
  67. package/src/effect/mod.ts +13 -1
  68. package/src/mod.ts +1 -0
  69. package/src/store/StoreRegistry.test.ts +516 -0
  70. package/src/store/StoreRegistry.ts +393 -0
  71. package/src/store/create-store.ts +50 -4
  72. package/src/store/devtools.ts +15 -0
  73. package/src/store/store-types.ts +17 -5
  74. package/src/store/store.ts +25 -5
  75. package/docs/building-with-livestore/examples/index.md +0 -30
@@ -1,10 +1,131 @@
1
1
  import type { UnknownError } from '@livestore/common';
2
- import type { LiveStoreSchema } from '@livestore/common/schema';
2
+ import type { LiveStoreEvent, LiveStoreSchema } from '@livestore/common/schema';
3
3
  import type { Cause, OtelTracer, Scope } from '@livestore/utils/effect';
4
- import { Effect, Layer } from '@livestore/utils/effect';
4
+ import { Context, Deferred, Effect, Layer } from '@livestore/utils/effect';
5
5
  import type { LiveStoreContextProps } from '../store/create-store.ts';
6
6
  import { DeferredStoreContext, LiveStoreContextRunning } from '../store/create-store.ts';
7
+ import type { LiveStoreContextRunning as LiveStoreContextRunningType, Queryable } from '../store/store-types.ts';
7
8
  export declare const makeLiveStoreContext: <TSchema extends LiveStoreSchema, TContext = {}>({ schema, storeId, context, boot, adapter, disableDevtools, onBootStatus, batchUpdates, syncPayload, syncPayloadSchema, }: LiveStoreContextProps<TSchema, TContext>) => Effect.Effect<LiveStoreContextRunning["Type"], UnknownError | Cause.TimeoutException, DeferredStoreContext | Scope.Scope | OtelTracer.OtelTracer>;
9
+ /**
10
+ * @deprecated Use `Store.Tag(schema, storeId)` instead for type-safe store contexts.
11
+ *
12
+ * @example Migration
13
+ * ```ts
14
+ * // Before
15
+ * const layer = LiveStoreContextLayer({ schema, adapter, ... })
16
+ *
17
+ * // After
18
+ * class MainStore extends Store.Tag(schema, 'main') {}
19
+ * const layer = MainStore.layer({ adapter, ... })
20
+ * ```
21
+ */
8
22
  export declare const LiveStoreContextLayer: <TSchema extends LiveStoreSchema, TContext = {}>(props: LiveStoreContextProps<TSchema, TContext>) => Layer.Layer<LiveStoreContextRunning, UnknownError | Cause.TimeoutException, OtelTracer.OtelTracer>;
23
+ /**
24
+ * @deprecated Use `Store.Tag(schema, storeId)` and `MainStore.DeferredLayer` instead.
25
+ */
9
26
  export declare const LiveStoreContextDeferred: Layer.Layer<DeferredStoreContext, never, never>;
27
+ /** Branded type for unique store context identity */
28
+ declare const StoreContextTypeId: unique symbol;
29
+ /** Phantom type carrying schema and storeId information */
30
+ export interface StoreContextId<TSchema extends LiveStoreSchema, TStoreId extends string> {
31
+ readonly [StoreContextTypeId]: {
32
+ readonly schema: TSchema;
33
+ readonly storeId: TStoreId;
34
+ };
35
+ }
36
+ /** Phantom type for deferred store context */
37
+ declare const DeferredContextTypeId: unique symbol;
38
+ export interface DeferredContextId<TStoreId extends string> {
39
+ readonly [DeferredContextTypeId]: {
40
+ readonly storeId: TStoreId;
41
+ };
42
+ }
43
+ /** Props for creating a store layer (schema and storeId are already provided) */
44
+ export type StoreLayerProps<TSchema extends LiveStoreSchema, TContext = {}> = Omit<LiveStoreContextProps<TSchema, TContext>, 'storeId' | 'schema'>;
45
+ /**
46
+ * Type for a Store.Tag class. This is the return type of `Store.Tag(schema, storeId)`.
47
+ * Can be extended as a class and is yieldable in Effect.gen.
48
+ *
49
+ * Note: This uses a type alias with a new() signature to make it extendable.
50
+ */
51
+ export type StoreTagClass<TSchema extends LiveStoreSchema, TStoreId extends string> = {
52
+ /** Constructor signature (makes the type extendable as a class) */
53
+ new (): Context.Tag<StoreContextId<TSchema, TStoreId>, LiveStoreContextRunningType<TSchema>>;
54
+ /** Tag identity type (from Context.Tag) */
55
+ readonly Id: StoreContextId<TSchema, TStoreId>;
56
+ /** Service type (from Context.Tag) */
57
+ readonly Type: LiveStoreContextRunningType<TSchema>;
58
+ /** The LiveStore schema for this store */
59
+ readonly schema: TSchema;
60
+ /** Unique identifier for this store */
61
+ readonly storeId: TStoreId;
62
+ /** Creates a layer that initializes the store */
63
+ layer<TContext = {}>(props: StoreLayerProps<TSchema, TContext>): Layer.Layer<StoreTagClass<TSchema, TStoreId>, UnknownError | Cause.TimeoutException, OtelTracer.OtelTracer>;
64
+ /** Deferred store tag for async initialization patterns */
65
+ readonly Deferred: Context.Tag<DeferredContextId<TStoreId>, Deferred.Deferred<LiveStoreContextRunningType<TSchema>, UnknownError>>;
66
+ /** Layer that provides the Deferred tag */
67
+ readonly DeferredLayer: Layer.Layer<DeferredContextId<TStoreId>, never, never>;
68
+ /** Layer that waits for Deferred and provides the running store */
69
+ readonly fromDeferred: Layer.Layer<StoreTagClass<TSchema, TStoreId>, UnknownError, DeferredContextId<TStoreId>>;
70
+ /** Query the store. Returns an Effect that yields the query result. */
71
+ query<TResult>(query: Queryable<TResult>): Effect.Effect<TResult, never, StoreTagClass<TSchema, TStoreId>>;
72
+ /** Commit events to the store. */
73
+ commit(...eventInputs: LiveStoreEvent.Input.ForSchema<TSchema>[]): Effect.Effect<void, never, StoreTagClass<TSchema, TStoreId>>;
74
+ /** Use the store with a callback function. */
75
+ use<A, E, R>(f: (ctx: LiveStoreContextRunningType<TSchema>) => Effect.Effect<A, E, R>): Effect.Effect<A, E, R | StoreTagClass<TSchema, TStoreId>>;
76
+ } & Context.Tag<StoreContextId<TSchema, TStoreId>, LiveStoreContextRunningType<TSchema>>;
77
+ /**
78
+ * Store utilities for Effect integration.
79
+ *
80
+ * @example
81
+ * ```ts
82
+ * import { Store } from '@livestore/livestore/effect'
83
+ *
84
+ * export class MainStore extends Store.Tag(schema, 'main') {}
85
+ * ```
86
+ */
87
+ export declare const Store: {
88
+ /**
89
+ * Create a typed store context class for use with Effect.
90
+ * @see {@link makeStoreTag} for full documentation
91
+ */
92
+ Tag: <TSchema extends LiveStoreSchema, TStoreId extends string>(schema: TSchema, storeId: TStoreId) => StoreTagClass<TSchema, TStoreId>;
93
+ };
94
+ /**
95
+ * @deprecated Use `Store.Tag(schema, storeId)` instead.
96
+ *
97
+ * @example Migration
98
+ * ```ts
99
+ * // Before
100
+ * const MainStoreContext = makeStoreContext<typeof schema>()('main')
101
+ * export const MainStore = MainStoreContext.Tag
102
+ * export const MainStoreLayer = MainStoreContext.Layer
103
+ *
104
+ * // After
105
+ * export class MainStore extends Store.Tag(schema, 'main') {}
106
+ * // MainStore.layer({ ... }) for the layer
107
+ * ```
108
+ */
109
+ export interface StoreContext<TSchema extends LiveStoreSchema, TStoreId extends string> {
110
+ readonly storeId: TStoreId;
111
+ readonly Tag: Context.Tag<StoreContextId<TSchema, TStoreId>, LiveStoreContextRunningType<TSchema>>;
112
+ readonly DeferredTag: Context.Tag<DeferredContextId<TStoreId>, Deferred.Deferred<LiveStoreContextRunningType<TSchema>, UnknownError>>;
113
+ readonly Layer: <TContext = {}>(props: Omit<LiveStoreContextProps<TSchema, TContext>, 'storeId'>) => Layer.Layer<StoreContextId<TSchema, TStoreId>, UnknownError | Cause.TimeoutException, OtelTracer.OtelTracer>;
114
+ readonly DeferredLayer: Layer.Layer<DeferredContextId<TStoreId>, never, never>;
115
+ readonly fromDeferred: Layer.Layer<StoreContextId<TSchema, TStoreId>, UnknownError, DeferredContextId<TStoreId>>;
116
+ }
117
+ /**
118
+ * @deprecated Use `Store.Tag(schema, storeId)` instead.
119
+ *
120
+ * @example Migration
121
+ * ```ts
122
+ * // Before
123
+ * const MainStoreContext = makeStoreContext<typeof schema>()('main')
124
+ *
125
+ * // After
126
+ * class MainStore extends Store.Tag(schema, 'main') {}
127
+ * ```
128
+ */
129
+ export declare const makeStoreContext: <TSchema extends LiveStoreSchema>() => <TStoreId extends string>(storeId: TStoreId) => StoreContext<TSchema, TStoreId>;
130
+ export {};
10
131
  //# sourceMappingURL=LiveStore.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"LiveStore.d.ts","sourceRoot":"","sources":["../../src/effect/LiveStore.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AACrD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAA;AAE/D,OAAO,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAA;AACvE,OAAO,EAAsB,MAAM,EAAE,KAAK,EAAQ,MAAM,yBAAyB,CAAA;AAEjF,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAA;AACrE,OAAO,EAAe,oBAAoB,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAA;AAErG,eAAO,MAAM,oBAAoB,GAAI,OAAO,SAAS,eAAe,EAAE,QAAQ,GAAG,EAAE,EAAE,2HAWlF,qBAAqB,CAAC,OAAO,EAAE,QAAQ,CAAC,KAAG,MAAM,CAAC,MAAM,CACzD,uBAAuB,CAAC,MAAM,CAAC,EAC/B,YAAY,GAAG,KAAK,CAAC,gBAAgB,EACrC,oBAAoB,GAAG,KAAK,CAAC,KAAK,GAAG,UAAU,CAAC,UAAU,CA0BzD,CAAA;AAEH,eAAO,MAAM,qBAAqB,GAAI,OAAO,SAAS,eAAe,EAAE,QAAQ,GAAG,EAAE,EAClF,OAAO,qBAAqB,CAAC,OAAO,EAAE,QAAQ,CAAC,KAC9C,KAAK,CAAC,KAAK,CAAC,uBAAuB,EAAE,YAAY,GAAG,KAAK,CAAC,gBAAgB,EAAE,UAAU,CAAC,UAAU,CAIjG,CAAA;AAEH,eAAO,MAAM,wBAAwB,iDAGpC,CAAA"}
1
+ {"version":3,"file":"LiveStore.d.ts","sourceRoot":"","sources":["../../src/effect/LiveStore.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { omitUndefineds } from '@livestore/utils';
2
- import { Deferred, Duration, Effect, Layer, pipe } from '@livestore/utils/effect';
2
+ import { Context, Deferred, Duration, Effect, Layer, pipe } from '@livestore/utils/effect';
3
3
  import { createStore, DeferredStoreContext, LiveStoreContextRunning } from "../store/create-store.js";
4
4
  export const makeLiveStoreContext = ({ schema, storeId = 'default', context, boot, adapter, disableDevtools, onBootStatus, batchUpdates, syncPayload, syncPayloadSchema, }) => pipe(Effect.gen(function* () {
5
5
  const store = yield* createStore({
@@ -19,6 +19,200 @@ export const makeLiveStoreContext = ({ schema, storeId = 'default', context, boo
19
19
  // This can take quite a while.
20
20
  // TODO make this configurable
21
21
  Effect.timeout(Duration.minutes(5)), Effect.withSpan('@livestore/livestore/effect:makeLiveStoreContext'));
22
+ /**
23
+ * @deprecated Use `Store.Tag(schema, storeId)` instead for type-safe store contexts.
24
+ *
25
+ * @example Migration
26
+ * ```ts
27
+ * // Before
28
+ * const layer = LiveStoreContextLayer({ schema, adapter, ... })
29
+ *
30
+ * // After
31
+ * class MainStore extends Store.Tag(schema, 'main') {}
32
+ * const layer = MainStore.layer({ adapter, ... })
33
+ * ```
34
+ */
22
35
  export const LiveStoreContextLayer = (props) => Layer.scoped(LiveStoreContextRunning, makeLiveStoreContext(props)).pipe(Layer.withSpan('LiveStore'), Layer.provide(LiveStoreContextDeferred));
36
+ /**
37
+ * @deprecated Use `Store.Tag(schema, storeId)` and `MainStore.DeferredLayer` instead.
38
+ */
23
39
  export const LiveStoreContextDeferred = Layer.effect(DeferredStoreContext, Deferred.make());
40
+ /**
41
+ * Create a typed store context class for use with Effect.
42
+ *
43
+ * Returns a class that extends `Context.Tag`, making it directly yieldable in Effect code.
44
+ * The class includes static methods for creating layers and accessors for common operations.
45
+ *
46
+ * @param schema - The LiveStore schema (used for type inference and runtime)
47
+ * @param storeId - Unique identifier for this store
48
+ *
49
+ * @example Basic usage
50
+ * ```ts
51
+ * import { Store } from '@livestore/livestore/effect'
52
+ * import { schema } from './schema.ts'
53
+ *
54
+ * // Define your store (once per store)
55
+ * export class MainStore extends Store.Tag(schema, 'main') {}
56
+ *
57
+ * // Create the layer
58
+ * const storeLayer = MainStore.layer({
59
+ * adapter: myAdapter,
60
+ * batchUpdates: ReactDOM.unstable_batchedUpdates,
61
+ * })
62
+ *
63
+ * // Use in Effect code
64
+ * Effect.gen(function* () {
65
+ * const { store } = yield* MainStore
66
+ * // ^? Store<typeof schema> - fully typed!
67
+ *
68
+ * // Or use accessors
69
+ * const users = yield* MainStore.query(tables.users.all())
70
+ * yield* MainStore.commit(events.createUser({ id: '1', name: 'Alice' }))
71
+ * })
72
+ * ```
73
+ *
74
+ * @example Multiple stores
75
+ * ```ts
76
+ * class MainStore extends Store.Tag(mainSchema, 'main') {}
77
+ * class SettingsStore extends Store.Tag(settingsSchema, 'settings') {}
78
+ *
79
+ * // Both available in same Effect context
80
+ * Effect.gen(function* () {
81
+ * const main = yield* MainStore
82
+ * const settings = yield* SettingsStore
83
+ * })
84
+ *
85
+ * const layer = Layer.mergeAll(
86
+ * MainStore.layer({ adapter: mainAdapter }),
87
+ * SettingsStore.layer({ adapter: settingsAdapter }),
88
+ * )
89
+ * ```
90
+ */
91
+ const makeStoreTag = (schema, storeId) => {
92
+ // Create the deferred tag and layers upfront
93
+ const _DeferredTag = Context.GenericTag(`@livestore/store-deferred/${storeId}`);
94
+ const _DeferredLayer = Layer.effect(_DeferredTag, Deferred.make());
95
+ class Tag extends Context.Tag(`@livestore/store/${storeId}`)() {
96
+ static schema = schema;
97
+ static storeId = storeId;
98
+ static layer(props) {
99
+ return pipe(Effect.gen(function* () {
100
+ const store = yield* createStore({
101
+ schema,
102
+ storeId,
103
+ adapter: props.adapter,
104
+ batchUpdates: props.batchUpdates,
105
+ ...omitUndefineds({
106
+ context: props.context,
107
+ boot: props.boot,
108
+ disableDevtools: props.disableDevtools,
109
+ onBootStatus: props.onBootStatus,
110
+ syncPayload: props.syncPayload,
111
+ syncPayloadSchema: props.syncPayloadSchema,
112
+ }),
113
+ });
114
+ globalThis.__debugLiveStore ??= {};
115
+ if (Object.keys(globalThis.__debugLiveStore).length === 0) {
116
+ globalThis.__debugLiveStore._ = store;
117
+ }
118
+ globalThis.__debugLiveStore[storeId] = store;
119
+ const ctx = { stage: 'running', store: store };
120
+ // Also fulfill the deferred if it exists in context
121
+ yield* Effect.flatMap(Effect.serviceOption(_DeferredTag), (optDeferred) => optDeferred._tag === 'Some' ? Deferred.succeed(optDeferred.value, ctx) : Effect.void);
122
+ return ctx;
123
+ }), Effect.timeout(Duration.minutes(5)), Effect.withSpan(`@livestore/effect:Store.Tag:${storeId}`), Layer.scoped(Tag), Layer.withSpan(`LiveStore:${storeId}`), Layer.provide(_DeferredLayer));
124
+ }
125
+ static Deferred = _DeferredTag;
126
+ static DeferredLayer = _DeferredLayer;
127
+ static fromDeferred = pipe(Effect.gen(function* () {
128
+ const deferred = yield* _DeferredTag;
129
+ const ctx = yield* deferred;
130
+ return Layer.succeed(Tag, ctx);
131
+ }), Layer.unwrapScoped);
132
+ static query(query) {
133
+ return Effect.map(Tag, ({ store }) => store.query(query));
134
+ }
135
+ static commit(...eventInputs) {
136
+ return Effect.map(Tag, ({ store }) => {
137
+ store.commit(...eventInputs);
138
+ });
139
+ }
140
+ static use(f) {
141
+ return Effect.flatMap(Tag, f);
142
+ }
143
+ }
144
+ return Tag;
145
+ };
146
+ /**
147
+ * Store utilities for Effect integration.
148
+ *
149
+ * @example
150
+ * ```ts
151
+ * import { Store } from '@livestore/livestore/effect'
152
+ *
153
+ * export class MainStore extends Store.Tag(schema, 'main') {}
154
+ * ```
155
+ */
156
+ export const Store = {
157
+ /**
158
+ * Create a typed store context class for use with Effect.
159
+ * @see {@link makeStoreTag} for full documentation
160
+ */
161
+ Tag: makeStoreTag,
162
+ };
163
+ /**
164
+ * @deprecated Use `Store.Tag(schema, storeId)` instead.
165
+ *
166
+ * @example Migration
167
+ * ```ts
168
+ * // Before
169
+ * const MainStoreContext = makeStoreContext<typeof schema>()('main')
170
+ *
171
+ * // After
172
+ * class MainStore extends Store.Tag(schema, 'main') {}
173
+ * ```
174
+ */
175
+ export const makeStoreContext = () => (storeId) => {
176
+ const Tag = Context.GenericTag(`@livestore/store/${storeId}`);
177
+ const DeferredTag = Context.GenericTag(`@livestore/store-deferred/${storeId}`);
178
+ const DeferredLayer = Layer.effect(DeferredTag, Deferred.make());
179
+ const makeLayer = (props) => pipe(Effect.gen(function* () {
180
+ const store = yield* createStore({
181
+ schema: props.schema,
182
+ storeId,
183
+ adapter: props.adapter,
184
+ batchUpdates: props.batchUpdates,
185
+ ...omitUndefineds({
186
+ context: props.context,
187
+ boot: props.boot,
188
+ disableDevtools: props.disableDevtools,
189
+ onBootStatus: props.onBootStatus,
190
+ syncPayload: props.syncPayload,
191
+ syncPayloadSchema: props.syncPayloadSchema,
192
+ }),
193
+ });
194
+ globalThis.__debugLiveStore ??= {};
195
+ if (Object.keys(globalThis.__debugLiveStore).length === 0) {
196
+ globalThis.__debugLiveStore._ = store;
197
+ }
198
+ globalThis.__debugLiveStore[storeId] = store;
199
+ const ctx = { stage: 'running', store: store };
200
+ // Also fulfill the deferred if it exists in context
201
+ yield* Effect.flatMap(Effect.serviceOption(DeferredTag), (optDeferred) => optDeferred._tag === 'Some' ? Deferred.succeed(optDeferred.value, ctx) : Effect.void);
202
+ return ctx;
203
+ }), Effect.timeout(Duration.minutes(5)), Effect.withSpan(`@livestore/effect:makeStoreContext:${storeId}`), Layer.scoped(Tag), Layer.withSpan(`LiveStore:${storeId}`), Layer.provide(DeferredLayer));
204
+ const fromDeferred = pipe(Effect.gen(function* () {
205
+ const deferred = yield* DeferredTag;
206
+ const ctx = yield* deferred;
207
+ return Layer.succeed(Tag, ctx);
208
+ }), Layer.unwrapScoped);
209
+ return {
210
+ storeId,
211
+ Tag,
212
+ DeferredTag,
213
+ Layer: makeLayer,
214
+ DeferredLayer,
215
+ fromDeferred,
216
+ };
217
+ };
24
218
  //# sourceMappingURL=LiveStore.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"LiveStore.js","sourceRoot":"","sources":["../../src/effect/LiveStore.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAEjD,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,yBAAyB,CAAA;AAGjF,OAAO,EAAE,WAAW,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAA;AAErG,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAiD,EACnF,MAAM,EACN,OAAO,GAAG,SAAS,EACnB,OAAO,EACP,IAAI,EACJ,OAAO,EACP,eAAe,EACf,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,iBAAiB,GACwB,EAIzC,EAAE,CACF,IAAI,CACF,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,WAAW,CAAC;QAC/B,MAAM;QACN,OAAO;QACP,OAAO;QACP,YAAY;QACZ,GAAG,cAAc,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,YAAY,EAAE,WAAW,EAAE,iBAAiB,EAAE,CAAC;KACpG,CAAC,CAAA;IAEF,UAAU,CAAC,gBAAgB,KAAK,EAAE,CAAA;IAClC,IAAI,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1D,UAAU,CAAC,gBAAgB,CAAC,CAAC,GAAG,KAAK,CAAA;IACvC,CAAC;IACD,UAAU,CAAC,gBAAgB,CAAC,OAAO,CAAC,GAAG,KAAK,CAAA;IAE5C,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAA4C,CAAA;AAC9E,CAAC,CAAC,EACF,MAAM,CAAC,aAAa,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,oBAAoB,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,EAC9G,MAAM,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,oBAAoB,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC;AACxG,+BAA+B;AAC/B,8BAA8B;AAC9B,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EACnC,MAAM,CAAC,QAAQ,CAAC,kDAAkD,CAAC,CACpE,CAAA;AAEH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CACnC,KAA+C,EACqD,EAAE,CACtG,KAAK,CAAC,MAAM,CAAC,uBAAuB,EAAE,oBAAoB,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CACrE,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,EAC3B,KAAK,CAAC,OAAO,CAAC,wBAAwB,CAAC,CACxC,CAAA;AAEH,MAAM,CAAC,MAAM,wBAAwB,GAAG,KAAK,CAAC,MAAM,CAClD,oBAAoB,EACpB,QAAQ,CAAC,IAAI,EAAiD,CAC/D,CAAA"}
1
+ {"version":3,"file":"LiveStore.js","sourceRoot":"","sources":["../../src/effect/LiveStore.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,3 @@
1
1
  export { DeferredStoreContext, type LiveStoreContextProps, LiveStoreContextRunning as LiveStoreContext, LiveStoreContextRunning, } from '../store/create-store.ts';
2
- export { LiveStoreContextDeferred, LiveStoreContextLayer } from './LiveStore.ts';
2
+ export { type DeferredContextId, LiveStoreContextDeferred, LiveStoreContextLayer, makeStoreContext, Store, type StoreContext, type StoreContextId, type StoreLayerProps, type StoreTagClass, } from './LiveStore.ts';
3
3
  //# sourceMappingURL=mod.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"mod.d.ts","sourceRoot":"","sources":["../../src/effect/mod.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,KAAK,qBAAqB,EAC1B,uBAAuB,IAAI,gBAAgB,EAC3C,uBAAuB,GACxB,MAAM,0BAA0B,CAAA;AACjC,OAAO,EAAE,wBAAwB,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAA"}
1
+ {"version":3,"file":"mod.d.ts","sourceRoot":"","sources":["../../src/effect/mod.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,KAAK,qBAAqB,EAC1B,uBAAuB,IAAI,gBAAgB,EAC3C,uBAAuB,GACxB,MAAM,0BAA0B,CAAA;AAGjC,OAAO,EACL,KAAK,iBAAiB,EACtB,wBAAwB,EACxB,qBAAqB,EACrB,gBAAgB,EAChB,KAAK,EACL,KAAK,YAAY,EACjB,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,KAAK,aAAa,GACnB,MAAM,gBAAgB,CAAA"}
@@ -1,3 +1,5 @@
1
1
  export { DeferredStoreContext, LiveStoreContextRunning as LiveStoreContext, LiveStoreContextRunning, } from "../store/create-store.js";
2
- export { LiveStoreContextDeferred, LiveStoreContextLayer } from "./LiveStore.js";
2
+ // Store.Tag - Idiomatic Effect API
3
+ // Legacy API (deprecated)
4
+ export { LiveStoreContextDeferred, LiveStoreContextLayer, makeStoreContext, Store, } from "./LiveStore.js";
3
5
  //# sourceMappingURL=mod.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"mod.js","sourceRoot":"","sources":["../../src/effect/mod.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EAEpB,uBAAuB,IAAI,gBAAgB,EAC3C,uBAAuB,GACxB,MAAM,0BAA0B,CAAA;AACjC,OAAO,EAAE,wBAAwB,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAA"}
1
+ {"version":3,"file":"mod.js","sourceRoot":"","sources":["../../src/effect/mod.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EAEpB,uBAAuB,IAAI,gBAAgB,EAC3C,uBAAuB,GACxB,MAAM,0BAA0B,CAAA;AACjC,mCAAmC;AACnC,0BAA0B;AAC1B,OAAO,EAEL,wBAAwB,EACxB,qBAAqB,EACrB,gBAAgB,EAChB,KAAK,GAKN,MAAM,gBAAgB,CAAA"}
package/dist/mod.d.ts CHANGED
@@ -7,6 +7,7 @@ export { nanoid } from '@livestore/utils/nanoid';
7
7
  export { computed, type LiveQuery, type LiveQueryDef, queryDb, type RcRef, type Signal, type SignalDef, signal, } from './live-queries/mod.ts';
8
8
  export { emptyDebugInfo, SqliteDbWrapper } from './SqliteDbWrapper.ts';
9
9
  export { type CreateStoreOptions, type CreateStoreOptionsPromise, createStore, createStorePromise, } from './store/create-store.ts';
10
+ export { type RegistryStoreOptions, StoreRegistry, storeOptions } from './store/StoreRegistry.ts';
10
11
  export { Store } from './store/store.ts';
11
12
  export { isLiveQueryDef, isLiveQueryInstance, isQueryable, type LiveStoreContext, type LiveStoreContextRunning, makeShutdownDeferred, type OtelOptions, type Queryable, type QueryDebugInfo, type RefreshReason, type ShutdownDeferred, type StoreInternals, StoreInternalsSymbol, type SubscribeOptions, type Unsubscribe, } from './store/store-types.ts';
12
13
  export { exposeDebugUtils } from './utils/dev.ts';
package/dist/mod.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"mod.d.ts","sourceRoot":"","sources":["../src/mod.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAClF,OAAO,EACL,KAAK,QAAQ,EACb,KAAK,UAAU,EACf,KAAK,SAAS,EACd,wBAAwB,EACxB,gBAAgB,EAChB,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EACvB,iBAAiB,EACjB,WAAW,EACX,KAAK,YAAY,EACjB,KAAK,eAAe,EACpB,KAAK,QAAQ,EACb,eAAe,EACf,KAAK,QAAQ,EACb,gBAAgB,EAChB,KAAK,SAAS,EACd,GAAG,GACJ,MAAM,mBAAmB,CAAA;AAC1B,cAAc,0BAA0B,CAAA;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAE5C,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAEhD,OAAO,EACL,QAAQ,EACR,KAAK,SAAS,EACd,KAAK,YAAY,EACjB,OAAO,EACP,KAAK,KAAK,EACV,KAAK,MAAM,EACX,KAAK,SAAS,EACd,MAAM,GACP,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AACtE,OAAO,EACL,KAAK,kBAAkB,EACvB,KAAK,yBAAyB,EAC9B,WAAW,EACX,kBAAkB,GACnB,MAAM,yBAAyB,CAAA;AAChC,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AACxC,OAAO,EACL,cAAc,EACd,mBAAmB,EACnB,WAAW,EACX,KAAK,gBAAgB,EACrB,KAAK,uBAAuB,EAC5B,oBAAoB,EACpB,KAAK,WAAW,EAChB,KAAK,SAAS,EACd,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACnB,oBAAoB,EACpB,KAAK,gBAAgB,EACrB,KAAK,WAAW,GACjB,MAAM,wBAAwB,CAAA;AAC/B,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AACjD,cAAc,uBAAuB,CAAA"}
1
+ {"version":3,"file":"mod.d.ts","sourceRoot":"","sources":["../src/mod.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAClF,OAAO,EACL,KAAK,QAAQ,EACb,KAAK,UAAU,EACf,KAAK,SAAS,EACd,wBAAwB,EACxB,gBAAgB,EAChB,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EACvB,iBAAiB,EACjB,WAAW,EACX,KAAK,YAAY,EACjB,KAAK,eAAe,EACpB,KAAK,QAAQ,EACb,eAAe,EACf,KAAK,QAAQ,EACb,gBAAgB,EAChB,KAAK,SAAS,EACd,GAAG,GACJ,MAAM,mBAAmB,CAAA;AAC1B,cAAc,0BAA0B,CAAA;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAE5C,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAEhD,OAAO,EACL,QAAQ,EACR,KAAK,SAAS,EACd,KAAK,YAAY,EACjB,OAAO,EACP,KAAK,KAAK,EACV,KAAK,MAAM,EACX,KAAK,SAAS,EACd,MAAM,GACP,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AACtE,OAAO,EACL,KAAK,kBAAkB,EACvB,KAAK,yBAAyB,EAC9B,WAAW,EACX,kBAAkB,GACnB,MAAM,yBAAyB,CAAA;AAChC,OAAO,EAAE,KAAK,oBAAoB,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AACjG,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AACxC,OAAO,EACL,cAAc,EACd,mBAAmB,EACnB,WAAW,EACX,KAAK,gBAAgB,EACrB,KAAK,uBAAuB,EAC5B,oBAAoB,EACpB,KAAK,WAAW,EAChB,KAAK,SAAS,EACd,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACnB,oBAAoB,EACpB,KAAK,gBAAgB,EACrB,KAAK,WAAW,GACjB,MAAM,wBAAwB,CAAA;AAC/B,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AACjD,cAAc,uBAAuB,CAAA"}
package/dist/mod.js CHANGED
@@ -7,6 +7,7 @@ export { nanoid } from '@livestore/utils/nanoid';
7
7
  export { computed, queryDb, signal, } from "./live-queries/mod.js";
8
8
  export { emptyDebugInfo, SqliteDbWrapper } from "./SqliteDbWrapper.js";
9
9
  export { createStore, createStorePromise, } from "./store/create-store.js";
10
+ export { StoreRegistry, storeOptions } from "./store/StoreRegistry.js";
10
11
  export { Store } from "./store/store.js";
11
12
  export { isLiveQueryDef, isLiveQueryInstance, isQueryable, makeShutdownDeferred, StoreInternalsSymbol, } from "./store/store-types.js";
12
13
  export { exposeDebugUtils } from "./utils/dev.js";
package/dist/mod.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"mod.js","sourceRoot":"","sources":["../src/mod.ts"],"names":[],"mappings":"AACA,OAAO,EAIL,wBAAwB,EACxB,gBAAgB,EAGhB,iBAAiB,EACjB,WAAW,EAIX,eAAe,EAEf,gBAAgB,EAEhB,GAAG,GACJ,MAAM,mBAAmB,CAAA;AAC1B,cAAc,0BAA0B,CAAA;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAC5C,4DAA4D;AAC5D,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAEhD,OAAO,EACL,QAAQ,EAGR,OAAO,EAIP,MAAM,GACP,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AACtE,OAAO,EAGL,WAAW,EACX,kBAAkB,GACnB,MAAM,yBAAyB,CAAA;AAChC,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AACxC,OAAO,EACL,cAAc,EACd,mBAAmB,EACnB,WAAW,EAGX,oBAAoB,EAOpB,oBAAoB,GAGrB,MAAM,wBAAwB,CAAA;AAC/B,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AACjD,cAAc,uBAAuB,CAAA"}
1
+ {"version":3,"file":"mod.js","sourceRoot":"","sources":["../src/mod.ts"],"names":[],"mappings":"AACA,OAAO,EAIL,wBAAwB,EACxB,gBAAgB,EAGhB,iBAAiB,EACjB,WAAW,EAIX,eAAe,EAEf,gBAAgB,EAEhB,GAAG,GACJ,MAAM,mBAAmB,CAAA;AAC1B,cAAc,0BAA0B,CAAA;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAC5C,4DAA4D;AAC5D,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAEhD,OAAO,EACL,QAAQ,EAGR,OAAO,EAIP,MAAM,GACP,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AACtE,OAAO,EAGL,WAAW,EACX,kBAAkB,GACnB,MAAM,yBAAyB,CAAA;AAChC,OAAO,EAA6B,aAAa,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AACjG,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AACxC,OAAO,EACL,cAAc,EACd,mBAAmB,EACnB,WAAW,EAGX,oBAAoB,EAOpB,oBAAoB,GAGrB,MAAM,wBAAwB,CAAA;AAC/B,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AACjD,cAAc,uBAAuB,CAAA"}
@@ -0,0 +1,190 @@
1
+ import { UnknownError } from '@livestore/common';
2
+ import type { LiveStoreSchema } from '@livestore/common/schema';
3
+ import { Effect, type OtelTracer, Runtime, type Schema, type Scope } from '@livestore/utils/effect';
4
+ import { type CreateStoreOptions } from './create-store.ts';
5
+ import type { Store } from './store.ts';
6
+ import type { OtelOptions } from './store-types.ts';
7
+ /**
8
+ * Configuration options for stores managed by a {@link StoreRegistry}.
9
+ *
10
+ * Extends {@link CreateStoreOptions} with registry-specific settings for caching and observability.
11
+ * Use with {@link storeOptions} helper to get full type inference when defining reusable store configurations.
12
+ *
13
+ * @typeParam TSchema - The LiveStore schema type
14
+ * @typeParam TContext - User-defined context attached to the store
15
+ * @typeParam TSyncPayloadSchema - Schema for the sync payload sent to the backend
16
+ *
17
+ * @see {@link storeOptions} for defining reusable store configurations
18
+ * @see {@link StoreRegistry} for managing store lifecycles
19
+ */
20
+ export interface RegistryStoreOptions<TSchema extends LiveStoreSchema = LiveStoreSchema.Any, TContext = {}, TSyncPayloadSchema extends Schema.Schema<any> = typeof Schema.JsonValue> extends CreateStoreOptions<TSchema, TContext, TSyncPayloadSchema> {
21
+ /**
22
+ * OpenTelemetry configuration for tracing store operations.
23
+ *
24
+ * When provided, store operations (boot, queries, commits) will be traced
25
+ * under the given root span context using the specified tracer.
26
+ */
27
+ otelOptions?: Partial<OtelOptions>;
28
+ /**
29
+ * The time in milliseconds that this store should remain
30
+ * in memory after becoming unused. When this store becomes
31
+ * unused (no active retentions), it will be disposed after this duration.
32
+ *
33
+ * Stores transition to the unused state as soon as they have no
34
+ * active retentions, so when all components which use that store
35
+ * have unmounted.
36
+ *
37
+ * @remarks
38
+ * - **Limitation:** Per-store values are not yet supported. Only the registry-level default
39
+ * (via `StoreRegistry` constructor's `defaultOptions.unusedCacheTime`) is used.
40
+ * See {@link https://github.com/livestorejs/livestore/issues/917 | #917} for per-store support
41
+ * and {@link https://github.com/livestorejs/livestore/issues/918 | #918} for dynamic "longest wins" behavior.
42
+ * - If set to `Infinity`, will disable automatic disposal
43
+ * - The maximum allowed time is about {@link https://developer.mozilla.org/en-US/docs/Web/API/Window/setTimeout#maximum_delay_value | 24 days}
44
+ *
45
+ * @defaultValue `60_000` (60 seconds) or `Infinity` during SSR to avoid
46
+ * disposing stores before server render completes.
47
+ */
48
+ unusedCacheTime?: number;
49
+ }
50
+ type StoreRegistryConfig = {
51
+ /**
52
+ * Default options that are applied to all stores when they are loaded.
53
+ *
54
+ * @remarks
55
+ * These are options that typically don't depend on the specific store being loaded:
56
+ * - Framework integration (`batchUpdates`)
57
+ * - Environment settings (`disableDevtools`, `debug`, `otelOptions`)
58
+ * - Behavior defaults (`confirmUnsavedChanges`, `unusedCacheTime`)
59
+ *
60
+ * Store-specific fields like `schema`, `adapter`, `storeId`, and `boot` are intentionally
61
+ * excluded since they vary per store definition.
62
+ */
63
+ defaultOptions?: Partial<Pick<RegistryStoreOptions, 'batchUpdates' | 'disableDevtools' | 'confirmUnsavedChanges' | 'debug' | 'otelOptions' | 'unusedCacheTime'>>;
64
+ /**
65
+ * Custom Effect runtime for all registry operations (loading, caching, etc.).
66
+ * When the runtime's scope closes, all managed stores are automatically shut down.
67
+ */
68
+ runtime?: Runtime.Runtime<Scope.Scope | OtelTracer.OtelTracer>;
69
+ };
70
+ /**
71
+ * Store Registry coordinating store loading, caching, and retention
72
+ *
73
+ * @public
74
+ */
75
+ export declare class StoreRegistry {
76
+ #private;
77
+ /**
78
+ * Creates a new StoreRegistry instance.
79
+ *
80
+ * @example
81
+ * ```ts
82
+ * const registry = new StoreRegistry({
83
+ * defaultOptions: {
84
+ * batchUpdates,
85
+ * unusedCacheTime: 30_000,
86
+ * }
87
+ * })
88
+ * ```
89
+ */
90
+ constructor(config?: StoreRegistryConfig);
91
+ /**
92
+ * Gets a cached store or loads a new one, with the store lifetime scoped to the caller.
93
+ *
94
+ * @typeParam TSchema - The schema type for the store
95
+ * @typeParam TContext - The context type for the store
96
+ * @typeParam TSyncPayloadSchema - The sync payload schema type
97
+ * @returns An Effect that yields the store, scoped to the provided Scope
98
+ *
99
+ * @remarks
100
+ * - Stores are kept in cache and reused while any scope holds them
101
+ * - When the scope closes, the reference is released; the store is disposed after `unusedCacheTime`
102
+ * if no other scopes retain it
103
+ * - Concurrent calls with the same storeId share the same store instance
104
+ */
105
+ getOrLoad: <TSchema extends LiveStoreSchema, TContext = {}, TSyncPayloadSchema extends Schema.Schema<any> = typeof Schema.JsonValue>(options: RegistryStoreOptions<TSchema, TContext, TSyncPayloadSchema>) => Effect.Effect<Store<TSchema, TContext>, UnknownError, Scope.Scope>;
106
+ /**
107
+ * Get or load a store, returning it directly if already loaded or a promise if loading.
108
+ *
109
+ * @typeParam TSchema - The schema type for the store
110
+ * @typeParam TContext - The context type for the store
111
+ * @typeParam TSyncPayloadSchema - The sync payload schema type
112
+ * @returns The loaded store if available, or a Promise that resolves to the loaded store
113
+ * @throws unknown - store loading error
114
+ *
115
+ * @remarks
116
+ * - Returns the store instance directly (synchronous) when already loaded
117
+ * - Returns a stable Promise reference when loading is in progress or needs to be initiated
118
+ * - Throws with the same error instance on subsequent calls after failure
119
+ * - Applies default options from registry config, with call-site options taking precedence
120
+ * - Concurrent calls with the same storeId share the same store instance
121
+ */
122
+ getOrLoadPromise: <TSchema extends LiveStoreSchema, TContext = {}, TSyncPayloadSchema extends Schema.Schema<any> = typeof Schema.JsonValue>(options: RegistryStoreOptions<TSchema, TContext, TSyncPayloadSchema>) => Store<TSchema, TContext> | Promise<Store<TSchema, TContext>>;
123
+ /**
124
+ * Retains the store in cache.
125
+ *
126
+ * @typeParam TSchema - The schema type for the store
127
+ * @typeParam TContext - The context type for the store
128
+ * @typeParam TSyncPayloadSchema - The sync payload schema type
129
+ * @returns A release function that, when called, removes this retention hold
130
+ *
131
+ * @remarks
132
+ * - Multiple retains on the same store are independent; each must be released separately
133
+ * - If the store isn't cached yet, it will be loaded and then retained
134
+ * - The store will remain in cache until all retains are released and after `unusedCacheTime` expires
135
+ */
136
+ retain: <TSchema extends LiveStoreSchema, TContext = {}, TSyncPayloadSchema extends Schema.Schema<any> = typeof Schema.JsonValue>(options: RegistryStoreOptions<TSchema, TContext, TSyncPayloadSchema>) => (() => void);
137
+ /**
138
+ * Loads a store (without suspending) to warm up the cache.
139
+ *
140
+ * @typeParam TSchema - The schema of the store to preload
141
+ * @typeParam TContext - The context type for the store
142
+ * @typeParam TSyncPayloadSchema - The sync payload schema type
143
+ * @returns A promise that resolves when the loading is complete (success or failure)
144
+ *
145
+ * @remarks
146
+ * - We don't return the store or throw as this is a fire-and-forget operation.
147
+ * - If the entry remains unused after preload resolves/rejects, it is scheduled for disposal.
148
+ * - Does not affect the retention of the store in cache.
149
+ */
150
+ preload: <TSchema extends LiveStoreSchema, TContext = {}, TSyncPayloadSchema extends Schema.Schema<any> = typeof Schema.JsonValue>(options: RegistryStoreOptions<TSchema, TContext, TSyncPayloadSchema>) => Promise<void>;
151
+ }
152
+ /**
153
+ * Helper for defining reusable store options with full type inference. Returns
154
+ * options that can be passed to `useStore()` or `storeRegistry.preload()`.
155
+ *
156
+ * @remarks
157
+ * At runtime this is an identity function that returns the input unchanged.
158
+ * Its value lies in enabling TypeScript's excess property checking to catch
159
+ * typos and configuration errors, while allowing options to be shared across
160
+ * `useStore()`, `storeRegistry.preload()`, `storeRegistry.getOrLoad()`, etc.
161
+ *
162
+ * @typeParam TSchema - The LiveStore schema type
163
+ * @typeParam TContext - User-defined context attached to the store
164
+ * @typeParam TSyncPayloadSchema - Schema for the sync payload sent to the backend
165
+ * @param options - The store configuration options
166
+ * @returns The same options object, unchanged
167
+ *
168
+ * @example
169
+ * ```ts
170
+ * export const issueStoreOptions = (issueId: string) =>
171
+ * storeOptions({
172
+ * storeId: `issue-${issueId}`,
173
+ * schema,
174
+ * adapter,
175
+ * unusedCacheTime: 30_000,
176
+ * })
177
+ *
178
+ * // In a component
179
+ * const issueStore = useStore(issueStoreOptions(issueId))
180
+ *
181
+ * // In a route loader or event handler
182
+ * storeRegistry.preload({
183
+ * ...issueStoreOptions(issueId),
184
+ * unusedCacheTime: 10_000,
185
+ * });
186
+ * ```
187
+ */
188
+ export declare function storeOptions<TSchema extends LiveStoreSchema, TContext = {}, TSyncPayloadSchema extends Schema.Schema<any> = typeof Schema.JsonValue>(options: RegistryStoreOptions<TSchema, TContext, TSyncPayloadSchema>): RegistryStoreOptions<TSchema, TContext, TSyncPayloadSchema>;
189
+ export {};
190
+ //# sourceMappingURL=StoreRegistry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StoreRegistry.d.ts","sourceRoot":"","sources":["../../src/store/StoreRegistry.ts"],"names":[],"mappings":"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"}