@livestore/livestore 0.4.0-dev.12 → 0.4.0-dev.13

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/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,EAGL,oBAAoB,GAErB,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,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 { ClientSession, ClientSessionSyncProcessorSimulationParams, IntentionalShutdownCause, InvalidPullError, IsOfflineError, MaterializeError, QueryBuilder, StoreInterrupted, SyncError, UnexpectedError } from '@livestore/common';
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,EACV,aAAa,EACb,0CAA0C,EAC1C,wBAAwB,EACxB,gBAAgB,EAChB,cAAc,EACd,gBAAgB,EAChB,YAAY,EACZ,gBAAgB,EAChB,SAAS,EACT,eAAe,EAChB,MAAM,mBAAmB,CAAA;AAC1B,OAAO,KAAK,EAAE,mBAAmB,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAA;AACpG,OAAO,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAA;AACrE,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AAClD,OAAO,KAAK,KAAK,IAAI,MAAM,oBAAoB,CAAA;AAE/C,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAA;AACvF,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAA;AAC5D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAA;AACvD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAEvC,MAAM,MAAM,gBAAgB,GACxB,uBAAuB,GACvB;IACE,KAAK,EAAE,OAAO,CAAA;IACd,KAAK,EAAE,eAAe,GAAG,OAAO,CAAA;CACjC,GACD;IACE,KAAK,EAAE,UAAU,CAAA;IACjB,KAAK,EAAE,wBAAwB,GAAG,gBAAgB,GAAG,SAAS,CAAA;CAC/D,CAAA;AAEL,MAAM,MAAM,gBAAgB,GAAG,QAAQ,CAAC,QAAQ,CAC9C,wBAAwB,EACxB,eAAe,GAAG,SAAS,GAAG,gBAAgB,GAAG,gBAAgB,GAAG,gBAAgB,GAAG,cAAc,CACtG,CAAA;AACD,eAAO,MAAM,oBAAoB,EAAE,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAG9D,CAAA;AAEH,MAAM,MAAM,uBAAuB,GAAG;IACpC,KAAK,EAAE,SAAS,CAAA;IAChB,KAAK,EAAE,KAAK,CAAA;CACb,CAAA;AAED,MAAM,MAAM,WAAW,GAAG;IACxB,MAAM,EAAE,IAAI,CAAC,MAAM,CAAA;IACnB,eAAe,EAAE,IAAI,CAAC,OAAO,CAAA;CAC9B,CAAA;AAED,MAAM,MAAM,YAAY,CAAC,OAAO,SAAS,eAAe,GAAG,eAAe,CAAC,GAAG,EAAE,QAAQ,GAAG,EAAE,IAAI;IAC/F,aAAa,EAAE,aAAa,CAAA;IAC5B,MAAM,EAAE,OAAO,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,QAAQ,CAAA;IACjB,WAAW,EAAE,WAAW,CAAA;IACxB,aAAa,EAAE;QACb,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;QACrC,aAAa,EAAE,KAAK,CAAC,KAAK,CAAA;KAC3B,CAAA;IACD,qBAAqB,EAAE,OAAO,CAAA;IAC9B,YAAY,EAAE,CAAC,UAAU,EAAE,MAAM,IAAI,KAAK,IAAI,CAAA;IAC9C,MAAM,EAAE;QACN,mBAAmB,EAAE,MAAM,CAAA;QAC3B,UAAU,CAAC,EAAE;YACX,0BAA0B,EAAE,OAAO,0CAA0C,CAAC,IAAI,CAAA;SACnF,CAAA;KACF,CAAA;IACD,mBAAmB,EAAE,OAAO,CAAA;CAC7B,CAAA;AAED,MAAM,MAAM,aAAa,GACrB,sBAAsB,GACtB;IACE,IAAI,EAAE,QAAQ,CAAA;IACd,mCAAmC;IACnC,MAAM,EAAE,aAAa,CAAC,cAAc,CAAC,UAAU,GAAG,cAAc,CAAC,iBAAiB,CAAC,CAAA;IAEnF,mDAAmD;IACnD,WAAW,EAAE,aAAa,CAAC,MAAM,CAAC,CAAA;CACnC,GACD;IAEE,IAAI,EAAE,OAAO,CAAA;IACb,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,SAAS,CAAC,EAAE,SAAS,CAAA;CACtB,GACD;IAAE,IAAI,EAAE,mBAAmB,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAC7C;IAAE,IAAI,EAAE,kBAAkB,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAC5C;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAA;AAEtC,MAAM,MAAM,cAAc,GAAG;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,UAAU,EAAE,MAAM,CAAA;CACnB,CAAA;AAED,MAAM,MAAM,SAAS,GAAG;IACtB,MAAM,EAAE,IAAI,CAAC,MAAM,CAAA;IACnB,eAAe,EAAE,IAAI,CAAC,OAAO,CAAA;IAC7B,kBAAkB,EAAE,IAAI,CAAC,OAAO,CAAA;IAChC,kBAAkB,EAAE,IAAI,CAAC,OAAO,CAAA;CACjC,CAAA;AAED,MAAM,MAAM,kBAAkB,GAAG;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,SAAS,CAAC,EAAE,IAAI,CAAC,IAAI,EAAE,CAAA;IACvB,WAAW,CAAC,EAAE,IAAI,CAAC,OAAO,CAAA;CAC3B,CAAA;AAED,MAAM,MAAM,kBAAkB,CAAC,OAAO,SAAS,eAAe,IAAI;IAChE;;;OAGG;IACH,MAAM,CAAC,EAAE,mBAAmB,CAAC,mBAAmB,CAAA;IAChD;;;OAGG;IACH,MAAM,CAAC,EAAE,aAAa,CAAC,MAAM,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAA;IACzD;;;OAGG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAC3B;;;OAGG;IACH,eAAe,CAAC,EAAE,OAAO,CAAA;CAC1B,CAAA;AAED,MAAM,MAAM,WAAW,GAAG,MAAM,IAAI,CAAA;AAEpC,MAAM,MAAM,gBAAgB,CAAC,OAAO,IAAI;IACtC,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,SAAS,CAAC,OAAO,CAAC,KAAK,IAAI,CAAA;IAClD,gBAAgB,CAAC,EAAE,MAAM,IAAI,CAAA;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,WAAW,CAAC,EAAE,IAAI,CAAC,OAAO,CAAA;IAC1B,SAAS,CAAC,EAAE,SAAS,CAAA;CACtB,CAAA;AAED,gFAAgF;AAChF,MAAM,MAAM,SAAS,CAAC,OAAO,IACzB,YAAY,CAAC,OAAO,CAAC,GACrB,SAAS,CAAC,OAAO,CAAC,GAClB,SAAS,CAAC,OAAO,CAAC,GAClB,YAAY,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA"}
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 { Deferred } from '@livestore/utils/effect';
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":"AAcA,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AAuBlD,MAAM,CAAC,MAAM,oBAAoB,GAAoC,QAAQ,CAAC,IAAI,EAG/E,CAAA"}
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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=store-types.test.d.ts.map
@@ -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.12",
3
+ "version": "0.4.0-dev.13",
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.12",
15
- "@livestore/utils": "0.4.0-dev.12"
14
+ "@livestore/common": "0.4.0-dev.13",
15
+ "@livestore/utils": "0.4.0-dev.13"
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/utils-dev": "0.4.0-dev.12",
24
- "@livestore/adapter-web": "0.4.0-dev.12"
23
+ "@livestore/adapter-web": "0.4.0-dev.13",
24
+ "@livestore/utils-dev": "0.4.0-dev.13"
25
25
  },
26
26
  "files": [
27
27
  "package.json",
package/src/mod.ts CHANGED
@@ -46,6 +46,7 @@ export type {
46
46
  Unsubscribe,
47
47
  } from './store/store-types.ts'
48
48
  export {
49
+ isQueryable,
49
50
  type LiveStoreContext,
50
51
  type LiveStoreContextRunning,
51
52
  makeShutdownDeferred,
@@ -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
+ })
@@ -1,21 +1,23 @@
1
- import type {
2
- ClientSession,
3
- ClientSessionSyncProcessorSimulationParams,
4
- IntentionalShutdownCause,
5
- InvalidPullError,
6
- IsOfflineError,
7
- MaterializeError,
8
- QueryBuilder,
9
- StoreInterrupted,
10
- SyncError,
11
- UnexpectedError,
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)