@signalium/query 0.0.0 → 0.0.1

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 (78) hide show
  1. package/.turbo/turbo-build.log +12 -0
  2. package/CHANGELOG.md +9 -0
  3. package/dist/cjs/EntityMap.js +46 -0
  4. package/dist/cjs/EntityMap.js.map +1 -0
  5. package/dist/cjs/QueryClient.js +180 -0
  6. package/dist/cjs/QueryClient.js.map +1 -0
  7. package/dist/cjs/QueryStore.js +219 -0
  8. package/dist/cjs/QueryStore.js.map +1 -0
  9. package/dist/cjs/errors.js +105 -0
  10. package/dist/cjs/errors.js.map +1 -0
  11. package/dist/cjs/index.js +24 -0
  12. package/dist/cjs/index.js.map +1 -0
  13. package/dist/cjs/parseEntities.js +127 -0
  14. package/dist/cjs/parseEntities.js.map +1 -0
  15. package/dist/cjs/pathInterpolator.js +69 -0
  16. package/dist/cjs/pathInterpolator.js.map +1 -0
  17. package/dist/cjs/proxy.js +187 -0
  18. package/dist/cjs/proxy.js.map +1 -0
  19. package/dist/cjs/query.js +41 -0
  20. package/dist/cjs/query.js.map +1 -0
  21. package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -0
  22. package/dist/cjs/typeDefs.js +249 -0
  23. package/dist/cjs/typeDefs.js.map +1 -0
  24. package/dist/cjs/types.js +6 -0
  25. package/dist/cjs/types.js.map +1 -0
  26. package/dist/cjs/utils.js +65 -0
  27. package/dist/cjs/utils.js.map +1 -0
  28. package/dist/esm/EntityMap.d.ts +18 -0
  29. package/dist/esm/EntityMap.d.ts.map +1 -0
  30. package/dist/esm/EntityMap.js +42 -0
  31. package/dist/esm/EntityMap.js.map +1 -0
  32. package/dist/esm/QueryClient.d.ts +82 -0
  33. package/dist/esm/QueryClient.d.ts.map +1 -0
  34. package/dist/esm/QueryClient.js +175 -0
  35. package/dist/esm/QueryClient.js.map +1 -0
  36. package/dist/esm/QueryStore.d.ts +73 -0
  37. package/dist/esm/QueryStore.d.ts.map +1 -0
  38. package/dist/esm/QueryStore.js +209 -0
  39. package/dist/esm/QueryStore.js.map +1 -0
  40. package/dist/esm/errors.d.ts +4 -0
  41. package/dist/esm/errors.d.ts.map +1 -0
  42. package/dist/esm/errors.js +101 -0
  43. package/dist/esm/errors.js.map +1 -0
  44. package/dist/esm/index.d.ts +7 -0
  45. package/dist/esm/index.d.ts.map +1 -0
  46. package/dist/esm/index.js +4 -0
  47. package/dist/esm/index.js.map +1 -0
  48. package/dist/esm/parseEntities.d.ts +8 -0
  49. package/dist/esm/parseEntities.d.ts.map +1 -0
  50. package/dist/esm/parseEntities.js +120 -0
  51. package/dist/esm/parseEntities.js.map +1 -0
  52. package/dist/esm/pathInterpolator.d.ts +29 -0
  53. package/dist/esm/pathInterpolator.d.ts.map +1 -0
  54. package/dist/esm/pathInterpolator.js +66 -0
  55. package/dist/esm/pathInterpolator.js.map +1 -0
  56. package/dist/esm/proxy.d.ts +8 -0
  57. package/dist/esm/proxy.d.ts.map +1 -0
  58. package/dist/esm/proxy.js +180 -0
  59. package/dist/esm/proxy.js.map +1 -0
  60. package/dist/esm/query.d.ts +40 -0
  61. package/dist/esm/query.d.ts.map +1 -0
  62. package/dist/esm/query.js +38 -0
  63. package/dist/esm/query.js.map +1 -0
  64. package/dist/esm/typeDefs.d.ts +25 -0
  65. package/dist/esm/typeDefs.d.ts.map +1 -0
  66. package/dist/esm/typeDefs.js +239 -0
  67. package/dist/esm/typeDefs.js.map +1 -0
  68. package/dist/esm/types.d.ts +86 -0
  69. package/dist/esm/types.d.ts.map +1 -0
  70. package/dist/esm/types.js +3 -0
  71. package/dist/esm/types.js.map +1 -0
  72. package/dist/esm/utils.d.ts +6 -0
  73. package/dist/esm/utils.d.ts.map +1 -0
  74. package/dist/esm/utils.js +60 -0
  75. package/dist/esm/utils.js.map +1 -0
  76. package/dist/tsconfig.esm.tsbuildinfo +1 -0
  77. package/package.json +3 -3
  78. package/vitest.config.ts +4 -10
