@rindle/client 0.1.1 → 0.1.3

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/ssr.js CHANGED
@@ -9,6 +9,7 @@
9
9
  //
10
10
  // `useQuery` is byte-for-byte identical in both — only the injected backend (and whether a live
11
11
  // subscribe ever happens) differs.
12
+ import { assertNoLocalTables } from "./query.js";
12
13
  import { Store } from "./store.js";
13
14
  /**
14
15
  * A no-op live backend for SSR (SSR-DESIGN.md §6.1): it opens no transport and never streams.
@@ -31,15 +32,22 @@ export class OneShotBackend {
31
32
  */
32
33
  export class ServerStore {
33
34
  store;
35
+ schema;
34
36
  opts;
35
37
  constructor(schema, opts) {
36
38
  this.store = new Store(schema, new OneShotBackend());
39
+ this.schema = schema;
37
40
  this.opts = opts;
38
41
  }
39
42
  /** Run the one-shot read for `query` and seed its first-paint snapshot (SSR-DESIGN.md §6.2).
40
43
  * Call once per query in the route loader, before the synchronous render. */
41
44
  async preload(query) {
42
45
  const ast = query.ast();
46
+ // E3 backstop: a local-only table must never be forwarded to the daemon. The `OneShotBackend`'s
47
+ // `registerQuery` is a no-op (no engine-side E3 check runs on the SSR path), and a query built
48
+ // from the LOCAL builder permits local tables — so the AST is re-checked here regardless of how
49
+ // it was built (201-LOCAL-ONLY-TABLES-DESIGN.md E3).
50
+ assertNoLocalTables(ast, this.schema);
43
51
  // Forward the AST (a direct-to-daemon backend reads it) plus the named identity when this came
44
52
  // from `defineQuery` (an API-tier backend resolves `(name, args)` → AST itself, never trusting
45
53
  // a client AST). The seed is keyed by the AST's `viewKey` either way, so the browser's
package/dist/ssr.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"ssr.js","sourceRoot":"","sources":["../src/ssr.ts"],"names":[],"mappings":"AAAA,4FAA4F;AAC5F,gGAAgG;AAChG,EAAE;AACF,+EAA+E;AAC/E,iGAAiG;AACjG,mGAAmG;AACnG,kGAAkG;AAClG,4FAA4F;AAC5F,EAAE;AACF,gGAAgG;AAChG,mCAAmC;AAInC,OAAO,EAA4C,KAAK,EAAE,MAAM,YAAY,CAAC;AA0B7E;;;;;GAKG;AACH,MAAM,OAAO,cAAc;IACzB,aAAa,CAAC,IAAa,EAAE,IAAa,EAAE,OAAqB,IAAS,CAAC;IAC3E,eAAe,CAAC,IAAa,IAAS,CAAC;IACvC,MAAM,CAAC,UAAsB;QAC3B,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,oEAAoE,CAAC,CAAC,CAAC;IACzG,CAAC;IACD,OAAO,CAAC,QAAwD,IAAS,CAAC;CAC3E;AAgBD;;;;GAIG;AACH,MAAM,OAAO,WAAW;IACb,KAAK,CAAW;IACR,IAAI,CAAqB;IAE1C,YAAY,MAAiB,EAAE,IAAwB;QACrD,IAAI,CAAC,KAAK,GAAG,IAAI,KAAK,CAAC,MAAM,EAAE,IAAI,cAAc,EAAE,CAAC,CAAC;QACrD,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;IAED;kFAC8E;IAC9E,KAAK,CAAC,OAAO,CAAC,KAA2B;QACvC,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC;QACxB,+FAA+F;QAC/F,+FAA+F;QAC/F,uFAAuF;QACvF,qDAAqD;QACrD,MAAM,KAAK,GAAG,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;QAClG,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;YACnC,GAAG;YACH,GAAG,KAAK;YACR,aAAa,EAAE,IAAI,CAAC,IAAI,CAAC,aAAa;YACtC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK;SACvB,CAAC,CAAC;QACH,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC;IAChE,CAAC;IAED;kDAC8C;IAC9C,SAAS;QACP,OAAO,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;IAChC,CAAC;CACF;AAED,2FAA2F;AAC3F,MAAM,UAAU,iBAAiB,CAC/B,MAAiB,EACjB,IAAwB;IAExB,OAAO,IAAI,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;AACvC,CAAC"}
1
+ {"version":3,"file":"ssr.js","sourceRoot":"","sources":["../src/ssr.ts"],"names":[],"mappings":"AAAA,4FAA4F;AAC5F,gGAAgG;AAChG,EAAE;AACF,+EAA+E;AAC/E,iGAAiG;AACjG,mGAAmG;AACnG,kGAAkG;AAClG,4FAA4F;AAC5F,EAAE;AACF,gGAAgG;AAChG,mCAAmC;AAEnC,OAAO,EAAE,mBAAmB,EAAc,MAAM,YAAY,CAAC;AAE7D,OAAO,EAA4C,KAAK,EAAE,MAAM,YAAY,CAAC;AA0B7E;;;;;GAKG;AACH,MAAM,OAAO,cAAc;IACzB,aAAa,CAAC,IAAa,EAAE,IAAa,EAAE,OAAqB,IAAS,CAAC;IAC3E,eAAe,CAAC,IAAa,IAAS,CAAC;IACvC,MAAM,CAAC,UAAsB;QAC3B,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,oEAAoE,CAAC,CAAC,CAAC;IACzG,CAAC;IACD,OAAO,CAAC,QAAwD,IAAS,CAAC;CAC3E;AAgBD;;;;GAIG;AACH,MAAM,OAAO,WAAW;IACb,KAAK,CAAW;IACR,MAAM,CAAY;IAClB,IAAI,CAAqB;IAE1C,YAAY,MAAiB,EAAE,IAAwB;QACrD,IAAI,CAAC,KAAK,GAAG,IAAI,KAAK,CAAC,MAAM,EAAE,IAAI,cAAc,EAAE,CAAC,CAAC;QACrD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;IAED;kFAC8E;IAC9E,KAAK,CAAC,OAAO,CAAC,KAA2B;QACvC,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC;QACxB,gGAAgG;QAChG,+FAA+F;QAC/F,gGAAgG;QAChG,qDAAqD;QACrD,mBAAmB,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QACtC,+FAA+F;QAC/F,+FAA+F;QAC/F,uFAAuF;QACvF,qDAAqD;QACrD,MAAM,KAAK,GAAG,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;QAClG,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;YACnC,GAAG;YACH,GAAG,KAAK;YACR,aAAa,EAAE,IAAI,CAAC,IAAI,CAAC,aAAa;YACtC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK;SACvB,CAAC,CAAC;QACH,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC;IAChE,CAAC;IAED;kDAC8C;IAC9C,SAAS;QACP,OAAO,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;IAChC,CAAC;CACF;AAED,2FAA2F;AAC3F,MAAM,UAAU,iBAAiB,CAC/B,MAAiB,EACjB,IAAwB;IAExB,OAAO,IAAI,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;AACvC,CAAC"}
package/dist/store.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import type { Ast } from "./ast.ts";
2
2
  import { type Query, type QueryRoot } from "./query.ts";
3
3
  import type { ColsMap, RowOf, Schema } from "./schema.ts";
4
- import type { Backend, WireValue } from "./types.ts";
4
+ import type { Backend, ChangeEvent, QueryId, ResultType, WireValue } from "./types.ts";
5
5
  /** One query's SSR snapshot, keyed by its `viewKey` ({@link stableKey} of the AST): the
6
6
  * pre-projected first-paint `rows` plus the `cvMin` watermark they reflect (SSR-DESIGN.md §6.2).
7
7
  * Serializable as-is into the HTML — `rows` are already JSON values (json columns parsed). */
@@ -34,6 +34,36 @@ export interface CachedQueryView<Q extends Query<any, any, any>> {
34
34
  retain(query: Q): () => void;
35
35
  destroy(): void;
36
36
  }
37
+ /** One live materialized view's read-only summary for a devtools pane (DEBUG-TOOLS-BROWSER-DESIGN
38
+ * §4.2 — "surface, not instrument"). All fields are already held by the {@link Store}; this is the
39
+ * single read-only accessor over the otherwise-private `views`/`asts` maps. */
40
+ export interface QueryInspect {
41
+ /** The Store-assigned query id (also the backend's qid — the Store passes it straight through). */
42
+ qid: QueryId;
43
+ /** The query's AST (`Store.asts`), for the inspector's pretty-print / table-derivation. */
44
+ ast: Ast;
45
+ /** The view's SERVER-CHANNEL state (`unknown` while loading, `complete` once authoritative). */
46
+ resultType: ResultType;
47
+ /** Current materialized row count (`view.data.length`). */
48
+ rowCount: number;
49
+ /** A capped peek at the projected rows (reference-stable objects off the live view). */
50
+ sample: readonly unknown[];
51
+ }
52
+ /** A frozen snapshot of the Store's live query state for a devtools pane ({@link Store.__inspect}). */
53
+ export interface StoreInspect {
54
+ queries: QueryInspect[];
55
+ }
56
+ /** A dev-only passive tap over the Store's per-query streams (DEBUG-TOOLS-BROWSER-DESIGN §6.2).
57
+ * Registered via {@link Store.__attachDevtools}; it ADDS a listener and never displaces the
58
+ * single `backend.onEvent`/`onResultType` handlers the Store already owns, so attaching devtools
59
+ * cannot perturb the app. Both hooks are optional. */
60
+ export interface StoreDevObserver {
61
+ /** The raw per-query {@link ChangeEvent} (hello / snapshot / batch) the Store just routed to its
62
+ * view — the source of the devtools delta stream (§4.3). Fired AFTER the view has folded it. */
63
+ onDelta?(qid: QueryId, ev: ChangeEvent): void;
64
+ /** A per-query {@link ResultType} transition the Store just applied to its view (§4.2). */
65
+ onResultType?(qid: QueryId, rt: ResultType): void;
66
+ }
37
67
  export declare class Store<S extends ColsMap> {
38
68
  /** Type-safe query entry: `store.query.issue.where.closed(false).materialize()`. */
39
69
  readonly query: QueryRoot<S>;
@@ -43,6 +73,7 @@ export declare class Store<S extends ColsMap> {
43
73
  private readonly views;
44
74
  private readonly asts;
45
75
  private readonly seeds;
76
+ private devObservers?;
46
77
  constructor(schema: Schema<S>, backend: Backend);
47
78
  /** Materialize any fluent query object. Named queries subscribe remotely by `(name,args)`;
48
79
  * ad-hoc builder queries are local-only for local-first backends. */
@@ -59,6 +90,21 @@ export declare class Store<S extends ColsMap> {
59
90
  * accepted them (local: applied; remote: sent). The resulting view updates flow back via
60
91
  * the backend's event stream. */
61
92
  write(fn: (tx: WriteTx<S>) => void): Promise<void>;
93
+ /** Direct-commit write to LOCAL-only tables (`201-LOCAL-ONLY-TABLES-DESIGN.md` §6): the
94
+ * client-authoritative path for selection state, draft text, view prefs, scratch rows. It
95
+ * bypasses the optimistic pending stack entirely — a local table is untracked, so it never
96
+ * rebases, reverts, or waits on a server confirmation (it "moves on its own").
97
+ *
98
+ * Rejects a synced/tracked table (M2): a direct write to one would be un-applied on the very
99
+ * next server rewind. Local writes also must NOT live inside a replayable mutator (M1) — the
100
+ * server runs the mutator from `args` alone and cannot see local tables; use this instead.
101
+ * Same keyed `WriteTx` shape as {@link write}. `async` so the no-seam / M2 guards surface as a
102
+ * REJECTED promise (the `Promise<void>` contract) rather than a synchronous throw that escapes a
103
+ * caller's `.catch` and crashes the event handler / render frame. */
104
+ writeLocal(fn: (tx: WriteTx<S>) => void): Promise<void>;
105
+ /** Drain a keyed `WriteTx` callback into positional {@link Mutation}s (shared by
106
+ * {@link write} / {@link writeLocal}; json columns stringified, rows in column order). */
107
+ private collectMutations;
62
108
  /** Seed a query's first-paint snapshot from a `POST /query` response (server side): convert the
63
109
  * assembled rows to the view's projected shape and stash them by `viewKey`. A view materialized
64
110
  * for this AST (during the synchronous render) reads the seed; {@link dehydrate} serializes it. */
@@ -81,6 +127,14 @@ export declare class Store<S extends ColsMap> {
81
127
  private registerMaterialized;
82
128
  private retainRemote;
83
129
  private onEvent;
130
+ /** Register a devtools {@link StoreDevObserver}; returns a detach function. Multiple panes may
131
+ * attach. The observer is ADDITIVE — it does not touch the backend's single handler slots. */
132
+ __attachDevtools(observer: StoreDevObserver): () => void;
133
+ /** A read-only snapshot of every live materialized view (DEBUG-TOOLS-BROWSER-DESIGN §4.2): its
134
+ * qid, AST, {@link ResultType}, row count, and a capped row sample. Built fresh on each call from
135
+ * the live `views`/`asts` maps — never cached, never mutating. `sampleRows` caps the per-query
136
+ * peek (default 50) so a large view doesn't bloat the snapshot. */
137
+ __inspect(sampleRows?: number): StoreInspect;
84
138
  private columns;
85
139
  /** An object row → a positional cell array in the table's column order (json → string). */
86
140
  private positionalize;
@@ -1 +1 @@
1
- {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}
package/dist/store.js CHANGED
@@ -21,14 +21,27 @@ export class Store {
21
21
  // seeded for first paint; a seed is consumed (dropped) the moment its query's first live
22
22
  // `hello` lands, so later mounts don't flash stale SSR data.
23
23
  seeds = new Map();
24
+ // Dev-only devtools taps (DEBUG-TOOLS-BROWSER-DESIGN §6.2). `undefined` until the first
25
+ // `__attachDevtools`, so a production app that never attaches a pane pays one undefined-check per
26
+ // routed event and nothing else — there is no global singleton and no hot-path instrumentation.
27
+ devObservers;
24
28
  constructor(schema, backend) {
25
29
  this.schema = schema;
26
30
  this.backend = backend;
27
31
  this.backend.onEvent((qid, ev) => this.onEvent(qid, ev));
28
32
  // Route the backend's per-query lifecycle onto its view (`view.resultType`). Backends without a
29
- // lifecycle omit `onResultType`, leaving every view `complete`.
30
- this.backend.onResultType?.((qid, rt) => this.views.get(qid)?.setResultType(rt));
31
- this.query = queries(this.schema, (query) => this.materialize(query));
33
+ // lifecycle omit `onResultType`, leaving every view `complete`. A devtools tap mirrors the
34
+ // transition (it never displaces this single handler).
35
+ this.backend.onResultType?.((qid, rt) => {
36
+ this.views.get(qid)?.setResultType(rt);
37
+ if (this.devObservers)
38
+ for (const o of this.devObservers)
39
+ o.onResultType?.(qid, rt);
40
+ });
41
+ // `store.query` is the LOCAL builder (201-LOCAL-ONLY-TABLES-DESIGN.md §5): it scopes over
42
+ // synced AND local-only tables, so a local query can join the two. Server/named queries use
43
+ // the synced-only `newQueryBuilder`, which excludes local tables.
44
+ this.query = queries(this.schema, (query) => this.materialize(query), { includeLocal: true });
32
45
  }
33
46
  /** Materialize any fluent query object. Named queries subscribe remotely by `(name,args)`;
34
47
  * ad-hoc builder queries are local-only for local-first backends. */
@@ -64,6 +77,36 @@ export class Store {
64
77
  * accepted them (local: applied; remote: sent). The resulting view updates flow back via
65
78
  * the backend's event stream. */
66
79
  write(fn) {
80
+ return Promise.resolve(this.backend.mutate(this.collectMutations(fn)));
81
+ }
82
+ /** Direct-commit write to LOCAL-only tables (`201-LOCAL-ONLY-TABLES-DESIGN.md` §6): the
83
+ * client-authoritative path for selection state, draft text, view prefs, scratch rows. It
84
+ * bypasses the optimistic pending stack entirely — a local table is untracked, so it never
85
+ * rebases, reverts, or waits on a server confirmation (it "moves on its own").
86
+ *
87
+ * Rejects a synced/tracked table (M2): a direct write to one would be un-applied on the very
88
+ * next server rewind. Local writes also must NOT live inside a replayable mutator (M1) — the
89
+ * server runs the mutator from `args` alone and cannot see local tables; use this instead.
90
+ * Same keyed `WriteTx` shape as {@link write}. `async` so the no-seam / M2 guards surface as a
91
+ * REJECTED promise (the `Promise<void>` contract) rather than a synchronous throw that escapes a
92
+ * caller's `.catch` and crashes the event handler / render frame. */
93
+ async writeLocal(fn) {
94
+ if (!this.backend.writeLocal) {
95
+ throw new Error("store.writeLocal: this backend has no local-write seam (local-only tables need the wasm/optimistic backend).");
96
+ }
97
+ const muts = this.collectMutations(fn);
98
+ // Defense in depth (M2): a clear Store-level rejection of any non-local table, before the
99
+ // backend's own chokepoint guard. Local writes are authoritative-for-themselves only.
100
+ for (const m of muts) {
101
+ if (!this.schema.tables[m.table]?.local) {
102
+ throw new Error(`store.writeLocal: "${m.table}" is not a local-only table — use store.write or a named mutator (M2).`);
103
+ }
104
+ }
105
+ this.backend.writeLocal(muts);
106
+ }
107
+ /** Drain a keyed `WriteTx` callback into positional {@link Mutation}s (shared by
108
+ * {@link write} / {@link writeLocal}; json columns stringified, rows in column order). */
109
+ collectMutations(fn) {
67
110
  const muts = [];
68
111
  const tx = {
69
112
  add: (t, row) => muts.push({ op: "add", table: t, row: this.positionalize(t, row) }),
@@ -71,7 +114,7 @@ export class Store {
71
114
  edit: (t, o, n) => muts.push({ op: "edit", table: t, old: this.positionalize(t, o), new: this.positionalize(t, n) }),
72
115
  };
73
116
  fn(tx);
74
- return Promise.resolve(this.backend.mutate(muts));
117
+ return muts;
75
118
  }
76
119
  // --- SSR (SSR-DESIGN.md §6) ---------------------------------------------------
77
120
  /** Seed a query's first-paint snapshot from a `POST /query` response (server side): convert the
@@ -147,7 +190,17 @@ export class Store {
147
190
  }
148
191
  baseDestroy();
149
192
  };
150
- this.backend.registerQuery(qid, ast, remote);
193
+ // If the backend rejects the registration (E3: a remote query naming a local-only table), roll
194
+ // back the per-qid state we just created — otherwise the view + ast entry leak (the caller never
195
+ // gets a handle to `destroy()` them, since the throw aborts before we return).
196
+ try {
197
+ this.backend.registerQuery(qid, ast, remote);
198
+ }
199
+ catch (e) {
200
+ this.views.delete(qid);
201
+ this.asts.delete(qid);
202
+ throw e;
203
+ }
151
204
  // SSR first paint (SSR-DESIGN.md §6): if this AST was preloaded/hydrated, seed the view now.
152
205
  // A synchronous backend (wasm) already reset the view above, so its live data wins and the
153
206
  // seed is inert; an async backend (ws) leaves it PENDING, so the seed shows until `hello`.
@@ -190,6 +243,43 @@ export class Store {
190
243
  else {
191
244
  this.views.get(qid)?.applyChanges(ev.events);
192
245
  }
246
+ // Mirror the raw delta to any devtools tap, AFTER the view has folded it (so a pane re-reading
247
+ // `__inspect` sees the post-apply state). No-op (one undefined-check) when no pane is attached.
248
+ if (this.devObservers)
249
+ for (const o of this.devObservers)
250
+ o.onDelta?.(qid, ev);
251
+ }
252
+ // --- dev-only introspection (DEBUG-TOOLS-BROWSER-DESIGN §2/§6.2) --------------
253
+ // A single read-only accessor + a passive tap per the design's "surface, not instrument" rule.
254
+ // Only ever called by `@rindle/devtools` (imported in dev); inert otherwise.
255
+ /** Register a devtools {@link StoreDevObserver}; returns a detach function. Multiple panes may
256
+ * attach. The observer is ADDITIVE — it does not touch the backend's single handler slots. */
257
+ __attachDevtools(observer) {
258
+ (this.devObservers ??= new Set()).add(observer);
259
+ return () => {
260
+ this.devObservers?.delete(observer);
261
+ };
262
+ }
263
+ /** A read-only snapshot of every live materialized view (DEBUG-TOOLS-BROWSER-DESIGN §4.2): its
264
+ * qid, AST, {@link ResultType}, row count, and a capped row sample. Built fresh on each call from
265
+ * the live `views`/`asts` maps — never cached, never mutating. `sampleRows` caps the per-query
266
+ * peek (default 50) so a large view doesn't bloat the snapshot. */
267
+ __inspect(sampleRows = 50) {
268
+ const queries = [];
269
+ for (const [qid, view] of this.views) {
270
+ const ast = this.asts.get(qid);
271
+ if (!ast)
272
+ continue; // a view mid-teardown (ast already dropped) — skip
273
+ const data = view.data;
274
+ queries.push({
275
+ qid,
276
+ ast,
277
+ resultType: view.resultType,
278
+ rowCount: data.length,
279
+ sample: sampleRows >= data.length ? data : data.slice(0, sampleRows),
280
+ });
281
+ }
282
+ return { queries };
193
283
  }
194
284
  columns(table) {
195
285
  const meta = this.schema.tables[table];
package/dist/store.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -174,6 +174,11 @@ export interface Backend {
174
174
  releaseRemoteQuery?(queryId: QueryId): void;
175
175
  /** Local: applies now (changes flow back on the stream). Remote: sends to the server. */
176
176
  mutate(mutations: Mutation[]): Promise<void>;
177
+ /** Optional DIRECT-COMMIT path for LOCAL-only tables (`201-LOCAL-ONLY-TABLES-DESIGN.md` §6):
178
+ * applies the writes straight to the engine, OUTSIDE the optimistic pending stack (a local
179
+ * table is untracked, so it never rebases). The backend rejects any synced/tracked table (M2).
180
+ * Backends with no local-table support (a plain remote sync backend) omit it. */
181
+ writeLocal?(mutations: Mutation[]): void;
177
182
  onEvent(handler: (queryId: QueryId, event: ChangeEvent) => void): void;
178
183
  /** Optional: the backend pushes per-query {@link ResultType} changes here and the core routes
179
184
  * each to the matching view (so `view.resultType` tracks it). Backends with no lifecycle (the
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,wFAAwF;AACxF,EAAE;AACF,sFAAsF;AACtF,0EAA0E;AAgM1E;;8EAE8E;AAC9E,MAAM,CAAC,MAAM,sBAAsB,GAAG,0BAA0B,CAAC;AAEjE;;mEAEmE;AACnE,MAAM,CAAC,MAAM,eAAe,GAAG,oBAAoB,CAAC;AAEpD;qDACqD;AACrD,MAAM,CAAC,MAAM,uBAAuB,GAA0B;IAC5D,IAAI,EAAE,sBAAsB;IAC5B,OAAO,EAAE,CAAC,WAAW,EAAE,kBAAkB,CAAC;IAC1C,UAAU,EAAE,CAAC,CAAC,CAAC;CAChB,CAAC"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,wFAAwF;AACxF,EAAE;AACF,sFAAsF;AACtF,0EAA0E;AAqM1E;;8EAE8E;AAC9E,MAAM,CAAC,MAAM,sBAAsB,GAAG,0BAA0B,CAAC;AAEjE;;mEAEmE;AACnE,MAAM,CAAC,MAAM,eAAe,GAAG,oBAAoB,CAAC;AAEpD;qDACqD;AACrD,MAAM,CAAC,MAAM,uBAAuB,GAA0B;IAC5D,IAAI,EAAE,sBAAsB;IAC5B,OAAO,EAAE,CAAC,WAAW,EAAE,kBAAkB,CAAC;IAC1C,UAAU,EAAE,CAAC,CAAC,CAAC;CAChB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rindle/client",
3
- "version": "0.1.1",
3
+ "version": "0.1.3",
4
4
  "license": "Apache-2.0",
5
5
  "repository": {
6
6
  "type": "git",
package/src/index.ts CHANGED
@@ -2,7 +2,7 @@
2
2
  // comparator, Backend seam, and the ArrayView contract. (The ArrayView folding impl + the
3
3
  // Store/backend wiring land in later slices.)
4
4
 
5
- export * from "./schema.ts"; // table/columns/primaryKey, createSchema, string/number/boolean/json, Col, RowOf, Row, TableDef, tableSpec, SCHEMA
5
+ export * from "./schema.ts"; // table/columns/primaryKey, createSchema/extendSchema, string/number/boolean/json, Col, RowOf, Row, TableDef, tableSpec, SCHEMA
6
6
  export * from "./operators.ts"; // eq/ne/gt/ge/lt/le/like/notLike/ilike/notIlike/inList/notInList/is/isNot, and/or, Pred, Cond, Arg
7
7
  export * from "./query.ts"; // Query, QueryRoot, queries/newQueryBuilder, defineQuery/NamedQuery, exists, notExists, defineFragment/Fragment/FragmentRef/isFragment
8
8
  export * from "./view.ts"; // ArrayView, SingularArrayView, FlatArrayView, SingularView, ViewTypes
package/src/query.ts CHANGED
@@ -11,7 +11,7 @@ import { stableKey } from "./key.ts";
11
11
  import type { Arg, Cond } from "./operators.ts";
12
12
  import { fieldCondition } from "./operators.ts";
13
13
  import type { AnyCols, AnyRelationship, AnyTable, ColsMap, ColT, Relationship, RowOf, Schema, TableLike, TableMeta } from "./schema.ts";
14
- import { isRelationship, SCHEMA } from "./schema.ts";
14
+ import { isLocalTable, isRelationship, SCHEMA } from "./schema.ts";
15
15
  import type { ArrayView, SingularArrayView } from "./view.ts";
16
16
 
17
17
  // ----------------------------- the public Query type -----------------------------
@@ -354,6 +354,41 @@ function compile(s: State): Ast {
354
354
  return ast;
355
355
  }
356
356
 
357
+ /** Every base table an AST draws rows from — the root plus every related / `EXISTS` subquery (a
358
+ * conservative deep scan for `table` fields, mirroring the optimistic backend's `collectTables`). */
359
+ function astTables(ast: Ast): Set<string> {
360
+ const out = new Set<string>();
361
+ const walk = (v: unknown): void => {
362
+ if (Array.isArray(v)) {
363
+ for (const x of v) walk(x);
364
+ } else if (v && typeof v === "object") {
365
+ const o = v as Record<string, unknown>;
366
+ if (typeof o.table === "string") out.add(o.table);
367
+ for (const k of Object.keys(o)) walk(o[k]);
368
+ }
369
+ };
370
+ walk(ast);
371
+ return out;
372
+ }
373
+
374
+ /** Throw if `ast` references a local-only table ANYWHERE — the complete form of the {@link queries}
375
+ * root guard (Q1 / E3 client half). The root proxy `get` only sees the table accessed off the
376
+ * builder root; a local table reached through a relationship / `sub` / `countAs` / `exists` CHILD is
377
+ * passed as a value and never touches the proxy, so it is caught here instead: at `.ast()` for a
378
+ * server-scope builder, and again as an SSR backstop in `ServerStore.preload`. A server/named query
379
+ * may never name a local table (`201-LOCAL-ONLY-TABLES-DESIGN.md` §5). */
380
+ export function assertNoLocalTables<S extends ColsMap>(ast: Ast, schema: Schema<S>): void {
381
+ for (const t of astTables(ast)) {
382
+ if (isLocalTable(schema, t)) {
383
+ throw new Error(
384
+ `local-only table "${t}" may not be used in a server/named query — it was reached through a ` +
385
+ `relationship/subquery; build it from store.query (the local builder) instead ` +
386
+ `(201-LOCAL-ONLY-TABLES-DESIGN.md §5 / Q1 / E3).`,
387
+ );
388
+ }
389
+ }
390
+ }
391
+
357
392
  /** Build a child AST for `sub`/`exists`: a fresh child query, the optional `build`, compiled. */
358
393
  function childAst(child: AnyTable, build: ((q: unknown) => unknown) | undefined): Ast {
359
394
  const cm = child[SCHEMA];
@@ -510,8 +545,12 @@ function makeQuery(
510
545
  s: State,
511
546
  onMat?: (query: AnyQuery) => unknown,
512
547
  named?: NamedQueryState,
548
+ // Set on a SERVER-scope root (`newQueryBuilder` / `includeLocal: false`); validates the finalized
549
+ // AST has no local-only table (caught even when reached via a child). Threaded to descendants of
550
+ // the same root so chained `.where`/`.sub`/`.countAs`/stamp keep enforcing it (Q1 / E3).
551
+ guardAst?: (ast: Ast) => void,
513
552
  ): unknown {
514
- const next = (patch: Partial<State>): unknown => makeQuery(meta, { ...s, ...patch }, onMat, named);
553
+ const next = (patch: Partial<State>): unknown => makeQuery(meta, { ...s, ...patch }, onMat, named, guardAst);
515
554
  const applyField = (field: string, arg: unknown) =>
516
555
  next({ wheres: [...s.wheres, fieldCondition(field, arg)] });
517
556
  let proxy: unknown;
@@ -535,7 +574,7 @@ function makeQuery(
535
574
  );
536
575
  }
537
576
  const fragAst = childAst(fragTable as AnyTable, fragment as unknown as (q: unknown) => unknown);
538
- return makeQuery(meta, mergeIncludedFragment(s, fragAst), onMat, named);
577
+ return makeQuery(meta, mergeIncludedFragment(s, fragAst), onMat, named, guardAst);
539
578
  },
540
579
  sub: (alias: string, childOrRel: AnyTable | AnyRelationship, b?: unknown, c?: unknown) => {
541
580
  const { child, corr, build } = resolveCorrelated(childOrRel, b, c);
@@ -560,7 +599,11 @@ function makeQuery(
560
599
  };
561
600
  return next({ related: [...s.related, csq] });
562
601
  },
563
- ast: () => compile(s),
602
+ ast: () => {
603
+ const a = compile(s);
604
+ guardAst?.(a);
605
+ return a;
606
+ },
564
607
  materialize: () => {
565
608
  if (!onMat) throw new Error("materialize() requires a Store — use store.query.<table>");
566
609
  return onMat(proxy as AnyQuery);
@@ -578,7 +621,8 @@ function makeQuery(
578
621
  proxy = new Proxy(base, {
579
622
  get(target, prop) {
580
623
  if (prop === "where") return whereProxy;
581
- if (prop === STAMP_NAMED_QUERY) return (name: string, args: unknown) => makeQuery(meta, s, onMat, { name, args });
624
+ if (prop === STAMP_NAMED_QUERY)
625
+ return (name: string, args: unknown) => makeQuery(meta, s, onMat, { name, args }, guardAst);
582
626
  if (typeof prop === "string" && prop.length > 5 && prop.startsWith("where")) {
583
627
  const field = prop[5].toLowerCase() + prop.slice(6);
584
628
  return (arg: unknown) => applyField(field, arg);
@@ -707,11 +751,21 @@ export function notExistsNoSync(a: AnyTable | AnyRelationship, b?: unknown, c?:
707
751
 
708
752
  export type QueryRoot<S extends ColsMap> = { [N in keyof S]: Query<S[N]> };
709
753
 
754
+ /** Scoping for {@link queries} (`201-LOCAL-ONLY-TABLES-DESIGN.md` §5). */
755
+ export interface QueriesOptions {
756
+ /** Include {@link TableMeta.local local-only} tables in the builder's root scope. The **local**
757
+ * builder (`store.query`) sets this; the **server** builder ({@link newQueryBuilder}) does NOT,
758
+ * so naming a local table in a remote/named query is a build error (Q1 / E3 client half). */
759
+ includeLocal?: boolean;
760
+ }
761
+
710
762
  /** A typed query entry over a schema: `queries(schema).issue.where.closed(false)…`. */
711
763
  export function queries<S extends ColsMap>(
712
764
  schema: Schema<S>,
713
765
  onMaterialize?: (query: AnyQuery) => unknown,
766
+ opts?: QueriesOptions,
714
767
  ): QueryRoot<S> {
768
+ const includeLocal = opts?.includeLocal ?? false;
715
769
  return new Proxy({} as Record<string, unknown>, {
716
770
  get(_t, prop) {
717
771
  if (typeof prop !== "string") return undefined;
@@ -723,12 +777,25 @@ export function queries<S extends ColsMap>(
723
777
  if (prop[0] === "$" || prop === "then" || prop === "toJSON") return undefined;
724
778
  const meta = schema.tables[prop];
725
779
  if (!meta) throw new Error(`unknown table: ${prop}`);
726
- return makeQuery(meta, emptyState(meta.name), onMaterialize);
780
+ // Server scope: a local-only table is absent (Q1 / E3 client half) — a remote/named query
781
+ // may never reference one. The local builder (`store.query`) opts in via `includeLocal`.
782
+ if (meta.local && !includeLocal) {
783
+ throw new Error(
784
+ `local-only table "${prop}" may not be used in a server/named query — build it from ` +
785
+ `store.query (the local builder) and materialize it ad-hoc (201-LOCAL-ONLY-TABLES-DESIGN.md §5 / Q1).`,
786
+ );
787
+ }
788
+ // A SERVER-scope builder (`!includeLocal`) also guards CHILD references: the root proxy never
789
+ // sees a table passed by value to `sub`/`countAs`/`exists`, so the finalized AST is re-checked
790
+ // at `.ast()` (Q1 / E3 client half — the complete form of the root check above).
791
+ const guardAst = includeLocal ? undefined : (ast: Ast) => assertNoLocalTables(ast, schema);
792
+ return makeQuery(meta, emptyState(meta.name), onMaterialize, undefined, guardAst);
727
793
  },
728
794
  }) as QueryRoot<S>;
729
795
  }
730
796
 
731
- /** A schema-bound query-builder factory for portable client/server query definitions. */
797
+ /** A schema-bound query-builder factory for portable client/server query definitions. SERVER
798
+ * scope: local-only tables are excluded (a named/remote query may never reference one). */
732
799
  export function newQueryBuilder<S extends ColsMap>(schema: Schema<S>): QueryRoot<S> {
733
800
  return queries(schema);
734
801
  }