@zeronsh/orbit 0.2.0 → 0.3.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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zeronsh/orbit",
3
- "version": "0.2.0",
3
+ "version": "0.3.1",
4
4
  "description": "Orbit — a Rust rebuild of Zero. Type-safe sync client, React bindings, server helpers, and Drizzle schema generation, all under one tree-shakeable package.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -50,6 +50,7 @@
50
50
  "README.md"
51
51
  ],
52
52
  "dependencies": {
53
+ "@standard-schema/spec": "^1.0.0",
53
54
  "commander": "^14.0.0"
54
55
  },
55
56
  "peerDependencies": {
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../client/src/protocol.ts","../client/src/query.ts","../client/src/schema.ts","../client/src/custom.ts","../client/src/query-manager.ts","../client/src/store.ts","../client/src/eval.ts","../client/src/ivm/data.ts","../client/src/ivm/operators.ts","../client/src/ivm/build.ts","../client/src/ivm/view.ts","../client/src/ivm/source.ts","../client/src/ivm/store-provider.ts","../client/src/client.ts","../client/src/persist.ts"],"names":["table","entry","pkKey","completeOrder","relationshipName","resolve"],"mappings":"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","file":"chunk-EXF5B3CL.js","sourcesContent":["// Wire protocol types + AST, matching the Rust `orbit-protocol` / `oql` JSON\n// (which is byte-compatible with Zero's). Keeping these in sync is what lets the\n// existing Zero TypeScript client talk to an Orbit server unchanged.\n\nexport type Value = string | number | boolean | null;\nexport type Row = Record<string, Value | unknown>;\n\nexport type Direction = 'asc' | 'desc';\nexport type OrderPart = readonly [field: string, dir: Direction];\n\nexport type SimpleOperator =\n | '=' | '!=' | 'IS' | 'IS NOT'\n | '<' | '>' | '<=' | '>='\n | 'LIKE' | 'NOT LIKE' | 'ILIKE' | 'NOT ILIKE'\n | 'IN' | 'NOT IN';\n\nexport type ValuePosition =\n | { type: 'literal'; value: Value | readonly (string | number | boolean)[] }\n | { type: 'column'; name: string };\n\nexport type Condition =\n | { type: 'simple'; op: SimpleOperator; left: ValuePosition; right: ValuePosition }\n | { type: 'and'; conditions: Condition[] }\n | { type: 'or'; conditions: Condition[] }\n | { type: 'correlatedSubquery'; related: CorrelatedSubquery; op: 'EXISTS' | 'NOT EXISTS' };\n\nexport type Correlation = { parentField: string[]; childField: string[] };\nexport type CorrelatedSubquery = {\n correlation: Correlation;\n subquery: AST;\n hidden?: boolean;\n /** A `.one()` relationship — the client unwraps it to a single row (or undefined). */\n singular?: boolean;\n};\n\nexport type AST = {\n table: string;\n alias?: string;\n where?: Condition;\n related?: CorrelatedSubquery[];\n start?: { row: Row; exclusive: boolean };\n limit?: number;\n orderBy?: OrderPart[];\n};\n\n// --- patches & messages -----------------------------------------------------\n\nexport type RowPatchOp =\n | { op: 'put'; tableName: string; value: Row }\n | { op: 'update'; tableName: string; id: Row; merge?: Row; constrain?: string[] }\n | { op: 'del'; tableName: string; id: Row }\n | { op: 'clear' };\n\nexport type QueriesPatchOp =\n | { op: 'put'; hash: string; ttl?: number; ast?: AST; name?: string; args?: unknown[] }\n | { op: 'del'; hash: string }\n | { op: 'clear' };\n\nexport type Downstream =\n | ['connected', { wsid: string; timestamp?: number }]\n | ['pokeStart', { pokeID: string; baseCookie: string | null }]\n | ['pokePart', {\n pokeID: string;\n lastMutationIDChanges?: Record<string, number>;\n gotQueriesPatch?: QueriesPatchOp[];\n rowsPatch?: RowPatchOp[];\n }]\n | ['pokeEnd', { pokeID: string; cookie: string; cancel?: boolean }]\n | ['pong', Record<string, never>]\n | ['error', { kind: string; message: string }];\n\nexport type CrudOp =\n | { op: 'insert'; tableName: string; primaryKey: string[]; value: Row }\n | { op: 'upsert'; tableName: string; primaryKey: string[]; value: Row }\n | { op: 'update'; tableName: string; primaryKey: string[]; value: Row }\n | { op: 'delete'; tableName: string; primaryKey: string[]; value: Row };\n\nexport type Mutation =\n | { type: 'crud'; id: number; clientID: string; name: '_zero_crud'; args: [{ ops: CrudOp[] }]; timestamp: number }\n | { type: 'custom'; id: number; clientID: string; name: string; args: unknown[]; timestamp: number };\n\nexport type Upstream =\n | ['initConnection', { desiredQueriesPatch: QueriesPatchOp[] }]\n | ['changeDesiredQueries', { desiredQueriesPatch: QueriesPatchOp[] }]\n | ['push', {\n clientGroupID: string;\n mutations: Mutation[];\n pushVersion: number;\n timestamp: number;\n requestID: string;\n }]\n | ['ping', Record<string, never>];\n\nexport const PROTOCOL_VERSION = 51;\n\n/** A simple stable string hash; the server treats the result as an opaque key. */\nexport function hashString(s: string): string {\n let h = 0;\n for (let i = 0; i < s.length; i++) {\n h = (Math.imul(31, h) + s.charCodeAt(i)) | 0;\n }\n return (h >>> 0).toString(36);\n}\n\n/** Stable hash of a query AST (matches the server's expectation of a string key). */\nexport function hashAST(ast: AST): string {\n return hashString(JSON.stringify(ast));\n}\n","// A fluent query builder producing an AST, mirroring Zero's `zero-client` query\n// API (`.where()`, `.related()`, `.orderBy()`, `.limit()`, `.start()`, `.one()`).\n\nimport type { AST, Condition, CorrelatedSubquery, Correlation, Direction, SimpleOperator, Value, Row } from './protocol.ts';\nimport type { Connection, Relationship, RowOf, SchemaDef } from './schema.ts';\n\nexport class Query {\n #ast: AST;\n /** `.one()` was called — a related parent should treat this as singular. */\n #singular: boolean;\n\n private constructor(ast: AST, singular = false) {\n this.#ast = ast;\n this.#singular = singular;\n }\n\n static from(table: string): Query {\n return new Query({ table });\n }\n\n where(field: string, op: SimpleOperator, value: Value | readonly (string | number | boolean)[]): Query {\n const cond: Condition = {\n type: 'simple',\n op,\n left: { type: 'column', name: field },\n right: { type: 'literal', value },\n };\n return new Query({ ...this.#ast, where: and(this.#ast.where, cond) }, this.#singular);\n }\n\n whereExists(correlation: Correlation, subquery: Query, negated = false): Query {\n const cond: Condition = {\n type: 'correlatedSubquery',\n related: { correlation, subquery: subquery.ast() },\n op: negated ? 'NOT EXISTS' : 'EXISTS',\n };\n return new Query({ ...this.#ast, where: and(this.#ast.where, cond) }, this.#singular);\n }\n\n related(name: string, correlation: Correlation, subquery: Query): Query {\n const sub = { ...subquery.ast(), alias: name };\n const entry = { correlation, subquery: sub, singular: subquery.#singular || undefined };\n const related = [...(this.#ast.related ?? []), entry];\n return new Query({ ...this.#ast, related }, this.#singular);\n }\n\n /** Append a fully-formed related entry (used for junction/`hidden` chains). */\n addRelated(entry: CorrelatedSubquery): Query {\n const related = [...(this.#ast.related ?? []), entry];\n return new Query({ ...this.#ast, related }, this.#singular);\n }\n\n orderBy(field: string, dir: Direction): Query {\n const orderBy = [...(this.#ast.orderBy ?? []), [field, dir] as const];\n return new Query({ ...this.#ast, orderBy }, this.#singular);\n }\n\n limit(n: number): Query {\n return new Query({ ...this.#ast, limit: n }, this.#singular);\n }\n\n one(): Query {\n return new Query({ ...this.#ast, limit: 1 }, true);\n }\n\n start(row: Row, exclusive = false): Query {\n return new Query({ ...this.#ast, start: { row, exclusive } }, this.#singular);\n }\n\n /** Whether this query was marked `.one()` (singular). */\n isSingular(): boolean {\n return this.#singular;\n }\n\n ast(): AST {\n return this.#ast;\n }\n}\n\nfunction and(existing: Condition | undefined, next: Condition): Condition {\n if (!existing) return next;\n if (existing.type === 'and') return { type: 'and', conditions: [...existing.conditions, next] };\n return { type: 'and', conditions: [existing, next] };\n}\n\n// --- typed query ------------------------------------------------------------\n\n/** A live view's read surface (avoids a circular import on `View`). */\nexport type ViewLike<T> = {\n data: T[];\n subscribe(fn: () => void): () => void;\n /** Release the view + its query subscription (enables TTL/GC). */\n destroy?(): void;\n};\n\n/** Anything `useQuery` can subscribe to (a typed query or a named query). */\nexport interface Subscribable<T> {\n materialize(): ViewLike<T>;\n}\n\n/**\n * A query builder result (a {@link TypedQuery} or {@link SchemaQuery}): subscribable\n * and able to expose its AST. Custom query defs return one of these so the client\n * can derive the AST and so the result row type can be inferred.\n */\nexport interface QueryBuilder<T extends Row> extends Subscribable<T> {\n ast(): AST;\n query(): Query;\n}\n\n/** What a [`TypedQuery`] needs from the client to materialize itself. */\nexport interface QueryHost {\n materialize(q: Query): ViewLike<Row>;\n}\n\n/**\n * A query bound to a row type `T` (from the schema) and to its client, mirroring\n * Zero's `z.query.<table>`. `where`/`orderBy` are checked against `T`'s columns,\n * and the materialized result is typed `T[]`. The `One` type parameter tracks\n * `.one()` so that when this query is used as a `related` child it types as a\n * single row (`R | undefined`) instead of an array (`R[]`).\n */\nexport class TypedQuery<T extends Row, One extends boolean = false> implements Subscribable<T> {\n readonly #host: QueryHost | null;\n readonly #q: Query;\n\n constructor(host: QueryHost | null, q: Query) {\n this.#host = host;\n this.#q = q;\n }\n\n where<K extends keyof T & string>(\n field: K,\n op: SimpleOperator,\n value: T[K] | readonly NonNullable<T[K]>[],\n ): TypedQuery<T, One> {\n return new TypedQuery<T, One>(this.#host, this.#q.where(field, op, value as Value));\n }\n\n whereExists(correlation: Correlation, subquery: TypedQuery<Row, boolean> | Query, negated = false): TypedQuery<T, One> {\n const sub = subquery instanceof TypedQuery ? subquery.query() : subquery;\n return new TypedQuery<T, One>(this.#host, this.#q.whereExists(correlation, sub, negated));\n }\n\n /**\n * Add a nested relationship. The result type gains `name`: a `R[]` array, or\n * `R | undefined` if the child query was `.one()`.\n */\n related<Name extends string, R extends Row, ROne extends boolean>(\n name: Name,\n correlation: Correlation,\n subquery: TypedQuery<R, ROne>,\n ): TypedQuery<T & { [K in Name]: ROne extends true ? R | undefined : R[] }, One> {\n return new TypedQuery(this.#host, this.#q.related(name, correlation, subquery.query()));\n }\n\n orderBy<K extends keyof T & string>(field: K, dir: Direction): TypedQuery<T, One> {\n return new TypedQuery<T, One>(this.#host, this.#q.orderBy(field, dir));\n }\n\n limit(n: number): TypedQuery<T, One> {\n return new TypedQuery<T, One>(this.#host, this.#q.limit(n));\n }\n\n one(): TypedQuery<T, true> {\n return new TypedQuery<T, true>(this.#host, this.#q.one());\n }\n\n start(row: Partial<T>, exclusive = false): TypedQuery<T, One> {\n return new TypedQuery<T, One>(this.#host, this.#q.start(row as Row, exclusive));\n }\n\n /** The underlying untyped query (escape hatch). */\n query(): Query {\n return this.#q;\n }\n\n ast(): AST {\n return this.#q.ast();\n }\n\n /** Materialize into a live, typed view. */\n materialize(): ViewLike<T> {\n if (!this.#host) throw new Error('this query is an unbound builder; subscribe via orbit.query.<name>()');\n return this.#host.materialize(this.#q) as ViewLike<T>;\n }\n}\n\n// --- schema-aware query (relationships by name) -----------------------------\n// `SchemaQuery` knows its schema `S` and source table `N`, so `.related('author')`\n// resolves the correlation (and child row type + cardinality) from the schema's\n// declared relationships — no per-query correlation needed. This mirrors Zero's\n// `z.query.<table>.related('name', q => ...)`. The explicit\n// `.related(name, correlation, subquery)` form is still accepted (back-compat /\n// escape hatch for ad-hoc, schema-less relationships).\n\n/** The last hop of a relationship chain (direct → only; junction → second). */\ntype LastConn<R extends Relationship> = R extends readonly [Connection]\n ? R[0]\n : R extends readonly [Connection, infer Second extends Connection]\n ? Second\n : never;\n\n/** The relationships declared for table `N` of schema `S`. */\ntype RelsOf<S extends SchemaDef, N extends string> = N extends keyof S['relationships']\n ? S['relationships'][N]\n : Record<never, never>;\n\n/** Relationship names available on table `N`. */\ntype RelNames<S extends SchemaDef, N extends string> = keyof RelsOf<S, N> & string;\n\ntype RelChain<S extends SchemaDef, N extends string, Rel extends RelNames<S, N>> =\n RelsOf<S, N>[Rel] extends Relationship ? RelsOf<S, N>[Rel] : never;\n\n/** Destination table name of relationship `Rel` (last hop). */\ntype DestName<S extends SchemaDef, N extends string, Rel extends RelNames<S, N>> =\n LastConn<RelChain<S, N, Rel>>['destSchema'] & string;\n\n/** `'one' | 'many'` of relationship `Rel` (last hop). */\ntype DestCard<S extends SchemaDef, N extends string, Rel extends RelNames<S, N>> =\n LastConn<RelChain<S, N, Rel>>['cardinality'];\n\n/** The row type of a named table in the schema. */\ntype TableRow<S extends SchemaDef, Name extends string> = Name extends keyof S['tables']\n ? RowOf<S['tables'][Name]>\n : Row;\n\n/** Apply cardinality (relationship `many`/`one`, or a `.one()` child) to a row type. */\ntype WithCard<Card extends Cardinality, R extends Row, ChildOne extends boolean> =\n (Card extends 'one' ? true : ChildOne) extends true ? R | undefined : R[];\n\ntype Cardinality = 'one' | 'many';\n\n/** Result shape of `.related(rel)` with no callback (uses the schema row + cardinality). */\ntype RelResult<S extends SchemaDef, N extends string, Rel extends RelNames<S, N>> =\n WithCard<DestCard<S, N, Rel>, TableRow<S, DestName<S, N, Rel>>, false>;\n\nexport class SchemaQuery<\n S extends SchemaDef,\n N extends string,\n T extends Row,\n One extends boolean = false,\n> implements Subscribable<T> {\n readonly #host: QueryHost | null;\n readonly #schema: S;\n readonly #table: N;\n readonly #q: Query;\n\n constructor(host: QueryHost | null, schema: S, table: N, q: Query) {\n this.#host = host;\n this.#schema = schema;\n this.#table = table;\n this.#q = q;\n }\n\n #wrap<T2 extends Row, One2 extends boolean>(q: Query): SchemaQuery<S, N, T2, One2> {\n return new SchemaQuery<S, N, T2, One2>(this.#host, this.#schema, this.#table, q);\n }\n\n where<K extends keyof T & string>(\n field: K,\n op: SimpleOperator,\n value: T[K] | readonly NonNullable<T[K]>[],\n ): SchemaQuery<S, N, T, One> {\n return this.#wrap<T, One>(this.#q.where(field, op, value as Value));\n }\n\n whereExists(correlation: Correlation, subquery: SchemaQuery<S, string, Row, boolean> | Query, negated = false): SchemaQuery<S, N, T, One> {\n const sub = subquery instanceof SchemaQuery ? subquery.query() : subquery;\n return this.#wrap<T, One>(this.#q.whereExists(correlation, sub, negated));\n }\n\n orderBy<K extends keyof T & string>(field: K, dir: Direction): SchemaQuery<S, N, T, One> {\n return this.#wrap<T, One>(this.#q.orderBy(field, dir));\n }\n\n limit(n: number): SchemaQuery<S, N, T, One> {\n return this.#wrap<T, One>(this.#q.limit(n));\n }\n\n one(): SchemaQuery<S, N, T, true> {\n return this.#wrap<T, true>(this.#q.one());\n }\n\n start(row: Partial<T>, exclusive = false): SchemaQuery<S, N, T, One> {\n return this.#wrap<T, One>(this.#q.start(row as Row, exclusive));\n }\n\n /** Add a relationship by name (resolved from the schema), with an optional child query. */\n related<Rel extends RelNames<S, N>>(\n name: Rel,\n ): SchemaQuery<S, N, T & { [K in Rel]: RelResult<S, N, Rel> }, One>;\n related<Rel extends RelNames<S, N>, CT extends Row, COne extends boolean>(\n name: Rel,\n cb: (q: SchemaQuery<S, DestName<S, N, Rel>, TableRow<S, DestName<S, N, Rel>>>) => SchemaQuery<S, string, CT, COne>,\n ): SchemaQuery<S, N, T & { [K in Rel]: WithCard<DestCard<S, N, Rel>, CT, COne> }, One>;\n /** Add a relationship with an explicit correlation (schema-less escape hatch). */\n related<Name extends string, R extends Row, ROne extends boolean>(\n name: Name,\n correlation: Correlation,\n subquery: SchemaQuery<S, string, R, ROne> | TypedQuery<R, ROne> | Query,\n ): SchemaQuery<S, N, T & { [K in Name]: ROne extends true ? R | undefined : R[] }, One>;\n related(name: string, second?: unknown, third?: unknown): SchemaQuery<S, N, Row, One> {\n // Explicit form: (name, correlation, subquery).\n if (third !== undefined || (isCorrelation(second))) {\n const correlation = second as Correlation;\n const sub = third as SchemaQuery<S, string, Row, boolean> | TypedQuery<Row, boolean> | Query;\n const subq: Query = sub instanceof Query ? sub : (sub as { query(): Query }).query();\n return this.#wrap<Row, One>(this.#q.related(name, correlation, subq));\n }\n\n // By-name form: (name, cb?). Resolve the chain from the schema.\n const chain = this.#schema.relationships?.[this.#table]?.[name] as Relationship | undefined;\n if (!chain) {\n throw new Error(`Unknown relationship \"${name}\" on table \"${this.#table}\". Declare it with relationships() in the schema.`);\n }\n const cb = second as ((q: SchemaQuery<S, string, Row>) => SchemaQuery<S, string, Row, boolean>) | undefined;\n const last = chain[chain.length - 1] as Connection;\n\n // Build the destination (final-hop) subquery, applying the callback if given.\n let dest = new SchemaQuery<S, string, Row>(null, this.#schema, last.destSchema, Query.from(last.destSchema));\n if (cb) dest = cb(dest) as SchemaQuery<S, string, Row>;\n let destAst: AST = { ...dest.ast(), alias: name };\n const destSingular = last.cardinality === 'one' || dest.isSingular();\n\n if (chain.length === 1) {\n const entry: CorrelatedSubquery = {\n correlation: { parentField: [...last.sourceField], childField: [...last.destField] },\n subquery: destAst,\n singular: destSingular || undefined,\n };\n return this.#wrap<Row, One>(this.#q.addRelated(entry));\n }\n\n // Junction (two hops): a `hidden` related layer over the junction table whose\n // own nested related is the destination — the presentation layer flattens it\n // (matches Zero's `hidden: true` junction compilation).\n const [first, second2] = chain as readonly [Connection, Connection];\n const junctionAst: AST = {\n table: first.destSchema,\n alias: name,\n related: [\n {\n correlation: { parentField: [...second2.sourceField], childField: [...second2.destField] },\n subquery: destAst,\n singular: destSingular || undefined,\n },\n ],\n };\n const entry: CorrelatedSubquery = {\n correlation: { parentField: [...first.sourceField], childField: [...first.destField] },\n hidden: true,\n subquery: junctionAst,\n };\n return this.#wrap<Row, One>(this.#q.addRelated(entry));\n }\n\n isSingular(): boolean {\n return this.#q.isSingular();\n }\n\n /** The underlying untyped query (escape hatch). */\n query(): Query {\n return this.#q;\n }\n\n ast(): AST {\n return this.#q.ast();\n }\n\n materialize(): ViewLike<T> {\n if (!this.#host) throw new Error('this query is an unbound builder; subscribe via orbit.query.<name>()');\n return this.#host.materialize(this.#q) as ViewLike<T>;\n }\n}\n\nfunction isCorrelation(v: unknown): v is Correlation {\n return typeof v === 'object' && v !== null && 'parentField' in v && 'childField' in v;\n}\n\n/** Every table of a schema as a {@link SchemaQuery}, optionally bound to a host. */\nexport type SchemaQueries<S extends SchemaDef> = {\n [K in keyof S['tables'] & string]: SchemaQuery<S, K, RowOf<S['tables'][K]>>;\n};\n\n/**\n * Standalone, schema-aware query builders (mirrors Zero's `createBuilder`). Use\n * inside query definitions: `builder.issue.where('id', '=', args.id).related('author')`.\n * Relationships declared in the schema are available by name and fully typed. The\n * returned queries are unbound (used to produce ASTs, not subscribed directly).\n */\nexport function createBuilder<S extends SchemaDef>(schema: S): SchemaQueries<S> {\n return buildSchemaQueries(schema, null);\n}\n\n/** Build the per-table {@link SchemaQuery} map, optionally bound to a host. */\nexport function buildSchemaQueries<S extends SchemaDef>(schema: S, host: QueryHost | null): SchemaQueries<S> {\n const out = {} as Record<string, SchemaQuery<S, string, Row>>;\n for (const name of Object.keys(schema.tables)) {\n out[name] = new SchemaQuery<S, string, Row>(host, schema, name, Query.from(name));\n }\n return out as SchemaQueries<S>;\n}\n","// Type-safe schema builder, mirroring Zero's `createSchema` / `table().columns()\n// .primaryKey()`. Defines tables + columns once and drives end-to-end TypeScript\n// types: typed queries, typed query results, and typed mutators.\n\nexport type ValueType = 'string' | 'number' | 'boolean' | 'json' | 'null';\n\n/** A column definition. The TS type it produces is carried in the `_type` phantom. */\nexport type Column<T = unknown> = {\n readonly type: ValueType;\n readonly optional: boolean;\n /** Phantom — never present at runtime; carries the column's TS type. */\n readonly _type?: T;\n};\n\n// The optional type parameter lets generated schemas carry a column's *custom*\n// TypeScript type (e.g. `string<\\`${string}@${string}\\`>()`, `string<'a' | 'b'>()`\n// for enums, `number<1 | 2>()`), so a Drizzle `$type<>()` survives into orbit.\nexport const string = <T extends string = string>(): Column<T> => ({ type: 'string', optional: false });\nexport const number = <T extends number = number>(): Column<T> => ({ type: 'number', optional: false });\nexport const boolean = <T extends boolean = boolean>(): Column<T> => ({ type: 'boolean', optional: false });\nexport const json = <T = unknown>(): Column<T> => ({ type: 'json', optional: false });\n\n/** Mark a column nullable (its TS type gains `| null`). */\nexport const optional = <T>(c: Column<T>): Column<T | null> => ({ ...c, optional: true });\n\nexport type Columns = Record<string, Column>;\n\nexport type TableDef<\n Name extends string = string,\n C extends Columns = Columns,\n PK extends keyof C & string = keyof C & string,\n> = {\n readonly name: Name;\n readonly columns: C;\n readonly primaryKey: readonly PK[];\n};\n\n/** `table('todo').columns({ ... }).primaryKey('id')` */\nexport function table<Name extends string>(name: Name) {\n return {\n columns<C extends Columns>(columns: C) {\n return {\n primaryKey<PK extends keyof C & string>(...primaryKey: PK[]): TableDef<Name, C, PK> {\n return { name, columns, primaryKey };\n },\n };\n },\n };\n}\n\n// --- relationships ----------------------------------------------------------\n// Schema-level relationships, mirroring Zero's `relationships(table, ({one, many})\n// => ...)`. A relationship is a chain of one or two `Connection`s: a single\n// connection is a direct (FK) relationship; two connections describe a\n// many-to-many through a junction table. Defining relationships once lets queries\n// reference them by name — `q.related('author')` — fully typed and with the\n// correlation resolved from the schema (no per-query correlation needed).\n\nexport type Cardinality = 'one' | 'many';\n\n/** One hop of a relationship: which fields correlate and to which table. */\nexport type Connection = {\n readonly sourceField: readonly string[];\n readonly destField: readonly string[];\n /** Destination table *name*. */\n readonly destSchema: string;\n readonly cardinality: Cardinality;\n};\n\n/** A relationship = a 1- (direct) or 2- (junction) element connection chain. */\nexport type Relationship = readonly [Connection] | readonly [Connection, Connection];\n\n/** The relationships declared for one source table. */\nexport type RelationshipsDef<\n Name extends string = string,\n R extends Record<string, Relationship> = Record<string, Relationship>,\n> = {\n readonly name: Name;\n readonly relationships: R;\n};\n\n/** A single hop's arguments, where `destSchema` is the destination *table def*. */\ntype ConnectArg<Dest extends TableDef = TableDef> = {\n readonly sourceField: readonly string[];\n readonly destField: readonly string[];\n readonly destSchema: Dest;\n};\n\ntype Connector<Card extends Cardinality> = {\n // direct\n <Dest extends TableDef>(arg: ConnectArg<Dest>): readonly [Connection & { destSchema: Dest['name']; cardinality: Card }];\n // junction (two hops)\n <Junction extends TableDef, Dest extends TableDef>(\n first: ConnectArg<Junction>,\n second: ConnectArg<Dest>,\n ): readonly [\n Connection & { destSchema: Junction['name']; cardinality: Card },\n Connection & { destSchema: Dest['name']; cardinality: Card },\n ];\n};\n\nconst makeConnector =\n (cardinality: Cardinality) =>\n (...args: ConnectArg[]): Connection[] =>\n args.map((a) => ({\n sourceField: a.sourceField,\n destField: a.destField,\n destSchema: a.destSchema.name,\n cardinality,\n }));\n\n/**\n * Declare the relationships for `table` (mirrors Zero's `relationships`). Pass a\n * callback that builds named relationships with `one(...)` / `many(...)`:\n *\n * ```ts\n * relationships(issue, ({ one, many }) => ({\n * author: one({ sourceField: ['authorId'], destField: ['id'], destSchema: user }),\n * comments: many({ sourceField: ['id'], destField: ['issueId'], destSchema: comment }),\n * labels: many(\n * { sourceField: ['id'], destField: ['issueId'], destSchema: issueLabel },\n * { sourceField: ['labelId'], destField: ['id'], destSchema: label },\n * ),\n * }));\n * ```\n */\nexport function relationships<Name extends string, R extends Record<string, Relationship>>(\n table: TableDef<Name>,\n cb: (connectors: { one: Connector<'one'>; many: Connector<'many'> }) => R,\n): RelationshipsDef<Name, R> {\n const r = cb({\n one: makeConnector('one') as unknown as Connector<'one'>,\n many: makeConnector('many') as unknown as Connector<'many'>,\n });\n return { name: table.name, relationships: r };\n}\n\n/** Relationships keyed by source-table name (the shape stored on a schema). */\nexport type RelationshipsMap = Record<string, Record<string, Relationship>>;\n\nexport type SchemaDef<\n T extends Record<string, TableDef> = Record<string, TableDef>,\n R extends RelationshipsMap = RelationshipsMap,\n> = {\n readonly tables: T;\n readonly relationships: R;\n};\n\n/** Combine table + relationship defs into a schema keyed by table name. */\nexport function createSchema<\n const T extends readonly TableDef[],\n const R extends readonly RelationshipsDef[] = [],\n>(def: {\n tables: T;\n relationships?: R;\n}): SchemaDef<\n { [K in T[number] as K['name']]: K },\n { [K in R[number] as K['name']]: K['relationships'] }\n> {\n const tables = {} as Record<string, TableDef>;\n for (const t of def.tables) tables[t.name] = t;\n const rels = {} as RelationshipsMap;\n for (const r of def.relationships ?? []) rels[r.name] = r.relationships as Record<string, Relationship>;\n return { tables, relationships: rels } as SchemaDef<\n { [K in T[number] as K['name']]: K },\n { [K in R[number] as K['name']]: K['relationships'] }\n >;\n}\n\n// --- type inference ---------------------------------------------------------\n\n/** The row type of a table def (column name -> TS value type). */\nexport type RowOf<T extends TableDef> = {\n [K in keyof T['columns']]: T['columns'][K] extends Column<infer V> ? V : never;\n};\n\n/** The primary-key column names of a table def. */\nexport type PkOf<T extends TableDef> = T['primaryKey'][number];\n\n/** A permissive schema, used when no schema is supplied (everything is loose). */\nexport type AnySchema = SchemaDef<Record<string, TableDef>>;\n","// Custom mutators + custom queries, matching Zero's authoring API:\n//\n// const mutators = {\n// createTodo: defineMutator(({tx, args}: {tx: Transaction<typeof schema>; args: {text: string}}) =>\n// tx.mutate.todo.insert({ id: crypto.randomUUID(), text: args.text, completed: false, created: Date.now() })),\n// };\n// const builder = createBuilder(schema);\n// const queries = {\n// allTodos: defineQuery(() => builder.todo.orderBy('created', 'asc')),\n// todoById: defineQuery(({args}: {args: {id: string}}) => builder.todo.where('id', '=', args.id).one()),\n// };\n// const orbit = new Orbit({ server, schema, mutators, queries });\n// orbit.mutate.createTodo({ text }); // fully typed\n// useQuery(orbit.query.allTodos()); // fully typed result\n//\n// A mutator's `tx.mutate.*` calls are recorded into CRUD ops and sent to the\n// server (which persists them to Postgres — the source of truth). A query def\n// produces a typed AST the client subscribes to. Both are checked end-to-end\n// against the schema.\n\nimport type { CrudOp, Row } from './protocol.ts';\nimport type { PkOf, RowOf, SchemaDef } from './schema.ts';\nimport type { QueryBuilder, Subscribable } from './query.ts';\n\n/** Typed CRUD surface for one table inside a mutator transaction. */\nexport type TableCRUD<T extends Row, PK extends keyof T> = {\n insert(value: T): void;\n upsert(value: T): void;\n update(value: Pick<T, PK> & Partial<T>): void;\n delete(value: Pick<T, PK>): void;\n};\n\n/** `tx.mutate.<table>` for every table in the schema. */\nexport type SchemaCRUD<S extends SchemaDef> = {\n [K in keyof S['tables']]: TableCRUD<RowOf<S['tables'][K]>, PkOf<S['tables'][K]>>;\n};\n\n/** The transaction passed to a mutator (mirrors Zero's `Transaction`). */\nexport type Transaction<S extends SchemaDef> = {\n readonly location: 'client';\n readonly mutate: SchemaCRUD<S>;\n};\n\n// --- mutators ---------------------------------------------------------------\n\n/**\n * A mutator's body. Receives a transaction, the client-supplied `args`, and\n * server-supplied `ctx` (the authenticated context — see the push endpoint). A\n * def that doesn't need `ctx` can simply omit it from its destructure.\n */\nexport type MutatorFn<S extends SchemaDef, Args, Ctx = unknown> = (c: {\n tx: Transaction<S>;\n args: Args;\n ctx: Ctx;\n}) => void | Promise<void>;\n\n/**\n * A mutator definition. Modeled as the function itself; its args type is inferred\n * from the signature. (`any` in the `tx`/args positions keeps specific defs\n * assignable to the `MutatorDefs` record.)\n */\n// oxlint-disable-next-line no-explicit-any\nexport type MutatorDef<Args = any> = (c: { tx: Transaction<any>; args: Args; ctx: any }) => void | Promise<void>;\n\n/** Define a custom mutator (mirrors Zero's `defineMutator`). */\nexport function defineMutator<S extends SchemaDef, Args, Ctx = unknown>(\n fn: MutatorFn<S, Args, Ctx>,\n): MutatorDef<Args> {\n return fn as MutatorDef<Args>;\n}\n\nexport type MutatorDefs = Record<string, MutatorDef>;\nexport type ArgsOf<M> = M extends (c: { tx: never; args: infer A; ctx: never }) => unknown ? A : never;\n\n/** `orbit.mutate` derived from mutator defs — `tx` stripped, args kept. */\nexport type MutateAPI<MD extends MutatorDefs> = {\n [K in keyof MD]: ArgsOf<MD[K]> extends void | undefined\n ? () => void\n : (args: ArgsOf<MD[K]>) => void;\n};\n\n// --- queries ----------------------------------------------------------------\n\nexport type QueryFn<Args, Ctx, T extends Row> = (c: { args: Args; ctx: Ctx }) => QueryBuilder<T>;\n\n/** A custom query definition (its args + result row types are inferred). */\n// oxlint-disable-next-line no-explicit-any\nexport type QueryDef<Args = any, T extends Row = Row> = (c: { args: Args; ctx: any }) => QueryBuilder<T>;\n\n/** Define a custom (named) query (mirrors Zero's `defineQuery`). */\nexport function defineQuery<T extends Row>(fn: () => QueryBuilder<T>): QueryDef<void, T>;\nexport function defineQuery<Args, Ctx, T extends Row>(fn: QueryFn<Args, Ctx, T>): QueryDef<Args, T>;\n// oxlint-disable-next-line no-explicit-any\nexport function defineQuery(fn: any): any {\n return fn;\n}\n\nexport type QueryDefs = Record<string, QueryDef>;\nexport type QArgsOf<Q> = Q extends (c: { args: infer A; ctx: never }) => unknown ? A : never;\nexport type QRowOf<Q> = Q extends (c: never) => Subscribable<infer T> ? T : never;\n\n/** `orbit.queries` derived from query defs — call with args, get a `Subscribable`. */\nexport type QueriesAPI<QD extends QueryDefs> = {\n [K in keyof QD]: QArgsOf<QD[K]> extends void | undefined\n ? () => Subscribable<QRowOf<QD[K]>>\n : (args: QArgsOf<QD[K]>) => Subscribable<QRowOf<QD[K]>>;\n};\n\n// --- server-side: run a mutator def into CRUD ops -------------------------\n\n/**\n * Run a mutator definition against a recording transaction and return the CRUD\n * ops it produced. Use this on **your push endpoint** (the server forwarded the\n * mutation to) to execute a mutator with context, then apply the ops to your DB.\n */\nexport function collectOps<S extends SchemaDef>(\n schema: S,\n def: MutatorDef,\n args: unknown,\n ctx?: unknown,\n): CrudOp[] {\n const pk: Record<string, string[]> = {};\n for (const t of Object.values(schema.tables)) pk[t.name] = [...t.primaryKey];\n\n const ops: CrudOp[] = [];\n const mutate = new Proxy(\n {},\n {\n get: (_t, table: string) => {\n const make = (op: CrudOp['op']) => (value: Row) =>\n ops.push({ op, tableName: table, primaryKey: pk[table] ?? ['id'], value } as CrudOp);\n return { insert: make('insert'), upsert: make('upsert'), update: make('update'), delete: make('delete') };\n },\n },\n );\n const tx = { location: 'client', mutate } as unknown as Transaction<S>;\n void def({ tx: tx as never, args, ctx });\n return ops;\n}\n","// Query lifetime management: dedup, TTL, and garbage collection — mirrors Zero's\n// `query-manager.ts` + `zql/src/query/ttl.ts`, simplified. Multiple subscribers\n// to the same query share one upstream subscription (refcount); when the last\n// view is destroyed the query is kept for its TTL, then unsubscribed (a `del` in\n// `changeDesiredQueries`). Without this, queries would leak forever.\n\nimport type { QueriesPatchOp } from './protocol.ts';\n\n/** The `put` variant of a desired-query patch op (always has a `hash`). */\nexport type QueryPut = Extract<QueriesPatchOp, { op: 'put' }>;\n\nexport type TTL = number | `${number}${'s' | 'm' | 'h' | 'd'}` | 'forever' | 'none';\n\nconst UNIT_MS = { s: 1_000, m: 60_000, h: 3_600_000, d: 86_400_000 } as const;\nconst MAX_TTL_MS = 600_000; // 10 minutes — matches Zero's clamp\nexport const DEFAULT_TTL: TTL = '5m';\n\n/** Parse a TTL into milliseconds. `'forever'` → Infinity, `'none'`/0 → 0. */\nexport function parseTTL(ttl: TTL): number {\n if (ttl === 'forever') return Infinity;\n if (ttl === 'none') return 0;\n if (typeof ttl === 'number') return Math.max(0, ttl);\n const m = /^(\\d+(?:\\.\\d+)?)(s|m|h|d)$/.exec(ttl);\n return m ? Number(m[1]) * UNIT_MS[m[2] as keyof typeof UNIT_MS] : parseTTL(DEFAULT_TTL);\n}\n\nfunction clampTTL(ms: number): number {\n return ms === Infinity ? Infinity : Math.min(ms, MAX_TTL_MS);\n}\n\nexport type Scheduler = {\n setTimeout: (fn: () => void, ms: number) => unknown;\n clearTimeout: (handle: unknown) => void;\n};\n\nconst defaultScheduler: Scheduler = {\n setTimeout: (fn, ms) => setTimeout(fn, ms),\n clearTimeout: (h) => clearTimeout(h as ReturnType<typeof setTimeout>),\n};\n\ntype Entry = { put: QueryPut; count: number; ttlMs: number; timer?: unknown };\n\nexport class QueryManager {\n #entries = new Map<string, Entry>();\n #onSubscribe: (put: QueryPut) => void;\n #onUnsubscribe: (hash: string) => void;\n #sched: Scheduler;\n\n constructor(opts: {\n onSubscribe: (put: QueryPut) => void;\n onUnsubscribe: (hash: string) => void;\n scheduler?: Scheduler;\n }) {\n this.#onSubscribe = opts.onSubscribe;\n this.#onUnsubscribe = opts.onUnsubscribe;\n this.#sched = opts.scheduler ?? defaultScheduler;\n }\n\n /**\n * Register interest in a query. Returns a release function (idempotent). The\n * first registration subscribes upstream; identical queries dedupe to one.\n */\n add(hash: string, put: QueryPut, ttl: TTL = DEFAULT_TTL): () => void {\n const ttlMs = clampTTL(parseTTL(ttl));\n let entry = this.#entries.get(hash);\n if (entry) {\n entry.count++;\n entry.ttlMs = Math.max(entry.ttlMs, ttlMs);\n this.#cancelGc(entry);\n } else {\n const stamped: QueryPut = Number.isFinite(ttlMs) ? { ...put, ttl: ttlMs } : put;\n entry = { put: stamped, count: 1, ttlMs };\n this.#entries.set(hash, entry);\n this.#onSubscribe(stamped);\n }\n let released = false;\n return () => {\n if (released) return;\n released = true;\n this.#release(hash);\n };\n }\n\n #release(hash: string): void {\n const entry = this.#entries.get(hash);\n if (!entry || --entry.count > 0) return;\n if (entry.ttlMs === Infinity) return; // forever — stay subscribed\n if (entry.ttlMs <= 0) {\n this.#gc(hash);\n return;\n }\n entry.timer = this.#sched.setTimeout(() => this.#gc(hash), entry.ttlMs);\n }\n\n #cancelGc(entry: Entry): void {\n if (entry.timer !== undefined) {\n this.#sched.clearTimeout(entry.timer);\n entry.timer = undefined;\n }\n }\n\n #gc(hash: string): void {\n const entry = this.#entries.get(hash);\n if (!entry || entry.count > 0) return;\n this.#entries.delete(hash);\n this.#onUnsubscribe(hash);\n }\n\n /** All currently-subscribed query `put` ops (for reconnect resume). */\n active(): QueryPut[] {\n return [...this.#entries.values()].map((e) => e.put);\n }\n\n /** Number of live (subscribed, incl. within-TTL) queries — for tests/introspection. */\n size(): number {\n return this.#entries.size;\n }\n}\n","// Client-side row store: server-synced rows plus an **optimistic overlay** of\n// pending (unconfirmed) mutations. `effectiveRows(table)` returns synced rows\n// with pending CRUD ops applied on top, so queries reflect local mutations\n// instantly; once the server confirms a mutation (its lastMutationID), its\n// overlay entry is dropped and the now-synced rows take over (rebase).\n//\n// Optionally persists to a `KV` (IndexedDB) — synced rows under `e/…`, pending\n// mutations under `p/…` — so data is available offline and survives reloads.\n\nimport type { CrudOp, Mutation, RowPatchOp, Row } from './protocol.ts';\nimport type { KV } from './persist.ts';\n\n/** A changed effective-row key, delivered to listeners so views update incrementally. */\nexport type ChangedKey = { table: string; key: string };\ntype Listener = (changed: ReadonlyArray<ChangedKey>) => void;\n\n/** A queued optimistic mutation: the client mutation id, its CRUD ops, and the\n * originating mutation message (kept so it can be re-sent after a reload). */\ntype Pending = { id: number; ops: CrudOp[]; mutation?: Mutation };\n\nexport class Store {\n /** table -> (pk-json -> row), server-synced. */\n #tables = new Map<string, Map<string, Row>>();\n /** Optimistic, not-yet-confirmed mutations, in order. */\n #pending: Pending[] = [];\n #listeners = new Set<Listener>();\n #pkByTable: Record<string, string[]>;\n\n // persistence\n #kv?: KV;\n #dirtyRows = new Set<string>(); // \"table\u0000pkKey\"\n #dirtyPending = new Set<number>();\n #cleared = false;\n #flushTimer: ReturnType<typeof setTimeout> | undefined;\n /** Effective-row keys touched since the last notify (delivered to listeners). */\n #changed: ChangedKey[] = [];\n\n constructor(pkByTable: Record<string, string[]> = {}) {\n this.#pkByTable = pkByTable;\n }\n\n #pkCols(table: string): string[] {\n return this.#pkByTable[table] ?? ['id'];\n }\n\n /** Primary-key columns for a table (for complete ordering in the evaluator). */\n pkOf(table: string): string[] {\n return this.#pkCols(table);\n }\n\n /** Primary-key tuple in *declared* order — matches the IVM engine's `pkKey`. */\n #key(table: string, row: Row): string {\n return JSON.stringify(this.#pkCols(table).map((c) => (row as Record<string, unknown>)[c] ?? null));\n }\n\n /** Public pk-key for a row (used by the IVM-backed view to match changes). */\n keyOf(table: string, row: Row): string {\n return this.#key(table, row);\n }\n\n /** The effective (synced + optimistic overlay) row for a pk key, or undefined. */\n effectiveRow(table: string, key: string): Row | undefined {\n let row = this.#table(table).get(key);\n for (const p of this.#pending) {\n for (const op of p.ops) {\n if (op.tableName !== table || this.#key(table, op.value) !== key) continue;\n if (op.op === 'delete') row = undefined;\n else if (op.op === 'update') row = { ...(row ?? {}), ...op.value };\n else row = op.value;\n }\n }\n return row;\n }\n\n #table(name: string): Map<string, Row> {\n let t = this.#tables.get(name);\n if (!t) {\n t = new Map();\n this.#tables.set(name, t);\n }\n return t;\n }\n\n // --- server-synced state (from pokes) ------------------------------------\n\n apply(op: RowPatchOp): void {\n switch (op.op) {\n case 'put': {\n const key = this.#key(op.tableName, op.value);\n this.#table(op.tableName).set(key, op.value);\n this.#touch(op.tableName, key);\n break;\n }\n case 'update': {\n const t = this.#table(op.tableName);\n const key = this.#key(op.tableName, op.id);\n const existing = t.get(key) ?? { ...op.id };\n t.set(key, { ...existing, ...(op.merge ?? {}) });\n this.#touch(op.tableName, key);\n break;\n }\n case 'del': {\n const key = this.#key(op.tableName, op.id);\n this.#table(op.tableName).delete(key);\n this.#touch(op.tableName, key);\n break;\n }\n case 'clear':\n this.#tables.clear();\n this.#cleared = true;\n this.#dirtyRows.clear();\n break;\n }\n }\n\n applyAll(ops: RowPatchOp[]): void {\n for (const op of ops) this.apply(op);\n this.#scheduleFlush();\n this.#notify();\n }\n\n // --- optimistic overlay --------------------------------------------------\n\n /** Queue an optimistic mutation's CRUD ops (applied on top of synced rows). */\n addPending(id: number, ops: CrudOp[], mutation?: Mutation): void {\n this.#pending.push({ id, ops, mutation });\n this.#dirtyPending.add(id);\n for (const op of ops) this.#touch(op.tableName, this.#key(op.tableName, op.value));\n this.#scheduleFlush();\n this.#notify();\n }\n\n /** Drop pending mutations the server has confirmed (id <= confirmed). */\n confirmThrough(id: number): void {\n const before = this.#pending.length;\n const dropped = this.#pending.filter((p) => p.id <= id);\n if (dropped.length === 0) return;\n this.#pending = this.#pending.filter((p) => p.id > id);\n for (const p of dropped) {\n this.#dirtyPending.add(p.id);\n for (const op of p.ops) this.#touch(op.tableName, this.#key(op.tableName, op.value));\n }\n if (this.#pending.length !== before) {\n this.#scheduleFlush();\n this.#notify();\n }\n }\n\n /** Originating messages of still-pending mutations (for resend after reload). */\n pendingMutations(): Mutation[] {\n return this.#pending.map((p) => p.mutation).filter((m): m is Mutation => m !== undefined);\n }\n\n /** All rows for `table` with the optimistic overlay applied. */\n effectiveRows(table: string): Row[] {\n const merged = new Map(this.#table(table));\n for (const p of this.#pending) {\n for (const op of p.ops) {\n if (op.tableName !== table) continue;\n const key = this.#key(table, op.value);\n if (op.op === 'delete') merged.delete(key);\n else if (op.op === 'update') merged.set(key, { ...(merged.get(key) ?? {}), ...op.value });\n else merged.set(key, op.value); // insert / upsert\n }\n }\n return [...merged.values()];\n }\n\n subscribe(fn: Listener): () => void {\n this.#listeners.add(fn);\n return () => this.#listeners.delete(fn);\n }\n\n #notify(): void {\n const changed = this.#changed;\n this.#changed = [];\n for (const fn of this.#listeners) fn(changed);\n }\n\n // --- persistence ---------------------------------------------------------\n\n #touch(table: string, pkKey: string): void {\n this.#changed.push({ table, key: pkKey });\n this.#dirtyRows.add(`${table}\u0000${pkKey}`);\n }\n\n #scheduleFlush(): void {\n if (!this.#kv || this.#flushTimer !== undefined) return;\n this.#flushTimer = setTimeout(() => void this.flush(), 50);\n }\n\n /** Load persisted rows + pending mutations from `kv` into memory. */\n async hydrate(kv: KV): Promise<void> {\n this.#kv = kv;\n const loaded: ChangedKey[] = [];\n for (const [, val] of await kv.entries('e/')) {\n const { t, k, v } = val as { t: string; k: string; v: Row };\n this.#table(t).set(k, v);\n loaded.push({ table: t, key: k });\n }\n const pend = (await kv.entries('p/'))\n .map(([, v]) => v as Pending)\n .sort((a, b) => a.id - b.id);\n for (const p of pend) {\n this.#pending.push(p);\n for (const op of p.ops) loaded.push({ table: op.tableName, key: this.#key(op.tableName, op.value) });\n }\n // Deliver the hydrated keys as changes so views created BEFORE hydrate\n // finished (e.g. `useQuery` on first render, racing the async hydrate) pick\n // up the loaded rows. Views created after hydrate seed from `effectiveRows`.\n this.#changed.push(...loaded);\n this.#notify();\n }\n\n /** Flush dirty rows + pending mutations to the KV (called debounced). */\n async flush(): Promise<void> {\n if (this.#flushTimer !== undefined) {\n clearTimeout(this.#flushTimer);\n this.#flushTimer = undefined;\n }\n const kv = this.#kv;\n if (!kv) return;\n if (this.#cleared) {\n // Wipe the whole persisted snapshot BEFORE writing the new rows, so a row that\n // survives a resync isn't clobbered by a racing delete — and, conversely, a row\n // the server dropped can't linger in IndexedDB as a phantom across reloads.\n const dels: Promise<void>[] = [];\n for (const [k] of await kv.entries('e/')) dels.push(kv.del(k));\n await Promise.all(dels);\n this.#cleared = false;\n }\n const ps: Promise<void>[] = [];\n for (const dk of this.#dirtyRows) {\n const sep = dk.indexOf('\u0000');\n const table = dk.slice(0, sep);\n const pkKey = dk.slice(sep + 1);\n const row = this.#tables.get(table)?.get(pkKey);\n const key = `e/${table}/${pkKey}`;\n ps.push(row ? kv.set(key, { t: table, k: pkKey, v: row }) : kv.del(key));\n }\n this.#dirtyRows.clear();\n for (const id of this.#dirtyPending) {\n const p = this.#pending.find((x) => x.id === id);\n ps.push(p ? kv.set(`p/${id}`, p) : kv.del(`p/${id}`));\n }\n this.#dirtyPending.clear();\n await Promise.all(ps);\n }\n}\n","// Client-side query evaluator — the local IVM that gives Zero-like reads:\n// `where`/`orderBy`/`limit`/`start`/`related` (nested results) + `EXISTS`,\n// evaluated over the local row store (synced rows + optimistic overlay). Run on\n// every store change (non-incremental, but correct; client datasets are small).\n//\n// Mirrors the value semantics of the Rust engine (`compareValues` /\n// `valuesEqual`), so client results match what the server materializes.\n\nimport type { AST, Condition, CorrelatedSubquery, Correlation, OrderPart, Row, SimpleOperator, Value, ValuePosition } from './protocol.ts';\n\n/** A nested query result row: columns plus any `related` arrays under their alias. */\nexport type ResultRow = Record<string, unknown>;\n\nfunction isNull(v: unknown): v is null | undefined {\n return v === null || v === undefined;\n}\n\nfunction typeRank(v: Value): number {\n if (isNull(v)) return 0;\n switch (typeof v) {\n case 'boolean':\n return 1;\n case 'number':\n return 2;\n case 'string':\n return 3;\n default:\n return 4;\n }\n}\n\n/** Total order with `null == null` (sorting semantics; mirrors `compare_values`). */\nexport function compareValues(a: Value, b: Value): number {\n if (isNull(a) && isNull(b)) return 0;\n if (isNull(a)) return -1;\n if (isNull(b)) return 1;\n if (typeof a === typeof b) {\n if (typeof a === 'number') return a < (b as number) ? -1 : a > (b as number) ? 1 : 0;\n if (typeof a === 'boolean') return a === b ? 0 : a ? 1 : -1;\n if (typeof a === 'string') return a < (b as string) ? -1 : a > (b as string) ? 1 : 0;\n return 0;\n }\n return typeRank(a) - typeRank(b);\n}\n\n/** Equality with `null != null` (join / `=` semantics; mirrors `values_equal`). */\nexport function valuesEqual(a: Value, b: Value): boolean {\n if (isNull(a) || isNull(b)) return false;\n return a === b;\n}\n\nfunction likeToRegExp(pattern: string, ci: boolean): RegExp {\n let re = '';\n for (const ch of pattern) {\n if (ch === '%') re += '.*';\n else if (ch === '_') re += '.';\n else re += ch.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n }\n return new RegExp(`^${re}$`, ci ? 'is' : 's');\n}\n\nfunction resolve(row: Row, pos: ValuePosition): Value | readonly Value[] | undefined {\n if (pos.type === 'column') return row[pos.name] as Value;\n return pos.value as Value | readonly Value[]; // 'literal'\n}\n\nfunction evalSimple(row: Row, op: SimpleOperator, left: ValuePosition, right: ValuePosition): boolean {\n const l = resolve(row, left);\n const r = resolve(row, right);\n if (l === undefined || r === undefined) return true; // unsupported position → don't filter\n\n if (op === 'IS') return isNull(l as Value) === isNull(r as Value) && (isNull(l as Value) || l === r);\n if (op === 'IS NOT') return !(isNull(l as Value) === isNull(r as Value) && (isNull(l as Value) || l === r));\n\n if (op === 'IN' || op === 'NOT IN') {\n // SQL three-valued logic: `NULL IN (…)` and `NULL NOT IN (…)` are both unknown,\n // so the row is excluded either way (matches Zero / Postgres).\n if (isNull(l as Value)) return false;\n const arr = (Array.isArray(r) ? r : [r]) as Value[];\n const found = arr.some((x) => valuesEqual(l as Value, x));\n return op === 'IN' ? found : !found;\n }\n\n const a = l as Value;\n const b = r as Value;\n switch (op) {\n case '=':\n return valuesEqual(a, b);\n case '!=':\n return !isNull(a) && !isNull(b) && a !== b;\n case '<':\n return !isNull(a) && !isNull(b) && compareValues(a, b) < 0;\n case '>':\n return !isNull(a) && !isNull(b) && compareValues(a, b) > 0;\n case '<=':\n return !isNull(a) && !isNull(b) && compareValues(a, b) <= 0;\n case '>=':\n return !isNull(a) && !isNull(b) && compareValues(a, b) >= 0;\n case 'LIKE':\n return !isNull(a) && likeToRegExp(String(b), false).test(String(a));\n case 'NOT LIKE':\n return !isNull(a) && !likeToRegExp(String(b), false).test(String(a));\n case 'ILIKE':\n return !isNull(a) && likeToRegExp(String(b), true).test(String(a));\n case 'NOT ILIKE':\n return !isNull(a) && !likeToRegExp(String(b), true).test(String(a));\n default:\n return true;\n }\n}\n\n/** Evaluate a single `simple` condition against a row (reused by the IVM engine). */\nexport function simpleMatches(\n row: Row,\n cond: { op: SimpleOperator; left: ValuePosition; right: ValuePosition },\n): boolean {\n return evalSimple(row, cond.op, cond.left, cond.right);\n}\n\nfunction compareByOrder(a: Row, b: Row, orderBy: readonly OrderPart[]): number {\n for (const [field, dir] of orderBy) {\n const c = compareValues(a[field] as Value, b[field] as Value);\n if (c !== 0) return dir === 'asc' ? c : -c;\n }\n return 0;\n}\n\n/**\n * Append any primary-key columns missing from `orderBy` (ascending), so the\n * order is total — mirrors the Rust engine's `complete_ordering` / Zero's\n * `completeOrdering`. With no `orderBy` this yields pure primary-key order,\n * matching how the server materializes (source rows are pk-ordered).\n */\nfunction completeOrder(orderBy: readonly OrderPart[] | undefined, pk: readonly string[]): OrderPart[] {\n const order: OrderPart[] = [...(orderBy ?? [])];\n for (const k of pk) if (!order.some(([f]) => f === k)) order.push([k, 'asc']);\n return order;\n}\n\nfunction correlated(parent: Row, child: Row, c: Correlation): boolean {\n return c.parentField.every((pf, i) => valuesEqual(parent[pf] as Value, child[c.childField[i]] as Value));\n}\n\n/**\n * Visible relationships contributed by `EXISTS`/`NOT EXISTS` conditions: a\n * correlated subquery with an explicit alias is materialized into the output\n * (the matched children for EXISTS, `[]` for NOT EXISTS) in addition to acting\n * as a filter — exactly like Zero. Auto-generated `zsubq_*` ones stay hidden.\n */\nexport function existsRelationships(cond: Condition | undefined): CorrelatedSubquery[] {\n const out: CorrelatedSubquery[] = [];\n const walk = (c: Condition | undefined): void => {\n if (!c) return;\n if (c.type === 'correlatedSubquery') {\n const alias = c.related.subquery.alias;\n if (alias && !alias.startsWith('zsubq_')) out.push(c.related);\n } else if (c.type === 'and' || c.type === 'or') {\n for (const inner of c.conditions) walk(inner);\n }\n };\n walk(cond);\n return out;\n}\n\n/**\n * Lift the destination rows out of a junction (`hidden`) relationship layer.\n * `junctionRows` are the rows of the junction table (already carrying their\n * nested destination rows under the inner alias); we concatenate those nested\n * rows and drop the junction layer entirely — mirroring Zero's junction view.\n */\nfunction liftHidden(junctionRows: ResultRow[], junctionAst: AST): ResultRow[] {\n const inner = junctionAst.related?.[0];\n if (!inner) return [];\n const innerAlias = inner.subquery.alias ?? inner.subquery.table;\n return junctionRows.flatMap((jr) => (jr[innerAlias] as ResultRow[]) ?? []);\n}\n\n/**\n * Evaluate `ast` against `getRows` (a function returning all current rows of a\n * table). Returns nested result rows. Set `applyWhere: false` for server-resolved\n * (named) queries whose `where` was already applied server-side.\n */\nexport function evaluate(\n getRows: (table: string) => Row[],\n ast: AST,\n opts: { applyWhere?: boolean; pkOf?: (table: string) => readonly string[] } = {},\n): ResultRow[] {\n const applyWhere = opts.applyWhere ?? true;\n const pkOf = opts.pkOf ?? (() => ['id']);\n\n const run = (node: AST, parent: Row | null, corr: Correlation | null): ResultRow[] => {\n let rows = getRows(node.table);\n if (parent && corr) rows = rows.filter((r) => correlated(parent, r, corr));\n\n const evalCond = (r: Row, cond: Condition): boolean => {\n switch (cond.type) {\n case 'simple':\n return evalSimple(r, cond.op, cond.left, cond.right);\n case 'and':\n return cond.conditions.every((c) => evalCond(r, c));\n case 'or':\n return cond.conditions.some((c) => evalCond(r, c));\n case 'correlatedSubquery': {\n const has = run(cond.related.subquery, r, cond.related.correlation).length > 0;\n return cond.op === 'EXISTS' ? has : !has;\n }\n }\n };\n\n if (applyWhere && node.where) rows = rows.filter((r) => evalCond(r, node.where!));\n rows = [...rows];\n const order = completeOrder(node.orderBy, pkOf(node.table));\n rows.sort((a, b) => compareByOrder(a, b, order));\n\n if (node.start) {\n const { row: cursor, exclusive } = node.start;\n const i = rows.findIndex((r) => {\n const c = compareByOrder(r, cursor, order);\n return exclusive ? c > 0 : c >= 0;\n });\n rows = i < 0 ? [] : rows.slice(i);\n }\n if (node.limit != null) rows = rows.slice(0, node.limit);\n\n const related = node.related ?? [];\n const existsRels = existsRelationships(node.where);\n if (related.length === 0 && existsRels.length === 0) return rows as ResultRow[];\n return rows.map((r) => {\n const out: ResultRow = { ...r };\n for (const rel of [...related, ...existsRels]) {\n const alias = rel.subquery.alias ?? rel.subquery.table;\n const children = run(rel.subquery, r, rel.correlation);\n // A `hidden` relationship is a junction (many-to-many) layer: drop the\n // junction rows and lift the nested destination rows up under this alias.\n out[alias] = rel.hidden ? liftHidden(children, rel.subquery) : children;\n }\n return out;\n });\n };\n\n return run(ast, null, null);\n}\n\n/**\n * Unwrap `.one()` relationships in a result tree to a single row (or `undefined`),\n * recursively. The raw materialized shape keeps relationships as arrays (matching\n * the server/IVM snapshot); this is the client-facing presentation transform.\n */\nexport function unwrapSingular(rows: ResultRow[], ast: AST): ResultRow[] {\n const related = ast.related;\n if (!related || related.length === 0) return rows;\n return rows.map((r) => {\n const out: ResultRow = { ...r };\n for (const rel of related) {\n const alias = rel.subquery.alias ?? rel.subquery.table;\n if (rel.hidden) {\n // `out[alias]` was already flattened to destination rows by `liftHidden`;\n // unwrap/recurse using the inner (destination) subquery + its cardinality.\n const inner = rel.subquery.related![0];\n const dest = unwrapSingular((out[alias] as ResultRow[]) ?? [], inner.subquery);\n out[alias] = inner.singular ? dest[0] : dest;\n } else {\n const children = unwrapSingular((out[alias] as ResultRow[]) ?? [], rel.subquery);\n out[alias] = rel.singular ? children[0] : children;\n }\n }\n return out;\n });\n}\n","// Core types for the incremental view-maintenance (IVM) operator graph — a\n// TypeScript port of the Rust `oql` engine (crates/oql/src/ivm). Operators form\n// a pipeline: a Source emits Changes on each mutation, which propagate downstream\n// (filter/join/take), and a terminal view applies them to a materialized result.\n// Mirrors Zero's `zql/src/ivm`.\n\nimport type { OrderPart, Row, Value } from '../protocol.ts';\nimport { compareValues, valuesEqual } from '../eval.ts';\n\n/** A row flowing through the pipeline plus its (eagerly materialized) children. */\nexport type Node = { row: Row; relationships: Record<string, Node[]> };\n\n/** An incremental change propagated downstream through `push`. */\nexport type Change =\n | { type: 'add'; node: Node }\n | { type: 'remove'; node: Node }\n | { type: 'edit'; node: Node; oldNode: Node }\n | { type: 'child'; node: Node; relationshipName: string; change: Change };\n\n/** A change applied to a Source (bare rows — sources are leaves). */\nexport type SourceChange =\n | { type: 'add'; row: Row }\n | { type: 'remove'; row: Row }\n | { type: 'edit'; row: Row; oldRow: Row };\n\nexport function changeNode(c: Change): Node {\n return c.node;\n}\n\n/** Parameters for a fetch (pull). */\nexport type FetchRequest = {\n constraint?: Record<string, Value>;\n start?: { row: Row; basis: 'at' | 'after' };\n reverse?: boolean;\n};\n\n/** An operator: both the fetch (pull) and push sides, plus a downstream link. */\nexport interface Op {\n fetch(req: FetchRequest): Node[];\n push(change: Change): Change[];\n output: Op | null;\n setOutput(o: Op): void;\n}\n\n/**\n * Propagate `change` into `op`, then deliver each emitted change to `op`'s\n * output — after `op.push` returns, mirroring the Rust `deliver` driver (so\n * operators may `fetch` from their inputs mid-push).\n */\nexport function deliver(op: Op, change: Change): void {\n const results = op.push(change);\n const out = op.output;\n if (out) for (const r of results) deliver(out, r);\n}\n\nexport type Comparator = (a: Row, b: Row) => number;\n\nexport function makeComparator(order: readonly OrderPart[], reverse = false): Comparator {\n return (a, b) => {\n for (const [field, dir] of order) {\n const c = compareValues(a[field] as Value, b[field] as Value);\n if (c !== 0) {\n const r = dir === 'asc' ? c : -c;\n return reverse ? -r : r;\n }\n }\n return 0;\n };\n}\n\n/** Append missing primary-key columns (ascending) — Zero's `completeOrdering`. */\nexport function completeOrder(orderBy: readonly OrderPart[] | undefined, pk: readonly string[]): OrderPart[] {\n const order: OrderPart[] = [...(orderBy ?? [])];\n for (const k of pk) if (!order.some(([f]) => f === k)) order.push([k, 'asc']);\n return order;\n}\n\nexport function pkKey(pk: readonly string[], row: Row): string {\n return JSON.stringify(pk.map((k) => (row as Record<string, unknown>)[k] ?? null));\n}\n\n/** Does `row` satisfy every column-equality in `constraint` (join semantics)? */\nexport function constraintMatches(constraint: Record<string, Value>, row: Row): boolean {\n for (const k of Object.keys(constraint)) {\n if (!valuesEqual((row as Record<string, Value>)[k] ?? null, constraint[k])) return false;\n }\n return true;\n}\n\n/** `to[i] = from[fromKeys[i]]`, or null if any key value is null (no join). */\nexport function buildJoinConstraint(\n from: Row,\n fromKeys: readonly string[],\n toKeys: readonly string[],\n): Record<string, Value> | null {\n const c: Record<string, Value> = {};\n for (let i = 0; i < fromKeys.length; i++) {\n const v = (from as Record<string, Value>)[fromKeys[i]] ?? null;\n if (v === null) return null;\n c[toKeys[i]] = v;\n }\n return c;\n}\n\n/** Shallow value equality of two rows (for change diffing). */\nexport function rowEq(a: Row, b: Row): boolean {\n const ak = Object.keys(a);\n const bk = Object.keys(b);\n if (ak.length !== bk.length) return false;\n for (const k of ak) if ((a as Record<string, unknown>)[k] !== (b as Record<string, unknown>)[k]) return false;\n return true;\n}\n\n/** Deep equality of two nodes (row + relationships) for Take's diffing. */\nexport function nodeEq(a: Node, b: Node): boolean {\n if (!rowEq(a.row, b.row)) return false;\n const ak = Object.keys(a.relationships);\n const bk = Object.keys(b.relationships);\n if (ak.length !== bk.length) return false;\n for (const k of ak) {\n const ca = a.relationships[k];\n const cb = b.relationships[k];\n if (!cb || ca.length !== cb.length) return false;\n for (let i = 0; i < ca.length; i++) if (!nodeEq(ca[i], cb[i])) return false;\n }\n return true;\n}\n","// IVM operators — ports of the Rust operators (crates/oql/src/ivm). Filter and\n// Skip are stateless change transforms; CondFilter (WHERE incl. EXISTS) and Take\n// (LIMIT) recompute their passing set/window on push and diff against the prior\n// state; Join attaches a child relationship and propagates parent/child changes.\n\nimport {\n buildJoinConstraint,\n nodeEq,\n pkKey,\n type Change,\n type Comparator,\n type FetchRequest,\n type Node,\n type Op,\n} from './data.ts';\nimport type { Row } from '../protocol.ts';\n\n// --- Filter (stateless row predicate) --------------------------------------\n\nexport type RowPredicate = (row: Row) => boolean;\n\nexport class Filter implements Op {\n output: Op | null = null;\n #input: Op;\n #predicate: RowPredicate;\n\n constructor(input: Op, predicate: RowPredicate) {\n this.#input = input;\n this.#predicate = predicate;\n input.setOutput(this);\n }\n fetch(req: FetchRequest): Node[] {\n return this.#input.fetch(req).filter((n) => this.#predicate(n.row));\n }\n push(change: Change): Change[] {\n return filterPush(change, this.#predicate);\n }\n setOutput(o: Op): void {\n this.output = o;\n }\n}\n\nfunction filterPush(change: Change, predicate: RowPredicate): Change[] {\n switch (change.type) {\n case 'add':\n case 'remove':\n case 'child':\n return predicate(change.node.row) ? [change] : [];\n case 'edit': {\n const o = predicate(change.oldNode.row);\n const n = predicate(change.node.row);\n if (o && n) return [change];\n if (o && !n) return [{ type: 'remove', node: change.oldNode }];\n if (!o && n) return [{ type: 'add', node: change.node }];\n return [];\n }\n }\n}\n\n/** Skip (`start` cursor): keep rows at/after `bound` in the input's sort order. */\nexport function skip(input: Op, bound: Row, exclusive: boolean, cmp: Comparator): Filter {\n return new Filter(input, (row) => {\n const o = cmp(row, bound);\n return exclusive ? o > 0 : o >= 0;\n });\n}\n\n// --- CondFilter (WHERE, incl. EXISTS via hidden relationships) --------------\n\nexport type NodePredicate = (node: Node) => boolean;\n\nexport class CondFilter implements Op {\n output: Op | null = null;\n #input: Op;\n #predicate: NodePredicate;\n #pk: string[];\n #passing: Set<string> | null = null;\n\n constructor(input: Op, predicate: NodePredicate, pk: string[]) {\n this.#input = input;\n this.#predicate = predicate;\n this.#pk = pk;\n input.setOutput(this);\n }\n\n /** Lazily build the set of currently-passing primary keys from the input. */\n #ensure(): Set<string> {\n if (!this.#passing) {\n this.#passing = new Set<string>();\n for (const n of this.#input.fetch({})) if (this.#predicate(n)) this.#passing.add(pkKey(this.#pk, n.row));\n }\n return this.#passing;\n }\n\n fetch(req: FetchRequest): Node[] {\n const nodes = this.#input.fetch(req).filter((n) => this.#predicate(n));\n this.#ensure();\n return nodes;\n }\n\n /**\n * Incremental: only the changed node's membership can flip, so process just\n * this change instead of recomputing the whole passing set.\n */\n push(change: Change): Change[] {\n const passing = this.#ensure();\n const key = pkKey(this.#pk, change.node.row);\n switch (change.type) {\n case 'add':\n if (this.#predicate(change.node)) {\n passing.add(key);\n return [change];\n }\n return [];\n case 'remove':\n if (passing.has(key)) {\n passing.delete(key);\n return [change];\n }\n return [];\n case 'edit': {\n const was = passing.has(key);\n const now = this.#predicate(change.node);\n if (was && now) return [change];\n if (was && !now) {\n passing.delete(key);\n return [{ type: 'remove', node: change.oldNode }];\n }\n if (!was && now) {\n passing.add(key);\n return [{ type: 'add', node: change.node }];\n }\n return [];\n }\n case 'child': {\n // The row is unchanged; a (hidden EXISTS) relationship changed, which can\n // flip membership.\n const was = passing.has(key);\n const now = this.#predicate(change.node);\n if (was && now) return [change]; // still passing — propagate the child change\n if (was && !now) {\n passing.delete(key);\n return [{ type: 'remove', node: change.node }];\n }\n if (!was && now) {\n passing.add(key);\n return [{ type: 'add', node: change.node }];\n }\n return [];\n }\n }\n }\n setOutput(o: Op): void {\n this.output = o;\n }\n}\n\n// --- Take (LIMIT, optionally partitioned per parent) -----------------------\n\nexport class Take implements Op {\n output: Op | null = null;\n #input: Op;\n #limit: number;\n #pk: string[];\n #partitionKey: string[] | null;\n #cmp: Comparator;\n /** All rows per partition, kept in sort order (incrementally maintained). */\n #partitions: Map<string, Node[]> | null = null;\n /** The last-emitted top-`limit` window per partition (for diffing). */\n #windows = new Map<string, Node[]>();\n\n constructor(input: Op, limit: number, pk: string[], partitionKey: string[] | null, cmp: Comparator) {\n this.#input = input;\n this.#limit = limit;\n this.#pk = pk;\n this.#partitionKey = partitionKey;\n this.#cmp = cmp;\n input.setOutput(this);\n }\n\n #partition(row: Row): string {\n return this.#partitionKey\n ? JSON.stringify(this.#partitionKey.map((k) => (row as Record<string, unknown>)[k] ?? null))\n : '';\n }\n\n #ensure(): Map<string, Node[]> {\n if (!this.#partitions) {\n this.#partitions = new Map();\n // input.fetch is already in sort order, so per-partition order is preserved.\n for (const n of this.#input.fetch({})) {\n const p = this.#partition(n.row);\n const arr = this.#partitions.get(p) ?? [];\n arr.push(n);\n this.#partitions.set(p, arr);\n }\n for (const [p, arr] of this.#partitions) this.#windows.set(p, arr.slice(0, this.#limit));\n }\n return this.#partitions;\n }\n\n fetch(req: FetchRequest): Node[] {\n this.#ensure();\n if (req.constraint || !this.#partitionKey) {\n return this.#input.fetch(req).slice(0, this.#limit);\n }\n const out: Node[] = [];\n for (const arr of this.#partitions!.values()) out.push(...arr.slice(0, this.#limit));\n return out;\n }\n\n /** Incremental: touch only the affected partition(s) and diff their windows. */\n push(change: Change): Change[] {\n this.#ensure();\n const out: Change[] = [];\n switch (change.type) {\n case 'add':\n this.#updatePartition(this.#partition(change.node.row), (arr) => insertSorted(arr, change.node, this.#cmp), out);\n break;\n case 'remove':\n this.#updatePartition(this.#partition(change.node.row), (arr) => removeByPk(arr, change.node.row, this.#pk), out);\n break;\n case 'child':\n this.#updatePartition(this.#partition(change.node.row), (arr) => replaceByPk(arr, change.node, this.#pk), out);\n break;\n case 'edit': {\n const po = this.#partition(change.oldNode.row);\n const pn = this.#partition(change.node.row);\n if (po === pn) {\n this.#updatePartition(po, (arr) => {\n removeByPk(arr, change.oldNode.row, this.#pk);\n insertSorted(arr, change.node, this.#cmp);\n }, out);\n } else {\n this.#updatePartition(po, (arr) => removeByPk(arr, change.oldNode.row, this.#pk), out);\n this.#updatePartition(pn, (arr) => insertSorted(arr, change.node, this.#cmp), out);\n }\n break;\n }\n }\n return out;\n }\n\n #updatePartition(p: string, mutate: (arr: Node[]) => void, out: Change[]): void {\n const arr = this.#partitions!.get(p) ?? [];\n mutate(arr);\n this.#partitions!.set(p, arr);\n const newWin = arr.slice(0, this.#limit);\n const oldWin = this.#windows.get(p) ?? [];\n diffWindow(oldWin, newWin, this.#pk, out);\n this.#windows.set(p, newWin);\n }\n setOutput(o: Op): void {\n this.output = o;\n }\n}\n\n/** Insert `node` into a sorted array at the position given by `cmp` (total order). */\nfunction insertSorted(arr: Node[], node: Node, cmp: Comparator): void {\n let lo = 0;\n let hi = arr.length;\n while (lo < hi) {\n const mid = (lo + hi) >> 1;\n if (cmp(arr[mid].row, node.row) < 0) lo = mid + 1;\n else hi = mid;\n }\n arr.splice(lo, 0, node);\n}\n\nfunction removeByPk(arr: Node[], row: Row, pk: string[]): void {\n const k = pkKey(pk, row);\n const i = arr.findIndex((n) => pkKey(pk, n.row) === k);\n if (i >= 0) arr.splice(i, 1);\n}\n\nfunction replaceByPk(arr: Node[], node: Node, pk: string[]): void {\n const k = pkKey(pk, node.row);\n const i = arr.findIndex((n) => pkKey(pk, n.row) === k);\n if (i >= 0) arr[i] = node;\n}\n\n/** Diff two windows (pk + full-node equality) into add/remove changes. */\nfunction diffWindow(oldWin: Node[], newWin: Node[], pk: string[], out: Change[]): void {\n const oldMap = new Map(oldWin.map((n) => [pkKey(pk, n.row), n]));\n const newMap = new Map(newWin.map((n) => [pkKey(pk, n.row), n]));\n for (const [k, o] of oldMap) {\n const n = newMap.get(k);\n if (!n || !nodeEq(o, n)) out.push({ type: 'remove', node: o });\n }\n for (const [k, n] of newMap) {\n const o = oldMap.get(k);\n if (!o || !nodeEq(o, n)) out.push({ type: 'add', node: n });\n }\n}\n\n// --- Join (hierarchical, non-flattening) -----------------------------------\n\nexport class Join implements Op {\n output: Op | null = null;\n #parent: Op;\n #child: Op;\n #parentKey: string[];\n #childKey: string[];\n #rel: string;\n\n constructor(parent: Op, child: Op, parentKey: string[], childKey: string[], relationshipName: string) {\n this.#parent = parent;\n this.#child = child;\n this.#parentKey = parentKey;\n this.#childKey = childKey;\n this.#rel = relationshipName;\n parent.setOutput(new JoinParentPort(this));\n child.setOutput(new JoinChildPort(this));\n }\n\n #process(parent: Node): Node {\n const constraint = buildJoinConstraint(parent.row, this.#parentKey, this.#childKey);\n const children = constraint ? this.#child.fetch({ constraint }) : [];\n return { row: parent.row, relationships: { ...parent.relationships, [this.#rel]: children } };\n }\n\n fetch(req: FetchRequest): Node[] {\n return this.#parent.fetch(req).map((n) => this.#process(n));\n }\n push(): Change[] {\n throw new Error('Join is pushed via its parent/child ports');\n }\n setOutput(o: Op): void {\n this.output = o;\n }\n\n pushParent(change: Change): Change[] {\n switch (change.type) {\n case 'add':\n return [{ type: 'add', node: this.#process(change.node) }];\n case 'remove':\n return [{ type: 'remove', node: this.#process(change.node) }];\n case 'child':\n return [{\n type: 'child',\n node: this.#process(change.node),\n relationshipName: change.relationshipName,\n change: change.change,\n }];\n case 'edit':\n // If the edit moves the parent to a different join key its child set\n // changes — split into remove (old) + add (new). Otherwise edit in place.\n if (sameKey(change.oldNode.row, change.node.row, this.#parentKey)) {\n return [{ type: 'edit', node: this.#process(change.node), oldNode: this.#process(change.oldNode) }];\n }\n return [\n { type: 'remove', node: this.#process(change.oldNode) },\n { type: 'add', node: this.#process(change.node) },\n ];\n }\n }\n\n pushChild(change: Change): Change[] {\n // For a key-changing edit, re-materialize BOTH old parents (lose the child)\n // and new parents (gain it); the two key values are disjoint.\n const childRows: Row[] = [change.node.row];\n if (change.type === 'edit' && !sameKey(change.oldNode.row, change.node.row, this.#childKey)) {\n childRows[0] = change.node.row;\n childRows.push(change.oldNode.row);\n }\n const out: Change[] = [];\n for (const childRow of childRows) {\n const constraint = buildJoinConstraint(childRow, this.#childKey, this.#parentKey);\n if (!constraint) continue;\n for (const p of this.#parent.fetch({ constraint })) {\n out.push({ type: 'child', node: this.#process(p), relationshipName: this.#rel, change });\n }\n }\n return out;\n }\n}\n\n/** Two rows share the same compound key (used to detect join-key-changing edits). */\nfunction sameKey(a: Row, b: Row, keys: string[]): boolean {\n return keys.every((k) => (a as Record<string, unknown>)[k] === (b as Record<string, unknown>)[k]);\n}\n\nclass JoinParentPort implements Op {\n #join: Join;\n constructor(join: Join) {\n this.#join = join;\n }\n get output(): Op | null {\n return this.#join.output;\n }\n set output(_o: Op | null) {\n /* a join port's output follows the join's output */\n }\n fetch(): Node[] {\n throw new Error('join port has no fetch');\n }\n push(c: Change): Change[] {\n return this.#join.pushParent(c);\n }\n setOutput(): void {\n /* no-op */\n }\n}\n\nclass JoinChildPort implements Op {\n #join: Join;\n constructor(join: Join) {\n this.#join = join;\n }\n get output(): Op | null {\n return this.#join.output;\n }\n set output(_o: Op | null) {\n /* follows the join's output */\n }\n fetch(): Node[] {\n throw new Error('join port has no fetch');\n }\n push(c: Change): Change[] {\n return this.#join.pushChild(c);\n }\n setOutput(): void {\n /* no-op */\n }\n}\n","// Pipeline builder: turn an AST into a live IVM operator graph. Port of the Rust\n// `build_pipeline` (crates/oql/src/builder.rs). Shape:\n// source → (start cursor) → (filter | hidden-joins + cond-filter for WHERE)\n// → (joins for each related) → (take for limit)\n// The predicate semantics reuse `eval.ts` (simpleMatches) so the IVM and the\n// re-evaluation engine agree exactly.\n\nimport type { AST, Condition, CorrelatedSubquery, OrderPart } from '../protocol.ts';\nimport { simpleMatches } from '../eval.ts';\nimport { completeOrder, makeComparator, type Node, type Op } from './data.ts';\nimport { CondFilter, Filter, Join, skip, Take, type NodePredicate, type RowPredicate } from './operators.ts';\n\nconst SUBQ = 'zsubq_';\n\n/** Supplies a source connection + primary key for each table in an AST. */\nexport interface SourceProvider {\n pkOf(table: string): string[];\n connect(table: string, order: OrderPart[]): Op;\n}\n\nexport function buildPipeline(\n ast: AST,\n provider: SourceProvider,\n partitionKey: string[] | null = null,\n): Op {\n const pk = provider.pkOf(ast.table);\n const order = completeOrder(ast.orderBy, pk);\n let current = provider.connect(ast.table, order);\n\n if (ast.start) current = skip(current, ast.start.row, ast.start.exclusive, makeComparator(order));\n\n if (ast.where) {\n if (conditionHasExists(ast.where)) {\n const joins: { relName: string; related: CorrelatedSubquery }[] = [];\n const counter = { n: 0 };\n const resolved = resolveCondition(ast.where, joins, counter);\n for (const { relName, related } of joins) {\n const child = buildPipeline(related.subquery, provider);\n current = new Join(\n current,\n child,\n related.correlation.parentField,\n related.correlation.childField,\n relName,\n );\n }\n current = new CondFilter(current, nodePredicate(resolved), pk);\n } else {\n current = new Filter(current, rowPredicate(ast.where));\n }\n }\n\n for (const sub of ast.related ?? []) {\n const child = buildPipeline(sub.subquery, provider, sub.correlation.childField);\n current = new Join(\n current,\n child,\n sub.correlation.parentField,\n sub.correlation.childField,\n relationshipName(sub),\n );\n }\n\n if (ast.limit != null) current = new Take(current, ast.limit, pk, partitionKey, makeComparator(order));\n\n return current;\n}\n\n/** Output relationship name for a related subquery (alias minus `zsubq_`). */\nfunction relationshipName(sub: CorrelatedSubquery): string {\n const a = sub.subquery.alias;\n if (a) return a.startsWith(SUBQ) ? a.slice(SUBQ.length) : a;\n return sub.subquery.table;\n}\n\n// --- WHERE compilation ------------------------------------------------------\n\ntype Resolved =\n | { kind: 'simple'; cond: Extract<Condition, { type: 'simple' }> }\n | { kind: 'and' | 'or'; items: Resolved[] }\n | { kind: 'exists'; relName: string; negated: boolean };\n\n/** Replace each EXISTS with a reference to the hidden relationship that backs it. */\nfunction resolveCondition(\n cond: Condition,\n joins: { relName: string; related: CorrelatedSubquery }[],\n counter: { n: number },\n): Resolved {\n switch (cond.type) {\n case 'simple':\n return { kind: 'simple', cond };\n case 'and':\n return { kind: 'and', items: cond.conditions.map((c) => resolveCondition(c, joins, counter)) };\n case 'or':\n return { kind: 'or', items: cond.conditions.map((c) => resolveCondition(c, joins, counter)) };\n case 'correlatedSubquery': {\n const relName = cond.related.subquery.alias ?? `${SUBQ}exists_${counter.n++}`;\n joins.push({ relName, related: cond.related });\n return { kind: 'exists', relName, negated: cond.op === 'NOT EXISTS' };\n }\n }\n}\n\nfunction nodePredicate(resolved: Resolved): NodePredicate {\n const evalResolved = (r: Resolved, node: Node): boolean => {\n switch (r.kind) {\n case 'simple':\n return simpleMatches(node.row, r.cond);\n case 'and':\n return r.items.every((x) => evalResolved(x, node));\n case 'or':\n return r.items.some((x) => evalResolved(x, node));\n case 'exists': {\n const present = (node.relationships[r.relName]?.length ?? 0) > 0;\n return present !== r.negated;\n }\n }\n };\n return (node) => evalResolved(resolved, node);\n}\n\nfunction rowPredicate(cond: Condition): RowPredicate {\n const evalRow = (c: Condition, row: Record<string, unknown>): boolean => {\n switch (c.type) {\n case 'simple':\n return simpleMatches(row, c);\n case 'and':\n return c.conditions.every((x) => evalRow(x, row));\n case 'or':\n return c.conditions.some((x) => evalRow(x, row));\n case 'correlatedSubquery':\n throw new Error('EXISTS must be handled by CondFilter');\n }\n };\n return (row) => evalRow(cond, row);\n}\n\nfunction conditionHasExists(cond: Condition): boolean {\n switch (cond.type) {\n case 'correlatedSubquery':\n return true;\n case 'and':\n case 'or':\n return cond.conditions.some(conditionHasExists);\n case 'simple':\n return false;\n }\n}\n","// Terminal of an IVM pipeline: maintains the materialized result (`nodes`)\n// incrementally as changes arrive, applying add/remove/edit/child to a sorted\n// array. Because each Change carries the node's full (re-materialized)\n// relationships, a `child` change just replaces the parent subtree in place.\n\nimport {\n makeComparator,\n pkKey,\n type Change,\n type Comparator,\n type Node,\n type Op,\n} from './data.ts';\nimport type { OrderPart, Row } from '../protocol.ts';\n\nexport class MaterializedView {\n /** The current top-level result, in sort order. */\n nodes: Node[];\n #cmp: Comparator;\n #pk: string[];\n\n constructor(top: Op, order: OrderPart[], pk: string[]) {\n this.#cmp = makeComparator(order);\n this.#pk = pk;\n this.nodes = top.fetch({});\n const terminal: Op = {\n output: null,\n fetch: () => [],\n setOutput: () => {},\n push: (c: Change) => {\n this.#apply(c);\n return [];\n },\n };\n top.setOutput(terminal);\n }\n\n #apply(change: Change): void {\n switch (change.type) {\n case 'add':\n this.#insert(change.node);\n break;\n case 'remove':\n this.#removeByPk(change.node.row);\n break;\n case 'edit':\n this.#removeByPk(change.oldNode.row);\n this.#insert(change.node);\n break;\n case 'child': {\n const i = this.#indexByPk(change.node.row);\n if (i >= 0) this.nodes[i] = change.node; // row unchanged → position unchanged\n break;\n }\n }\n }\n\n #insert(node: Node): void {\n let lo = 0;\n let hi = this.nodes.length;\n while (lo < hi) {\n const mid = (lo + hi) >> 1;\n if (this.#cmp(this.nodes[mid].row, node.row) < 0) lo = mid + 1;\n else hi = mid;\n }\n this.nodes.splice(lo, 0, node);\n }\n\n #indexByPk(row: Row): number {\n const k = pkKey(this.#pk, row);\n return this.nodes.findIndex((n) => pkKey(this.#pk, n.row) === k);\n }\n\n #removeByPk(row: Row): void {\n const i = this.#indexByPk(row);\n if (i >= 0) this.nodes.splice(i, 1);\n }\n\n /** The result as Zero's `{row, rels}` snapshot shape (hidden `zsubq_*` excluded). */\n snapshot(): { row: Row; rels: Record<string, unknown> }[] {\n return this.nodes.map(normNode);\n }\n}\n\nfunction normNode(node: Node): { row: Row; rels: Record<string, unknown> } {\n const rels: Record<string, unknown> = {};\n for (const k of Object.keys(node.relationships).sort()) {\n if (k.startsWith('zsubq_')) continue;\n rels[k] = node.relationships[k].map(normNode);\n }\n return { row: node.row, rels };\n}\n","// MemorySource: the in-memory root data source of a pipeline. Port of the Rust\n// `MemorySource` (crates/oql/src/ivm/source.rs), simplified to **commit-first**:\n// a push commits the change to storage, then delivers it to each connection's\n// output. Downstream fetches therefore observe the post-change state directly —\n// equivalent to Zero's overlay mechanism for the cross-table case, without the\n// epoch bookkeeping. A source may have multiple connections (one per consumer,\n// each with its own sort order).\n\nimport {\n constraintMatches,\n deliver,\n makeComparator,\n pkKey,\n type Change,\n type Comparator,\n type FetchRequest,\n type Node,\n type Op,\n type SourceChange,\n} from './data.ts';\nimport type { OrderPart, Row } from '../protocol.ts';\n\ntype Connection = { output: Op | null; order: OrderPart[]; cmp: Comparator };\n\nexport class MemorySource {\n readonly table: string;\n readonly pk: string[];\n #rows = new Map<string, Row>();\n #connections: Connection[] = [];\n\n constructor(table: string, pk: string[]) {\n this.table = table;\n this.pk = pk;\n }\n\n insertInitial(row: Row): void {\n this.#rows.set(pkKey(this.pk, row), row);\n }\n\n rows(): Row[] {\n return [...this.#rows.values()];\n }\n\n get(key: string): Row | undefined {\n return this.#rows.get(key);\n }\n\n connect(order: OrderPart[]): SourceConnection {\n const conn: Connection = { output: null, order, cmp: makeComparator(order) };\n this.#connections.push(conn);\n return new SourceConnection(this, conn);\n }\n\n fetchConn(req: FetchRequest, conn: Connection): Node[] {\n let rows = [...this.#rows.values()];\n if (req.constraint) rows = rows.filter((r) => constraintMatches(req.constraint!, r));\n const cmp = req.reverse ? makeComparator(conn.order, true) : conn.cmp;\n rows = [...rows].sort(cmp);\n if (req.start) {\n const { row, basis } = req.start;\n const i = rows.findIndex((r) => {\n const c = cmp(r, row);\n return basis === 'after' ? c > 0 : c >= 0;\n });\n rows = i < 0 ? [] : rows.slice(i);\n }\n return rows.map((r) => ({ row: r, relationships: {} }));\n }\n\n /** Apply a source change (commit-first) and propagate to all connections. */\n push(change: SourceChange): void {\n // Commit to storage first so downstream fetches see the post-change view.\n if (change.type === 'add') {\n this.#rows.set(pkKey(this.pk, change.row), change.row);\n } else if (change.type === 'remove') {\n this.#rows.delete(pkKey(this.pk, change.row));\n } else {\n this.#rows.delete(pkKey(this.pk, change.oldRow));\n this.#rows.set(pkKey(this.pk, change.row), change.row);\n }\n for (const conn of this.#connections) {\n if (conn.output) deliver(conn.output, toChange(change));\n }\n }\n}\n\n/** A set of MemorySources, one per table — a `SourceProvider` for the builder. */\nexport class MemorySourceProvider {\n #sources = new Map<string, MemorySource>();\n\n add(table: string, pk: string[], rows: Row[]): MemorySource {\n const s = new MemorySource(table, pk);\n for (const r of rows) s.insertInitial(r);\n this.#sources.set(table, s);\n return s;\n }\n source(table: string): MemorySource {\n const s = this.#sources.get(table);\n if (!s) throw new Error(`no source for table ${table}`);\n return s;\n }\n pkOf(table: string): string[] {\n return this.source(table).pk;\n }\n connect(table: string, order: OrderPart[]): Op {\n return this.source(table).connect(order);\n }\n push(table: string, change: SourceChange): void {\n this.source(table).push(change);\n }\n}\n\nfunction toChange(change: SourceChange): Change {\n if (change.type === 'add') return { type: 'add', node: { row: change.row, relationships: {} } };\n if (change.type === 'remove') return { type: 'remove', node: { row: change.row, relationships: {} } };\n return {\n type: 'edit',\n node: { row: change.row, relationships: {} },\n oldNode: { row: change.oldRow, relationships: {} },\n };\n}\n\n/** One connection (consumer) of a MemorySource — an Input + push target. */\nexport class SourceConnection implements Op {\n output: Op | null = null;\n #src: MemorySource;\n #conn: Connection;\n\n constructor(src: MemorySource, conn: Connection) {\n this.#src = src;\n this.#conn = conn;\n }\n\n fetch(req: FetchRequest): Node[] {\n return this.#src.fetchConn(req, this.#conn);\n }\n push(): Change[] {\n throw new Error('a source connection never receives an upstream push');\n }\n setOutput(o: Op): void {\n this.output = o;\n this.#conn.output = o;\n }\n}\n","// Bridges the client Store to the IVM operator graph: seeds a MemorySource per\n// table from the store's effective rows, and translates each changed effective-\n// row key into an add/remove/edit push so the pipeline updates incrementally.\n\nimport { MemorySource } from './source.ts';\nimport { rowEq, type Op } from './data.ts';\nimport type { SourceProvider } from './build.ts';\nimport type { AST, CorrelatedSubquery, OrderPart, Row } from '../protocol.ts';\nimport { existsRelationships } from '../eval.ts';\nimport type { Store } from '../store.ts';\n\nexport class StoreProvider implements SourceProvider {\n #store: Store;\n #sources = new Map<string, MemorySource>();\n\n constructor(store: Store) {\n this.#store = store;\n }\n\n pkOf(table: string): string[] {\n return this.#store.pkOf(table);\n }\n\n connect(table: string, order: OrderPart[]): Op {\n return this.#ensure(table).connect(order);\n }\n\n #ensure(table: string): MemorySource {\n let s = this.#sources.get(table);\n if (!s) {\n s = new MemorySource(table, this.#store.pkOf(table));\n for (const row of this.#store.effectiveRows(table)) s.insertInitial(row);\n this.#sources.set(table, s);\n }\n return s;\n }\n\n /** Push the change for one touched effective-row key into its table's source. */\n applyChange(table: string, key: string): void {\n const src = this.#sources.get(table);\n if (!src) return;\n const next = this.#store.effectiveRow(table, key);\n const prev = src.get(key);\n if (prev && next) {\n if (!rowEq(prev, next)) src.push({ type: 'edit', row: next, oldRow: prev });\n } else if (next) {\n src.push({ type: 'add', row: next });\n } else if (prev) {\n src.push({ type: 'remove', row: prev });\n }\n }\n}\n\n/** Tables referenced anywhere in an AST (top + related + EXISTS subqueries). */\nexport function tablesOf(ast: AST, out = new Set<string>()): Set<string> {\n out.add(ast.table);\n for (const rel of ast.related ?? []) tablesOf(rel.subquery, out);\n for (const rel of existsRelationships(ast.where)) tablesOf(rel.subquery, out);\n collectExistsTables(ast.where, out);\n return out;\n}\n\n/** EXISTS subqueries (incl. hidden `zsubq_*`) referenced by a condition. */\nfunction collectExistsTables(cond: AST['where'], out: Set<string>): void {\n if (!cond) return;\n if (cond.type === 'correlatedSubquery') tablesOf((cond.related as CorrelatedSubquery).subquery, out);\n else if (cond.type === 'and' || cond.type === 'or') for (const c of cond.conditions) collectExistsTables(c, out);\n}\n\n/** Convert an IVM result node into a client row (nested arrays, singular unwrap). */\nexport function nodeToRow(node: { row: Row; relationships: Record<string, { row: Row; relationships: Record<string, unknown> }[]> }, ast: AST): Record<string, unknown> {\n const out: Record<string, unknown> = { ...node.row };\n for (const rel of ast.related ?? []) {\n const alias = rel.subquery.alias ?? rel.subquery.table;\n if (rel.hidden) {\n // Junction (many-to-many): drop the junction nodes and lift the nested\n // destination nodes up under this alias (matches Zero's hidden junction).\n const inner = rel.subquery.related![0];\n const innerAlias = inner.subquery.alias ?? inner.subquery.table;\n const junctionNodes = node.relationships[alias] ?? [];\n const dest = junctionNodes.flatMap((jn) => (jn.relationships[innerAlias] as typeof junctionNodes ?? []).map((c) => nodeToRow(c as never, inner.subquery)));\n out[alias] = inner.singular ? dest[0] : dest;\n } else {\n const children = (node.relationships[alias] ?? []).map((c) => nodeToRow(c as never, rel.subquery));\n out[alias] = rel.singular ? children[0] : children;\n }\n }\n for (const rel of existsRelationships(ast.where)) {\n const alias = rel.subquery.alias!;\n out[alias] = (node.relationships[alias] ?? []).map((c) => nodeToRow(c as never, rel.subquery));\n }\n return out;\n}\n","// The Orbit client: connects to an Orbit server over WebSocket, subscribes to\n// queries, applies pokes, and sends mutations. Mirrors Zero's `Zero` class\n// surface (`.query`, `.mutate`, materialized views) and behaviour:\n//\n// - **Reactive local reads**: views run the query (`where`/`orderBy`/`limit`/\n// `related`) over the local store on every change (see `eval.ts`), so results\n// are correctly ordered/limited and nested — not just flat synced rows.\n// - **Optimistic mutations**: a mutation is applied to a local overlay\n// immediately and rebased away once the server confirms its lastMutationID.\n// - **Resilient connection**: auto-reconnect with backoff, resubscribing active\n// queries and resending unconfirmed mutations on reconnect.\n\nimport {\n hashAST,\n hashString,\n type AST,\n type CrudOp,\n type Downstream,\n type Mutation,\n type QueriesPatchOp,\n type Row,\n type Upstream,\n} from './protocol.ts';\nimport { Query, SchemaQuery, type SchemaQueries, type QueryHost } from './query.ts';\nimport { type AnySchema, type PkOf, type RowOf, type SchemaDef } from './schema.ts';\nimport {\n collectOps,\n type MutateAPI,\n type MutatorDef,\n type MutatorDefs,\n type QueriesAPI,\n type QueryDef,\n type QueryDefs,\n} from './custom.ts';\nimport { QueryManager, type TTL } from './query-manager.ts';\nimport { Store, type ChangedKey } from './store.ts';\nimport type { KV } from './persist.ts';\nimport { buildPipeline } from './ivm/build.ts';\nimport { MaterializedView } from './ivm/view.ts';\nimport { completeOrder } from './ivm/data.ts';\nimport { StoreProvider, tablesOf, nodeToRow } from './ivm/store-provider.ts';\n\n/** Encode an auth token into a `Sec-WebSocket-Protocol` value (Zero-compatible). */\nfunction encodeSecProtocol(authToken: string): string {\n const payload = JSON.stringify({ initConnectionMessage: null, authToken });\n const b64 =\n typeof btoa === 'function' ? btoa(payload) : Buffer.from(payload, 'utf8').toString('base64');\n return encodeURIComponent(b64);\n}\n\nexport type OrbitOptions<S extends SchemaDef = AnySchema> = {\n server: string; // ws://host:port\n /** The schema — supplies end-to-end types for `query`/`mutate`. Optional. */\n schema?: S;\n /**\n * Auth token (or async getter) sent to the server, which forwards it as a\n * `Bearer` token to your push/query endpoints so they can authenticate.\n */\n auth?: string | (() => string | Promise<string>);\n clientID?: string;\n clientGroupID?: string;\n /** Max reconnect backoff in ms (default 30s). Set 0 to disable reconnect. */\n maxReconnectMs?: number;\n /**\n * How long a query stays subscribed after its last view is destroyed, before\n * it's garbage-collected (a `del` is sent upstream). Default `'5m'`.\n */\n queryTTL?: TTL;\n /**\n * Persist synced rows + pending mutations to a `KV` (e.g. `new IDBKV()` in the\n * browser) so data is available offline and survives reloads. Hydrated before\n * the first connection.\n */\n persist?: KV;\n /**\n * Called when the server sends a terminal `error` message (e.g. auth/version\n * failure). Without a handler the error is logged; the socket still reconnects\n * with backoff, so handle fatal errors here (e.g. refresh auth or `close()`).\n */\n onError?: (e: { kind: string; message: string }) => void;\n};\n\n/** Per-table CRUD mutators, mirroring Zero's `z.mutate.<table>.<op>(row)`. */\nexport type TableMutator<T extends Row = Row, PK extends keyof T = keyof T> = {\n insert(value: T): void;\n upsert(value: T): void;\n update(value: Pick<T, PK> & Partial<T>): void;\n delete(value: Pick<T, PK>): void;\n};\n\n/** `orbit.query.<table>` — one schema-aware query per table (relationships by name). */\nexport type QueryAccess<S extends SchemaDef> = SchemaQueries<S>;\n\n/** `orbit.mutate.<table>` — one typed mutator per schema table. */\nexport type MutateAccess<S extends SchemaDef> = {\n [K in keyof S['tables']]: TableMutator<RowOf<S['tables'][K]>, PkOf<S['tables'][K]>>;\n};\n\n/**\n * A live view over a query's results, maintained **incrementally** by the IVM\n * operator graph (see `ivm/`). The query is compiled to a pipeline of operators\n * fed by the local store; each store change is pushed through as add/remove/edit\n * and the materialized result is updated in place — not re-evaluated from\n * scratch. `applyWhere` defaults to true (the client store is shared across\n * subscriptions, so each view must filter to its own rows); pass false only when\n * the caller guarantees the store already holds exactly this query's rows.\n */\nexport class View<T extends Row = Row> {\n #ast: AST;\n #unsub: () => void;\n #onDestroy?: () => void;\n #provider: StoreProvider;\n #mview: MaterializedView;\n #tables: Set<string>;\n data: T[] = [];\n #listeners = new Set<() => void>();\n\n constructor(store: Store, ast: AST, applyWhere = true, onDestroy?: () => void) {\n this.#ast = applyWhere ? ast : { ...ast, where: undefined };\n this.#onDestroy = onDestroy;\n this.#tables = tablesOf(this.#ast);\n this.#provider = new StoreProvider(store);\n const pk = store.pkOf(this.#ast.table);\n const top = buildPipeline(this.#ast, this.#provider);\n this.#mview = new MaterializedView(top, completeOrder(this.#ast.orderBy, pk), pk);\n this.#refresh();\n this.#unsub = store.subscribe((changed) => this.#onChange(changed));\n }\n\n #onChange(changed: ReadonlyArray<ChangedKey>): void {\n let touched = false;\n for (const { table, key } of changed) {\n if (this.#tables.has(table)) {\n this.#provider.applyChange(table, key);\n touched = true;\n }\n }\n if (touched) this.#refresh();\n }\n\n #refresh(): void {\n this.data = this.#mview.nodes.map((n) => nodeToRow(n, this.#ast)) as unknown as T[];\n for (const fn of this.#listeners) fn();\n }\n\n subscribe(fn: () => void): () => void {\n this.#listeners.add(fn);\n return () => this.#listeners.delete(fn);\n }\n\n /** Stop reacting to store changes + release the query subscription (Zero's `view.destroy()`). */\n destroy(): void {\n this.#unsub();\n this.#listeners.clear();\n this.#onDestroy?.();\n }\n}\n\nexport class Orbit<\n S extends SchemaDef = AnySchema,\n MD extends MutatorDefs | undefined = undefined,\n QD extends QueryDefs | undefined = undefined,\n> implements QueryHost {\n // Not `readonly`: when `persist` is enabled and no explicit id was given, these\n // are restored from the KV in `#init` so a reload keeps the same identity (and\n // thus resumes the same server CVR as a fast delta instead of a full resync).\n clientID: string;\n clientGroupID: string;\n /** Per-table typed query builder (ad-hoc queries): `orbit.query.todo.where(...)`. */\n readonly query: QueryAccess<S>;\n /** Custom (named) queries from the `queries` option: `orbit.queries.allTodos()`. */\n readonly queries: QD extends QueryDefs ? QueriesAPI<QD> : Record<string, never>;\n /**\n * Mutators. With a `mutators` option these are your custom mutators\n * (`orbit.mutate.createTodo(args)`); otherwise per-table CRUD\n * (`orbit.mutate.todo.insert(...)`).\n */\n readonly mutate: MD extends MutatorDefs ? MutateAPI<MD> : MutateAccess<S>;\n\n #ws: WebSocket | undefined;\n #store: Store;\n #opts: OrbitOptions<S>;\n #pkByTable: Record<string, string[]>;\n #schema?: S;\n #mutatorDefs?: Record<string, MutatorDef>;\n #nextMutationID = 1;\n #closed = false;\n #connecting = false;\n #reconnectMs = 500;\n #maxReconnectMs: number;\n #queryTTL: TTL;\n #kv?: KV;\n /** Last server cookie we've fully applied; sent as `baseCookie` on reconnect so\n * the server can prove a delta resume is safe (else it full-resyncs). */\n #cookie?: string;\n\n /** Query lifetime: dedup + TTL + GC. Its `active()` set is resent on reconnect. */\n #queries: QueryManager;\n /** Unconfirmed mutations by id — resent on (re)connect, dropped on confirm. */\n #unconfirmedPushes = new Map<number, Upstream>();\n /** In-flight poke buffer: rows + lastMutationID changes accumulate across\n * `pokePart`s and are applied atomically on `pokeEnd`. A mid-poke disconnect (or\n * `pokeEnd.cancel`) discards it, so the store never holds a torn partial poke. */\n #poke: { rows: import('./protocol.ts').RowPatchOp[]; lmids: Record<string, number> } | null = null;\n /** Surfaced when the server sends a terminal `error` message. */\n #onError?: (e: { kind: string; message: string }) => void;\n /** Whether the id was supplied explicitly (then we never override it from the KV). */\n #idFromOpts: boolean;\n\n constructor(opts: OrbitOptions<S> & { mutators?: MD; queries?: QD }) {\n this.#opts = opts;\n this.#schema = opts.schema;\n this.#maxReconnectMs = opts.maxReconnectMs ?? 30_000;\n this.#queryTTL = opts.queryTTL ?? '5m';\n this.#kv = opts.persist;\n this.#onError = opts.onError;\n this.#queries = new QueryManager({\n onSubscribe: (put) => this.#send(['changeDesiredQueries', { desiredQueriesPatch: [put] }]),\n onUnsubscribe: (hash) =>\n this.#send(['changeDesiredQueries', { desiredQueriesPatch: [{ op: 'del', hash }] }]),\n });\n this.#idFromOpts = opts.clientID != null;\n this.clientID = opts.clientID ?? Math.random().toString(36).slice(2);\n this.clientGroupID = opts.clientGroupID ?? this.clientID;\n\n // Primary keys per table from the schema (defaults to ['id']).\n this.#pkByTable = {};\n for (const t of Object.values(opts.schema?.tables ?? {})) {\n this.#pkByTable[t.name] = [...t.primaryKey];\n }\n this.#store = new Store(this.#pkByTable);\n\n const schemaForQueries = (this.#schema ?? { tables: {}, relationships: {} }) as S;\n this.query = new Proxy({}, {\n get: (_t, table: string) => new SchemaQuery(this, schemaForQueries, table, Query.from(table)),\n }) as QueryAccess<S>;\n\n // Custom queries: `orbit.queries.<name>(args)` -> a typed Subscribable that\n // subscribes by NAME (resolved authoritatively by the server's query\n // endpoint). The def runs locally to derive the AST used for local\n // ordering/nesting/optimistic reads (its `where` is applied server-side).\n const queryDefs = opts.queries as Record<string, QueryDef> | undefined;\n this.queries = (queryDefs\n ? new Proxy({}, {\n get: (_t, name: string) => (args?: unknown) => ({\n materialize: () => {\n const ast = queryDefs[name]({ args, ctx: {} } as never).ast();\n const argList = args === undefined ? [] : [args];\n return this.materializeNamed(name, argList, ast);\n },\n }),\n })\n : ({} as Record<string, never>)) as this['queries'];\n\n // Mutators: custom (sent to the server by NAME — the server forwards them to\n // the app's push endpoint, which runs them with context) or per-table CRUD.\n this.#mutatorDefs = opts.mutators as Record<string, MutatorDef> | undefined;\n this.mutate = (this.#mutatorDefs\n ? new Proxy({}, {\n get: (_t, name: string) => (args?: unknown) => this.mutateCustom(name, args),\n })\n : new Proxy({}, {\n get: (_t, table: string): TableMutator => {\n const pk = this.#pkByTable[table] ?? ['id'];\n const crud = (op: CrudOp['op'], value: Row) =>\n this.mutateCrud({ op, tableName: table, primaryKey: pk, value } as CrudOp);\n return {\n insert: (value) => crud('insert', value),\n upsert: (value) => crud('upsert', value),\n update: (value) => crud('update', value),\n delete: (value) => crud('delete', value),\n };\n },\n })) as this['mutate'];\n\n void this.#init();\n }\n\n /** Build a raw (untyped) query against `table` — escape hatch. */\n queryRaw(table: string): Query {\n return Query.from(table);\n }\n\n /** Subscribe to an ad-hoc query and return a live [`View`]. */\n materialize(query: Query, ttl: TTL = this.#queryTTL): View {\n const ast = query.ast();\n const hash = hashAST(ast);\n const release = this.#queries.add(hash, { op: 'put', hash, ast }, ttl);\n return new View(this.#store, ast, true, release);\n }\n\n /**\n * Subscribe to a custom (named) query by name + args. The server's query\n * endpoint resolves/authorizes it (with the connection's auth) into the actual\n * query; the client uses the def's `ast` for local ordering/nesting/optimism.\n *\n * The local view DOES apply the def's `where` (applyWhere=true): the client\n * store is shared across all subscriptions, so without it a filtered query like\n * `issue({id})` would match every row another query synced (e.g. the issues\n * list) and `.one()` would return the wrong row. This assumes the def's filter\n * matches the server's resolution, which holds for ordinary parameterized\n * queries; the store only ever holds server-authorized rows.\n */\n materializeNamed(name: string, args: unknown[], ast: AST, ttl: TTL = this.#queryTTL): View {\n const hash = hashString(JSON.stringify([name, args]));\n const release = this.#queries.add(hash, { op: 'put', hash, name, args }, ttl);\n return new View(this.#store, ast, true, release);\n }\n\n /** Apply a single CRUD op (mirrors `z.mutate.<table>.insert(...)`). */\n mutateCrud(op: CrudOp): void {\n const id = this.#nextMutationID++;\n const mutation: Mutation = {\n type: 'crud',\n id,\n clientID: this.clientID,\n name: '_zero_crud',\n args: [{ ops: [op] }],\n timestamp: Date.now(),\n };\n this.#store.addPending(id, [op], mutation); // optimistic + persisted\n this.#pushMutation(id, mutation);\n }\n\n /** Run a custom mutator by name (optimistically, then on the server). */\n mutateCustom(name: string, args?: unknown): void {\n const id = this.#nextMutationID++;\n const mutation: Mutation = {\n type: 'custom',\n id,\n clientID: this.clientID,\n name,\n args: args === undefined ? [] : [args],\n timestamp: Date.now(),\n };\n // Optimistic: run the mutator locally to overlay its effect immediately.\n // (`ctx` is server-supplied; a stub is fine — the server-confirmed rows\n // replace the overlay on rebase.)\n const def = this.#mutatorDefs?.[name];\n let ops: CrudOp[] = [];\n if (def && this.#schema) {\n try {\n ops = collectOps(this.#schema, def, args, {});\n } catch {\n /* a mutator that needs real ctx locally just skips the optimistic step */\n }\n }\n this.#store.addPending(id, ops, mutation);\n this.#pushMutation(id, mutation);\n }\n\n close(): void {\n this.#closed = true;\n this.#ws?.close();\n }\n\n // --- internals ----------------------------------------------------------\n\n /** Hydrate persisted state (if any), restore unconfirmed mutations, then connect. */\n async #init(): Promise<void> {\n if (this.#kv) {\n try {\n await this.#store.hydrate(this.#kv);\n // Restore a STABLE identity so a reload resumes the same server-side CVR as\n // a fast delta instead of looking like a brand-new client (full resync).\n // Only when no explicit id was given; sign-out (resetOrbit) deletes the KV,\n // so a different user gets a fresh identity.\n if (!this.#idFromOpts) {\n const savedID = await this.#kv.get('clientID');\n if (typeof savedID === 'string') {\n this.clientID = savedID;\n const savedGroup = await this.#kv.get('clientGroupID');\n this.clientGroupID = typeof savedGroup === 'string' ? savedGroup : savedID;\n } else {\n void this.#kv.set('clientID', this.clientID);\n void this.#kv.set('clientGroupID', this.clientGroupID);\n }\n }\n // Re-queue restored pending mutations so they're resent on connect, and\n // continue the mutation-id sequence past them.\n let maxId = 0;\n for (const m of this.#store.pendingMutations()) {\n maxId = Math.max(maxId, m.id);\n this.#unconfirmedPushes.set(m.id, ['push', {\n clientGroupID: this.clientGroupID,\n mutations: [m],\n pushVersion: 1,\n timestamp: m.timestamp,\n requestID: Math.random().toString(36).slice(2),\n }]);\n }\n if (maxId >= this.#nextMutationID) this.#nextMutationID = maxId + 1;\n // Continue the mutation-id sequence past the high-water mark persisted\n // across reloads. Otherwise ids restart at 1 and the server (which tracks a\n // per-client lastMutationID) silently drops them as already-processed.\n const savedNextID = await this.#kv.get('nextMutationID');\n if (typeof savedNextID === 'number' && savedNextID > this.#nextMutationID) {\n this.#nextMutationID = savedNextID;\n }\n // Restore the last applied cookie so a reload resumes as a delta.\n const c = await this.#kv.get('cookie');\n if (typeof c === 'string') this.#cookie = c;\n } catch {\n /* a persistence failure must not block connecting */\n }\n }\n await this.#connect();\n }\n\n #pushMutation(id: number, mutation: Mutation): void {\n const msg: Upstream = ['push', {\n clientGroupID: this.clientGroupID,\n mutations: [mutation],\n pushVersion: 1,\n timestamp: Date.now(),\n requestID: Math.random().toString(36).slice(2),\n }];\n this.#unconfirmedPushes.set(id, msg);\n // Persist the high-water mark so ids keep climbing across reloads (the store\n // already persists the pending mutation itself).\n void this.#kv?.set('nextMutationID', this.#nextMutationID);\n this.#send(msg);\n }\n\n async #connect(): Promise<void> {\n if (this.#closed || this.#connecting) return;\n if (typeof WebSocket === 'undefined') return; // non-browser/test env\n this.#connecting = true;\n\n // Auth token is sent in the `Sec-WebSocket-Protocol` header (the only way to\n // pass auth on a browser WebSocket handshake). The server forwards it as a\n // Bearer token to the app's push/query endpoints.\n const token = typeof this.#opts.auth === 'function' ? await this.#opts.auth() : this.#opts.auth;\n if (this.#closed) {\n this.#connecting = false;\n return;\n }\n // clientID rides in the connect URL (Zero-style) so a view-syncer can load\n // this client's persisted view and, on reconnect to ANY node, resume as a\n // delta instead of re-sending the whole result. baseCookie is the last cookie\n // we applied — the server fast-resumes only if it matches the stored version.\n let url = `${this.#opts.server}/sync/v51/connect?clientID=${encodeURIComponent(this.clientID)}`;\n if (this.#cookie != null) url += `&baseCookie=${encodeURIComponent(this.#cookie)}`;\n const ws = token ? new WebSocket(url, [encodeSecProtocol(token)]) : new WebSocket(url);\n this.#ws = ws;\n\n ws.addEventListener('open', () => {\n this.#connecting = false;\n // Backoff resets on the first completed poke (a real health signal), not on\n // mere socket open — an open-then-immediately-close server can't reconnect-storm.\n this.#resume(ws);\n });\n ws.addEventListener('message', (ev: MessageEvent) => {\n this.#onMessage(JSON.parse(ev.data as string) as Downstream);\n });\n ws.addEventListener('close', () => {\n this.#connecting = false;\n if (this.#ws === ws) this.#ws = undefined;\n this.#poke = null; // discard any partially-received poke (no torn state)\n this.#scheduleReconnect();\n });\n ws.addEventListener('error', () => ws.close());\n }\n\n /** Resubscribe active queries and resend unconfirmed mutations. */\n #resume(ws: WebSocket): void {\n const queries = this.#queries.active();\n if (queries.length) {\n ws.send(JSON.stringify(['changeDesiredQueries', { desiredQueriesPatch: queries }]));\n }\n for (const msg of this.#unconfirmedPushes.values()) ws.send(JSON.stringify(msg));\n }\n\n #scheduleReconnect(): void {\n if (this.#closed || this.#maxReconnectMs === 0) return;\n const delay = Math.min(this.#reconnectMs, this.#maxReconnectMs);\n this.#reconnectMs = Math.min(this.#reconnectMs * 2, this.#maxReconnectMs);\n setTimeout(() => void this.#connect(), delay);\n }\n\n #send(msg: Upstream): void {\n if (this.#ws && this.#ws.readyState === WebSocket.OPEN) {\n this.#ws.send(JSON.stringify(msg));\n }\n // Otherwise it's captured in #activeQueries / #unconfirmedPushes and will be\n // (re)sent by #resume on the next open.\n }\n\n #onMessage(msg: Downstream): void {\n const [tag, body] = msg;\n switch (tag) {\n case 'pokeStart':\n // Begin buffering a poke. (The server only sends a delta when our reported\n // baseCookie matches its stored version, else it full-resyncs, so we trust\n // the framing here.)\n this.#poke = { rows: [], lmids: {} };\n return;\n case 'pokePart': {\n const poke = (this.#poke ??= { rows: [], lmids: {} });\n if (body.rowsPatch) poke.rows.push(...body.rowsPatch);\n if (body.lastMutationIDChanges) Object.assign(poke.lmids, body.lastMutationIDChanges);\n return;\n }\n case 'pokeEnd': {\n const poke = this.#poke;\n this.#poke = null;\n if (!poke || body.cancel) return; // canceled → discard the whole poke\n // Apply atomically on pokeEnd: synced rows FIRST, then confirmations, so a\n // confirmed mutation's optimistic overlay only drops once its authoritative\n // row is in the store (no flicker), and a mid-poke disconnect (no pokeEnd)\n // leaves nothing partially applied.\n if (poke.rows.length) this.#store.applyAll(poke.rows);\n const confirmed = poke.lmids[this.clientID];\n if (confirmed != null) {\n for (const id of this.#unconfirmedPushes.keys()) {\n if (id <= confirmed) this.#unconfirmedPushes.delete(id);\n }\n this.#store.confirmThrough(confirmed);\n }\n this.#cookie = body.cookie;\n void this.#kv?.set('cookie', body.cookie);\n this.#reconnectMs = 500; // a completed poke proves the connection is healthy\n return;\n }\n case 'error':\n // Surface terminal server errors instead of silently looping.\n if (this.#onError) this.#onError(body);\n else console.error(`orbit: server error: ${body.kind}: ${body.message}`);\n return;\n default:\n return; // 'connected', 'pong' — nothing to apply\n }\n }\n}\n","// Pluggable client persistence — a small async key/value abstraction (mirroring\n// the role of Zero/Replicache's `kv/store.ts`, without the dag/btree). The Store\n// persists synced rows under `e/…` keys and pending mutations under `p/…`, so\n// data is available offline and survives reloads. `IDBKV` backs it with\n// IndexedDB in the browser; `MemoryKV` is for tests / non-browser environments.\n\nexport interface KV {\n get(key: string): Promise<unknown>;\n set(key: string, value: unknown): Promise<void>;\n del(key: string): Promise<void>;\n /** All `[key, value]` pairs whose key starts with `prefix`. */\n entries(prefix: string): Promise<[string, unknown][]>;\n}\n\n/** In-memory KV — used by tests and as a no-IndexedDB fallback. */\nexport class MemoryKV implements KV {\n #m = new Map<string, unknown>();\n async get(key: string): Promise<unknown> {\n return this.#m.get(key);\n }\n async set(key: string, value: unknown): Promise<void> {\n this.#m.set(key, value);\n }\n async del(key: string): Promise<void> {\n this.#m.delete(key);\n }\n async entries(prefix: string): Promise<[string, unknown][]> {\n return [...this.#m].filter(([k]) => k.startsWith(prefix));\n }\n}\n\nfunction wrap<T>(req: IDBRequest<T>): Promise<T> {\n return new Promise((resolve, reject) => {\n req.onsuccess = () => resolve(req.result);\n req.onerror = () => reject(req.error);\n });\n}\n\n/** IndexedDB-backed KV (browser). One object store, keyed by string. */\nexport class IDBKV implements KV {\n #dbp: Promise<IDBDatabase>;\n\n constructor(name = 'orbit') {\n this.#dbp = new Promise((resolve, reject) => {\n const r = indexedDB.open(name, 1);\n r.onupgradeneeded = () => r.result.createObjectStore('kv');\n r.onsuccess = () => resolve(r.result);\n r.onerror = () => reject(r.error);\n });\n }\n\n async #store(mode: IDBTransactionMode): Promise<IDBObjectStore> {\n const db = await this.#dbp;\n return db.transaction('kv', mode).objectStore('kv');\n }\n\n async get(key: string): Promise<unknown> {\n return wrap((await this.#store('readonly')).get(key));\n }\n async set(key: string, value: unknown): Promise<void> {\n await wrap((await this.#store('readwrite')).put(value as unknown as never, key));\n }\n async del(key: string): Promise<void> {\n await wrap((await this.#store('readwrite')).delete(key));\n }\n async entries(prefix: string): Promise<[string, unknown][]> {\n const s = await this.#store('readonly');\n const [keys, vals] = await Promise.all([wrap(s.getAllKeys()), wrap(s.getAll())]);\n const out: [string, unknown][] = [];\n for (let i = 0; i < keys.length; i++) {\n const k = String(keys[i]);\n if (k.startsWith(prefix)) out.push([k, vals[i]]);\n }\n return out;\n }\n}\n"]}
@@ -1,81 +0,0 @@
1
- import { R as Row, Q as QueryBuilder, S as Subscribable, C as CrudOp } from './query-CKrvTNqq.js';
2
- import { S as SchemaDef, R as RowOf, P as PkOf } from './schema-BNM6bks7.js';
3
-
4
- /** Typed CRUD surface for one table inside a mutator transaction. */
5
- type TableCRUD<T extends Row, PK extends keyof T> = {
6
- insert(value: T): void;
7
- upsert(value: T): void;
8
- update(value: Pick<T, PK> & Partial<T>): void;
9
- delete(value: Pick<T, PK>): void;
10
- };
11
- /** `tx.mutate.<table>` for every table in the schema. */
12
- type SchemaCRUD<S extends SchemaDef> = {
13
- [K in keyof S['tables']]: TableCRUD<RowOf<S['tables'][K]>, PkOf<S['tables'][K]>>;
14
- };
15
- /** The transaction passed to a mutator (mirrors Zero's `Transaction`). */
16
- type Transaction<S extends SchemaDef> = {
17
- readonly location: 'client';
18
- readonly mutate: SchemaCRUD<S>;
19
- };
20
- /**
21
- * A mutator's body. Receives a transaction, the client-supplied `args`, and
22
- * server-supplied `ctx` (the authenticated context — see the push endpoint). A
23
- * def that doesn't need `ctx` can simply omit it from its destructure.
24
- */
25
- type MutatorFn<S extends SchemaDef, Args, Ctx = unknown> = (c: {
26
- tx: Transaction<S>;
27
- args: Args;
28
- ctx: Ctx;
29
- }) => void | Promise<void>;
30
- /**
31
- * A mutator definition. Modeled as the function itself; its args type is inferred
32
- * from the signature. (`any` in the `tx`/args positions keeps specific defs
33
- * assignable to the `MutatorDefs` record.)
34
- */
35
- type MutatorDef<Args = any> = (c: {
36
- tx: Transaction<any>;
37
- args: Args;
38
- ctx: any;
39
- }) => void | Promise<void>;
40
- /** Define a custom mutator (mirrors Zero's `defineMutator`). */
41
- declare function defineMutator<S extends SchemaDef, Args, Ctx = unknown>(fn: MutatorFn<S, Args, Ctx>): MutatorDef<Args>;
42
- type MutatorDefs = Record<string, MutatorDef>;
43
- type ArgsOf<M> = M extends (c: {
44
- tx: never;
45
- args: infer A;
46
- ctx: never;
47
- }) => unknown ? A : never;
48
- /** `orbit.mutate` derived from mutator defs — `tx` stripped, args kept. */
49
- type MutateAPI<MD extends MutatorDefs> = {
50
- [K in keyof MD]: ArgsOf<MD[K]> extends void | undefined ? () => void : (args: ArgsOf<MD[K]>) => void;
51
- };
52
- type QueryFn<Args, Ctx, T extends Row> = (c: {
53
- args: Args;
54
- ctx: Ctx;
55
- }) => QueryBuilder<T>;
56
- /** A custom query definition (its args + result row types are inferred). */
57
- type QueryDef<Args = any, T extends Row = Row> = (c: {
58
- args: Args;
59
- ctx: any;
60
- }) => QueryBuilder<T>;
61
- /** Define a custom (named) query (mirrors Zero's `defineQuery`). */
62
- declare function defineQuery<T extends Row>(fn: () => QueryBuilder<T>): QueryDef<void, T>;
63
- declare function defineQuery<Args, Ctx, T extends Row>(fn: QueryFn<Args, Ctx, T>): QueryDef<Args, T>;
64
- type QueryDefs = Record<string, QueryDef>;
65
- type QArgsOf<Q> = Q extends (c: {
66
- args: infer A;
67
- ctx: never;
68
- }) => unknown ? A : never;
69
- type QRowOf<Q> = Q extends (c: never) => Subscribable<infer T> ? T : never;
70
- /** `orbit.queries` derived from query defs — call with args, get a `Subscribable`. */
71
- type QueriesAPI<QD extends QueryDefs> = {
72
- [K in keyof QD]: QArgsOf<QD[K]> extends void | undefined ? () => Subscribable<QRowOf<QD[K]>> : (args: QArgsOf<QD[K]>) => Subscribable<QRowOf<QD[K]>>;
73
- };
74
- /**
75
- * Run a mutator definition against a recording transaction and return the CRUD
76
- * ops it produced. Use this on **your push endpoint** (the server forwarded the
77
- * mutation to) to execute a mutator with context, then apply the ops to your DB.
78
- */
79
- declare function collectOps<S extends SchemaDef>(schema: S, def: MutatorDef, args: unknown, ctx?: unknown): CrudOp[];
80
-
81
- export { type MutatorDef as M, type QueryDef as Q, type SchemaCRUD as S, type TableCRUD as T, type MutatorDefs as a, type QueryDefs as b, type QueriesAPI as c, type MutateAPI as d, type Transaction as e, collectOps as f, defineMutator as g, defineQuery as h };