@@ -0,0 +1,12 @@
1
+
2
+ > @signalium/query@0.0.1 build
3
+ > npm run build:esm && npm run build:cjs
4
+
5
+
6
+ > @signalium/query@0.0.1 build:esm
7
+ > tsc --build tsconfig.esm.json
8
+
9
+
10
+ > @signalium/query@0.0.1 build:cjs
11
+ > tsc --build tsconfig.cjs.json
12
+
package/CHANGELOG.md ADDED
@@ -0,0 +1,9 @@
1
+ # @signalium/query
2
+
3
+ ## 0.0.1
4
+
5
+ ### Patch Changes
6
+
7
+ - e6c39ee: Initial Signalium Query release
8
+ - Updated dependencies [e6c39ee]
9
+ - signalium@2.0.7
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EntityStore = void 0;
4
+ const signalium_1 = require("signalium");
5
+ const proxy_js_1 = require("./proxy.js");
6
+ class EntityStore {
7
+ map = new Map();
8
+ hasEntity(key) {
9
+ return this.map.has(key);
10
+ }
11
+ getEntity(key) {
12
+ return this.map.get(key);
13
+ }
14
+ hydratePreloadedEntity(key, shape) {
15
+ const record = this.getEntity(key);
16
+ if (record === undefined) {
17
+ throw new Error(`Entity ${key} not found`);
18
+ }
19
+ record.proxy = (0, proxy_js_1.createEntityProxy)(key, record, shape);
20
+ return record;
21
+ }
22
+ setPreloadedEntity(key, obj) {
23
+ const record = {
24
+ key,
25
+ signal: (0, signalium_1.signal)(obj),
26
+ cache: new Map(),
27
+ proxy: undefined,
28
+ };
29
+ this.map.set(key, record);
30
+ return record;
31
+ }
32
+ setEntity(key, obj, shape) {
33
+ let record = this.map.get(key);
34
+ if (record === undefined) {
35
+ record = this.setPreloadedEntity(key, obj);
36
+ record.proxy = (0, proxy_js_1.createEntityProxy)(key, record, shape);
37
+ }
38
+ else {
39
+ record.signal.value = obj;
40
+ record.cache.clear();
41
+ }
42
+ return record;
43
+ }
44
+ }
45
+ exports.EntityStore = EntityStore;
46
+ //# sourceMappingURL=EntityMap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EntityMap.js","sourceRoot":"","sources":["../../src/EntityMap.ts"],"names":[],"mappings":";;;AAAA,yCAA2C;AAE3C,yCAA+C;AAW/C,MAAa,WAAW;IACd,GAAG,GAAG,IAAI,GAAG,EAAgD,CAAC;IAEtE,SAAS,CAAC,GAAW;QACnB,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;IAED,SAAS,CAAC,GAAW;QACnB,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;IAED,sBAAsB,CAAC,GAAW,EAAE,KAAgB;QAClD,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QACnC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CAAC,UAAU,GAAG,YAAY,CAAC,CAAC;QAC7C,CAAC;QAED,MAAM,CAAC,KAAK,GAAG,IAAA,4BAAiB,EAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;QAErD,OAAO,MAAsB,CAAC;IAChC,CAAC;IAED,kBAAkB,CAAC,GAAW,EAAE,GAA4B;QAC1D,MAAM,MAAM,GAA0B;YACpC,GAAG;YACH,MAAM,EAAE,IAAA,kBAAM,EAAC,GAAG,CAAC;YACnB,KAAK,EAAE,IAAI,GAAG,EAAE;YAChB,KAAK,EAAE,SAAS;SACjB,CAAC;QAEF,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAE1B,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,SAAS,CAAC,GAAW,EAAE,GAA4B,EAAE,KAAgB;QACnE,IAAI,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAE/B,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,MAAM,GAAG,IAAI,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YAE3C,MAAM,CAAC,KAAK,GAAG,IAAA,4BAAiB,EAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;QACvD,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,MAAM,CAAC,KAAK,GAAG,GAAG,CAAC;YAC1B,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACvB,CAAC;QAED,OAAO,MAAsB,CAAC;IAChC,CAAC;CACF;AAjDD,kCAiDC"}
@@ -0,0 +1,180 @@
1
+ "use strict";
2
+ /**
3
+ * Query Client with Entity Caching and Deduplication
4
+ *
5
+ * Features:
6
+ * - Global entity map for deduplication
7
+ * - Entity definitions with cached sub-entity paths
8
+ * - Eager entity discovery and caching
9
+ * - Permanent proxy cache for entities
10
+ * - Response caching for offline access
11
+ * - Signalium-based reactivity for entity updates
12
+ * - Self-contained validator (no external dependencies except Signalium)
13
+ */
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.QueryClientContext = exports.QueryClient = exports.QueryResultImpl = void 0;
16
+ const signalium_1 = require("signalium");
17
+ const utils_1 = require("signalium/utils");
18
+ const proxy_js_1 = require("./proxy.js");
19
+ const parseEntities_js_1 = require("./parseEntities.js");
20
+ const EntityMap_js_1 = require("./EntityMap.js");
21
+ const typeDefs_js_1 = require("./typeDefs.js");
22
+ const queryKeyFor = (queryDef, params) => {
23
+ return (0, utils_1.hashValue)([queryDef.id, params]);
24
+ };
25
+ /**
26
+ * QueryResult wraps a DiscriminatedReactivePromise and adds additional functionality
27
+ * like refetch, while forwarding all the base relay properties.
28
+ */
29
+ class QueryResultImpl {
30
+ relay;
31
+ instance;
32
+ constructor(relay, instance) {
33
+ this.relay = relay;
34
+ this.instance = instance;
35
+ (0, utils_1.setReactivePromise)(this);
36
+ }
37
+ // Forward all ReactivePromise properties through getters
38
+ get value() {
39
+ return this.relay.value;
40
+ }
41
+ get error() {
42
+ return this.relay.error;
43
+ }
44
+ get isPending() {
45
+ return this.relay.isPending;
46
+ }
47
+ get isRejected() {
48
+ return this.relay.isRejected;
49
+ }
50
+ get isResolved() {
51
+ return this.relay.isResolved;
52
+ }
53
+ get isSettled() {
54
+ return this.relay.isSettled;
55
+ }
56
+ get isReady() {
57
+ return this.relay.isReady;
58
+ }
59
+ // TODO: Intimate APIs needed for `useReactive`, this is a code smell and
60
+ // we should find a better way to entangle these more generically
61
+ get _version() {
62
+ return this.relay._version;
63
+ }
64
+ get _signal() {
65
+ return this.relay._signal;
66
+ }
67
+ get _flags() {
68
+ return this.relay._flags;
69
+ }
70
+ // Forward Promise methods
71
+ then(onfulfilled, onrejected) {
72
+ return this.relay.then(onfulfilled, onrejected);
73
+ }
74
+ catch(onrejected) {
75
+ return this.relay.catch(onrejected);
76
+ }
77
+ finally(onfinally) {
78
+ return this.relay.finally(onfinally);
79
+ }
80
+ // Additional methods
81
+ refetch() {
82
+ this.instance.notifier.notify();
83
+ // pull the value to make sure the relay is activated
84
+ // eslint-disable-next-line @typescript-eslint/no-unused-expressions
85
+ this.instance.relay.value;
86
+ return this.relay;
87
+ }
88
+ // Make it work with Symbol.toStringTag for Promise detection
89
+ get [Symbol.toStringTag]() {
90
+ return 'QueryResult';
91
+ }
92
+ }
93
+ exports.QueryResultImpl = QueryResultImpl;
94
+ class QueryClient {
95
+ store;
96
+ context;
97
+ entityMap = new EntityMap_js_1.EntityStore();
98
+ queryInstances = new Map();
99
+ constructor(store, context = { fetch }) {
100
+ this.store = store;
101
+ this.context = context;
102
+ }
103
+ /**
104
+ * Loads a query from the document store and returns a QueryResult
105
+ * that triggers fetches and prepopulates with cached data
106
+ */
107
+ getQuery(queryDef, params) {
108
+ const queryKey = queryKeyFor(queryDef, params);
109
+ let queryInstance = this.queryInstances.get(queryKey);
110
+ // Create a new relay if it doesn't exist
111
+ if (queryInstance === undefined) {
112
+ queryInstance = {
113
+ relay: undefined,
114
+ initialized: false,
115
+ notifier: (0, signalium_1.notifier)(),
116
+ };
117
+ const queryRelay = (0, signalium_1.relay)(state => {
118
+ // Load from cache first, then fetch fresh data
119
+ queryInstance.notifier.consume();
120
+ this.store.activateQuery(queryDef, queryKey);
121
+ if (queryInstance.initialized) {
122
+ state.setPromise(this.runQuery(queryDef, queryKey, params));
123
+ }
124
+ else {
125
+ this.initializeQuery(queryDef, params, state, queryInstance);
126
+ }
127
+ });
128
+ queryInstance.relay = new QueryResultImpl(queryRelay, queryInstance);
129
+ // Store the relay for future use
130
+ this.queryInstances.set(queryKey, queryInstance);
131
+ }
132
+ return queryInstance.relay;
133
+ }
134
+ async initializeQuery(queryDef, params, state, instance) {
135
+ try {
136
+ instance.initialized = true;
137
+ const queryKey = queryKeyFor(queryDef, params);
138
+ // Load from cache first
139
+ const query = this.store.loadQuery(queryDef, queryKey, this.entityMap);
140
+ if (query !== undefined) {
141
+ const shape = queryDef.shape;
142
+ state.value =
143
+ shape instanceof typeDefs_js_1.ValidatorDef
144
+ ? (0, parseEntities_js_1.parseEntities)(query, shape, this, new Set())
145
+ : (0, proxy_js_1.parseValue)(query, shape, queryDef.id);
146
+ }
147
+ state.setPromise(this.runQuery(queryDef, queryKey, params));
148
+ }
149
+ catch (error) {
150
+ // Relay will handle the error state automatically
151
+ state.setError(error);
152
+ }
153
+ }
154
+ /**
155
+ * Fetches fresh data and updates the cache
156
+ */
157
+ async runQuery(queryDef, queryKey, params) {
158
+ const freshData = await queryDef.fetchFn(this.context, params);
159
+ // Parse and cache the fresh data
160
+ const entityRefs = new Set();
161
+ const shape = queryDef.shape;
162
+ const parsedData = shape instanceof typeDefs_js_1.ValidatorDef
163
+ ? (0, parseEntities_js_1.parseEntities)(freshData, shape, this, entityRefs)
164
+ : (0, proxy_js_1.parseValue)(freshData, shape, queryDef.id);
165
+ // Cache the data (synchronous, fire-and-forget)
166
+ this.store.saveQuery(queryDef, queryKey, freshData, entityRefs);
167
+ return parsedData;
168
+ }
169
+ hydrateEntity(key, shape) {
170
+ return this.entityMap.hydratePreloadedEntity(key, shape);
171
+ }
172
+ saveEntity(key, obj, shape, entityRefs) {
173
+ const record = this.entityMap.setEntity(key, obj, shape);
174
+ this.store.saveEntity(key, obj, entityRefs);
175
+ return record;
176
+ }
177
+ }
178
+ exports.QueryClient = QueryClient;
179
+ exports.QueryClientContext = (0, signalium_1.context)(undefined);
180
+ //# sourceMappingURL=QueryClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"QueryClient.js","sourceRoot":"","sources":["../../src/QueryClient.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,219 @@
1
+ "use strict";
2
+ /**
3
+ * QueryStore - Minimal interface for query persistence
4
+ *
5
+ * Provides a clean abstraction over document storage, reference counting,
6
+ * and LRU cache management. Supports both synchronous (in-memory) and
7
+ * asynchronous (writer-backed) implementations.
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.SyncQueryStore = exports.queueKeyFor = exports.updatedAtKeyFor = exports.refIdsKeyFor = exports.refCountKeyFor = exports.valueKeyFor = exports.MemoryPersistentStore = void 0;
11
+ const DEFAULT_MAX_COUNT = 50;
12
+ const DEFAULT_MAX_AGE = 1000 * 60 * 60 * 24; // 24 hours
13
+ class MemoryPersistentStore {
14
+ kv = Object.create(null);
15
+ has(key) {
16
+ return key in this.kv;
17
+ }
18
+ getString(key) {
19
+ return this.kv[key];
20
+ }
21
+ setString(key, value) {
22
+ this.kv[key] = value;
23
+ }
24
+ getNumber(key) {
25
+ return this.kv[key];
26
+ }
27
+ setNumber(key, value) {
28
+ this.kv[key] = value;
29
+ }
30
+ getBuffer(key) {
31
+ return this.kv[key];
32
+ }
33
+ setBuffer(key, value) {
34
+ this.kv[key] = value;
35
+ }
36
+ delete(key) {
37
+ delete this.kv[key];
38
+ }
39
+ }
40
+ exports.MemoryPersistentStore = MemoryPersistentStore;
41
+ // Query Instance keys
42
+ const valueKeyFor = (id) => `sq:doc:value:${id}`;
43
+ exports.valueKeyFor = valueKeyFor;
44
+ const refCountKeyFor = (id) => `sq:doc:refCount:${id}`;
45
+ exports.refCountKeyFor = refCountKeyFor;
46
+ const refIdsKeyFor = (id) => `sq:doc:refIds:${id}`;
47
+ exports.refIdsKeyFor = refIdsKeyFor;
48
+ const updatedAtKeyFor = (id) => `sq:doc:updatedAt:${id}`;
49
+ exports.updatedAtKeyFor = updatedAtKeyFor;
50
+ // Query Type keys
51
+ const queueKeyFor = (queryDefId) => `sq:doc:queue:${queryDefId}`;
52
+ exports.queueKeyFor = queueKeyFor;
53
+ class SyncQueryStore {
54
+ kv;
55
+ queues = new Map();
56
+ constructor(kv) {
57
+ this.kv = kv;
58
+ }
59
+ loadQuery(queryDef, queryKey, entityMap) {
60
+ const updatedAt = this.kv.getNumber((0, exports.updatedAtKeyFor)(queryKey));
61
+ if (updatedAt === undefined || updatedAt < Date.now() - (queryDef.cache?.maxAge ?? DEFAULT_MAX_AGE)) {
62
+ return;
63
+ }
64
+ const value = this.kv.getString((0, exports.valueKeyFor)(queryKey));
65
+ if (value === undefined) {
66
+ return;
67
+ }
68
+ const entityIds = this.kv.getBuffer((0, exports.refIdsKeyFor)(queryKey));
69
+ if (entityIds !== undefined) {
70
+ this.preloadEntities(entityIds, entityMap);
71
+ }
72
+ this.activateQuery(queryDef, queryKey);
73
+ return JSON.parse(value);
74
+ }
75
+ preloadEntities(entityIds, entityMap) {
76
+ for (const entityId of entityIds) {
77
+ const entityValue = this.kv.getString((0, exports.valueKeyFor)(entityId));
78
+ if (entityValue === undefined) {
79
+ continue;
80
+ }
81
+ const entity = JSON.parse(entityValue);
82
+ entityMap.setPreloadedEntity(entityId, entity);
83
+ const childIds = this.kv.getBuffer((0, exports.refIdsKeyFor)(entityId));
84
+ if (childIds === undefined) {
85
+ continue;
86
+ }
87
+ this.preloadEntities(childIds, entityMap);
88
+ }
89
+ }
90
+ saveQuery(queryDef, queryKey, value, refIds) {
91
+ this.setValue(queryKey, value, refIds);
92
+ this.kv.setNumber((0, exports.updatedAtKeyFor)(queryKey), Date.now());
93
+ this.activateQuery(queryDef, queryKey);
94
+ }
95
+ saveEntity(entityKey, value, refIds) {
96
+ this.setValue(entityKey, value, refIds);
97
+ }
98
+ activateQuery(queryDef, queryKey) {
99
+ if (!this.kv.has((0, exports.valueKeyFor)(queryKey))) {
100
+ // Query not in store, nothing to do. This can happen if the query has
101
+ // been evicted from the cache, but is still active in memory.
102
+ return;
103
+ }
104
+ let queue = this.queues.get(queryDef.id);
105
+ if (queue === undefined) {
106
+ const maxCount = queryDef.cache?.maxCount ?? DEFAULT_MAX_COUNT;
107
+ queue = this.kv.getBuffer((0, exports.queueKeyFor)(queryDef.id));
108
+ if (queue === undefined) {
109
+ queue = new Uint32Array(maxCount);
110
+ this.kv.setBuffer((0, exports.queueKeyFor)(queryDef.id), queue);
111
+ }
112
+ else if (queue.length !== maxCount) {
113
+ const newQueue = new Uint32Array(maxCount);
114
+ newQueue.set(queue);
115
+ queue = newQueue;
116
+ this.kv.setBuffer((0, exports.queueKeyFor)(queryDef.id), queue);
117
+ }
118
+ this.queues.set(queryDef.id, queue);
119
+ }
120
+ const indexOfKey = queue.indexOf(queryKey);
121
+ // Item already in queue, move to front
122
+ if (indexOfKey >= 0) {
123
+ if (indexOfKey === 0) {
124
+ // Already at front, nothing to do
125
+ return;
126
+ }
127
+ // Shift items right to make space at front
128
+ queue.copyWithin(1, 0, indexOfKey);
129
+ queue[0] = queryKey;
130
+ return;
131
+ }
132
+ // Item not in queue, add to front and evict tail
133
+ const evicted = queue[queue.length - 1];
134
+ queue.copyWithin(1, 0, queue.length - 1);
135
+ queue[0] = queryKey;
136
+ if (evicted !== 0) {
137
+ this.deleteValue(evicted);
138
+ this.kv.delete((0, exports.updatedAtKeyFor)(evicted));
139
+ }
140
+ }
141
+ setValue(id, value, refIds) {
142
+ const kv = this.kv;
143
+ kv.setString((0, exports.valueKeyFor)(id), JSON.stringify(value));
144
+ const refIdsKey = (0, exports.refIdsKeyFor)(id);
145
+ const prevRefIds = kv.getBuffer(refIdsKey);
146
+ if (refIds === undefined || refIds.size === 0) {
147
+ kv.delete(refIdsKey);
148
+ // Decrement all previous refs
149
+ if (prevRefIds !== undefined) {
150
+ for (let i = 0; i < prevRefIds.length; i++) {
151
+ const refId = prevRefIds[i];
152
+ this.decrementRefCount(refId);
153
+ }
154
+ }
155
+ }
156
+ else {
157
+ // Convert the set to a Uint32Array and capture all the refIds before we
158
+ // delete previous ones from the set
159
+ const newRefIds = new Uint32Array(refIds);
160
+ if (prevRefIds !== undefined) {
161
+ // Process new refs: increment if not in old
162
+ for (let i = 0; i < prevRefIds.length; i++) {
163
+ const refId = prevRefIds[i];
164
+ if (refIds.has(refId)) {
165
+ refIds.delete(refId);
166
+ }
167
+ else {
168
+ this.decrementRefCount(refId);
169
+ }
170
+ }
171
+ }
172
+ // No previous refs, increment all unique new refs
173
+ for (const refId of refIds) {
174
+ this.incrementRefCount(refId);
175
+ }
176
+ kv.setBuffer(refIdsKey, newRefIds);
177
+ }
178
+ }
179
+ deleteValue(id) {
180
+ const kv = this.kv;
181
+ kv.delete((0, exports.valueKeyFor)(id));
182
+ kv.delete((0, exports.refCountKeyFor)(id));
183
+ const refIds = kv.getBuffer((0, exports.refIdsKeyFor)(id));
184
+ kv.delete((0, exports.refIdsKeyFor)(id)); // Clean up the refIds key
185
+ if (refIds === undefined) {
186
+ return;
187
+ }
188
+ // Decrement ref counts for all referenced entities
189
+ for (const refId of refIds) {
190
+ if (refId !== 0) {
191
+ this.decrementRefCount(refId);
192
+ }
193
+ }
194
+ }
195
+ incrementRefCount(refId) {
196
+ const refCountKey = (0, exports.refCountKeyFor)(refId);
197
+ const currentCount = this.kv.getNumber(refCountKey) ?? 0;
198
+ const newCount = currentCount + 1;
199
+ this.kv.setNumber(refCountKey, newCount);
200
+ }
201
+ decrementRefCount(refId) {
202
+ const refCountKey = (0, exports.refCountKeyFor)(refId);
203
+ const currentCount = this.kv.getNumber(refCountKey);
204
+ if (currentCount === undefined) {
205
+ // Already deleted or never existed
206
+ return;
207
+ }
208
+ const newCount = currentCount - 1;
209
+ if (newCount === 0) {
210
+ // Entity exists, cascade delete it
211
+ this.deleteValue(refId);
212
+ }
213
+ else {
214
+ this.kv.setNumber(refCountKey, newCount);
215
+ }
216
+ }
217
+ }
218
+ exports.SyncQueryStore = SyncQueryStore;
219
+ //# sourceMappingURL=QueryStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"QueryStore.js","sourceRoot":"","sources":["../../src/QueryStore.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,105 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.typeToString = typeToString;
4
+ exports.typeError = typeError;
5
+ const types_js_1 = require("./types.js");
6
+ function typeToString(type) {
7
+ // Handle Set-based constants/enums
8
+ if (type instanceof Set) {
9
+ const values = Array.from(type).map(v => (typeof v === 'string' ? `"${v}"` : String(v)));
10
+ return values.join(' | ');
11
+ }
12
+ // Handle constants
13
+ if (typeof type === 'string') {
14
+ return `"${type}"`;
15
+ }
16
+ if (typeof type === 'boolean') {
17
+ return String(type);
18
+ }
19
+ // Handle primitive masks
20
+ if (typeof type === 'number') {
21
+ const types = [];
22
+ if (type & 1 /* Mask.UNDEFINED */)
23
+ types.push('undefined');
24
+ if (type & 2 /* Mask.NULL */)
25
+ types.push('null');
26
+ if (type & 4 /* Mask.NUMBER */)
27
+ types.push('number');
28
+ if (type & 8 /* Mask.STRING */)
29
+ types.push('string');
30
+ if (type & 16 /* Mask.BOOLEAN */)
31
+ types.push('boolean');
32
+ if (type & 32 /* Mask.OBJECT */)
33
+ types.push('object');
34
+ if (type & 64 /* Mask.ARRAY */)
35
+ types.push('array');
36
+ if (types.length === 0) {
37
+ return 'unknown';
38
+ }
39
+ return types.length === 1 ? types[0] : types.join(' | ');
40
+ }
41
+ // Handle complex types - CHECK UNION FIRST since it contains other types
42
+ const mask = type.mask;
43
+ if (mask & 512 /* Mask.UNION */) {
44
+ const unionType = type;
45
+ const parts = [];
46
+ // Add primitive types from the mask
47
+ if (mask & 1 /* Mask.UNDEFINED */)
48
+ parts.push('undefined');
49
+ if (mask & 2 /* Mask.NULL */)
50
+ parts.push('null');
51
+ if (mask & 4 /* Mask.NUMBER */)
52
+ parts.push('number');
53
+ if (mask & 8 /* Mask.STRING */)
54
+ parts.push('string');
55
+ if (mask & 16 /* Mask.BOOLEAN */)
56
+ parts.push('boolean');
57
+ // Add const/enum values from the values Set
58
+ if (unionType.values !== undefined && unionType.values.size > 0) {
59
+ for (const val of unionType.values) {
60
+ const valStr = typeof val === 'string' ? `"${val}"` : String(val);
61
+ parts.push(valStr);
62
+ }
63
+ }
64
+ // Add complex types from the shape object
65
+ if (unionType.shape !== undefined) {
66
+ if (unionType.shape[types_js_1.ARRAY_KEY] !== undefined) {
67
+ parts.push(`Array<${typeToString(unionType.shape[types_js_1.ARRAY_KEY])}>`);
68
+ }
69
+ if (unionType.shape[types_js_1.RECORD_KEY] !== undefined) {
70
+ parts.push(`Record<string, ${typeToString(unionType.shape[types_js_1.RECORD_KEY])}>`);
71
+ }
72
+ // Add entity/object types by typename
73
+ for (const [key, value] of Object.entries(unionType.shape)) {
74
+ if (key !== types_js_1.ARRAY_KEY && key !== types_js_1.RECORD_KEY) {
75
+ // key is the typename value (e.g., "User", "Post")
76
+ parts.push(key);
77
+ }
78
+ }
79
+ }
80
+ if (parts.length === 0) {
81
+ return 'union';
82
+ }
83
+ return parts.join(' | ');
84
+ }
85
+ if (mask & 1024 /* Mask.ENTITY */) {
86
+ return `Entity<${type.typenameValue}>`;
87
+ }
88
+ if (mask & 64 /* Mask.ARRAY */) {
89
+ const shape = type.shape;
90
+ return `Array<${typeToString(shape)}>`;
91
+ }
92
+ if (mask & 256 /* Mask.RECORD */) {
93
+ const shape = type.shape;
94
+ return `Record<string, ${typeToString(shape)}>`;
95
+ }
96
+ if (mask & 32 /* Mask.OBJECT */) {
97
+ const typename = type.typenameValue;
98
+ return typename ? `Object<${typename}>` : 'object';
99
+ }
100
+ return 'unknown';
101
+ }
102
+ function typeError(path, expectedType, value) {
103
+ return new TypeError(`Validation error at ${path}: expected ${typeToString(expectedType)}, got ${typeof value === 'object' ? (value === null ? 'null' : Array.isArray(value) ? 'array' : 'object') : typeof value}`);
104
+ }
105
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.query = exports.QueryResult = exports.QueryClient = void 0;
18
+ __exportStar(require("./types.js"), exports);
19
+ var QueryClient_js_1 = require("./QueryClient.js");
20
+ Object.defineProperty(exports, "QueryClient", { enumerable: true, get: function () { return QueryClient_js_1.QueryClient; } });
21
+ Object.defineProperty(exports, "QueryResult", { enumerable: true, get: function () { return QueryClient_js_1.QueryResultImpl; } });
22
+ var query_js_1 = require("./query.js");
23
+ Object.defineProperty(exports, "query", { enumerable: true, get: function () { return query_js_1.query; } });
24
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,6CAA2B;AAE3B,mDAA+E;AAAtE,6GAAA,WAAW,OAAA;AAAE,6GAAA,eAAe,OAAe;AAGpD,uCAAmC;AAA1B,iGAAA,KAAK,OAAA"}