@livestore/livestore 0.4.0-dev.12 → 0.4.0-dev.14
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/dist/.tsbuildinfo +1 -1
- package/dist/mod.d.ts +1 -1
- package/dist/mod.d.ts.map +1 -1
- package/dist/mod.js +1 -1
- package/dist/mod.js.map +1 -1
- package/dist/store/store-types.d.ts +19 -1
- package/dist/store/store-types.d.ts.map +1 -1
- package/dist/store/store-types.js +27 -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/package.json +5 -5
- package/src/mod.ts +1 -0
- package/src/store/store-types.test.ts +50 -0
- package/src/store/store-types.ts +65 -12
package/dist/mod.d.ts
CHANGED
|
@@ -9,7 +9,7 @@ export { emptyDebugInfo, SqliteDbWrapper } from './SqliteDbWrapper.ts';
|
|
|
9
9
|
export { type CreateStoreOptions, createStore, createStorePromise } from './store/create-store.ts';
|
|
10
10
|
export { Store } from './store/store.ts';
|
|
11
11
|
export type { OtelOptions, Queryable, QueryDebugInfo, RefreshReason, SubscribeOptions, Unsubscribe, } from './store/store-types.ts';
|
|
12
|
-
export { type LiveStoreContext, type LiveStoreContextRunning, makeShutdownDeferred, type ShutdownDeferred, } from './store/store-types.ts';
|
|
12
|
+
export { isQueryable, type LiveStoreContext, type LiveStoreContextRunning, makeShutdownDeferred, type ShutdownDeferred, } from './store/store-types.ts';
|
|
13
13
|
export { exposeDebugUtils } from './utils/dev.ts';
|
|
14
14
|
export * from './utils/stack-info.ts';
|
|
15
15
|
//# sourceMappingURL=mod.d.ts.map
|
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,EAAE,KAAK,kBAAkB,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AAClG,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AACxC,YAAY,EACV,WAAW,EACX,SAAS,EACT,cAAc,EACd,aAAa,EACb,gBAAgB,EAChB,WAAW,GACZ,MAAM,wBAAwB,CAAA;AAC/B,OAAO,EACL,KAAK,gBAAgB,EACrB,KAAK,uBAAuB,EAC5B,oBAAoB,EACpB,KAAK,gBAAgB,GACtB,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,EAAE,KAAK,kBAAkB,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AAClG,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AACxC,YAAY,EACV,WAAW,EACX,SAAS,EACT,cAAc,EACd,aAAa,EACb,gBAAgB,EAChB,WAAW,GACZ,MAAM,wBAAwB,CAAA;AAC/B,OAAO,EACL,WAAW,EACX,KAAK,gBAAgB,EACrB,KAAK,uBAAuB,EAC5B,oBAAoB,EACpB,KAAK,gBAAgB,GACtB,MAAM,wBAAwB,CAAA;AAC/B,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AACjD,cAAc,uBAAuB,CAAA"}
|
package/dist/mod.js
CHANGED
|
@@ -8,7 +8,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
10
|
export { Store } from "./store/store.js";
|
|
11
|
-
export { makeShutdownDeferred, } from "./store/store-types.js";
|
|
11
|
+
export { isQueryable, makeShutdownDeferred, } from "./store/store-types.js";
|
|
12
12
|
export { exposeDebugUtils } from "./utils/dev.js";
|
|
13
13
|
export * from "./utils/stack-info.js";
|
|
14
14
|
//# sourceMappingURL=mod.js.map
|
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,EAA2B,WAAW,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AAClG,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AASxC,OAAO,
|
|
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,EAA2B,WAAW,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AAClG,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AASxC,OAAO,EACL,WAAW,EAGX,oBAAoB,GAErB,MAAM,wBAAwB,CAAA;AAC/B,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AACjD,cAAc,uBAAuB,CAAA"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type ClientSession, type ClientSessionSyncProcessorSimulationParams, type IntentionalShutdownCause, type InvalidPullError, type IsOfflineError, type MaterializeError, type QueryBuilder, type StoreInterrupted, type SyncError, type UnexpectedError } from '@livestore/common';
|
|
2
2
|
import type { EventSequenceNumber, LiveStoreEvent, LiveStoreSchema } from '@livestore/common/schema';
|
|
3
3
|
import type { Effect, Runtime, Scope } from '@livestore/utils/effect';
|
|
4
4
|
import { Deferred } from '@livestore/utils/effect';
|
|
@@ -116,4 +116,22 @@ export type SubscribeOptions<TResult> = {
|
|
|
116
116
|
};
|
|
117
117
|
/** All query definitions or instances the store can execute or subscribe to. */
|
|
118
118
|
export type Queryable<TResult> = LiveQueryDef<TResult> | SignalDef<TResult> | LiveQuery<TResult> | QueryBuilder<TResult, any, any>;
|
|
119
|
+
/**
|
|
120
|
+
* Helper types for `Queryable`.
|
|
121
|
+
*
|
|
122
|
+
* Provides type-level utilities to work with `Queryable` values.
|
|
123
|
+
*/
|
|
124
|
+
export declare namespace Queryable {
|
|
125
|
+
/**
|
|
126
|
+
* Extracts the result type from a `Queryable`.
|
|
127
|
+
*
|
|
128
|
+
* Example:
|
|
129
|
+
* - `Queryable.Result<LiveQueryDef<number>>` → `number`
|
|
130
|
+
* - `Queryable.Result<SignalDef<string>>` → `string`
|
|
131
|
+
* - `Queryable.Result<LiveQuery<{ id: string }>>` → `{ id: string }`
|
|
132
|
+
* - `Queryable.Result<LiveQueryDef<A> | SignalDef<B>>` → `A | B`
|
|
133
|
+
*/
|
|
134
|
+
type Result<TQueryable extends Queryable<any>> = TQueryable extends Queryable<infer TResult> ? TResult : never;
|
|
135
|
+
}
|
|
136
|
+
export declare const isQueryable: (value: unknown) => value is Queryable<unknown>;
|
|
119
137
|
//# sourceMappingURL=store-types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store-types.d.ts","sourceRoot":"","sources":["../../src/store/store-types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"store-types.d.ts","sourceRoot":"","sources":["../../src/store/store-types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,29 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { isQueryBuilder, } from '@livestore/common';
|
|
2
|
+
import { Deferred, Predicate } from '@livestore/utils/effect';
|
|
3
|
+
import { TypeId } from "../live-queries/base-class.js";
|
|
2
4
|
export const makeShutdownDeferred = Deferred.make();
|
|
5
|
+
const isLiveQueryDef = (value) => {
|
|
6
|
+
if (typeof value !== 'object' || value === null) {
|
|
7
|
+
return false;
|
|
8
|
+
}
|
|
9
|
+
if (!('_tag' in value)) {
|
|
10
|
+
return false;
|
|
11
|
+
}
|
|
12
|
+
const tag = value._tag;
|
|
13
|
+
if (tag !== 'def' && tag !== 'signal-def') {
|
|
14
|
+
return false;
|
|
15
|
+
}
|
|
16
|
+
const candidate = value;
|
|
17
|
+
if (typeof candidate.make !== 'function') {
|
|
18
|
+
// The store calls make() to turn the definition into a live query instance.
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
if (typeof candidate.hash !== 'string' || typeof candidate.label !== 'string') {
|
|
22
|
+
// Both identifiers must be present so the store can cache and log the query.
|
|
23
|
+
return false;
|
|
24
|
+
}
|
|
25
|
+
return true;
|
|
26
|
+
};
|
|
27
|
+
const isLiveQueryInstance = (value) => Predicate.hasProperty(value, TypeId);
|
|
28
|
+
export const isQueryable = (value) => isQueryBuilder(value) || isLiveQueryInstance(value) || isLiveQueryDef(value);
|
|
3
29
|
//# sourceMappingURL=store-types.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store-types.js","sourceRoot":"","sources":["../../src/store/store-types.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"store-types.js","sourceRoot":"","sources":["../../src/store/store-types.ts"],"names":[],"mappings":"AAAA,OAAO,EAML,cAAc,GAMf,MAAM,mBAAmB,CAAA;AAG1B,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AAI7D,OAAO,EAAE,MAAM,EAAE,MAAM,+BAA+B,CAAA;AAoBtD,MAAM,CAAC,MAAM,oBAAoB,GAAoC,QAAQ,CAAC,IAAI,EAG/E,CAAA;AAsIH,MAAM,cAAc,GAAG,CAAC,KAAc,EAA+C,EAAE;IACrF,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QAChD,OAAO,KAAK,CAAA;IACd,CAAC;IAED,IAAI,CAAC,CAAC,MAAM,IAAI,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,KAAK,CAAA;IACd,CAAC;IAED,MAAM,GAAG,GAAI,KAA4C,CAAC,IAAI,CAAA;IAC9D,IAAI,GAAG,KAAK,KAAK,IAAI,GAAG,KAAK,YAAY,EAAE,CAAC;QAC1C,OAAO,KAAK,CAAA;IACd,CAAC;IAED,MAAM,SAAS,GAAG,KAA0B,CAAA;IAC5C,IAAI,OAAO,SAAS,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QACzC,4EAA4E;QAC5E,OAAO,KAAK,CAAA;IACd,CAAC;IAED,IAAI,OAAO,SAAS,CAAC,IAAI,KAAK,QAAQ,IAAI,OAAO,SAAS,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9E,6EAA6E;QAC7E,OAAO,KAAK,CAAA;IACd,CAAC;IAED,OAAO,IAAI,CAAA;AACb,CAAC,CAAA;AAED,MAAM,mBAAmB,GAAG,CAAC,KAAc,EAA2B,EAAE,CAAC,SAAS,CAAC,WAAW,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;AAE7G,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,KAAc,EAA+B,EAAE,CACzE,cAAc,CAAC,KAAK,CAAC,IAAI,mBAAmB,CAAC,KAAK,CAAC,IAAI,cAAc,CAAC,KAAK,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store-types.test.d.ts","sourceRoot":"","sources":["../../src/store/store-types.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { QueryBuilderTypeId } from '@livestore/common';
|
|
2
|
+
import { Schema } from '@livestore/utils/effect';
|
|
3
|
+
import { describe, expect, it } from 'vitest';
|
|
4
|
+
import { TypeId } from "../live-queries/base-class.js";
|
|
5
|
+
import { queryDb, signal } from "../live-queries/mod.js";
|
|
6
|
+
import { isQueryable } from "./store-types.js";
|
|
7
|
+
const makeQueryBuilder = () => ({
|
|
8
|
+
[QueryBuilderTypeId]: QueryBuilderTypeId,
|
|
9
|
+
ResultType: null,
|
|
10
|
+
asSql: () => ({ query: 'select 1', bindValues: [], usedTables: new Set() }),
|
|
11
|
+
toString: () => 'select 1',
|
|
12
|
+
});
|
|
13
|
+
describe('isQueryable', () => {
|
|
14
|
+
it('identifies live query definitions', () => {
|
|
15
|
+
const def = queryDb({
|
|
16
|
+
query: 'select 1 as value',
|
|
17
|
+
schema: Schema.Array(Schema.Struct({ value: Schema.Number })),
|
|
18
|
+
});
|
|
19
|
+
expect(isQueryable(def)).toBe(true);
|
|
20
|
+
});
|
|
21
|
+
it('identifies signal definitions', () => {
|
|
22
|
+
const sig = signal(0, { label: 'count' });
|
|
23
|
+
expect(isQueryable(sig)).toBe(true);
|
|
24
|
+
});
|
|
25
|
+
it('identifies live query instances', () => {
|
|
26
|
+
const liveQueryLike = { [TypeId]: TypeId };
|
|
27
|
+
expect(isQueryable(liveQueryLike)).toBe(true);
|
|
28
|
+
});
|
|
29
|
+
it('identifies query builders', () => {
|
|
30
|
+
const qb = makeQueryBuilder();
|
|
31
|
+
expect(isQueryable(qb)).toBe(true);
|
|
32
|
+
});
|
|
33
|
+
it('rejects unrelated values', () => {
|
|
34
|
+
expect(isQueryable(null)).toBe(false);
|
|
35
|
+
expect(isQueryable(undefined)).toBe(false);
|
|
36
|
+
expect(isQueryable({})).toBe(false);
|
|
37
|
+
});
|
|
38
|
+
});
|
|
39
|
+
//# sourceMappingURL=store-types.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store-types.test.js","sourceRoot":"","sources":["../../src/store/store-types.test.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AACtD,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAC7C,OAAO,EAAE,MAAM,EAAE,MAAM,+BAA+B,CAAA;AACtD,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAA;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAE9C,MAAM,gBAAgB,GAAG,GAAgC,EAAE,CACzD,CAAC;IACC,CAAC,kBAAkB,CAAC,EAAE,kBAAkB;IACxC,UAAU,EAAE,IAAI;IAChB,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI,GAAG,EAAU,EAAE,CAAC;IACnF,QAAQ,EAAE,GAAG,EAAE,CAAC,UAAU;CAC3B,CAA2C,CAAA;AAE9C,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC3B,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,MAAM,GAAG,GAAG,OAAO,CAAC;YAClB,KAAK,EAAE,mBAAmB;YAC1B,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;SAC9D,CAAC,CAAA;QAEF,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACrC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAA;QAEzC,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACrC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,MAAM,aAAa,GAAG,EAAE,CAAC,MAAM,CAAC,EAAE,MAAM,EAAW,CAAA;QAEnD,MAAM,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAC/C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACnC,MAAM,EAAE,GAAG,gBAAgB,EAAE,CAAA;QAE7B,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACpC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;QAClC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACrC,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAC1C,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACrC,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@livestore/livestore",
|
|
3
|
-
"version": "0.4.0-dev.
|
|
3
|
+
"version": "0.4.0-dev.14",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"sideEffects": false,
|
|
6
6
|
"exports": {
|
|
@@ -11,8 +11,8 @@
|
|
|
11
11
|
},
|
|
12
12
|
"dependencies": {
|
|
13
13
|
"@opentelemetry/api": "1.9.0",
|
|
14
|
-
"@livestore/common": "0.4.0-dev.
|
|
15
|
-
"@livestore/utils": "0.4.0-dev.
|
|
14
|
+
"@livestore/common": "0.4.0-dev.14",
|
|
15
|
+
"@livestore/utils": "0.4.0-dev.14"
|
|
16
16
|
},
|
|
17
17
|
"devDependencies": {
|
|
18
18
|
"@opentelemetry/sdk-trace-base": "^2.0.1",
|
|
@@ -20,8 +20,8 @@
|
|
|
20
20
|
"typescript": "5.9.2",
|
|
21
21
|
"vite": "7.1.7",
|
|
22
22
|
"vitest": "3.2.4",
|
|
23
|
-
"@livestore/
|
|
24
|
-
"@livestore/
|
|
23
|
+
"@livestore/adapter-web": "0.4.0-dev.14",
|
|
24
|
+
"@livestore/utils-dev": "0.4.0-dev.14"
|
|
25
25
|
},
|
|
26
26
|
"files": [
|
|
27
27
|
"package.json",
|
package/src/mod.ts
CHANGED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import type { QueryBuilder } from '@livestore/common'
|
|
2
|
+
import { QueryBuilderTypeId } from '@livestore/common'
|
|
3
|
+
import { Schema } from '@livestore/utils/effect'
|
|
4
|
+
import { describe, expect, it } from 'vitest'
|
|
5
|
+
import { TypeId } from '../live-queries/base-class.ts'
|
|
6
|
+
import { queryDb, signal } from '../live-queries/mod.ts'
|
|
7
|
+
import { isQueryable } from './store-types.ts'
|
|
8
|
+
|
|
9
|
+
const makeQueryBuilder = (): QueryBuilder<any, any, any> =>
|
|
10
|
+
({
|
|
11
|
+
[QueryBuilderTypeId]: QueryBuilderTypeId,
|
|
12
|
+
ResultType: null,
|
|
13
|
+
asSql: () => ({ query: 'select 1', bindValues: [], usedTables: new Set<string>() }),
|
|
14
|
+
toString: () => 'select 1',
|
|
15
|
+
}) as unknown as QueryBuilder<any, any, any>
|
|
16
|
+
|
|
17
|
+
describe('isQueryable', () => {
|
|
18
|
+
it('identifies live query definitions', () => {
|
|
19
|
+
const def = queryDb({
|
|
20
|
+
query: 'select 1 as value',
|
|
21
|
+
schema: Schema.Array(Schema.Struct({ value: Schema.Number })),
|
|
22
|
+
})
|
|
23
|
+
|
|
24
|
+
expect(isQueryable(def)).toBe(true)
|
|
25
|
+
})
|
|
26
|
+
|
|
27
|
+
it('identifies signal definitions', () => {
|
|
28
|
+
const sig = signal(0, { label: 'count' })
|
|
29
|
+
|
|
30
|
+
expect(isQueryable(sig)).toBe(true)
|
|
31
|
+
})
|
|
32
|
+
|
|
33
|
+
it('identifies live query instances', () => {
|
|
34
|
+
const liveQueryLike = { [TypeId]: TypeId } as const
|
|
35
|
+
|
|
36
|
+
expect(isQueryable(liveQueryLike)).toBe(true)
|
|
37
|
+
})
|
|
38
|
+
|
|
39
|
+
it('identifies query builders', () => {
|
|
40
|
+
const qb = makeQueryBuilder()
|
|
41
|
+
|
|
42
|
+
expect(isQueryable(qb)).toBe(true)
|
|
43
|
+
})
|
|
44
|
+
|
|
45
|
+
it('rejects unrelated values', () => {
|
|
46
|
+
expect(isQueryable(null)).toBe(false)
|
|
47
|
+
expect(isQueryable(undefined)).toBe(false)
|
|
48
|
+
expect(isQueryable({})).toBe(false)
|
|
49
|
+
})
|
|
50
|
+
})
|
package/src/store/store-types.ts
CHANGED
|
@@ -1,21 +1,23 @@
|
|
|
1
|
-
import
|
|
2
|
-
ClientSession,
|
|
3
|
-
ClientSessionSyncProcessorSimulationParams,
|
|
4
|
-
IntentionalShutdownCause,
|
|
5
|
-
InvalidPullError,
|
|
6
|
-
IsOfflineError,
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
1
|
+
import {
|
|
2
|
+
type ClientSession,
|
|
3
|
+
type ClientSessionSyncProcessorSimulationParams,
|
|
4
|
+
type IntentionalShutdownCause,
|
|
5
|
+
type InvalidPullError,
|
|
6
|
+
type IsOfflineError,
|
|
7
|
+
isQueryBuilder,
|
|
8
|
+
type MaterializeError,
|
|
9
|
+
type QueryBuilder,
|
|
10
|
+
type StoreInterrupted,
|
|
11
|
+
type SyncError,
|
|
12
|
+
type UnexpectedError,
|
|
12
13
|
} from '@livestore/common'
|
|
13
14
|
import type { EventSequenceNumber, LiveStoreEvent, LiveStoreSchema } from '@livestore/common/schema'
|
|
14
15
|
import type { Effect, Runtime, Scope } from '@livestore/utils/effect'
|
|
15
|
-
import { Deferred } from '@livestore/utils/effect'
|
|
16
|
+
import { Deferred, Predicate } from '@livestore/utils/effect'
|
|
16
17
|
import type * as otel from '@opentelemetry/api'
|
|
17
18
|
|
|
18
19
|
import type { LiveQuery, LiveQueryDef, SignalDef } from '../live-queries/base-class.ts'
|
|
20
|
+
import { TypeId } from '../live-queries/base-class.ts'
|
|
19
21
|
import type { DebugRefreshReasonBase } from '../reactive.ts'
|
|
20
22
|
import type { StackInfo } from '../utils/stack-info.ts'
|
|
21
23
|
import type { Store } from './store.ts'
|
|
@@ -153,3 +155,54 @@ export type Queryable<TResult> =
|
|
|
153
155
|
| SignalDef<TResult>
|
|
154
156
|
| LiveQuery<TResult>
|
|
155
157
|
| QueryBuilder<TResult, any, any>
|
|
158
|
+
|
|
159
|
+
/**
|
|
160
|
+
* Helper types for `Queryable`.
|
|
161
|
+
*
|
|
162
|
+
* Provides type-level utilities to work with `Queryable` values.
|
|
163
|
+
*/
|
|
164
|
+
export namespace Queryable {
|
|
165
|
+
/**
|
|
166
|
+
* Extracts the result type from a `Queryable`.
|
|
167
|
+
*
|
|
168
|
+
* Example:
|
|
169
|
+
* - `Queryable.Result<LiveQueryDef<number>>` → `number`
|
|
170
|
+
* - `Queryable.Result<SignalDef<string>>` → `string`
|
|
171
|
+
* - `Queryable.Result<LiveQuery<{ id: string }>>` → `{ id: string }`
|
|
172
|
+
* - `Queryable.Result<LiveQueryDef<A> | SignalDef<B>>` → `A | B`
|
|
173
|
+
*/
|
|
174
|
+
export type Result<TQueryable extends Queryable<any>> = TQueryable extends Queryable<infer TResult> ? TResult : never
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
const isLiveQueryDef = (value: unknown): value is LiveQueryDef<any> | SignalDef<any> => {
|
|
178
|
+
if (typeof value !== 'object' || value === null) {
|
|
179
|
+
return false
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
if (!('_tag' in value)) {
|
|
183
|
+
return false
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
const tag = (value as LiveQueryDef<any> | SignalDef<any>)._tag
|
|
187
|
+
if (tag !== 'def' && tag !== 'signal-def') {
|
|
188
|
+
return false
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
const candidate = value as LiveQueryDef<any>
|
|
192
|
+
if (typeof candidate.make !== 'function') {
|
|
193
|
+
// The store calls make() to turn the definition into a live query instance.
|
|
194
|
+
return false
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
if (typeof candidate.hash !== 'string' || typeof candidate.label !== 'string') {
|
|
198
|
+
// Both identifiers must be present so the store can cache and log the query.
|
|
199
|
+
return false
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
return true
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
const isLiveQueryInstance = (value: unknown): value is LiveQuery<any> => Predicate.hasProperty(value, TypeId)
|
|
206
|
+
|
|
207
|
+
export const isQueryable = (value: unknown): value is Queryable<unknown> =>
|
|
208
|
+
isQueryBuilder(value) || isLiveQueryInstance(value) || isLiveQueryDef(value)
|