@livestore/livestore 0.4.0-dev.9 → 0.5.0-dev.0
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.
- package/README.md +0 -1
- package/dist/.tsbuildinfo +1 -1
- package/dist/QueryCache.js +1 -1
- package/dist/QueryCache.js.map +1 -1
- package/dist/SqliteDbWrapper.d.ts +5 -5
- package/dist/SqliteDbWrapper.d.ts.map +1 -1
- package/dist/SqliteDbWrapper.js +15 -13
- package/dist/SqliteDbWrapper.js.map +1 -1
- package/dist/SqliteDbWrapper.test.js +24 -6
- package/dist/SqliteDbWrapper.test.js.map +1 -1
- package/dist/effect/LiveStore.d.ts +134 -6
- package/dist/effect/LiveStore.d.ts.map +1 -1
- package/dist/effect/LiveStore.js +190 -11
- package/dist/effect/LiveStore.js.map +1 -1
- package/dist/effect/LiveStore.test.d.ts +2 -0
- package/dist/effect/LiveStore.test.d.ts.map +1 -0
- package/dist/effect/LiveStore.test.js +41 -0
- package/dist/effect/LiveStore.test.js.map +1 -0
- package/dist/effect/mod.d.ts +1 -1
- package/dist/effect/mod.d.ts.map +1 -1
- package/dist/effect/mod.js +3 -1
- package/dist/effect/mod.js.map +1 -1
- package/dist/live-queries/base-class.d.ts +129 -9
- package/dist/live-queries/base-class.d.ts.map +1 -1
- package/dist/live-queries/base-class.js +30 -4
- package/dist/live-queries/base-class.js.map +1 -1
- package/dist/live-queries/client-document-get-query.d.ts +1 -1
- package/dist/live-queries/client-document-get-query.d.ts.map +1 -1
- package/dist/live-queries/client-document-get-query.js +4 -3
- package/dist/live-queries/client-document-get-query.js.map +1 -1
- package/dist/live-queries/computed.d.ts +56 -0
- package/dist/live-queries/computed.d.ts.map +1 -1
- package/dist/live-queries/computed.js +62 -6
- package/dist/live-queries/computed.js.map +1 -1
- package/dist/live-queries/db-query.d.ts +2 -2
- package/dist/live-queries/db-query.d.ts.map +1 -1
- package/dist/live-queries/db-query.js +41 -30
- package/dist/live-queries/db-query.js.map +1 -1
- package/dist/live-queries/db-query.test.js +112 -29
- package/dist/live-queries/db-query.test.js.map +1 -1
- package/dist/live-queries/signal.d.ts +49 -0
- package/dist/live-queries/signal.d.ts.map +1 -1
- package/dist/live-queries/signal.js +51 -2
- package/dist/live-queries/signal.js.map +1 -1
- package/dist/live-queries/signal.test.js +4 -4
- package/dist/live-queries/signal.test.js.map +1 -1
- package/dist/mod.d.ts +3 -3
- package/dist/mod.d.ts.map +1 -1
- package/dist/mod.js +3 -2
- package/dist/mod.js.map +1 -1
- package/dist/reactive.d.ts +10 -10
- package/dist/reactive.d.ts.map +1 -1
- package/dist/reactive.js +29 -27
- package/dist/reactive.js.map +1 -1
- package/dist/reactive.test.js +2 -2
- package/dist/reactive.test.js.map +1 -1
- package/dist/store/StoreRegistry.d.ts +215 -0
- package/dist/store/StoreRegistry.d.ts.map +1 -0
- package/dist/store/StoreRegistry.js +267 -0
- package/dist/store/StoreRegistry.js.map +1 -0
- package/dist/store/StoreRegistry.test.d.ts +2 -0
- package/dist/store/StoreRegistry.test.d.ts.map +1 -0
- package/dist/store/StoreRegistry.test.js +384 -0
- package/dist/store/StoreRegistry.test.js.map +1 -0
- package/dist/store/create-store.d.ts +99 -22
- package/dist/store/create-store.d.ts.map +1 -1
- package/dist/store/create-store.js +85 -37
- package/dist/store/create-store.js.map +1 -1
- package/dist/store/devtools.d.ts +6 -18
- package/dist/store/devtools.d.ts.map +1 -1
- package/dist/store/devtools.js +61 -19
- package/dist/store/devtools.js.map +1 -1
- package/dist/store/store-eventstream.test.d.ts +2 -0
- package/dist/store/store-eventstream.test.d.ts.map +1 -0
- package/dist/store/store-eventstream.test.js +65 -0
- package/dist/store/store-eventstream.test.js.map +1 -0
- package/dist/store/store-types.d.ts +271 -31
- package/dist/store/store-types.d.ts.map +1 -1
- package/dist/store/store-types.js +41 -1
- package/dist/store/store-types.js.map +1 -1
- package/dist/store/store-types.test.d.ts +2 -0
- package/dist/store/store-types.test.d.ts.map +1 -0
- package/dist/store/store-types.test.js +39 -0
- package/dist/store/store-types.test.js.map +1 -0
- package/dist/store/store.d.ts +255 -68
- package/dist/store/store.d.ts.map +1 -1
- package/dist/store/store.js +533 -186
- package/dist/store/store.js.map +1 -1
- package/dist/utils/dev.d.ts.map +1 -1
- package/dist/utils/dev.js +1 -1
- package/dist/utils/dev.js.map +1 -1
- package/dist/utils/stack-info.d.ts.map +1 -1
- package/dist/utils/stack-info.js +3 -2
- package/dist/utils/stack-info.js.map +1 -1
- package/dist/utils/tests/fixture.d.ts +46 -39
- package/dist/utils/tests/fixture.d.ts.map +1 -1
- package/dist/utils/tests/fixture.js +7 -0
- package/dist/utils/tests/fixture.js.map +1 -1
- package/dist/utils/tests/otel.d.ts.map +1 -1
- package/dist/utils/tests/otel.js +5 -5
- package/dist/utils/tests/otel.js.map +1 -1
- package/package.json +50 -18
- package/src/QueryCache.ts +1 -1
- package/src/SqliteDbWrapper.test.ts +30 -6
- package/src/SqliteDbWrapper.ts +21 -17
- package/src/ambient.d.ts +0 -7
- package/src/effect/LiveStore.test.ts +61 -0
- package/src/effect/LiveStore.ts +426 -22
- package/src/effect/mod.ts +13 -1
- package/src/live-queries/__snapshots__/db-query.test.ts.snap +814 -178
- package/src/live-queries/base-class.ts +162 -32
- package/src/live-queries/client-document-get-query.ts +6 -4
- package/src/live-queries/computed.ts +65 -8
- package/src/live-queries/db-query.test.ts +168 -30
- package/src/live-queries/db-query.ts +58 -43
- package/src/live-queries/signal.test.ts +5 -4
- package/src/live-queries/signal.ts +52 -3
- package/src/mod.ts +19 -2
- package/src/reactive.test.ts +3 -2
- package/src/reactive.ts +58 -49
- package/src/store/StoreRegistry.test.ts +543 -0
- package/src/store/StoreRegistry.ts +429 -0
- package/src/store/create-store.ts +227 -74
- package/src/store/devtools.ts +305 -261
- package/src/store/store-eventstream.test.ts +123 -0
- package/src/store/store-types.test.ts +52 -0
- package/src/store/store-types.ts +318 -44
- package/src/store/store.ts +695 -283
- package/src/utils/dev.ts +3 -4
- package/src/utils/stack-info.ts +5 -2
- package/src/utils/tests/fixture.ts +9 -1
- package/src/utils/tests/otel.ts +8 -7
package/dist/effect/LiveStore.js
CHANGED
|
@@ -1,24 +1,203 @@
|
|
|
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
|
-
export const makeLiveStoreContext = ({ schema, storeId = 'default', context, boot, adapter, disableDevtools, onBootStatus, batchUpdates, }) => pipe(Effect.gen(function* () {
|
|
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({
|
|
6
6
|
schema,
|
|
7
7
|
storeId,
|
|
8
8
|
adapter,
|
|
9
9
|
batchUpdates,
|
|
10
|
-
...omitUndefineds({ context, boot, disableDevtools, onBootStatus }),
|
|
10
|
+
...omitUndefineds({ context, boot, disableDevtools, onBootStatus, syncPayload, syncPayloadSchema }),
|
|
11
11
|
});
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
globalThis.__debugLiveStore._ = store;
|
|
15
|
-
}
|
|
16
|
-
globalThis.__debugLiveStore[storeId] = store;
|
|
17
|
-
return { stage: 'running', store };
|
|
18
|
-
}), Effect.tapErrorCause((cause) => Effect.flatMap(DeferredStoreContext, (def) => Deferred.failCause(def, cause))), Effect.tap((storeCtx) => Effect.flatMap(DeferredStoreContext, (def) => Deferred.succeed(def, storeCtx))),
|
|
12
|
+
return LiveStoreContextRunning.of({ stage: 'running', store });
|
|
13
|
+
}), Effect.tapCause((cause) => Effect.flatMap(DeferredStoreContext, (def) => Deferred.failCause(def, cause))), Effect.tap((storeCtx) => Effect.flatMap(DeferredStoreContext, (def) => Deferred.succeed(def, storeCtx))),
|
|
19
14
|
// This can take quite a while.
|
|
20
15
|
// TODO make this configurable
|
|
21
16
|
Effect.timeout(Duration.minutes(5)), Effect.withSpan('@livestore/livestore/effect:makeLiveStoreContext'));
|
|
22
|
-
|
|
17
|
+
/**
|
|
18
|
+
* @deprecated Use `Store.Tag(schema, storeId)` instead for type-safe store contexts.
|
|
19
|
+
*
|
|
20
|
+
* @example Migration
|
|
21
|
+
* ```ts
|
|
22
|
+
* // Before
|
|
23
|
+
* const layer = LiveStoreContextLayer({ schema, adapter, ... })
|
|
24
|
+
*
|
|
25
|
+
* // After
|
|
26
|
+
* class MainStore extends Store.Tag(schema, 'main') {}
|
|
27
|
+
* const layer = MainStore.layer({ adapter, ... })
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
export const LiveStoreContextLayer = (props) => Layer.effect(LiveStoreContextRunning, makeLiveStoreContext(props)).pipe(Layer.withSpan('LiveStore'), Layer.provide(LiveStoreContextDeferred));
|
|
31
|
+
/**
|
|
32
|
+
* @deprecated Use `Store.Tag(schema, storeId)` and `MainStore.DeferredLayer` instead.
|
|
33
|
+
*/
|
|
23
34
|
export const LiveStoreContextDeferred = Layer.effect(DeferredStoreContext, Deferred.make());
|
|
35
|
+
/**
|
|
36
|
+
* Create a typed store context class for use with Effect.
|
|
37
|
+
*
|
|
38
|
+
* Returns a class that extends `Context.Service`, making it directly yieldable in Effect code.
|
|
39
|
+
* The class includes static methods for creating layers and accessors for common operations.
|
|
40
|
+
*
|
|
41
|
+
* @param schema - The LiveStore schema (used for type inference and runtime)
|
|
42
|
+
* @param storeId - Unique identifier for this store
|
|
43
|
+
*
|
|
44
|
+
* @example Basic usage
|
|
45
|
+
* ```ts
|
|
46
|
+
* import { Store } from '@livestore/livestore/effect'
|
|
47
|
+
* import { schema } from './schema.ts'
|
|
48
|
+
*
|
|
49
|
+
* // Define your store (once per store)
|
|
50
|
+
* export class MainStore extends Store.Tag(schema, 'main') {}
|
|
51
|
+
*
|
|
52
|
+
* // Create the layer
|
|
53
|
+
* const storeLayer = MainStore.layer({
|
|
54
|
+
* adapter: myAdapter,
|
|
55
|
+
* batchUpdates: ReactDOM.unstable_batchedUpdates,
|
|
56
|
+
* })
|
|
57
|
+
*
|
|
58
|
+
* // Use in Effect code
|
|
59
|
+
* Effect.gen(function* () {
|
|
60
|
+
* const { store } = yield* MainStore
|
|
61
|
+
* // ^? Store<typeof schema> - fully typed!
|
|
62
|
+
*
|
|
63
|
+
* // Or use accessors
|
|
64
|
+
* const users = yield* MainStore.query(tables.users.all())
|
|
65
|
+
* yield* MainStore.commit(events.createUser({ id: '1', name: 'Alice' }))
|
|
66
|
+
* })
|
|
67
|
+
* ```
|
|
68
|
+
*
|
|
69
|
+
* @example Multiple stores
|
|
70
|
+
* ```ts
|
|
71
|
+
* class MainStore extends Store.Tag(mainSchema, 'main') {}
|
|
72
|
+
* class SettingsStore extends Store.Tag(settingsSchema, 'settings') {}
|
|
73
|
+
*
|
|
74
|
+
* // Both available in same Effect context
|
|
75
|
+
* Effect.gen(function* () {
|
|
76
|
+
* const main = yield* MainStore
|
|
77
|
+
* const settings = yield* SettingsStore
|
|
78
|
+
* })
|
|
79
|
+
*
|
|
80
|
+
* const layer = Layer.mergeAll(
|
|
81
|
+
* MainStore.layer({ adapter: mainAdapter }),
|
|
82
|
+
* SettingsStore.layer({ adapter: settingsAdapter }),
|
|
83
|
+
* )
|
|
84
|
+
* ```
|
|
85
|
+
*/
|
|
86
|
+
const makeStoreTag = (schema, storeId) => {
|
|
87
|
+
// Create the deferred tag and layers upfront
|
|
88
|
+
const _DeferredTag = Context.Service(`@livestore/store-deferred/${storeId}`);
|
|
89
|
+
const _DeferredLayer = Layer.effect(_DeferredTag, Deferred.make());
|
|
90
|
+
class Tag extends Context.Service()(`@livestore/store/${storeId}`) {
|
|
91
|
+
static schema = schema;
|
|
92
|
+
static storeId = storeId;
|
|
93
|
+
static layer(props) {
|
|
94
|
+
return pipe(Effect.gen(function* () {
|
|
95
|
+
const store = yield* createStore({
|
|
96
|
+
schema,
|
|
97
|
+
storeId,
|
|
98
|
+
adapter: props.adapter,
|
|
99
|
+
batchUpdates: props.batchUpdates,
|
|
100
|
+
...omitUndefineds({
|
|
101
|
+
context: props.context,
|
|
102
|
+
boot: props.boot,
|
|
103
|
+
disableDevtools: props.disableDevtools,
|
|
104
|
+
onBootStatus: props.onBootStatus,
|
|
105
|
+
syncPayload: props.syncPayload,
|
|
106
|
+
syncPayloadSchema: props.syncPayloadSchema,
|
|
107
|
+
}),
|
|
108
|
+
});
|
|
109
|
+
const ctx = { stage: 'running', store: store };
|
|
110
|
+
// Also fulfill the deferred if it exists in context
|
|
111
|
+
yield* Effect.flatMap(Effect.serviceOption(_DeferredTag), (optDeferred) => optDeferred._tag === 'Some' ? Deferred.succeed(optDeferred.value, ctx) : Effect.void);
|
|
112
|
+
return Tag.of(ctx);
|
|
113
|
+
}), Effect.timeout(Duration.minutes(5)), Effect.withSpan(`@livestore/effect:Store.Tag:${storeId}`), Layer.effect(Tag), Layer.withSpan(`LiveStore:${storeId}`), Layer.provide(_DeferredLayer));
|
|
114
|
+
}
|
|
115
|
+
static Deferred = _DeferredTag;
|
|
116
|
+
static DeferredLayer = _DeferredLayer;
|
|
117
|
+
static fromDeferred = pipe(Effect.gen(function* () {
|
|
118
|
+
const deferred = yield* _DeferredTag;
|
|
119
|
+
const ctx = yield* Deferred.await(deferred);
|
|
120
|
+
return Layer.succeed(Tag, Tag.of(ctx));
|
|
121
|
+
}), Layer.unwrap);
|
|
122
|
+
static query(query) {
|
|
123
|
+
return Effect.map(Tag, ({ store }) => store.query(query));
|
|
124
|
+
}
|
|
125
|
+
static commit(...eventInputs) {
|
|
126
|
+
return Effect.map(Tag, ({ store }) => {
|
|
127
|
+
store.commit(...eventInputs);
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
static use(f) {
|
|
131
|
+
return Effect.flatMap(Tag, f);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
return Tag;
|
|
135
|
+
};
|
|
136
|
+
/**
|
|
137
|
+
* Store utilities for Effect integration.
|
|
138
|
+
*
|
|
139
|
+
* @example
|
|
140
|
+
* ```ts
|
|
141
|
+
* import { Store } from '@livestore/livestore/effect'
|
|
142
|
+
*
|
|
143
|
+
* export class MainStore extends Store.Tag(schema, 'main') {}
|
|
144
|
+
* ```
|
|
145
|
+
*/
|
|
146
|
+
export const Store = {
|
|
147
|
+
/**
|
|
148
|
+
* Create a typed store context class for use with Effect.
|
|
149
|
+
* @see {@link makeStoreTag} for full documentation
|
|
150
|
+
*/
|
|
151
|
+
Tag: makeStoreTag,
|
|
152
|
+
};
|
|
153
|
+
/**
|
|
154
|
+
* @deprecated Use `Store.Tag(schema, storeId)` instead.
|
|
155
|
+
*
|
|
156
|
+
* @example Migration
|
|
157
|
+
* ```ts
|
|
158
|
+
* // Before
|
|
159
|
+
* const MainStoreContext = makeStoreContext<typeof schema>()('main')
|
|
160
|
+
*
|
|
161
|
+
* // After
|
|
162
|
+
* class MainStore extends Store.Tag(schema, 'main') {}
|
|
163
|
+
* ```
|
|
164
|
+
*/
|
|
165
|
+
export const makeStoreContext = () => (storeId) => {
|
|
166
|
+
const Tag = Context.Service(`@livestore/store/${storeId}`);
|
|
167
|
+
const DeferredTag = Context.Service(`@livestore/store-deferred/${storeId}`);
|
|
168
|
+
const DeferredLayer = Layer.effect(DeferredTag, Deferred.make());
|
|
169
|
+
const makeLayer = (props) => pipe(Effect.gen(function* () {
|
|
170
|
+
const store = yield* createStore({
|
|
171
|
+
schema: props.schema,
|
|
172
|
+
storeId,
|
|
173
|
+
adapter: props.adapter,
|
|
174
|
+
batchUpdates: props.batchUpdates,
|
|
175
|
+
...omitUndefineds({
|
|
176
|
+
context: props.context,
|
|
177
|
+
boot: props.boot,
|
|
178
|
+
disableDevtools: props.disableDevtools,
|
|
179
|
+
onBootStatus: props.onBootStatus,
|
|
180
|
+
syncPayload: props.syncPayload,
|
|
181
|
+
syncPayloadSchema: props.syncPayloadSchema,
|
|
182
|
+
}),
|
|
183
|
+
});
|
|
184
|
+
const ctx = { stage: 'running', store: store };
|
|
185
|
+
// Also fulfill the deferred if it exists in context
|
|
186
|
+
yield* Effect.flatMap(Effect.serviceOption(DeferredTag), (optDeferred) => optDeferred._tag === 'Some' ? Deferred.succeed(optDeferred.value, ctx) : Effect.void);
|
|
187
|
+
return ctx;
|
|
188
|
+
}), Effect.timeout(Duration.minutes(5)), Effect.withSpan(`@livestore/effect:makeStoreContext:${storeId}`), Layer.effect(Tag), Layer.withSpan(`LiveStore:${storeId}`), Layer.provide(DeferredLayer));
|
|
189
|
+
const fromDeferred = pipe(Effect.gen(function* () {
|
|
190
|
+
const deferred = yield* DeferredTag;
|
|
191
|
+
const ctx = yield* Deferred.await(deferred);
|
|
192
|
+
return Layer.succeed(Tag, ctx);
|
|
193
|
+
}), Layer.unwrap);
|
|
194
|
+
return {
|
|
195
|
+
storeId,
|
|
196
|
+
Tag,
|
|
197
|
+
DeferredTag,
|
|
198
|
+
Layer: makeLayer,
|
|
199
|
+
DeferredLayer,
|
|
200
|
+
fromDeferred,
|
|
201
|
+
};
|
|
202
|
+
};
|
|
24
203
|
//# 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,
|
|
1
|
+
{"version":3,"file":"LiveStore.js","sourceRoot":"","sources":["../../src/effect/LiveStore.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LiveStore.test.d.ts","sourceRoot":"","sources":["../../src/effect/LiveStore.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { describe, it } from 'vitest';
|
|
2
|
+
import { Effect, Layer } from '@livestore/utils/effect';
|
|
3
|
+
import { schema } from "../utils/tests/fixture.js";
|
|
4
|
+
import { Store } from "./LiveStore.js";
|
|
5
|
+
/**
|
|
6
|
+
* Regression test for https://github.com/livestorejs/livestore/issues/1103
|
|
7
|
+
*
|
|
8
|
+
* `yield* MyStore` and `MyStore.query(...)` must produce the same R channel type
|
|
9
|
+
* so that a single layer provision satisfies both.
|
|
10
|
+
*/
|
|
11
|
+
describe('Store.Tag R channel consistency', () => {
|
|
12
|
+
class MainStore extends Store.Tag(schema, 'main') {
|
|
13
|
+
}
|
|
14
|
+
const storeLayer = MainStore.layer({ adapter: {}, batchUpdates: (_) => { } });
|
|
15
|
+
it('yield* and method R channels unify so layer provision eliminates all requirements', () => {
|
|
16
|
+
const prog = Effect.gen(function* () {
|
|
17
|
+
const { store } = yield* MainStore;
|
|
18
|
+
void store;
|
|
19
|
+
const _queryResult = yield* MainStore.query({ get: () => 42 });
|
|
20
|
+
void _queryResult;
|
|
21
|
+
yield* MainStore.commit();
|
|
22
|
+
});
|
|
23
|
+
const _provided = prog.pipe(Effect.provide(storeLayer));
|
|
24
|
+
const _check = true;
|
|
25
|
+
void _check;
|
|
26
|
+
});
|
|
27
|
+
it('use() helper R channel is satisfied by the same layer', () => {
|
|
28
|
+
const prog = MainStore.use(({ store }) => Effect.succeed(store));
|
|
29
|
+
const _provided = prog.pipe(Effect.provide(storeLayer));
|
|
30
|
+
const _check = true;
|
|
31
|
+
void _check;
|
|
32
|
+
});
|
|
33
|
+
it('fromDeferred layer output satisfies the same R channel', () => {
|
|
34
|
+
const prog = MainStore;
|
|
35
|
+
/** fromDeferred + DeferredLayer should satisfy MainStore in R */
|
|
36
|
+
const _provided = prog.pipe(Effect.provide(Layer.merge(MainStore.fromDeferred, MainStore.DeferredLayer)));
|
|
37
|
+
const _check = true;
|
|
38
|
+
void _check;
|
|
39
|
+
});
|
|
40
|
+
});
|
|
41
|
+
//# sourceMappingURL=LiveStore.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LiveStore.test.js","sourceRoot":"","sources":["../../src/effect/LiveStore.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAErC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAA;AAEvD,OAAO,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAA;AAClD,OAAO,EAAE,KAAK,EAAsB,MAAM,gBAAgB,CAAA;AAE1D;;;;;GAKG;AACH,QAAQ,CAAC,iCAAiC,EAAE,GAAG,EAAE;IAC/C,MAAM,SAAU,SAAQ,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC;KAAG;IAEpD,MAAM,UAAU,GAAG,SAAS,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,EAAS,EAAE,YAAY,EAAE,CAAC,CAAa,EAAE,EAAE,GAAE,CAAC,EAAE,CAAC,CAAA;IAE/F,EAAE,CAAC,mFAAmF,EAAE,GAAG,EAAE;QAC3F,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;YAC/B,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC,CAAC,SAAS,CAAA;YAClC,KAAK,KAAK,CAAA;YAEV,MAAM,YAAY,GAAG,KAAK,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,EAAS,CAAC,CAAA;YACrE,KAAK,YAAY,CAAA;YAEjB,KAAK,CAAC,CAAC,SAAS,CAAC,MAAM,EAAE,CAAA;QAC3B,CAAC,CAAC,CAAA;QAEF,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAA;QAIvD,MAAM,MAAM,GAAqB,IAAI,CAAA;QACrC,KAAK,MAAM,CAAA;IACb,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAC/D,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAA;QAEhE,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAA;QAIvD,MAAM,MAAM,GAAqB,IAAI,CAAA;QACrC,KAAK,MAAM,CAAA;IACb,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;QAChE,MAAM,IAAI,GAAG,SAAS,CAAA;QAEtB,iEAAiE;QACjE,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,YAAY,EAAE,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,CAAA;QAKzG,MAAM,MAAM,GAAqB,IAAI,CAAA;QACrC,KAAK,MAAM,CAAA;IACb,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
package/dist/effect/mod.d.ts
CHANGED
|
@@ -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
|
package/dist/effect/mod.d.ts.map
CHANGED
|
@@ -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;
|
|
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"}
|
package/dist/effect/mod.js
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
1
|
export { DeferredStoreContext, LiveStoreContextRunning as LiveStoreContext, LiveStoreContextRunning, } from "../store/create-store.js";
|
|
2
|
-
|
|
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
|
package/dist/effect/mod.js.map
CHANGED
|
@@ -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,
|
|
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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { Equal, Hash } from '@livestore/utils/effect';
|
|
2
1
|
import type * as otel from '@opentelemetry/api';
|
|
2
|
+
import { Equal, Hash } from '@livestore/utils/effect';
|
|
3
3
|
import * as RG from '../reactive.ts';
|
|
4
|
-
import type { Store } from '../store/store.ts';
|
|
5
4
|
import type { QueryDebugInfo, RefreshReason } from '../store/store-types.ts';
|
|
5
|
+
import type { Store } from '../store/store.ts';
|
|
6
6
|
import type { StackInfo } from '../utils/stack-info.ts';
|
|
7
7
|
export type ReactivityGraph = RG.ReactiveGraph<RefreshReason, QueryDebugInfo, ReactivityGraphContext>;
|
|
8
8
|
export declare const makeReactivityGraph: () => ReactivityGraph;
|
|
@@ -17,65 +17,169 @@ export type ReactivityGraphContext = {
|
|
|
17
17
|
effectsWrapper: (run: () => void) => void;
|
|
18
18
|
};
|
|
19
19
|
export type GetResult<TQuery extends LiveQueryDef.Any | LiveQuery.Any | SignalDef<any>> = TQuery extends LiveQuery<infer TResult> ? TResult : TQuery extends LiveQueryDef<infer TResult> ? TResult : TQuery extends SignalDef<infer TResult> ? TResult : unknown;
|
|
20
|
+
/**
|
|
21
|
+
* A signal definition representing ephemeral, local-only reactive state.
|
|
22
|
+
*
|
|
23
|
+
* `SignalDef` is the type returned by {@link signal}. It's a blueprint for creating
|
|
24
|
+
* signal instances—the actual instance is created when you use the definition with
|
|
25
|
+
* a Store via `store.query()` or `store.setSignal()`.
|
|
26
|
+
*
|
|
27
|
+
* @typeParam T - The type of value the signal holds
|
|
28
|
+
*/
|
|
20
29
|
export interface SignalDef<T> extends LiveQueryDef<T, 'signal-def'> {
|
|
21
30
|
_tag: 'signal-def';
|
|
31
|
+
/** The initial value used when the signal is first created */
|
|
22
32
|
defaultValue: T;
|
|
33
|
+
/** Unique identifier for caching and deduplication */
|
|
23
34
|
hash: string;
|
|
35
|
+
/** Human-readable label for debugging and devtools */
|
|
24
36
|
label: string;
|
|
37
|
+
/** Creates a reference-counted signal instance bound to a Store's reactivity graph */
|
|
25
38
|
make: (ctx: ReactivityGraphContext) => RcRef<ISignal<T>>;
|
|
26
|
-
[Equal.symbol](that:
|
|
39
|
+
[Equal.symbol](that: Equal.Equal): boolean;
|
|
27
40
|
[Hash.symbol](): number;
|
|
28
41
|
}
|
|
42
|
+
/**
|
|
43
|
+
* Interface for a live signal instance.
|
|
44
|
+
*
|
|
45
|
+
* This represents an active signal bound to a Store's reactivity graph.
|
|
46
|
+
* Use `store.setSignal()` to update values and `store.query()` to read them.
|
|
47
|
+
*
|
|
48
|
+
* @typeParam T - The type of value the signal holds
|
|
49
|
+
*/
|
|
29
50
|
export interface ISignal<T> extends LiveQuery<T> {
|
|
30
51
|
_tag: 'signal';
|
|
31
52
|
reactivityGraph: ReactivityGraph;
|
|
53
|
+
/** The underlying reactive reference in the graph */
|
|
32
54
|
ref: RG.Ref<T, ReactivityGraphContext, RefreshReason>;
|
|
55
|
+
/** Sets the signal's value (prefer using `store.setSignal()` instead) */
|
|
33
56
|
set: (value: T) => void;
|
|
57
|
+
/** Gets the signal's current value (prefer using `store.query()` instead) */
|
|
34
58
|
get: () => T;
|
|
59
|
+
/** Removes the signal from the reactivity graph */
|
|
35
60
|
destroy: () => void;
|
|
36
61
|
}
|
|
37
62
|
export declare const TypeId: unique symbol;
|
|
38
63
|
export type TypeId = typeof TypeId;
|
|
64
|
+
/**
|
|
65
|
+
* A reference-counted wrapper around a LiveQuery or Signal instance.
|
|
66
|
+
*
|
|
67
|
+
* LiveStore uses reference counting to manage query lifecycle. When multiple
|
|
68
|
+
* components or subscriptions use the same query definition, they share a single
|
|
69
|
+
* instance. The instance is destroyed when the last reference is released.
|
|
70
|
+
*
|
|
71
|
+
* You typically don't interact with `RcRef` directly—it's used internally by
|
|
72
|
+
* hooks like `useQuery` and `useQueryRef`.
|
|
73
|
+
*/
|
|
39
74
|
export interface RcRef<T> {
|
|
75
|
+
/** Current reference count */
|
|
40
76
|
rc: number;
|
|
77
|
+
/** The wrapped query or signal instance */
|
|
41
78
|
value: T;
|
|
79
|
+
/** Decrements the reference count; destroys the instance when it reaches zero */
|
|
42
80
|
deref: () => void;
|
|
43
81
|
}
|
|
82
|
+
/**
|
|
83
|
+
* Dependency key used to identify queries on platforms where `fn.toString()` isn't reliable.
|
|
84
|
+
*
|
|
85
|
+
* On Expo/React Native, Hermes compiles functions to bytecode, so `fn.toString()` returns
|
|
86
|
+
* `[native code]`. To uniquely identify contextual queries, you must provide explicit `deps`.
|
|
87
|
+
*
|
|
88
|
+
* @example
|
|
89
|
+
* ```ts
|
|
90
|
+
* // On Expo, this would fail without deps:
|
|
91
|
+
* const filtered$ = queryDb(
|
|
92
|
+
* (get) => tables.todos.where({ userId: get(userId$) }),
|
|
93
|
+
* { deps: [userId] } // Required on Expo/React Native
|
|
94
|
+
* )
|
|
95
|
+
* ```
|
|
96
|
+
*/
|
|
44
97
|
export type DepKey = string | number | ReadonlyArray<string | number | undefined | null>;
|
|
45
98
|
export declare const depsToString: (deps: DepKey) => string;
|
|
99
|
+
/**
|
|
100
|
+
* A query definition representing a blueprint for a reactive query.
|
|
101
|
+
*
|
|
102
|
+
* Query definitions are created by {@link queryDb}, {@link computed}, and {@link signal}.
|
|
103
|
+
* They're lightweight and can be defined at module scope. The actual query instance
|
|
104
|
+
* (which holds state) is created lazily when you use the definition with a Store.
|
|
105
|
+
*
|
|
106
|
+
* Multiple uses of the same definition share a single instance via reference counting.
|
|
107
|
+
*
|
|
108
|
+
* @typeParam TResult - The type of value the query returns
|
|
109
|
+
* @typeParam TTag - Internal discriminator tag ('def' for queries, 'signal-def' for signals)
|
|
110
|
+
*/
|
|
46
111
|
export interface LiveQueryDef<TResult, TTag extends string = 'def'> {
|
|
47
112
|
_tag: TTag;
|
|
48
|
-
/** Creates a
|
|
113
|
+
/** Creates a reference-counted query instance bound to a Store's reactivity graph */
|
|
49
114
|
make: (ctx: ReactivityGraphContext, otelContext?: otel.Context) => RcRef<LiveQuery<TResult> | ISignal<TResult>>;
|
|
115
|
+
/** Human-readable label for debugging and devtools */
|
|
50
116
|
label: string;
|
|
117
|
+
/** Unique identifier derived from the query string or explicit deps; used for caching */
|
|
51
118
|
hash: string;
|
|
52
|
-
[Equal.symbol](that:
|
|
119
|
+
[Equal.symbol](that: Equal.Equal): boolean;
|
|
53
120
|
[Hash.symbol](): number;
|
|
54
121
|
}
|
|
55
122
|
export declare namespace LiveQueryDef {
|
|
56
123
|
type Any = LiveQueryDef<any, 'def' | 'signal-def'>;
|
|
57
124
|
}
|
|
58
125
|
/**
|
|
59
|
-
*
|
|
126
|
+
* Type guard that checks if a value is a query or signal definition.
|
|
127
|
+
*
|
|
128
|
+
* Use this to distinguish between definitions (blueprints) and instances (live queries).
|
|
129
|
+
* Definitions are created by `queryDb()`, `computed()`, and `signal()`.
|
|
130
|
+
*
|
|
131
|
+
* @example
|
|
132
|
+
* ```ts
|
|
133
|
+
* const todos$ = queryDb(tables.todos.all())
|
|
134
|
+
*
|
|
135
|
+
* if (isLiveQueryDef(todos$)) {
|
|
136
|
+
* console.log('This is a definition:', todos$.label)
|
|
137
|
+
* }
|
|
138
|
+
* ```
|
|
139
|
+
*/
|
|
140
|
+
export declare const isLiveQueryDef: (value: unknown) => value is LiveQueryDef<any> | SignalDef<any>;
|
|
141
|
+
export declare const isSignalDef: (value: unknown) => value is SignalDef<any>;
|
|
142
|
+
/**
|
|
143
|
+
* A live query instance bound to a specific Store.
|
|
144
|
+
*
|
|
145
|
+
* `LiveQuery` represents an active, stateful query in the reactivity graph. Unlike
|
|
146
|
+
* query definitions (`LiveQueryDef`), instances maintain state like execution counts,
|
|
147
|
+
* timing data, and active subscriptions.
|
|
148
|
+
*
|
|
149
|
+
* You typically don't work with `LiveQuery` directly—use `store.query()` for one-shot
|
|
150
|
+
* reads or `store.subscribe()` for reactive subscriptions. The instance is managed
|
|
151
|
+
* automatically via reference counting.
|
|
152
|
+
*
|
|
153
|
+
* @typeParam TResult - The type of value the query returns
|
|
60
154
|
*/
|
|
61
155
|
export interface LiveQuery<TResult> {
|
|
156
|
+
/** Unique identifier for this query instance */
|
|
62
157
|
id: number;
|
|
158
|
+
/** Discriminator for the query type */
|
|
63
159
|
_tag: 'computed' | 'db' | 'graphql' | 'signal';
|
|
64
160
|
[TypeId]: TypeId;
|
|
65
|
-
/**
|
|
161
|
+
/** Type-level only—extracts the result type from a LiveQuery */
|
|
66
162
|
'__result!': TResult;
|
|
67
|
-
/**
|
|
163
|
+
/** The underlying reactive atom in the graph that holds the query result */
|
|
68
164
|
results$: RG.Atom<TResult, ReactivityGraphContext, RefreshReason>;
|
|
165
|
+
/** Human-readable label for debugging and devtools */
|
|
69
166
|
label: string;
|
|
167
|
+
/** Executes the query and returns the result */
|
|
70
168
|
run: (args: {
|
|
71
169
|
otelContext?: otel.Context;
|
|
72
170
|
debugRefreshReason?: RefreshReason;
|
|
73
171
|
}) => TResult;
|
|
172
|
+
/** Removes the query from the reactivity graph */
|
|
74
173
|
destroy: () => void;
|
|
174
|
+
/** Whether this query instance has been destroyed */
|
|
75
175
|
isDestroyed: boolean;
|
|
176
|
+
/** Stack traces of active subscriptions (for debugging) */
|
|
76
177
|
activeSubscriptions: Set<StackInfo>;
|
|
178
|
+
/** Number of times this query has been executed */
|
|
77
179
|
runs: number;
|
|
180
|
+
/** Execution times in milliseconds (for performance monitoring) */
|
|
78
181
|
executionTimes: number[];
|
|
182
|
+
/** The definition that created this instance */
|
|
79
183
|
def: LiveQueryDef<TResult> | SignalDef<TResult>;
|
|
80
184
|
}
|
|
81
185
|
export declare namespace LiveQuery {
|
|
@@ -102,7 +206,23 @@ export declare abstract class LiveStoreQueryBase<TResult> implements LiveQuery<T
|
|
|
102
206
|
}) => TResult;
|
|
103
207
|
protected dependencyQueriesRef: DependencyQueriesRef;
|
|
104
208
|
}
|
|
105
|
-
|
|
209
|
+
/**
|
|
210
|
+
* Function signature for the `get` parameter in `computed()` and `queryDb()` callbacks.
|
|
211
|
+
*
|
|
212
|
+
* Call `get()` with a query definition, signal, or live query instance to:
|
|
213
|
+
* 1. Read its current value
|
|
214
|
+
* 2. Establish a reactive dependency (the caller re-runs when the dependency changes)
|
|
215
|
+
*
|
|
216
|
+
* @example
|
|
217
|
+
* ```ts
|
|
218
|
+
* const filtered$ = computed((get) => {
|
|
219
|
+
* const todos = get(todos$) // Depends on todos$
|
|
220
|
+
* const filter = get(filterText$) // Depends on filterText$
|
|
221
|
+
* return todos.filter((t) => t.text.includes(filter))
|
|
222
|
+
* })
|
|
223
|
+
* ```
|
|
224
|
+
*/
|
|
225
|
+
export type GetAtomResult = <T>(atom: RG.Atom<T, any, RefreshReason> | LiveQueryDef<T> | LiveQuery<T> | ISignal<T> | SignalDef<T>, otelContext?: otel.Context, debugRefreshReason?: RefreshReason) => T;
|
|
106
226
|
export type DependencyQueriesRef = Set<RcRef<LiveQuery.Any | ISignal<any>>>;
|
|
107
227
|
export declare const makeGetAtomResult: (get: RG.GetAtom, ctx: ReactivityGraphContext, otelContext: otel.Context, dependencyQueriesRef: DependencyQueriesRef) => GetAtomResult;
|
|
108
228
|
export declare const withRCMap: <T extends LiveQuery.Any | ISignal<any>>(id: string, make: (ctx: ReactivityGraphContext, otelContext?: otel.Context) => T) => ((ctx: ReactivityGraphContext, otelContext?: otel.Context) => RcRef<T>);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base-class.d.ts","sourceRoot":"","sources":["../../src/live-queries/base-class.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"base-class.d.ts","sourceRoot":"","sources":["../../src/live-queries/base-class.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,IAAI,MAAM,oBAAoB,CAAA;AAE/C,OAAO,EAAE,KAAK,EAAE,IAAI,EAAa,MAAM,yBAAyB,CAAA;AAEhE,OAAO,KAAK,EAAE,MAAM,gBAAgB,CAAA;AACpC,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAA;AAC5E,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AAC9C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAA;AAEvD,MAAM,MAAM,eAAe,GAAG,EAAE,CAAC,aAAa,CAAC,aAAa,EAAE,cAAc,EAAE,sBAAsB,CAAC,CAAA;AAErG,eAAO,MAAM,mBAAmB,QAAO,eACwC,CAAA;AAE/E,MAAM,MAAM,sBAAsB,GAAG;IACnC,KAAK,EAAE,KAAK,CAAA;IACZ,2EAA2E;IAC3E,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,SAAS,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;IAC1D,6DAA6D;IAC7D,eAAe,EAAE,OAAO,CAAC,eAAe,CAAC,CAAA;IACzC,UAAU,EAAE,IAAI,CAAC,MAAM,CAAA;IACvB,eAAe,EAAE,IAAI,CAAC,OAAO,CAAA;IAC7B,cAAc,EAAE,CAAC,GAAG,EAAE,MAAM,IAAI,KAAK,IAAI,CAAA;CAC1C,CAAA;AAED,MAAM,MAAM,SAAS,CAAC,MAAM,SAAS,YAAY,CAAC,GAAG,GAAG,SAAS,CAAC,GAAG,GAAG,SAAS,CAAC,GAAG,CAAC,IACpF,MAAM,SAAS,SAAS,CAAC,MAAM,OAAO,CAAC,GACnC,OAAO,GACP,MAAM,SAAS,YAAY,CAAC,MAAM,OAAO,CAAC,GACxC,OAAO,GACP,MAAM,SAAS,SAAS,CAAC,MAAM,OAAO,CAAC,GACrC,OAAO,GACP,OAAO,CAAA;AAIjB;;;;;;;;GAQG;AACH,MAAM,WAAW,SAAS,CAAC,CAAC,CAAE,SAAQ,YAAY,CAAC,CAAC,EAAE,YAAY,CAAC;IACjE,IAAI,EAAE,YAAY,CAAA;IAClB,8DAA8D;IAC9D,YAAY,EAAE,CAAC,CAAA;IACf,sDAAsD;IACtD,IAAI,EAAE,MAAM,CAAA;IACZ,sDAAsD;IACtD,KAAK,EAAE,MAAM,CAAA;IACb,sFAAsF;IACtF,IAAI,EAAE,CAAC,GAAG,EAAE,sBAAsB,KAAK,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAA;IACxD,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,GAAG,OAAO,CAAA;IAC1C,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,MAAM,CAAA;CACxB;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,OAAO,CAAC,CAAC,CAAE,SAAQ,SAAS,CAAC,CAAC,CAAC;IAC9C,IAAI,EAAE,QAAQ,CAAA;IACd,eAAe,EAAE,eAAe,CAAA;IAChC,qDAAqD;IACrD,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,sBAAsB,EAAE,aAAa,CAAC,CAAA;IACrD,yEAAyE;IACzE,GAAG,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,CAAA;IACvB,6EAA6E;IAC7E,GAAG,EAAE,MAAM,CAAC,CAAA;IACZ,mDAAmD;IACnD,OAAO,EAAE,MAAM,IAAI,CAAA;CACpB;AAED,eAAO,MAAM,MAAM,eAA0B,CAAA;AAC7C,MAAM,MAAM,MAAM,GAAG,OAAO,MAAM,CAAA;AAElC;;;;;;;;;GASG;AACH,MAAM,WAAW,KAAK,CAAC,CAAC;IACtB,8BAA8B;IAC9B,EAAE,EAAE,MAAM,CAAA;IACV,2CAA2C;IAC3C,KAAK,EAAE,CAAC,CAAA;IACR,iFAAiF;IACjF,KAAK,EAAE,MAAM,IAAI,CAAA;CAClB;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,MAAM,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,aAAa,CAAC,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC,CAAA;AAExF,eAAO,MAAM,YAAY,GAAI,MAAM,MAAM,KAAG,MAK3C,CAAA;AAED;;;;;;;;;;;GAWG;AAEH,MAAM,WAAW,YAAY,CAAC,OAAO,EAAE,IAAI,SAAS,MAAM,GAAG,KAAK;IAChE,IAAI,EAAE,IAAI,CAAA;IACV,qFAAqF;IACrF,IAAI,EAAE,CAAC,GAAG,EAAE,sBAAsB,EAAE,WAAW,CAAC,EAAE,IAAI,CAAC,OAAO,KAAK,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAA;IAC/G,sDAAsD;IACtD,KAAK,EAAE,MAAM,CAAA;IACb,yFAAyF;IACzF,IAAI,EAAE,MAAM,CAAA;IACZ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,GAAG,OAAO,CAAA;IAC1C,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,MAAM,CAAA;CACxB;AAED,yBAAiB,YAAY,CAAC;IAC5B,KAAY,GAAG,GAAG,YAAY,CAAC,GAAG,EAAE,KAAK,GAAG,YAAY,CAAC,CAAA;CAC1D;AAED;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,cAAc,GAAI,OAAO,OAAO,KAAG,KAAK,IAAI,YAAY,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,GAAG,CAazF,CAAA;AAED,eAAO,MAAM,WAAW,GAAI,OAAO,OAAO,KAAG,KAAK,IAAI,SAAS,CAAC,GAAG,CACD,CAAA;AAElE;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,SAAS,CAAC,OAAO;IAChC,gDAAgD;IAChD,EAAE,EAAE,MAAM,CAAA;IACV,uCAAuC;IACvC,IAAI,EAAE,UAAU,GAAG,IAAI,GAAG,SAAS,GAAG,QAAQ,CAAA;IAC9C,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IAEhB,gEAAgE;IAChE,WAAW,EAAE,OAAO,CAAA;IAEpB,4EAA4E;IAC5E,QAAQ,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,sBAAsB,EAAE,aAAa,CAAC,CAAA;IAEjE,sDAAsD;IACtD,KAAK,EAAE,MAAM,CAAA;IAEb,gDAAgD;IAChD,GAAG,EAAE,CAAC,IAAI,EAAE;QAAE,WAAW,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC;QAAC,kBAAkB,CAAC,EAAE,aAAa,CAAA;KAAE,KAAK,OAAO,CAAA;IAE1F,kDAAkD;IAClD,OAAO,EAAE,MAAM,IAAI,CAAA;IACnB,qDAAqD;IACrD,WAAW,EAAE,OAAO,CAAA;IAEpB,2DAA2D;IAC3D,mBAAmB,EAAE,GAAG,CAAC,SAAS,CAAC,CAAA;IAEnC,mDAAmD;IACnD,IAAI,EAAE,MAAM,CAAA;IAEZ,mEAAmE;IACnE,cAAc,EAAE,MAAM,EAAE,CAAA;IACxB,gDAAgD;IAChD,GAAG,EAAE,YAAY,CAAC,OAAO,CAAC,GAAG,SAAS,CAAC,OAAO,CAAC,CAAA;CAChD;AAED,yBAAiB,SAAS,CAAC;IACzB,KAAY,GAAG,GAAG,SAAS,CAAC,GAAG,CAAC,CAAA;CACjC;AAED,8BAAsB,kBAAkB,CAAC,OAAO,CAAE,YAAW,SAAS,CAAC,OAAO,CAAC;IAC7E,WAAW,EAAG,OAAO,CAAA;IACrB,EAAE,SAAoB;IACtB,CAAC,MAAM,CAAC,EAAE,MAAM,CAAS;IACzB,QAAQ,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI,GAAG,SAAS,GAAG,QAAQ,CAAA;IAEvD,uDAAuD;IACvD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IAEtB,QAAQ,CAAC,GAAG,EAAE,YAAY,CAAC,OAAO,CAAC,GAAG,SAAS,CAAC,OAAO,CAAC,CAAA;IAExD,QAAQ,CAAC,QAAQ,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,sBAAsB,EAAE,aAAa,CAAC,CAAA;IAE1E,mBAAmB,EAAE,GAAG,CAAC,SAAS,CAAC,CAAY;IAE/C,QAAQ,CAAC,QAAQ,CAAC,eAAe,EAAE,eAAe,CAAA;IAElD,IAAI,IAAI,WAKP;IAED,cAAc,EAAE,MAAM,EAAE,CAAK;IAG7B,WAAW,UAAQ;IACnB,QAAQ,CAAC,OAAO,EAAE,MAAM,IAAI,CAAA;IAE5B,GAAG,GAAI,MAAM;QAAE,WAAW,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC;QAAC,kBAAkB,CAAC,EAAE,aAAa,CAAA;KAAE,KAAG,OAAO,CAExF;IAED,SAAS,CAAC,oBAAoB,EAAE,oBAAoB,CAAY;CAYjE;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,EAC5B,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,EAAE,aAAa,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,EACjG,WAAW,CAAC,EAAE,IAAI,CAAC,OAAO,EAC1B,kBAAkB,CAAC,EAAE,aAAa,KAC/B,CAAC,CAAA;AAEN,MAAM,MAAM,oBAAoB,GAAG,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;AAE3E,eAAO,MAAM,iBAAiB,GAC5B,KAAK,EAAE,CAAC,OAAO,EACf,KAAK,sBAAsB,EAC3B,aAAa,IAAI,CAAC,OAAO,EACzB,sBAAsB,oBAAoB,kBAyB3C,CAAA;AAED,eAAO,MAAM,SAAS,GAAI,CAAC,SAAS,SAAS,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,EAC9D,IAAI,MAAM,EACV,MAAM,CAAC,GAAG,EAAE,sBAAsB,EAAE,WAAW,CAAC,EAAE,IAAI,CAAC,OAAO,KAAK,CAAC,KACnE,CAAC,CAAC,GAAG,EAAE,sBAAsB,EAAE,WAAW,CAAC,EAAE,IAAI,CAAC,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,CAyBxE,CAAA"}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { isNotNil } from '@livestore/utils';
|
|
2
1
|
import { Equal, Hash, Predicate } from '@livestore/utils/effect';
|
|
3
2
|
import * as RG from "../reactive.js";
|
|
4
3
|
export const makeReactivityGraph = () => new RG.ReactiveGraph();
|
|
@@ -8,8 +7,35 @@ export const depsToString = (deps) => {
|
|
|
8
7
|
if (typeof deps === 'string' || typeof deps === 'number') {
|
|
9
8
|
return deps.toString();
|
|
10
9
|
}
|
|
11
|
-
return deps.filter(
|
|
10
|
+
return deps.filter(Predicate.isNotNullish).join(',');
|
|
12
11
|
};
|
|
12
|
+
/**
|
|
13
|
+
* Type guard that checks if a value is a query or signal definition.
|
|
14
|
+
*
|
|
15
|
+
* Use this to distinguish between definitions (blueprints) and instances (live queries).
|
|
16
|
+
* Definitions are created by `queryDb()`, `computed()`, and `signal()`.
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* ```ts
|
|
20
|
+
* const todos$ = queryDb(tables.todos.all())
|
|
21
|
+
*
|
|
22
|
+
* if (isLiveQueryDef(todos$)) {
|
|
23
|
+
* console.log('This is a definition:', todos$.label)
|
|
24
|
+
* }
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
export const isLiveQueryDef = (value) => {
|
|
28
|
+
if (Predicate.isTagged(value, 'def') === false && Predicate.isTagged(value, 'signal-def') === false) {
|
|
29
|
+
return false;
|
|
30
|
+
}
|
|
31
|
+
return (Predicate.hasProperty(value, 'make') &&
|
|
32
|
+
Predicate.isFunction(value.make) &&
|
|
33
|
+
Predicate.hasProperty(value, 'hash') &&
|
|
34
|
+
Predicate.isString(value.hash) &&
|
|
35
|
+
Predicate.hasProperty(value, 'label') &&
|
|
36
|
+
Predicate.isString(value.label));
|
|
37
|
+
};
|
|
38
|
+
export const isSignalDef = (value) => isLiveQueryDef(value) && Predicate.isTagged(value, 'signal-def');
|
|
13
39
|
export class LiveStoreQueryBase {
|
|
14
40
|
'__result!';
|
|
15
41
|
id = queryIdCounter++;
|
|
@@ -43,7 +69,7 @@ export const makeGetAtomResult = (get, ctx, otelContext, dependencyQueriesRef) =
|
|
|
43
69
|
return getAtom(query.value, _otelContext, debugRefreshReason);
|
|
44
70
|
}
|
|
45
71
|
// Signal case
|
|
46
|
-
if (atom._tag === 'signal' && Predicate.hasProperty(atom, 'ref')) {
|
|
72
|
+
if (atom._tag === 'signal' && Predicate.hasProperty(atom, 'ref') === true) {
|
|
47
73
|
return get(atom.ref, otelContext, debugRefreshReason);
|
|
48
74
|
}
|
|
49
75
|
// LiveQuery case
|
|
@@ -54,7 +80,7 @@ export const makeGetAtomResult = (get, ctx, otelContext, dependencyQueriesRef) =
|
|
|
54
80
|
export const withRCMap = (id, make) => {
|
|
55
81
|
return (ctx, otelContext) => {
|
|
56
82
|
let item = ctx.defRcMap.get(id);
|
|
57
|
-
if (item) {
|
|
83
|
+
if (item !== undefined) {
|
|
58
84
|
item.rc++;
|
|
59
85
|
return item;
|
|
60
86
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base-class.js","sourceRoot":"","sources":["../../src/live-queries/base-class.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"base-class.js","sourceRoot":"","sources":["../../src/live-queries/base-class.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
+
import type * as otel from '@opentelemetry/api';
|
|
1
2
|
import { SessionIdSymbol } from '@livestore/common';
|
|
2
3
|
import { State } from '@livestore/common/schema';
|
|
3
|
-
import type * as otel from '@opentelemetry/api';
|
|
4
4
|
import type { ReactivityGraphContext } from './base-class.ts';
|
|
5
5
|
export declare const rowQueryLabel: (table: State.SQLite.ClientDocumentTableDef.Any, id: string | SessionIdSymbol | undefined) => string;
|
|
6
6
|
export declare const makeExecBeforeFirstRun: ({ id, explicitDefaultValues, table, otelContext: otelContext_, }: {
|