fetchium 0.0.0 → 0.1.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.
- package/CHANGELOG.md +250 -0
- package/README.md +287 -0
- package/dist/cjs/development/QueryClient-CLi3ONNM.js +2 -0
- package/dist/cjs/development/QueryClient-CLi3ONNM.js.map +1 -0
- package/dist/cjs/development/QueryController-BQA49OYU.js +2 -0
- package/dist/cjs/development/QueryController-BQA49OYU.js.map +1 -0
- package/dist/cjs/development/index.js +2 -0
- package/dist/cjs/development/index.js.map +1 -0
- package/dist/cjs/development/mutation-CikIl_6k.js +2 -0
- package/dist/cjs/development/mutation-CikIl_6k.js.map +1 -0
- package/dist/cjs/development/package.json +3 -0
- package/dist/cjs/development/react/index.js +2 -0
- package/dist/cjs/development/react/index.js.map +1 -0
- package/dist/cjs/development/rest/index.js +2 -0
- package/dist/cjs/development/rest/index.js.map +1 -0
- package/dist/cjs/development/shared-Ct5zKrt4.js +2 -0
- package/dist/cjs/development/shared-Ct5zKrt4.js.map +1 -0
- package/dist/cjs/development/stores/async.js +2 -0
- package/dist/cjs/development/stores/async.js.map +1 -0
- package/dist/cjs/development/stores/sync.js +2 -0
- package/dist/cjs/development/stores/sync.js.map +1 -0
- package/dist/cjs/development/subscriptions/polling.js +2 -0
- package/dist/cjs/development/subscriptions/polling.js.map +1 -0
- package/dist/cjs/development/topic/index.js +2 -0
- package/dist/cjs/development/topic/index.js.map +1 -0
- package/dist/cjs/production/QueryClient-N0MJmuHW.js +2 -0
- package/dist/cjs/production/QueryClient-N0MJmuHW.js.map +1 -0
- package/dist/cjs/production/QueryController-BQA49OYU.js +2 -0
- package/dist/cjs/production/QueryController-BQA49OYU.js.map +1 -0
- package/dist/cjs/production/index.js +2 -0
- package/dist/cjs/production/index.js.map +1 -0
- package/dist/cjs/production/mutation-P_Yb4LI9.js +2 -0
- package/dist/cjs/production/mutation-P_Yb4LI9.js.map +1 -0
- package/dist/cjs/production/package.json +3 -0
- package/dist/cjs/production/react/index.js +2 -0
- package/dist/cjs/production/react/index.js.map +1 -0
- package/dist/cjs/production/rest/index.js +2 -0
- package/dist/cjs/production/rest/index.js.map +1 -0
- package/dist/cjs/production/shared-Ct5zKrt4.js +2 -0
- package/dist/cjs/production/shared-Ct5zKrt4.js.map +1 -0
- package/dist/cjs/production/stores/async.js +2 -0
- package/dist/cjs/production/stores/async.js.map +1 -0
- package/dist/cjs/production/stores/sync.js +2 -0
- package/dist/cjs/production/stores/sync.js.map +1 -0
- package/dist/cjs/production/subscriptions/polling.js +2 -0
- package/dist/cjs/production/subscriptions/polling.js.map +1 -0
- package/dist/cjs/production/topic/index.js +2 -0
- package/dist/cjs/production/topic/index.js.map +1 -0
- package/dist/esm/ConstraintMatcher.d.ts +42 -0
- package/dist/esm/ConstraintMatcher.d.ts.map +1 -0
- package/dist/esm/EntityInstance.d.ts +38 -0
- package/dist/esm/EntityInstance.d.ts.map +1 -0
- package/dist/esm/EntityStore.d.ts +14 -0
- package/dist/esm/EntityStore.d.ts.map +1 -0
- package/dist/esm/GcManager.d.ts +38 -0
- package/dist/esm/GcManager.d.ts.map +1 -0
- package/dist/esm/LiveCollection.d.ts +86 -0
- package/dist/esm/LiveCollection.d.ts.map +1 -0
- package/dist/esm/MutationResult.d.ts +22 -0
- package/dist/esm/MutationResult.d.ts.map +1 -0
- package/dist/esm/NetworkManager.d.ts +62 -0
- package/dist/esm/NetworkManager.d.ts.map +1 -0
- package/dist/esm/QueryClient.d.ts +98 -0
- package/dist/esm/QueryClient.d.ts.map +1 -0
- package/dist/esm/QueryController.d.ts +49 -0
- package/dist/esm/QueryController.d.ts.map +1 -0
- package/dist/esm/QueryResult.d.ts +67 -0
- package/dist/esm/QueryResult.d.ts.map +1 -0
- package/dist/esm/applyEntities.d.ts +12 -0
- package/dist/esm/applyEntities.d.ts.map +1 -0
- package/dist/esm/development/QueryClient-Dtde3pss.js +2572 -0
- package/dist/esm/development/QueryClient-Dtde3pss.js.map +1 -0
- package/dist/esm/development/QueryController-Ch_ncxiI.js +14 -0
- package/dist/esm/development/QueryController-Ch_ncxiI.js.map +1 -0
- package/dist/esm/development/index.js +32 -0
- package/dist/esm/development/index.js.map +1 -0
- package/dist/esm/development/mutation-UZshUQAf.js +58 -0
- package/dist/esm/development/mutation-UZshUQAf.js.map +1 -0
- package/dist/esm/development/react/index.js +40 -0
- package/dist/esm/development/react/index.js.map +1 -0
- package/dist/esm/development/rest/index.js +142 -0
- package/dist/esm/development/rest/index.js.map +1 -0
- package/dist/esm/development/shared-DcuVH8Pf.js +15 -0
- package/dist/esm/development/shared-DcuVH8Pf.js.map +1 -0
- package/dist/esm/development/stores/async.js +214 -0
- package/dist/esm/development/stores/async.js.map +1 -0
- package/dist/esm/development/stores/sync.js +149 -0
- package/dist/esm/development/stores/sync.js.map +1 -0
- package/dist/esm/development/subscriptions/polling.js +25 -0
- package/dist/esm/development/subscriptions/polling.js.map +1 -0
- package/dist/esm/development/topic/index.js +86 -0
- package/dist/esm/development/topic/index.js.map +1 -0
- package/dist/esm/errors.d.ts +4 -0
- package/dist/esm/errors.d.ts.map +1 -0
- package/dist/esm/fieldRef.d.ts +15 -0
- package/dist/esm/fieldRef.d.ts.map +1 -0
- package/dist/esm/index.d.ts +15 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/mutation.d.ts +34 -0
- package/dist/esm/mutation.d.ts.map +1 -0
- package/dist/esm/parseEntities.d.ts +44 -0
- package/dist/esm/parseEntities.d.ts.map +1 -0
- package/dist/esm/production/QueryClient-YqnBxFy1.js +2457 -0
- package/dist/esm/production/QueryClient-YqnBxFy1.js.map +1 -0
- package/dist/esm/production/QueryController-Ch_ncxiI.js +14 -0
- package/dist/esm/production/QueryController-Ch_ncxiI.js.map +1 -0
- package/dist/esm/production/index.js +32 -0
- package/dist/esm/production/index.js.map +1 -0
- package/dist/esm/production/mutation-pgFl1uIY.js +58 -0
- package/dist/esm/production/mutation-pgFl1uIY.js.map +1 -0
- package/dist/esm/production/react/index.js +40 -0
- package/dist/esm/production/react/index.js.map +1 -0
- package/dist/esm/production/rest/index.js +142 -0
- package/dist/esm/production/rest/index.js.map +1 -0
- package/dist/esm/production/shared-DcuVH8Pf.js +15 -0
- package/dist/esm/production/shared-DcuVH8Pf.js.map +1 -0
- package/dist/esm/production/stores/async.js +214 -0
- package/dist/esm/production/stores/async.js.map +1 -0
- package/dist/esm/production/stores/sync.js +149 -0
- package/dist/esm/production/stores/sync.js.map +1 -0
- package/dist/esm/production/subscriptions/polling.js +25 -0
- package/dist/esm/production/subscriptions/polling.js.map +1 -0
- package/dist/esm/production/topic/index.js +86 -0
- package/dist/esm/production/topic/index.js.map +1 -0
- package/dist/esm/proxy.d.ts +20 -0
- package/dist/esm/proxy.d.ts.map +1 -0
- package/dist/esm/proxyId.d.ts +8 -0
- package/dist/esm/proxyId.d.ts.map +1 -0
- package/dist/esm/query-types.d.ts +60 -0
- package/dist/esm/query-types.d.ts.map +1 -0
- package/dist/esm/query.d.ts +64 -0
- package/dist/esm/query.d.ts.map +1 -0
- package/dist/esm/react/index.d.ts +2 -0
- package/dist/esm/react/index.d.ts.map +1 -0
- package/dist/esm/react/use-query.d.ts +5 -0
- package/dist/esm/react/use-query.d.ts.map +1 -0
- package/dist/esm/rest/RESTMutation.d.ts +18 -0
- package/dist/esm/rest/RESTMutation.d.ts.map +1 -0
- package/dist/esm/rest/RESTQuery.d.ts +24 -0
- package/dist/esm/rest/RESTQuery.d.ts.map +1 -0
- package/dist/esm/rest/RESTQueryController.d.ts +34 -0
- package/dist/esm/rest/RESTQueryController.d.ts.map +1 -0
- package/dist/esm/rest/index.d.ts +5 -0
- package/dist/esm/rest/index.d.ts.map +1 -0
- package/dist/esm/retry.d.ts +4 -0
- package/dist/esm/retry.d.ts.map +1 -0
- package/dist/esm/stores/async.d.ts +80 -0
- package/dist/esm/stores/async.d.ts.map +1 -0
- package/dist/esm/stores/shared.d.ts +12 -0
- package/dist/esm/stores/shared.d.ts.map +1 -0
- package/dist/esm/stores/sync.d.ts +41 -0
- package/dist/esm/stores/sync.d.ts.map +1 -0
- package/dist/esm/subscriptions/polling.d.ts +6 -0
- package/dist/esm/subscriptions/polling.d.ts.map +1 -0
- package/dist/esm/testing/MockClient.d.ts +64 -0
- package/dist/esm/testing/MockClient.d.ts.map +1 -0
- package/dist/esm/testing/auto-generate.d.ts +20 -0
- package/dist/esm/testing/auto-generate.d.ts.map +1 -0
- package/dist/esm/testing/entity-factory.d.ts +13 -0
- package/dist/esm/testing/entity-factory.d.ts.map +1 -0
- package/dist/esm/testing/index.d.ts +6 -0
- package/dist/esm/testing/index.d.ts.map +1 -0
- package/dist/esm/testing/types.d.ts +37 -0
- package/dist/esm/testing/types.d.ts.map +1 -0
- package/dist/esm/topic/TopicQuery.d.ts +10 -0
- package/dist/esm/topic/TopicQuery.d.ts.map +1 -0
- package/dist/esm/topic/TopicQueryController.d.ts +43 -0
- package/dist/esm/topic/TopicQueryController.d.ts.map +1 -0
- package/dist/esm/topic/index.d.ts +3 -0
- package/dist/esm/topic/index.d.ts.map +1 -0
- package/dist/esm/type-utils.d.ts +16 -0
- package/dist/esm/type-utils.d.ts.map +1 -0
- package/dist/esm/typeDefs.d.ts +86 -0
- package/dist/esm/typeDefs.d.ts.map +1 -0
- package/dist/esm/types.d.ts +277 -0
- package/dist/esm/types.d.ts.map +1 -0
- package/dist/esm/utils.d.ts +38 -0
- package/dist/esm/utils.d.ts.map +1 -0
- package/index.d.ts +1 -0
- package/package.json +181 -5
- package/plugin/.claude-plugin/plugin.json +10 -0
- package/plugin/agents/fetchium.md +168 -0
- package/plugin/docs/api/fetchium-react.md +135 -0
- package/plugin/docs/api/fetchium.md +674 -0
- package/plugin/docs/api/stores-async.md +219 -0
- package/plugin/docs/api/stores-sync.md +133 -0
- package/plugin/docs/core/entities.md +351 -0
- package/plugin/docs/core/queries.md +600 -0
- package/plugin/docs/core/streaming.md +550 -0
- package/plugin/docs/core/types.md +374 -0
- package/plugin/docs/data/caching.md +298 -0
- package/plugin/docs/data/live-data.md +435 -0
- package/plugin/docs/data/mutations.md +465 -0
- package/plugin/docs/guides/auth.md +318 -0
- package/plugin/docs/guides/error-handling.md +351 -0
- package/plugin/docs/guides/offline.md +270 -0
- package/plugin/docs/guides/testing.md +301 -0
- package/plugin/docs/quickstart.md +170 -0
- package/plugin/docs/reference/pagination.md +519 -0
- package/plugin/docs/reference/rest-queries.md +107 -0
- package/plugin/docs/reference/why-signalium.md +364 -0
- package/plugin/docs/setup/project-setup.md +319 -0
- package/plugin/install.mjs +88 -0
- package/plugin/skills/design/SKILL.md +140 -0
- package/plugin/skills/teach/SKILL.md +105 -0
- package/stores/async.d.ts +1 -0
- package/stores/async.js +15 -0
- package/stores/sync.d.ts +1 -0
- package/stores/sync.js +15 -0
- package/index.js +0 -1
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import { u as v, D as l, v as f, r as h, a as y, q as a, l as C, c as d, L as g, b as k } from "../shared-DcuVH8Pf.js";
|
|
2
|
+
class N {
|
|
3
|
+
kv = /* @__PURE__ */ Object.create(null);
|
|
4
|
+
has(e) {
|
|
5
|
+
return e in this.kv;
|
|
6
|
+
}
|
|
7
|
+
getString(e) {
|
|
8
|
+
return this.kv[e];
|
|
9
|
+
}
|
|
10
|
+
setString(e, s) {
|
|
11
|
+
this.kv[e] = s;
|
|
12
|
+
}
|
|
13
|
+
getNumber(e) {
|
|
14
|
+
return this.kv[e];
|
|
15
|
+
}
|
|
16
|
+
setNumber(e, s) {
|
|
17
|
+
this.kv[e] = s;
|
|
18
|
+
}
|
|
19
|
+
getBuffer(e) {
|
|
20
|
+
return this.kv[e];
|
|
21
|
+
}
|
|
22
|
+
setBuffer(e, s) {
|
|
23
|
+
this.kv[e] = s;
|
|
24
|
+
}
|
|
25
|
+
delete(e) {
|
|
26
|
+
delete this.kv[e];
|
|
27
|
+
}
|
|
28
|
+
getAllKeys() {
|
|
29
|
+
return Object.keys(this.kv);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
class S {
|
|
33
|
+
constructor(e) {
|
|
34
|
+
this.kv = e;
|
|
35
|
+
}
|
|
36
|
+
queues = /* @__PURE__ */ new Map();
|
|
37
|
+
loadQuery(e, s) {
|
|
38
|
+
const i = this.kv.getNumber(v(s)), t = (e.statics.cache?.cacheTime ?? l) * 60 * 1e3;
|
|
39
|
+
if (i === void 0 || i < Date.now() - t)
|
|
40
|
+
return;
|
|
41
|
+
const n = this.kv.getString(f(s));
|
|
42
|
+
if (n === void 0)
|
|
43
|
+
return;
|
|
44
|
+
const r = this.kv.getBuffer(h(s));
|
|
45
|
+
let o;
|
|
46
|
+
return r !== void 0 && (o = /* @__PURE__ */ new Map(), this.preloadEntities(r, o)), this.activateQuery(e, s), {
|
|
47
|
+
value: JSON.parse(n),
|
|
48
|
+
refIds: r === void 0 ? void 0 : new Set(r ?? []),
|
|
49
|
+
updatedAt: i,
|
|
50
|
+
preloadedEntities: o
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
preloadEntities(e, s) {
|
|
54
|
+
for (const i of e) {
|
|
55
|
+
const t = this.kv.getString(f(i));
|
|
56
|
+
if (t === void 0)
|
|
57
|
+
continue;
|
|
58
|
+
s.set(i, JSON.parse(t));
|
|
59
|
+
const n = this.kv.getBuffer(h(i));
|
|
60
|
+
n !== void 0 && this.preloadEntities(n, s);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
saveQuery(e, s, i, t, n) {
|
|
64
|
+
this.setValue(s, i, n), this.kv.setNumber(v(s), t), this.activateQuery(e, s);
|
|
65
|
+
}
|
|
66
|
+
saveEntity(e, s, i) {
|
|
67
|
+
this.setValue(e, s, i);
|
|
68
|
+
}
|
|
69
|
+
activateQuery(e, s) {
|
|
70
|
+
if (!this.kv.has(f(s)))
|
|
71
|
+
return;
|
|
72
|
+
const i = e.statics.id;
|
|
73
|
+
let t = this.queues.get(i);
|
|
74
|
+
if (t === void 0) {
|
|
75
|
+
const o = e.statics.cache?.maxCount ?? y;
|
|
76
|
+
t = this.kv.getBuffer(a(i)), t === void 0 ? (t = new Uint32Array(o), this.kv.setBuffer(a(i), t)) : t.length !== o && (t = new Uint32Array(t.buffer, 0, o), this.kv.setBuffer(a(i), t)), this.queues.set(i, t);
|
|
77
|
+
}
|
|
78
|
+
this.kv.setNumber(C(i), Date.now()), this.kv.setNumber(d(i), e.statics.cache?.cacheTime ?? l);
|
|
79
|
+
const n = t.indexOf(s);
|
|
80
|
+
if (n >= 0) {
|
|
81
|
+
if (n === 0)
|
|
82
|
+
return;
|
|
83
|
+
t.copyWithin(1, 0, n), t[0] = s;
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
const r = t[t.length - 1];
|
|
87
|
+
t.copyWithin(1, 0, t.length - 1), t[0] = s, r !== 0 && (this.deleteQuery(r), this.kv.delete(v(r)));
|
|
88
|
+
}
|
|
89
|
+
purgeStaleQueries() {
|
|
90
|
+
const e = this.kv.getAllKeys(), s = Date.now();
|
|
91
|
+
for (const i of e) {
|
|
92
|
+
if (!i.startsWith(g)) continue;
|
|
93
|
+
const t = i.slice(g.length), n = this.kv.getNumber(i), o = (this.kv.getNumber(d(t)) ?? l) * 60 * 1e3;
|
|
94
|
+
if (n === void 0 || s - n > o) {
|
|
95
|
+
const c = this.kv.getBuffer(a(t));
|
|
96
|
+
if (c !== void 0)
|
|
97
|
+
for (const u of c)
|
|
98
|
+
u !== 0 && (this.deleteQuery(u), this.kv.delete(v(u)));
|
|
99
|
+
this.kv.delete(a(t)), this.kv.delete(i), this.kv.delete(d(t)), this.queues.delete(t);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
setValue(e, s, i) {
|
|
104
|
+
const t = this.kv;
|
|
105
|
+
t.setString(f(e), JSON.stringify(s));
|
|
106
|
+
const n = h(e), r = t.getBuffer(n);
|
|
107
|
+
if (i === void 0 || i.size === 0) {
|
|
108
|
+
if (t.delete(n), r !== void 0)
|
|
109
|
+
for (let o = 0; o < r.length; o++) {
|
|
110
|
+
const c = r[o];
|
|
111
|
+
this.decrementRefCount(c);
|
|
112
|
+
}
|
|
113
|
+
} else {
|
|
114
|
+
const o = new Uint32Array([...i]);
|
|
115
|
+
if (r !== void 0)
|
|
116
|
+
for (let c = 0; c < r.length; c++) {
|
|
117
|
+
const u = r[c];
|
|
118
|
+
i.has(u) ? i.delete(u) : this.decrementRefCount(u);
|
|
119
|
+
}
|
|
120
|
+
for (const c of i)
|
|
121
|
+
this.incrementRefCount(c);
|
|
122
|
+
t.setBuffer(n, o);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
deleteQuery(e) {
|
|
126
|
+
const s = this.kv;
|
|
127
|
+
s.delete(f(e)), s.delete(k(e));
|
|
128
|
+
const i = s.getBuffer(h(e));
|
|
129
|
+
if (s.delete(h(e)), i !== void 0)
|
|
130
|
+
for (const t of i)
|
|
131
|
+
t !== 0 && this.decrementRefCount(t);
|
|
132
|
+
}
|
|
133
|
+
incrementRefCount(e) {
|
|
134
|
+
const s = k(e), t = (this.kv.getNumber(s) ?? 0) + 1;
|
|
135
|
+
this.kv.setNumber(s, t);
|
|
136
|
+
}
|
|
137
|
+
decrementRefCount(e) {
|
|
138
|
+
const s = k(e), i = this.kv.getNumber(s);
|
|
139
|
+
if (i === void 0)
|
|
140
|
+
return;
|
|
141
|
+
const t = i - 1;
|
|
142
|
+
t === 0 ? this.deleteQuery(e) : this.kv.setNumber(s, t);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
export {
|
|
146
|
+
N as MemoryPersistentStore,
|
|
147
|
+
S as SyncQueryStore
|
|
148
|
+
};
|
|
149
|
+
//# sourceMappingURL=sync.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync.js","sources":["../../../../src/stores/sync.ts"],"sourcesContent":["import { CachedQuery, QueryStore, type PreloadedEntityMap } from '../QueryClient.js';\nimport { QueryDefinition } from '../query.js';\nimport {\n cacheTimeKeyFor,\n DEFAULT_CACHE_TIME,\n DEFAULT_MAX_COUNT,\n LAST_USED_PREFIX,\n lastUsedKeyFor,\n queueKeyFor,\n refCountKeyFor,\n refIdsKeyFor,\n updatedAtKeyFor,\n valueKeyFor,\n} from './shared.js';\n\nexport interface SyncPersistentStore {\n has(key: string): boolean;\n\n getString(key: string): string | undefined;\n setString(key: string, value: string): void;\n\n getNumber(key: string): number | undefined;\n setNumber(key: string, value: number): void;\n\n getBuffer(key: string): Uint32Array | undefined;\n setBuffer(key: string, value: Uint32Array): void;\n\n delete(key: string): void;\n\n getAllKeys(): string[];\n}\n\nexport class MemoryPersistentStore implements SyncPersistentStore {\n private readonly kv: Record<string, unknown> = Object.create(null);\n\n has(key: string): boolean {\n return key in this.kv;\n }\n\n getString(key: string): string | undefined {\n return this.kv[key] as string | undefined;\n }\n\n setString(key: string, value: string): void {\n this.kv[key] = value;\n }\n\n getNumber(key: string): number | undefined {\n return this.kv[key] as number | undefined;\n }\n\n setNumber(key: string, value: number): void {\n this.kv[key] = value;\n }\n\n getBuffer(key: string): Uint32Array | undefined {\n return this.kv[key] as Uint32Array | undefined;\n }\n\n setBuffer(key: string, value: Uint32Array): void {\n this.kv[key] = value;\n }\n\n delete(key: string): void {\n delete this.kv[key];\n }\n\n getAllKeys(): string[] {\n return Object.keys(this.kv);\n }\n}\n\nexport class SyncQueryStore implements QueryStore {\n queues: Map<string, Uint32Array> = new Map();\n\n constructor(private readonly kv: SyncPersistentStore) {}\n\n loadQuery(queryDef: QueryDefinition<any, any, any>, queryKey: number): CachedQuery | undefined {\n const updatedAt = this.kv.getNumber(updatedAtKeyFor(queryKey));\n\n const cacheTimeMs = (queryDef.statics.cache?.cacheTime ?? DEFAULT_CACHE_TIME) * 60 * 1000;\n if (updatedAt === undefined || updatedAt < Date.now() - cacheTimeMs) {\n return;\n }\n\n const valueStr = this.kv.getString(valueKeyFor(queryKey));\n\n if (valueStr === undefined) {\n return;\n }\n\n const entityIds = this.kv.getBuffer(refIdsKeyFor(queryKey));\n\n let preloadedEntities: PreloadedEntityMap | undefined;\n if (entityIds !== undefined) {\n preloadedEntities = new Map();\n this.preloadEntities(entityIds, preloadedEntities);\n }\n\n this.activateQuery(queryDef, queryKey);\n\n return {\n value: JSON.parse(valueStr) as Record<string, unknown>,\n refIds: entityIds === undefined ? undefined : new Set(entityIds ?? []),\n updatedAt,\n preloadedEntities,\n };\n }\n\n private preloadEntities(entityIds: Uint32Array, preloaded: PreloadedEntityMap): void {\n for (const entityId of entityIds) {\n const entityValue = this.kv.getString(valueKeyFor(entityId));\n\n if (entityValue === undefined) {\n continue;\n }\n\n preloaded.set(entityId, JSON.parse(entityValue) as Record<string, unknown>);\n\n const childIds = this.kv.getBuffer(refIdsKeyFor(entityId));\n\n if (childIds === undefined) {\n continue;\n }\n\n this.preloadEntities(childIds, preloaded);\n }\n }\n\n saveQuery(\n queryDef: QueryDefinition<any, any, any>,\n queryKey: number,\n value: unknown,\n updatedAt: number,\n refIds?: Set<number>,\n ): void {\n this.setValue(queryKey, value, refIds);\n this.kv.setNumber(updatedAtKeyFor(queryKey), updatedAt);\n this.activateQuery(queryDef, queryKey);\n }\n\n saveEntity(entityKey: number, value: unknown, refIds?: Set<number>): void {\n this.setValue(entityKey, value, refIds);\n }\n\n activateQuery(queryDef: QueryDefinition<any, any, any>, queryKey: number): void {\n if (!this.kv.has(valueKeyFor(queryKey))) {\n return;\n }\n\n const queryDefId = queryDef.statics.id;\n let queue = this.queues.get(queryDefId);\n\n if (queue === undefined) {\n const maxCount = queryDef.statics.cache?.maxCount ?? DEFAULT_MAX_COUNT;\n queue = this.kv.getBuffer(queueKeyFor(queryDefId));\n\n if (queue === undefined) {\n queue = new Uint32Array(maxCount);\n this.kv.setBuffer(queueKeyFor(queryDefId), queue);\n } else if (queue.length !== maxCount) {\n queue = new Uint32Array(queue.buffer, 0, maxCount);\n this.kv.setBuffer(queueKeyFor(queryDefId), queue);\n }\n\n this.queues.set(queryDefId, queue);\n }\n\n this.kv.setNumber(lastUsedKeyFor(queryDefId), Date.now());\n this.kv.setNumber(cacheTimeKeyFor(queryDefId), queryDef.statics.cache?.cacheTime ?? DEFAULT_CACHE_TIME);\n\n const indexOfKey = queue.indexOf(queryKey);\n\n if (indexOfKey >= 0) {\n if (indexOfKey === 0) {\n return;\n }\n queue.copyWithin(1, 0, indexOfKey);\n queue[0] = queryKey;\n return;\n }\n\n const evicted = queue[queue.length - 1];\n queue.copyWithin(1, 0, queue.length - 1);\n queue[0] = queryKey;\n\n if (evicted !== 0) {\n this.deleteQuery(evicted);\n this.kv.delete(updatedAtKeyFor(evicted));\n }\n }\n\n purgeStaleQueries(): void {\n const allKeys = this.kv.getAllKeys();\n const now = Date.now();\n\n for (const key of allKeys) {\n if (!key.startsWith(LAST_USED_PREFIX)) continue;\n\n const queryDefId = key.slice(LAST_USED_PREFIX.length);\n const lastUsedAt = this.kv.getNumber(key);\n const cacheTime = this.kv.getNumber(cacheTimeKeyFor(queryDefId)) ?? DEFAULT_CACHE_TIME;\n const cacheTimeMs = cacheTime * 60 * 1000;\n\n if (lastUsedAt === undefined || now - lastUsedAt > cacheTimeMs) {\n const queue = this.kv.getBuffer(queueKeyFor(queryDefId));\n\n if (queue !== undefined) {\n for (const queryKey of queue) {\n if (queryKey !== 0) {\n this.deleteQuery(queryKey);\n this.kv.delete(updatedAtKeyFor(queryKey));\n }\n }\n }\n\n this.kv.delete(queueKeyFor(queryDefId));\n this.kv.delete(key);\n this.kv.delete(cacheTimeKeyFor(queryDefId));\n this.queues.delete(queryDefId);\n }\n }\n }\n\n private setValue(id: number, value: unknown, refIds?: Set<number>): void {\n const kv = this.kv;\n\n kv.setString(valueKeyFor(id), JSON.stringify(value));\n\n const refIdsKey = refIdsKeyFor(id);\n\n const prevRefIds = kv.getBuffer(refIdsKey);\n\n if (refIds === undefined || refIds.size === 0) {\n kv.delete(refIdsKey);\n\n // Decrement all previous refs\n if (prevRefIds !== undefined) {\n for (let i = 0; i < prevRefIds.length; i++) {\n const refId = prevRefIds[i];\n this.decrementRefCount(refId);\n }\n }\n } else {\n // Convert the set to a Uint32Array and capture all the refIds before we\n // delete previous ones from the set\n // NOTE: Using spread operator because Hermes (React Native) doesn't correctly\n // handle new Uint32Array(Set) - it produces an empty array instead of converting\n const newRefIds = new Uint32Array([...refIds]);\n\n if (prevRefIds !== undefined) {\n // Process new refs: increment if not in old\n for (let i = 0; i < prevRefIds.length; i++) {\n const refId = prevRefIds[i];\n\n if (refIds.has(refId)) {\n refIds.delete(refId);\n } else {\n this.decrementRefCount(refId);\n }\n }\n }\n\n // No previous refs, increment all unique new refs\n for (const refId of refIds) {\n this.incrementRefCount(refId);\n }\n\n kv.setBuffer(refIdsKey, newRefIds);\n }\n }\n\n deleteQuery(id: number): void {\n const kv = this.kv;\n\n kv.delete(valueKeyFor(id));\n kv.delete(refCountKeyFor(id));\n\n const refIds = kv.getBuffer(refIdsKeyFor(id));\n kv.delete(refIdsKeyFor(id)); // Clean up the refIds key\n\n if (refIds === undefined) {\n return;\n }\n\n // Decrement ref counts for all referenced entities\n for (const refId of refIds) {\n if (refId !== 0) {\n this.decrementRefCount(refId);\n }\n }\n }\n\n private incrementRefCount(refId: number): void {\n const refCountKey = refCountKeyFor(refId);\n const currentCount = this.kv.getNumber(refCountKey) ?? 0;\n const newCount = currentCount + 1;\n this.kv.setNumber(refCountKey, newCount);\n }\n\n private decrementRefCount(refId: number): void {\n const refCountKey = refCountKeyFor(refId);\n const currentCount = this.kv.getNumber(refCountKey);\n\n if (currentCount === undefined) {\n // Already deleted or never existed\n return;\n }\n\n const newCount = currentCount - 1;\n\n if (newCount === 0) {\n // Entity exists, cascade delete it\n this.deleteQuery(refId);\n } else {\n this.kv.setNumber(refCountKey, newCount);\n }\n }\n}\n"],"names":["MemoryPersistentStore","key","value","SyncQueryStore","kv","queryDef","queryKey","updatedAt","updatedAtKeyFor","cacheTimeMs","DEFAULT_CACHE_TIME","valueStr","valueKeyFor","entityIds","refIdsKeyFor","preloadedEntities","preloaded","entityId","entityValue","childIds","refIds","entityKey","queryDefId","queue","maxCount","DEFAULT_MAX_COUNT","queueKeyFor","lastUsedKeyFor","cacheTimeKeyFor","indexOfKey","evicted","allKeys","now","LAST_USED_PREFIX","lastUsedAt","id","refIdsKey","prevRefIds","i","refId","newRefIds","refCountKeyFor","refCountKey","newCount","currentCount"],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
function o(t) {
|
|
2
|
+
return !Number.isFinite(t) || t < 100 ? ((Number.isNaN(t) || t < 0) && console.warn(`poll: invalid interval ${t}, clamping to 100ms`), 100) : t;
|
|
3
|
+
}
|
|
4
|
+
function N(t) {
|
|
5
|
+
const n = o(t.interval);
|
|
6
|
+
return function(u) {
|
|
7
|
+
let i = !0, e;
|
|
8
|
+
const c = this.refetch, r = async () => {
|
|
9
|
+
if (i) {
|
|
10
|
+
try {
|
|
11
|
+
await c();
|
|
12
|
+
} catch {
|
|
13
|
+
}
|
|
14
|
+
i && (e = setTimeout(r, n));
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
return e = setTimeout(r, n), () => {
|
|
18
|
+
i = !1, e !== void 0 && (clearTimeout(e), e = void 0);
|
|
19
|
+
};
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
export {
|
|
23
|
+
N as poll
|
|
24
|
+
};
|
|
25
|
+
//# sourceMappingURL=polling.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"polling.js","sources":["../../../../src/subscriptions/polling.ts"],"sourcesContent":["import type { MutationEvent } from '../types.js';\n\nconst MIN_INTERVAL = 100;\n\nexport interface PollConfig {\n interval: number;\n}\n\nfunction clampInterval(interval: number): number {\n if (!Number.isFinite(interval) || interval < MIN_INTERVAL) {\n if (IS_DEV && (Number.isNaN(interval) || interval < 0)) {\n console.warn(`poll: invalid interval ${interval}, clamping to ${MIN_INTERVAL}ms`);\n }\n return MIN_INTERVAL;\n }\n return interval;\n}\n\nexport function poll(config: PollConfig): (this: any, onEvent: (event: MutationEvent) => void) => () => void {\n const interval = clampInterval(config.interval);\n\n return function subscribe(this: any, _onEvent: (event: MutationEvent) => void): () => void {\n let active = true;\n let timer: ReturnType<typeof setTimeout> | undefined;\n\n const refetch = this.refetch as () => Promise<unknown>;\n\n const tick = async () => {\n if (!active) return;\n try {\n await refetch();\n } catch {\n // Keep polling after errors\n }\n if (active) {\n timer = setTimeout(tick, interval);\n }\n };\n\n timer = setTimeout(tick, interval);\n\n return () => {\n active = false;\n if (timer !== undefined) {\n clearTimeout(timer);\n timer = undefined;\n }\n };\n };\n}\n"],"names":["clampInterval","interval","poll","config","_onEvent","active","timer","refetch","tick"],"mappings":"AAQA,SAASA,EAAcC,GAA0B;AAC/C,SAAI,CAAC,OAAO,SAASA,CAAQ,KAAKA,IAAW,QAC5B,OAAO,MAAMA,CAAQ,KAAKA,IAAW,MAClD,QAAQ,KAAK,0BAA0BA,CAAQ,qBAAiC,GAE3E,OAEFA;AACT;AAEO,SAASC,EAAKC,GAAwF;AAC3G,QAAMF,IAAWD,EAAcG,EAAO,QAAQ;AAE9C,SAAO,SAA8BC,GAAsD;AACzF,QAAIC,IAAS,IACTC;AAEJ,UAAMC,IAAU,KAAK,SAEfC,IAAO,YAAY;AACvB,UAAKH,GACL;AAAA,YAAI;AACF,gBAAME,EAAA;AAAA,QACR,QAAQ;AAAA,QAER;AACA,QAAIF,MACFC,IAAQ,WAAWE,GAAMP,CAAQ;AAAA;AAAA,IAErC;AAEA,WAAAK,IAAQ,WAAWE,GAAMP,CAAQ,GAE1B,MAAM;AACX,MAAAI,IAAS,IACLC,MAAU,WACZ,aAAaA,CAAK,GAClBA,IAAQ;AAAA,IAEZ;AAAA,EACF;AACF;"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { f as a } from "../QueryClient-Dtde3pss.js";
|
|
2
|
+
import { Q as d } from "../QueryController-Ch_ncxiI.js";
|
|
3
|
+
class g extends a {
|
|
4
|
+
static controller;
|
|
5
|
+
getIdentityKey() {
|
|
6
|
+
return `topic:${this.topic}`;
|
|
7
|
+
}
|
|
8
|
+
getConfig() {
|
|
9
|
+
return {
|
|
10
|
+
staleTime: 0,
|
|
11
|
+
subscribe: () => () => {
|
|
12
|
+
this._topicController?.unsubscribe(this.topic);
|
|
13
|
+
}
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
class _ extends d {
|
|
18
|
+
_topics = /* @__PURE__ */ new Map();
|
|
19
|
+
/**
|
|
20
|
+
* Resolve the pending promise for a topic with initial data.
|
|
21
|
+
* Can be called before `send()` — the data will be picked up
|
|
22
|
+
* when the query activates.
|
|
23
|
+
*/
|
|
24
|
+
fulfillTopic(e, s) {
|
|
25
|
+
const t = this._topics.get(e);
|
|
26
|
+
if (t === void 0) {
|
|
27
|
+
this._topics.set(e, { status: "fulfilled", data: s });
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
t.status === "pending" && (t.status = "fulfilled", t.data = s, t.resolve(s));
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Reject the pending promise for a topic.
|
|
34
|
+
* Can be called before `send()` — the error will be propagated
|
|
35
|
+
* when the query activates.
|
|
36
|
+
*/
|
|
37
|
+
rejectTopic(e, s) {
|
|
38
|
+
const t = this._topics.get(e);
|
|
39
|
+
if (t === void 0) {
|
|
40
|
+
this._topics.set(e, { status: "rejected", error: s });
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
t.status === "pending" && (t.status = "rejected", t.error = s, t.reject(s));
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Clears internal state for a topic. Called automatically by
|
|
47
|
+
* `unsubscribe` — subclasses generally don't need to call this.
|
|
48
|
+
*/
|
|
49
|
+
clearTopic(e) {
|
|
50
|
+
this._topics.delete(e);
|
|
51
|
+
}
|
|
52
|
+
clearAll() {
|
|
53
|
+
this._topics.clear();
|
|
54
|
+
}
|
|
55
|
+
async send(e, s) {
|
|
56
|
+
const t = e;
|
|
57
|
+
t._topicController = this;
|
|
58
|
+
const r = t.topic, i = this._topics.get(r);
|
|
59
|
+
if (i)
|
|
60
|
+
switch (i.status) {
|
|
61
|
+
case "fulfilled":
|
|
62
|
+
return i.data;
|
|
63
|
+
case "rejected":
|
|
64
|
+
throw i.error;
|
|
65
|
+
case "pending":
|
|
66
|
+
return i.promise;
|
|
67
|
+
}
|
|
68
|
+
let o, c;
|
|
69
|
+
const n = new Promise((p, u) => {
|
|
70
|
+
o = p, c = u;
|
|
71
|
+
});
|
|
72
|
+
return this._topics.set(r, { status: "pending", promise: n, resolve: o, reject: c }), this.subscribe(r), n;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Convenience wrapper — pushes a mutation event through the QueryClient
|
|
76
|
+
* so that entities and live collections are updated reactively.
|
|
77
|
+
*/
|
|
78
|
+
sendMutationEvent(e) {
|
|
79
|
+
this.queryClient.applyMutationEvent(e);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
export {
|
|
83
|
+
g as TopicQuery,
|
|
84
|
+
_ as TopicQueryController
|
|
85
|
+
};
|
|
86
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../src/topic/TopicQuery.ts","../../../../src/topic/TopicQueryController.ts"],"sourcesContent":["import { Query } from '../query.js';\nimport type { TopicQueryController } from './TopicQueryController.js';\nimport type { QueryConfigOptions } from '../query-types.js';\n\n// ================================\n// TopicQuery — declarative topic-based query definition\n// ================================\n\nexport abstract class TopicQuery extends Query {\n static override controller: typeof TopicQueryController;\n\n abstract topic: string;\n\n getIdentityKey(): string {\n return `topic:${this.topic}`;\n }\n\n getConfig(): QueryConfigOptions {\n return {\n staleTime: 0,\n subscribe: () => {\n return () => {\n const controller = (this as Record<string, any>)._topicController as TopicQueryController | undefined;\n controller?.unsubscribe(this.topic);\n };\n },\n };\n }\n}\n","import { QueryController } from '../QueryController.js';\nimport type { Query } from '../query.js';\nimport type { MutationEvent } from '../types.js';\n\n// ================================\n// TopicQueryController — abstract controller for topic-based subscriptions\n// ================================\n\ninterface TopicCtx extends Query {\n topic: string;\n _topicController?: TopicQueryController;\n}\n\ninterface TopicState {\n status: 'pending' | 'fulfilled' | 'rejected';\n promise?: Promise<unknown>;\n resolve?: (data: unknown) => void;\n reject?: (error: unknown) => void;\n data?: unknown;\n error?: unknown;\n}\n\nexport abstract class TopicQueryController extends QueryController {\n private _topics = new Map<string, TopicState>();\n\n /**\n * Called when a query activates for a given topic.\n * Implementations should start delivering data for this topic,\n * calling `fulfillTopic()` when initial data is available and\n * `sendMutationEvent()` for ongoing updates.\n */\n abstract subscribe(topic: string): void;\n\n /**\n * Called when the query deactivates. Implementations should\n * tear down any resources for this topic.\n */\n abstract unsubscribe(topic: string): void;\n\n /**\n * Resolve the pending promise for a topic with initial data.\n * Can be called before `send()` — the data will be picked up\n * when the query activates.\n */\n protected fulfillTopic(topic: string, data: unknown): void {\n const state = this._topics.get(topic);\n\n if (state === undefined) {\n this._topics.set(topic, { status: 'fulfilled', data });\n return;\n }\n\n if (state.status === 'pending') {\n state.status = 'fulfilled';\n state.data = data;\n state.resolve!(data);\n }\n }\n\n /**\n * Reject the pending promise for a topic.\n * Can be called before `send()` — the error will be propagated\n * when the query activates.\n */\n protected rejectTopic(topic: string, error: unknown): void {\n const state = this._topics.get(topic);\n\n if (state === undefined) {\n this._topics.set(topic, { status: 'rejected', error });\n return;\n }\n\n if (state.status === 'pending') {\n state.status = 'rejected';\n state.error = error;\n state.reject!(error);\n }\n }\n\n /**\n * Clears internal state for a topic. Called automatically by\n * `unsubscribe` — subclasses generally don't need to call this.\n */\n protected clearTopic(topic: string): void {\n this._topics.delete(topic);\n }\n\n protected clearAll(): void {\n this._topics.clear();\n }\n\n override async send(ctx: Query, _signal: AbortSignal): Promise<unknown> {\n const topicCtx = ctx as TopicCtx;\n topicCtx._topicController = this;\n const topic = topicCtx.topic;\n\n const existing = this._topics.get(topic);\n\n if (existing) {\n switch (existing.status) {\n case 'fulfilled':\n return existing.data;\n case 'rejected':\n throw existing.error;\n case 'pending':\n return existing.promise;\n }\n }\n\n // No state yet — create a deferred and subscribe\n let resolve!: (data: unknown) => void;\n let reject!: (error: unknown) => void;\n const promise = new Promise<unknown>((res, rej) => {\n resolve = res;\n reject = rej;\n });\n\n this._topics.set(topic, { status: 'pending', promise, resolve, reject });\n this.subscribe(topic);\n\n return promise;\n }\n\n /**\n * Convenience wrapper — pushes a mutation event through the QueryClient\n * so that entities and live collections are updated reactively.\n */\n protected sendMutationEvent(event: MutationEvent): void {\n this.queryClient!.applyMutationEvent(event);\n }\n}\n"],"names":["TopicQuery","Query","TopicQueryController","QueryController","topic","data","state","error","ctx","_signal","topicCtx","existing","resolve","reject","promise","res","rej","event"],"mappings":";;AAQO,MAAeA,UAAmBC,EAAM;AAAA,EAC7C,OAAgB;AAAA,EAIhB,iBAAyB;AACvB,WAAO,SAAS,KAAK,KAAK;AAAA,EAC5B;AAAA,EAEA,YAAgC;AAC9B,WAAO;AAAA,MACL,WAAW;AAAA,MACX,WAAW,MACF,MAAM;AAEX,QADoB,KAA6B,kBACrC,YAAY,KAAK,KAAK;AAAA,MACpC;AAAA,IACF;AAAA,EAEJ;AACF;ACNO,MAAeC,UAA6BC,EAAgB;AAAA,EACzD,8BAAc,IAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAqBZ,aAAaC,GAAeC,GAAqB;AACzD,UAAMC,IAAQ,KAAK,QAAQ,IAAIF,CAAK;AAEpC,QAAIE,MAAU,QAAW;AACvB,WAAK,QAAQ,IAAIF,GAAO,EAAE,QAAQ,aAAa,MAAAC,GAAM;AACrD;AAAA,IACF;AAEA,IAAIC,EAAM,WAAW,cACnBA,EAAM,SAAS,aACfA,EAAM,OAAOD,GACbC,EAAM,QAASD,CAAI;AAAA,EAEvB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOU,YAAYD,GAAeG,GAAsB;AACzD,UAAMD,IAAQ,KAAK,QAAQ,IAAIF,CAAK;AAEpC,QAAIE,MAAU,QAAW;AACvB,WAAK,QAAQ,IAAIF,GAAO,EAAE,QAAQ,YAAY,OAAAG,GAAO;AACrD;AAAA,IACF;AAEA,IAAID,EAAM,WAAW,cACnBA,EAAM,SAAS,YACfA,EAAM,QAAQC,GACdD,EAAM,OAAQC,CAAK;AAAA,EAEvB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMU,WAAWH,GAAqB;AACxC,SAAK,QAAQ,OAAOA,CAAK;AAAA,EAC3B;AAAA,EAEU,WAAiB;AACzB,SAAK,QAAQ,MAAA;AAAA,EACf;AAAA,EAEA,MAAe,KAAKI,GAAYC,GAAwC;AACtE,UAAMC,IAAWF;AACjB,IAAAE,EAAS,mBAAmB;AAC5B,UAAMN,IAAQM,EAAS,OAEjBC,IAAW,KAAK,QAAQ,IAAIP,CAAK;AAEvC,QAAIO;AACF,cAAQA,EAAS,QAAA;AAAA,QACf,KAAK;AACH,iBAAOA,EAAS;AAAA,QAClB,KAAK;AACH,gBAAMA,EAAS;AAAA,QACjB,KAAK;AACH,iBAAOA,EAAS;AAAA,MAAA;AAKtB,QAAIC,GACAC;AACJ,UAAMC,IAAU,IAAI,QAAiB,CAACC,GAAKC,MAAQ;AACjD,MAAAJ,IAAUG,GACVF,IAASG;AAAA,IACX,CAAC;AAED,gBAAK,QAAQ,IAAIZ,GAAO,EAAE,QAAQ,WAAW,SAAAU,GAAS,SAAAF,GAAS,QAAAC,GAAQ,GACvE,KAAK,UAAUT,CAAK,GAEbU;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMU,kBAAkBG,GAA4B;AACtD,SAAK,YAAa,mBAAmBA,CAAK;AAAA,EAC5C;AACF;"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { InternalObjectFieldTypeDef } from './types.js';
|
|
2
|
+
export declare function typeToString(type: InternalObjectFieldTypeDef): string;
|
|
3
|
+
export declare function typeError(path: string, expectedType: InternalObjectFieldTypeDef, value: unknown): Error;
|
|
4
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,0BAA0B,EAM3B,MAAM,YAAY,CAAC;AAGpB,wBAAgB,YAAY,CAAC,IAAI,EAAE,0BAA0B,GAAG,MAAM,CAkIrE;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,0BAA0B,EAAE,KAAK,EAAE,OAAO,GAAG,KAAK,CASvG"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { QueryContext } from './QueryClient.js';
|
|
2
|
+
export declare const DEFINITION_TARGET: unique symbol;
|
|
3
|
+
export declare const CANCEL_PROXY: unique symbol;
|
|
4
|
+
export declare function isFieldRef(value: unknown): boolean;
|
|
5
|
+
export declare function getFieldRefPath(ref: unknown): string[];
|
|
6
|
+
export declare function createDefinitionProxy<T extends object>(target: T): T;
|
|
7
|
+
export interface CapturedDefinition<T = Record<string, unknown>> {
|
|
8
|
+
fields: T;
|
|
9
|
+
methods: T;
|
|
10
|
+
}
|
|
11
|
+
export declare function extractDefinition<T>(instance: T): CapturedDefinition<T>;
|
|
12
|
+
export declare function resolveFieldRefPath(path: string[], root: Record<string, unknown>): unknown;
|
|
13
|
+
export declare function reifyValue(value: unknown, root: Record<string, unknown>): unknown;
|
|
14
|
+
export declare function createExecutionContext<T>(captured: CapturedDefinition<T>, actualParams: Record<string, unknown>, queryContext: QueryContext): T;
|
|
15
|
+
//# sourceMappingURL=fieldRef.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fieldRef.d.ts","sourceRoot":"","sources":["../../src/fieldRef.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AASrD,eAAO,MAAM,iBAAiB,eAA8B,CAAC;AAC7D,eAAO,MAAM,YAAY,eAAyB,CAAC;AA0CnD,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAElD;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,EAAE,CAEtD;AAMD,wBAAgB,qBAAqB,CAAC,CAAC,SAAS,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,CAyBpE;AAMD,MAAM,WAAW,kBAAkB,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAC7D,MAAM,EAAE,CAAC,CAAC;IACV,OAAO,EAAE,CAAC,CAAC;CACZ;AAED,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,kBAAkB,CAAC,CAAC,CAAC,CAyBvE;AAMD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAO1F;AAUD,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAsBjF;AAMD,wBAAgB,sBAAsB,CAAC,CAAC,EACtC,QAAQ,EAAE,kBAAkB,CAAC,CAAC,CAAC,EAC/B,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACrC,YAAY,EAAE,YAAY,GACzB,CAAC,CAmBH"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export * from './types.js';
|
|
2
|
+
export { QueryClient, QueryClientContext } from './QueryClient.js';
|
|
3
|
+
export type { QueryContext, QueryClientConfig } from './QueryClient.js';
|
|
4
|
+
export { QueryController } from './QueryController.js';
|
|
5
|
+
export type { IQueryClientForController } from './QueryController.js';
|
|
6
|
+
export { t, registerFormat } from './typeDefs.js';
|
|
7
|
+
export { Query, fetchQuery, queryKeyForClass } from './query.js';
|
|
8
|
+
export { Mutation, getMutation, mutationKeyForClass } from './mutation.js';
|
|
9
|
+
export type { MutationDefinition } from './mutation.js';
|
|
10
|
+
export { draft } from './utils.js';
|
|
11
|
+
export type { Draft } from './utils.js';
|
|
12
|
+
export { NetworkManager, NoOpNetworkManager, defaultNetworkManager, NetworkManagerContext } from './NetworkManager.js';
|
|
13
|
+
export { GcManager, NoOpGcManager } from './GcManager.js';
|
|
14
|
+
export { Entity } from './proxy.js';
|
|
15
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAE3B,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACnE,YAAY,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACxE,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,YAAY,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAC;AACtE,OAAO,EAAE,CAAC,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AACjE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAC3E,YAAY,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,YAAY,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AACvH,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { ReactiveTask } from 'signalium';
|
|
2
|
+
import { ExtractType, InternalTypeDef, MutationEffects, RetryConfig, TypeDefShape } from './types.js';
|
|
3
|
+
import { type QueryContext } from './QueryClient.js';
|
|
4
|
+
import { type CapturedDefinition } from './fieldRef.js';
|
|
5
|
+
import type { QueryController } from './QueryController.js';
|
|
6
|
+
export interface MutationConfigOptions {
|
|
7
|
+
retry?: RetryConfig | number | false;
|
|
8
|
+
}
|
|
9
|
+
export interface MutationDefinition<Request, Response> {
|
|
10
|
+
id: string;
|
|
11
|
+
requestShape: InternalTypeDef;
|
|
12
|
+
responseShape: InternalTypeDef | undefined;
|
|
13
|
+
captured: CapturedDefinition<Mutation>;
|
|
14
|
+
optimisticUpdates: boolean;
|
|
15
|
+
config?: MutationConfigOptions;
|
|
16
|
+
effects?: MutationEffects;
|
|
17
|
+
hasGetEffects: boolean;
|
|
18
|
+
controllerClass: typeof QueryController;
|
|
19
|
+
}
|
|
20
|
+
export declare abstract class Mutation {
|
|
21
|
+
static controller?: typeof QueryController;
|
|
22
|
+
readonly params?: TypeDefShape;
|
|
23
|
+
readonly result?: TypeDefShape;
|
|
24
|
+
readonly optimisticUpdates?: boolean;
|
|
25
|
+
readonly config?: MutationConfigOptions;
|
|
26
|
+
readonly effects?: Readonly<MutationEffects>;
|
|
27
|
+
context: QueryContext;
|
|
28
|
+
abstract getIdentityKey(): unknown;
|
|
29
|
+
getEffects?(): MutationEffects;
|
|
30
|
+
constructor();
|
|
31
|
+
}
|
|
32
|
+
export declare const mutationKeyForClass: (cls: new () => Mutation) => string;
|
|
33
|
+
export declare function getMutation<T extends Mutation>(MutationClass: new () => T): ReactiveTask<Readonly<ExtractType<T['result']>>, [ExtractType<T['params']>]>;
|
|
34
|
+
//# sourceMappingURL=mutation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mutation.d.ts","sourceRoot":"","sources":["../../src/mutation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,YAAY,EAAE,MAAM,WAAW,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,eAAe,EAAW,WAAW,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC/G,OAAO,EAAsB,KAAK,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEzE,OAAO,EAA4C,KAAK,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAClG,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAM5D,MAAM,WAAW,qBAAqB;IACpC,KAAK,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,KAAK,CAAC;CACtC;AAED,MAAM,WAAW,kBAAkB,CAAC,OAAO,EAAE,QAAQ;IACnD,EAAE,EAAE,MAAM,CAAC;IACX,YAAY,EAAE,eAAe,CAAC;IAC9B,aAAa,EAAE,eAAe,GAAG,SAAS,CAAC;IAC3C,QAAQ,EAAE,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IACvC,iBAAiB,EAAE,OAAO,CAAC;IAC3B,MAAM,CAAC,EAAE,qBAAqB,CAAC;IAC/B,OAAO,CAAC,EAAE,eAAe,CAAC;IAC1B,aAAa,EAAE,OAAO,CAAC;IACvB,eAAe,EAAE,OAAO,eAAe,CAAC;CACzC;AAMD,8BAAsB,QAAQ;IAC5B,MAAM,CAAC,UAAU,CAAC,EAAE,OAAO,eAAe,CAAC;IAE3C,QAAQ,CAAC,MAAM,CAAC,EAAE,YAAY,CAAC;IAC/B,QAAQ,CAAC,MAAM,CAAC,EAAE,YAAY,CAAC;IAC/B,QAAQ,CAAC,iBAAiB,CAAC,EAAE,OAAO,CAAC;IACrC,QAAQ,CAAC,MAAM,CAAC,EAAE,qBAAqB,CAAC;IACxC,QAAQ,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,eAAe,CAAC,CAAC;IAErC,OAAO,EAAE,YAAY,CAAC;IAE9B,QAAQ,CAAC,cAAc,IAAI,OAAO;IAElC,UAAU,CAAC,IAAI,eAAe;;CAK/B;AAQD,eAAO,MAAM,mBAAmB,GAAI,KAAK,UAAU,QAAQ,KAAG,MAQ7D,CAAC;AAmEF,wBAAgB,WAAW,CAAC,CAAC,SAAS,QAAQ,EAC5C,aAAa,EAAE,UAAU,CAAC,GACzB,YAAY,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAU9E"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type { QueryClient, PreloadedEntityMap } from './QueryClient.js';
|
|
2
|
+
import { ValidatorDef } from './typeDefs.js';
|
|
3
|
+
import { ComplexTypeDef, EntityDef, TypeDef } from './types.js';
|
|
4
|
+
import type { WarnFn } from './proxy.js';
|
|
5
|
+
export interface ParsedEntity {
|
|
6
|
+
key: number;
|
|
7
|
+
shape: EntityDef;
|
|
8
|
+
data: Record<string, unknown>;
|
|
9
|
+
/** Set for partial event updates — restricts mergeFields to only these keys. */
|
|
10
|
+
rawKeys: Set<string> | undefined;
|
|
11
|
+
}
|
|
12
|
+
export declare class ParseContext {
|
|
13
|
+
queryClient: QueryClient | undefined;
|
|
14
|
+
preloadedEntities: PreloadedEntityMap | undefined;
|
|
15
|
+
warn: WarnFn;
|
|
16
|
+
/** When true, missing optional fields on existing entities are set to
|
|
17
|
+
* undefined. False for mutation events (truly partial payloads). */
|
|
18
|
+
isPartialEvent: boolean;
|
|
19
|
+
seen: Map<Record<string, unknown>, ParsedEntity> | undefined;
|
|
20
|
+
seenByKey: Map<number, ParsedEntity> | undefined;
|
|
21
|
+
reset(queryClient: QueryClient | undefined, preloadedEntities: PreloadedEntityMap | undefined, warn: WarnFn, isPartialEvent?: boolean): void;
|
|
22
|
+
}
|
|
23
|
+
export interface ParseResult {
|
|
24
|
+
data: unknown;
|
|
25
|
+
ctx: ParseContext;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Parse data: validates types, applies formats, produces parsed entity data
|
|
29
|
+
* objects (stored in ctx.seen). Does NOT touch the entity store.
|
|
30
|
+
*
|
|
31
|
+
* After parsing, call applyEntityRefs() to apply entities and reify the tree.
|
|
32
|
+
*/
|
|
33
|
+
export declare function parseEntities(value: unknown, typeDef: TypeDef | ComplexTypeDef, ctx: ParseContext): unknown;
|
|
34
|
+
/**
|
|
35
|
+
* Standalone value parser for non-entity values. Used by tests and LiveCollection.
|
|
36
|
+
* Validates types and applies eager formats. Does not perform entity resolution.
|
|
37
|
+
*/
|
|
38
|
+
export declare function parseValue(value: unknown, typeDef: TypeDef | ComplexTypeDef, path: string, warn?: WarnFn): unknown;
|
|
39
|
+
/**
|
|
40
|
+
* Parse a single entity. Returns its parsed data object.
|
|
41
|
+
*/
|
|
42
|
+
export declare function parseEntity(obj: Record<string, unknown>, entityShape: EntityDef, ctx: ParseContext): Record<string, unknown>;
|
|
43
|
+
export declare function entitySatisfiesShape(data: Record<string, unknown>, def: ValidatorDef<any>): boolean;
|
|
44
|
+
//# sourceMappingURL=parseEntities.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parseEntities.d.ts","sourceRoot":"","sources":["../../src/parseEntities.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACxE,OAAO,EAAyD,YAAY,EAAE,MAAM,eAAe,CAAC;AAEpG,OAAO,EAGL,cAAc,EACd,SAAS,EAQT,OAAO,EAER,MAAM,YAAY,CAAC;AAIpB,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AASzC,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,SAAS,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,gFAAgF;IAChF,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC;CAClC;AAMD,qBAAa,YAAY;IACvB,WAAW,EAAE,WAAW,GAAG,SAAS,CAAa;IACjD,iBAAiB,EAAE,kBAAkB,GAAG,SAAS,CAAa;IAC9D,IAAI,EAAE,MAAM,CAAY;IACxB;yEACqE;IACrE,cAAc,EAAE,OAAO,CAAS;IAChC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,CAAC,GAAG,SAAS,CAAa;IACzE,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,GAAG,SAAS,CAAa;IAE7D,KAAK,CACH,WAAW,EAAE,WAAW,GAAG,SAAS,EACpC,iBAAiB,EAAE,kBAAkB,GAAG,SAAS,EACjD,IAAI,EAAE,MAAM,EACZ,cAAc,GAAE,OAAe,GAC9B,IAAI;CAeR;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,OAAO,CAAC;IACd,GAAG,EAAE,YAAY,CAAC;CACnB;AAMD;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,GAAG,cAAc,EAAE,GAAG,EAAE,YAAY,GAAG,OAAO,CAE3G;AAED;;;GAGG;AACH,wBAAgB,UAAU,CACxB,KAAK,EAAE,OAAO,EACd,OAAO,EAAE,OAAO,GAAG,cAAc,EACjC,IAAI,EAAE,MAAM,EACZ,IAAI,GAAE,MAAiB,GACtB,OAAO,CAKT;AAED;;GAEG;AACH,wBAAgB,WAAW,CACzB,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5B,WAAW,EAAE,SAAS,EACtB,GAAG,EAAE,YAAY,GAChB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEzB;AAkVD,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,YAAY,CAAC,GAAG,CAAC,GAAG,OAAO,CAEnG"}
|