@schemic/surrealdb 0.1.0-alpha.0

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/driver/surreal.ts","../src/cli/engine.ts","../src/cli/introspect.ts","../src/ddl.ts","../src/pure.ts","../src/cli/struct.ts","../src/cli/structure.ts","../src/cli/surreal-diff.ts","../src/cli/lower.ts","../src/cli/surreal-filter.ts","../src/cli/pull.ts","../src/cli/scaffold.ts","../src/cli/surreal-connect.ts","../src/kinds/explode.ts","../src/kinds/registry.ts","../src/index.ts","../src/connection.ts"],"sourcesContent":["// The SURREAL driver — a SET OF KINDS on the core-v2 registry (see docs/kind-registry-flip-plan.md).\n//\n// Everything dialect-specific lives here: the kind `registry` (table/index/event/function/access), the\n// authoring -> kinded `explode`, the single-read `introspectAll`, the connection lifecycle, and the\n// SurrealDB command capabilities. Core orchestrates schema ops (lower/diff/emit/order) GENERICALLY over\n// `registry` — it never names a kind. The Struct-IR (`DbStructured`) + `diffSnapshots` stay the driver's\n// INTERNAL clause-level engine (the kinds delegate to them); the field/type substrate stays core.\n\nimport type {\n ApplyOptions,\n ConnectionOverrides as CfgOverrides,\n ConnectionOverrides,\n Definable,\n Diff,\n Driver,\n Filter,\n MigrationRecord,\n MigrationStore,\n PortableObject,\n PullPlan,\n RenderedUnit,\n ResolvedConfig,\n ShadowCapability,\n} from \"@schemic/core\";\nimport { registerDriver } from \"@schemic/core\";\nimport { escapeIdent, type Surreal } from \"surrealdb\";\nimport {\n connectEmbedded,\n spawnEphemeralServer,\n surrealBinaryAvailable,\n} from \"../cli/engine\";\nimport {\n applyStatements,\n diffAgainstDb,\n shadowStructured,\n syncPlan,\n tsStructsAgainstDb,\n verifyMigrations,\n} from \"../cli/introspect\";\nimport { planPull, renderPerFile, renderSchemaToTS } from \"../cli/pull\";\nimport { initScaffold, scaffoldEntity } from \"../cli/scaffold\";\nimport { normalizeDb } from \"../cli/struct\";\nimport type { DbStructured } from \"../cli/structure\";\nimport { connect as surrealConnect } from \"../cli/surreal-connect\";\nimport { renderMigration } from \"../cli/surreal-diff\";\nimport { filterStructured } from \"../cli/surreal-filter\";\nimport type { SurrealParams } from \"../config\";\nimport {\n explodeSchema,\n fromStructured,\n introspectAll as introspectAllKinds,\n toStructured,\n} from \"../kinds/explode\";\nimport type { SurrealPortable } from \"../kinds/portable\";\nimport { surrealKinds } from \"../kinds/registry\";\nimport type { Shape, StandaloneDef, TableDef } from \"../pure\";\n\nconst shadow: ShadowCapability<Surreal> = {\n // Apply DDL to a throwaway database, read it back via INFO STRUCTURE, drop it — the live-side\n // canonicalizer. Delegates to `shadowStructured`, then to per-kind portable objects (== lowering).\n roundTrip: async (conn, config, ddl) =>\n fromStructured(normalizeDb(await shadowStructured(conn, config, ddl))),\n // `ephemeral` (full isolated instance for `sz check` replay) is intentionally not wired here —\n // `check` still uses its existing path. A later milestone routes it through this capability.\n};\n\n// --- migration bookkeeping (the apply-time SurrealQL, moved behind the driver) -------------------\n\n/** Record one applied migration: a `_migrations` row keyed by tag, with file + checksum + time. */\nconst RECORD_SQL =\n \"CREATE type::record($tbl, $tag) CONTENT { tag: $tag, file: $file, checksum: $sum, applied_at: time::now() }\";\nconst recordVars = (table: string, r: MigrationRecord) => ({\n tbl: table,\n tag: r.tag,\n file: r.file,\n sum: r.checksum,\n});\n\n/** `DEFINE TABLE … SCHEMALESS` for an internal tracking table (migrations or its lock). */\nasync function ensureTrackTable(conn: Surreal, table: string): Promise<void> {\n await conn.query(\n `DEFINE TABLE IF NOT EXISTS ${escapeIdent(table)} TYPE NORMAL SCHEMALESS PERMISSIONS NONE;`,\n );\n}\n\nconst lockTableOf = (table: string) => `${table}_lock`;\n\nconst migrations: MigrationStore<Surreal> = {\n // SurrealDB migrations are SurrealQL scripts.\n extension: \".surql\",\n render: (tag, diff) => renderMigration(tag, diff),\n ensure: ensureTrackTable,\n\n async applied(conn, table) {\n const [rows] = await conn.query<[{ tag: string; checksum: string }[]]>(\n \"SELECT tag, checksum FROM type::table($tbl)\",\n { tbl: table },\n );\n return new Map((rows ?? []).map((r) => [r.tag, r.checksum]));\n },\n\n // SurrealDB is natively transactional — run the migration program + its bookkeeping write in one\n // BEGIN/COMMIT so the record is written iff the DDL applied. `$direction` drives the up/down branch.\n async apply(conn, table, { content, direction, record }) {\n const bookkeep =\n direction === \"up\"\n ? { sql: RECORD_SQL, vars: recordVars(table, record) }\n : {\n sql: \"DELETE type::record($tbl, $tag)\",\n vars: { tbl: table, tag: record.tag },\n };\n await conn.query(`BEGIN;\\n${content}\\n${bookkeep.sql};\\nCOMMIT;`, {\n direction,\n ...bookkeep.vars,\n });\n },\n\n async record(conn, table, record) {\n await ensureTrackTable(conn, table);\n await conn.query(RECORD_SQL, recordVars(table, record));\n },\n\n async clear(conn, table) {\n await conn.query(\"DELETE type::table($tbl)\", { tbl: table });\n },\n\n async lock(conn, table) {\n const tbl = lockTableOf(table);\n await ensureTrackTable(conn, tbl);\n try {\n await conn.query(\n \"CREATE type::record($tbl, 'lock') CONTENT { at: time::now() }\",\n { tbl },\n );\n } catch {\n throw new Error(\n \"Migrations are locked — another run is in progress. If it's stale, run `schemic unlock`.\",\n );\n }\n },\n\n async unlock(conn, table) {\n await conn.query(\"DELETE type::record($tbl, 'lock')\", {\n tbl: lockTableOf(table),\n });\n },\n};\n\n/**\n * Render a structured schema to per-file source: one combined module under `single`, else one file\n * per object via `fileFor`. Shared by `renderSchema` (offline `diff --ts`) and `diffTsLive`.\n */\nfunction renderFiles(\n struct: DbStructured,\n fileFor: (kind: string, name: string) => string,\n single?: string,\n): Map<string, string> {\n return single\n ? new Map([[single, renderSchemaToTS(struct)]])\n : renderPerFile(\n struct,\n fileFor as (kind: RenderedUnit[\"kind\"], name: string) => string,\n );\n}\n\nexport const surrealDriver: Driver<\n Surreal,\n TableDef<string, Shape>,\n StandaloneDef\n> = {\n name: \"surrealdb\",\n registry: surrealKinds,\n\n // --- kind registry (the schema engine) -----------------------------------------------------\n // Authoring -> kinded definables (the driver-side explode: one inline-authored table fans out into\n // [table, ...index, ...event], db-level functions/accesses alongside). Core lowers via\n // `lowerSchema(registry, explode(...))`, then diffs/emits/orders GENERICALLY — it never names a kind.\n explode: (tables, defs) => explodeSchema(tables, defs),\n // Live DB -> all portable objects: ONE `INFO … STRUCTURE` read fanned per kind, canonicalized\n // IDENTICALLY to lowering (a clean apply round-trips to a zero diff) and complete (every kind).\n introspectAll: (conn, exclude) => introspectAllKinds(conn, exclude),\n\n // --- execution -----------------------------------------------------------------------------\n\n connect(\n config: ResolvedConfig,\n over?: ConnectionOverrides,\n ): Promise<Surreal> {\n // The driver's portable `ConnectionOverrides` is a structural superset of the SDK's; the only\n // soft field is `authLevel` (a string here vs. the SDK's `AuthLevel` union) — pass it through.\n return surrealConnect(config, (over ?? {}) as CfgOverrides);\n },\n\n async apply(\n conn: Surreal,\n statements: string[],\n opts?: ApplyOptions,\n ): Promise<void> {\n if (!statements.length) return;\n if (opts?.transactional === false) {\n for (const s of statements) await conn.query(s);\n return;\n }\n // SurrealDB is natively transactional — one BEGIN/COMMIT around the batch (matches applyStatements).\n await applyStatements(conn, statements);\n },\n\n async close(conn: Surreal): Promise<void> {\n await conn.close();\n },\n\n /**\n * Raw READ query -> rows, for connection resolvers (`ctx.connections.<name>.query(...)`) and seed.\n * SurrealQL returns one result per statement; we hand back the LAST statement's rows (the payload of\n * a `… ; SELECT …` resolver), wrapping a scalar/`RETURN` result and treating none as an empty set.\n */\n async query<T = unknown>(\n conn: Surreal,\n sql: string,\n vars?: Record<string, unknown>,\n ): Promise<T[]> {\n const results = (await conn.query(sql, vars)) as unknown[];\n if (!results.length) return [];\n const last = results[results.length - 1];\n return (Array.isArray(last) ? last : last == null ? [] : [last]) as T[];\n },\n\n shadow,\n migrations,\n\n // --- command capabilities (thin adapters over the existing surreal cli functions) ----------\n\n diffLive: (conn, config, filter) => diffAgainstDb(conn, config, filter),\n syncPlan: (diff, prune) => syncPlan(diff, prune),\n\n // Offline `diff --ts` / `pull`: reconstruct the structured form from the portable objects (no DDL\n // re-parse — the normalized struct rides on them), filter, render to per-file `s.*` source.\n renderSchema(objects, filter, fileFor, single) {\n return renderFiles(\n filterStructured(toStructured(objects as SurrealPortable[]), filter),\n fileFor,\n single,\n );\n },\n\n // Live `diff --ts`: both sides normalized through SurrealDB, then rendered per file.\n async diffTsLive(conn, config, filter, fileFor, single) {\n const { current, desired } = await tsStructsAgainstDb(conn, config, filter);\n return {\n current: renderFiles(current, fileFor, single),\n desired: renderFiles(desired, fileFor, single),\n };\n },\n\n planPull: (conn, config, opts) => planPull(conn, config, opts),\n\n async serverInfo(conn) {\n let v = \"unknown\";\n try {\n v = (await conn.version()).version;\n } catch {\n // server version unavailable\n }\n return `SurrealDB ${v}`;\n },\n\n // The files `schemic init` scaffolds for a fresh SurrealDB project (connections-only config + sample\n // s.* schema + seed + .env.example); the CLI writes them and adds the neutral migration snapshot.\n initScaffold,\n\n // `schemic new <kind> <name>`: the starter `s.*`/`define*` module for one entity (table/relation/\n // view/function/access/event/analyzer); throws for inline-only (index/field) or unknown kinds.\n scaffoldEntity,\n\n // `check`: replay every migration into a throwaway engine and diff the result against the schema.\n // Owns ephemeral-engine selection — an embedded @surrealdb/node instance, an ephemeral server from\n // the local `surreal` binary, or a configured scratch server — and the replay never touches the\n // real database. Progress lines go to `log`; the empty/non-empty diff is reported by the caller.\n async checkReplay(config, over, filter, log) {\n const params = config.params as unknown as SurrealParams;\n const check = params.check;\n const engine = check?.engine ?? \"auto\";\n const useBinary =\n engine === \"binary\" ||\n (engine === \"auto\" && surrealBinaryAvailable(check?.binary));\n if (engine === \"binary\" && !useBinary) {\n throw new Error(\n 'check.engine \"binary\" needs the `surreal` CLI on PATH (or set `check.binary`). Run `schemic check --schema` to skip the replay.',\n );\n }\n\n let db: Surreal;\n let checkCfg: ResolvedConfig;\n let cleanup: () => Promise<void>;\n if (typeof engine === \"object\") {\n const embedded = await connectEmbedded(engine, \"check\", \"check\");\n db = embedded.db;\n checkCfg = {\n ...config,\n params: {\n url: embedded.url,\n namespace: \"check\",\n database: \"check\",\n authLevel: \"root\",\n } satisfies SurrealParams,\n };\n cleanup = embedded.stop;\n log(\n ` replaying on an ${embedded.url} SurrealDB (@surrealdb/node) — no server, your data untouched`,\n );\n } else if (useBinary) {\n const server = await spawnEphemeralServer(check?.binary);\n checkCfg = {\n ...config,\n params: {\n url: server.url,\n namespace: \"check\",\n database: \"check\",\n username: server.username,\n password: server.password,\n authLevel: \"root\",\n } satisfies SurrealParams,\n };\n db = await surrealConnect(checkCfg, {});\n cleanup = async () => {\n await db.close().catch(() => {});\n await server.stop();\n };\n log(\n \" replaying on an ephemeral in-memory SurrealDB (local `surreal` binary) — your server is untouched\",\n );\n } else {\n // Scratch connection for the `remote` engine: check.db merged over the connection's own params.\n const remote: SurrealParams = { ...params, ...(check?.db ?? {}) };\n checkCfg = {\n ...config,\n params: remote as unknown as Record<string, unknown>,\n };\n try {\n db = await surrealConnect(checkCfg, over as CfgOverrides);\n } catch (e) {\n throw new Error(\n `${e instanceof Error ? e.message : String(e)}\\n (run \\`schemic check --schema\\` to skip the replay, install the \\`surreal\\` CLI for an in-memory engine, or set \\`check.db\\` to point the replay at a scratch server)`,\n );\n }\n cleanup = async () => {\n await db.close().catch(() => {});\n };\n log(\n ` replaying on ${remote.url} (${remote.namespace}) — isolated scratch databases; your data is untouched`,\n );\n }\n\n try {\n return await verifyMigrations(db, checkCfg, filter, (tag) =>\n log(` ${tag}`),\n );\n } finally {\n await cleanup();\n }\n },\n};\n\nregisterDriver(surrealDriver as Driver<unknown>);\n","import { type ChildProcess, execFileSync, spawn } from \"node:child_process\";\nimport { createServer } from \"node:net\";\nimport { escapeIdent, Surreal } from \"surrealdb\";\nimport type { SurrealZodCheckEmbedded } from \"../config\";\n\n/** Pick a free localhost TCP port by binding to :0 and reading it back. */\nfunction freePort(): Promise<number> {\n return new Promise((resolve, reject) => {\n const srv = createServer();\n srv.once(\"error\", reject);\n srv.listen(0, \"127.0.0.1\", () => {\n const addr = srv.address();\n const port = addr && typeof addr === \"object\" ? addr.port : 0;\n srv.close(() => (port ? resolve(port) : reject(new Error(\"no port\"))));\n });\n });\n}\n\n/** Whether the local `surreal` CLI is runnable (used to pick the `auto` check engine). */\nexport function surrealBinaryAvailable(bin = \"surreal\"): boolean {\n try {\n execFileSync(bin, [\"version\"], { stdio: \"ignore\" });\n return true;\n } catch {\n return false;\n }\n}\n\nexport interface EphemeralServer {\n url: string;\n username: string;\n password: string;\n /** Stop the spawned process (idempotent). */\n stop: () => Promise<void>;\n}\n\nconst sleep = (ms: number) => new Promise((r) => setTimeout(r, ms));\n\n/** Poll a Surreal connection until it succeeds, the process dies, or we time out. */\nasync function waitUntilReady(\n url: string,\n username: string,\n password: string,\n child: ChildProcess,\n stderr: () => string,\n): Promise<void> {\n const deadline = Date.now() + 15_000;\n while (Date.now() < deadline) {\n if (child.exitCode !== null) {\n throw new Error(\n `surreal exited (${child.exitCode}): ${stderr().split(\"\\n\").filter(Boolean).pop() ?? \"no output\"}`,\n );\n }\n const db = new Surreal();\n try {\n await db.connect(url, { reconnect: false });\n await db.signin({ username, password });\n await db.close();\n return;\n } catch {\n await db.close().catch(() => {});\n await sleep(100);\n }\n }\n throw new Error(\"surreal did not become ready within 15s\");\n}\n\n/**\n * Spawn an ephemeral in-memory SurrealDB using the local `surreal` binary — for `schemic check`'s\n * migration replay. It runs on the user's EXACT SurrealDB version, needs no external server, and\n * never touches their data. Capabilities are fully allowed (`--allow-all`): it's a throwaway\n * instance running the user's own schema, so asserts/defaults/scripted functions all work. The\n * caller must `stop()` it (a `process.exit` hook is also registered as a backstop).\n */\nexport async function spawnEphemeralServer(\n bin = \"surreal\",\n): Promise<EphemeralServer> {\n const port = await freePort();\n const username = \"root\";\n const password = \"root\";\n const child = spawn(\n bin,\n [\n \"start\",\n \"--bind\",\n `127.0.0.1:${port}`,\n \"--username\",\n username,\n \"--password\",\n password,\n \"--allow-all\",\n \"memory\",\n ],\n { stdio: [\"ignore\", \"ignore\", \"pipe\"] },\n );\n let stderr = \"\";\n child.stderr?.on(\"data\", (d) => {\n stderr += String(d);\n });\n\n let stopped = false;\n const stop = (): Promise<void> =>\n new Promise((resolve) => {\n if (stopped || child.exitCode !== null) {\n stopped = true;\n return resolve();\n }\n stopped = true;\n child.once(\"exit\", () => resolve());\n child.kill(\"SIGTERM\");\n // Hard-kill if it doesn't exit promptly.\n setTimeout(() => child.kill(\"SIGKILL\"), 2000).unref?.();\n });\n // Backstop: don't leak the process if the CLI exits abnormally.\n const onExit = () => {\n if (!stopped) child.kill(\"SIGKILL\");\n };\n process.once(\"exit\", onExit);\n\n const url = `ws://127.0.0.1:${port}/rpc`;\n try {\n await waitUntilReady(url, username, password, child, () => stderr);\n } catch (e) {\n await stop();\n throw e;\n }\n return { url, username, password, stop };\n}\n\nexport interface EmbeddedConnection {\n db: Surreal;\n /** A display label for the engine, e.g. `embedded memory`. */\n url: string;\n stop: () => Promise<void>;\n}\n\n/**\n * Connect to an EMBEDDED in-process SurrealDB via the optional `@surrealdb/node` package, selecting\n * the `cfg.backend` storage and passing `cfg` (capabilities, timeouts, …) straight to\n * `createNodeEngines`. Creates/selects the given namespace/database so the replay can run. The\n * package is imported lazily (a non-literal specifier) so it's never required unless this engine is\n * used; a clear error tells the user to install it otherwise.\n */\nexport async function connectEmbedded(\n cfg: SurrealZodCheckEmbedded,\n namespace: string,\n database: string,\n): Promise<EmbeddedConnection> {\n // Non-literal specifier so tsc/bundlers don't treat `@surrealdb/node` as a hard dependency.\n const pkg: string = \"@surrealdb/node\";\n let createNodeEngines: ((options?: unknown) => unknown) | undefined;\n try {\n const mod = (await import(pkg)) as {\n createNodeEngines?: (options?: unknown) => unknown;\n };\n createNodeEngines = mod.createNodeEngines;\n } catch {\n createNodeEngines = undefined;\n }\n if (!createNodeEngines) {\n throw new Error(\n 'check.engine embedded mode needs `@surrealdb/node` — install it (e.g. `npm i -D @surrealdb/node`), or use a string engine (\"auto\" / \"binary\" / \"remote\").',\n );\n }\n\n const backend = cfg.backend ?? \"memory\";\n const scheme = backend === \"memory\" ? \"mem\" : backend;\n const url = `${scheme}://${cfg.path ?? \"\"}`;\n const engines = createNodeEngines({\n capabilities: cfg.capabilities ?? true,\n strict: cfg.strict,\n query_timeout: cfg.query_timeout,\n transaction_timeout: cfg.transaction_timeout,\n });\n // biome-ignore lint/suspicious/noExplicitAny: the SDK's `engines` option is loosely typed here.\n const db = new Surreal({ engines } as any);\n await db.connect(url);\n await db.query(`DEFINE NAMESPACE IF NOT EXISTS ${escapeIdent(namespace)}`);\n await db.use({ namespace });\n await db.query(`DEFINE DATABASE IF NOT EXISTS ${escapeIdent(database)}`);\n await db.use({ namespace, database });\n return {\n db,\n url: `embedded ${backend}`,\n stop: async () => {\n await db.close().catch(() => {});\n },\n };\n}\n","import { readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { Diff, ResolvedConfig } from \"@schemic/core\";\nimport {\n type Filter,\n listMigrations,\n loadDefs,\n parseFilter,\n} from \"@schemic/core\";\nimport { escapeIdent, type Surreal } from \"surrealdb\";\nimport type { SurrealParams } from \"../config\";\nimport { type DefineStatement, overwriteStatement } from \"../ddl\";\nimport { normalizeDb } from \"./struct\";\nimport {\n type DbStructured,\n introspectStructured,\n type Snapshot,\n structuredSnapshot,\n} from \"./structure\";\nimport { buildSnapshot, diffSnapshots } from \"./surreal-diff\";\nimport { filterSnapshot, filterStructured } from \"./surreal-filter\";\n\nconst SHADOW_DB = \"__surreal_zod_shadow\";\nconst SHADOW_MIG_DB = \"__surreal_zod_shadow_mig\";\n\n// Apply order: tables, then fields, then indexes.\nconst RANK: Record<DefineStatement[\"kind\"], number> = {\n analyzer: 0, // db-level; defined first (a FULLTEXT index references its analyzer)\n function: 0, // db-level; defined first (tables/events may reference fn::…)\n table: 1,\n field: 2,\n index: 3,\n event: 4,\n access: 5, // db-level; defined last (SIGNUP/SIGNIN reference tables)\n};\nconst byCreate = (a: DefineStatement, b: DefineStatement) =>\n RANK[a.kind] - RANK[b.kind];\n\n/**\n * Read the live database into a snapshot of **canonical** DDL, skipping `exclude`d tables. Uses\n * `INFO … STRUCTURE` and rebuilds each object's DDL deterministically (see `structuredSnapshot`),\n * so equivalent schemas compare equal regardless of SurrealDB's formatting (e.g. union order).\n */\nexport async function introspect(\n db: Surreal,\n exclude: Set<string> = new Set(),\n): Promise<Snapshot> {\n return structuredSnapshot(await introspectStructured(db, exclude));\n}\n\n/**\n * Apply `ddl` to a fresh scratch database, introspect it back to a canonical snapshot, then drop it\n * (restoring the original namespace/database). Normalizes a desired schema THROUGH SurrealDB so the\n * comparison is free of formatting noise. Used by both `diff --live` and `verify`.\n */\nasync function applyToShadow(\n db: Surreal,\n config: ResolvedConfig,\n shadowDb: string,\n ddl: string,\n): Promise<Snapshot> {\n const { namespace, database } = config.params as unknown as SurrealParams;\n await db.query(`REMOVE DATABASE IF EXISTS ${escapeIdent(shadowDb)};`);\n await db.query(`DEFINE DATABASE ${escapeIdent(shadowDb)};`);\n try {\n await db.use({ namespace, database: shadowDb });\n if (ddl) await db.query(`BEGIN;\\n${ddl}\\nCOMMIT;`);\n return await introspect(db);\n } finally {\n await db.use({ namespace, database });\n await db.query(`REMOVE DATABASE IF EXISTS ${escapeIdent(shadowDb)};`);\n }\n}\n\n/**\n * Apply `ddl` to a fresh scratch database and return its STRUCTURED introspection (the Struct-IR\n * form, not the canonical-DDL snapshot), then drop it. Backs `diff --ts`'s desired (schema) side —\n * normalizing the schema THROUGH SurrealDB so it lands in the same form INFO returns for the live DB.\n */\nexport async function shadowStructured(\n db: Surreal,\n config: ResolvedConfig,\n ddl: string,\n): Promise<DbStructured> {\n const { namespace, database } = config.params as unknown as SurrealParams;\n await db.query(`REMOVE DATABASE IF EXISTS ${escapeIdent(SHADOW_DB)};`);\n await db.query(`DEFINE DATABASE ${escapeIdent(SHADOW_DB)};`);\n try {\n await db.use({ namespace, database: SHADOW_DB });\n if (ddl) await db.query(`BEGIN;\\n${ddl}\\nCOMMIT;`);\n return await introspectStructured(db);\n } finally {\n await db.use({ namespace, database });\n await db.query(`REMOVE DATABASE IF EXISTS ${escapeIdent(SHADOW_DB)};`);\n }\n}\n\n/**\n * The two sides of `diff --ts --live` as normalized Struct-IR: the live database (`current`) and\n * the declared schema (`desired`, normalized THROUGH SurrealDB via a shadow apply). Both go through\n * the same normalize, so an unchanged schema yields deep-equal structs. The caller renders them.\n */\nexport async function tsStructsAgainstDb(\n db: Surreal,\n config: ResolvedConfig,\n filter: Filter = parseFilter({}),\n): Promise<{ current: DbStructured; desired: DbStructured }> {\n const exclude = new Set([\n config.migrationsTable,\n `${config.migrationsTable}_lock`,\n ]);\n const target = await introspectStructured(db, exclude);\n const { tables, defs } = await loadDefs(config.schemaPath);\n const ddl = Object.values(buildSnapshot(tables, defs).statements)\n .sort(byCreate)\n .map((s) => s.ddl)\n .join(\"\\n\");\n const desired = await shadowStructured(db, config, ddl);\n const norm = (d: DbStructured) => normalizeDb(filterStructured(d, filter));\n return { current: norm(target), desired: norm(desired) };\n}\n\n/**\n * Replay every migration (direction `up`) from zero into a fresh scratch database, introspect the\n * result, then drop it. Surfaces the offending migration if one fails to apply.\n */\nasync function replayMigrations(\n db: Surreal,\n config: ResolvedConfig,\n shadowDb: string,\n onApply?: (tag: string) => void,\n): Promise<Snapshot> {\n const { namespace, database } = config.params as unknown as SurrealParams;\n await db.query(`REMOVE DATABASE IF EXISTS ${escapeIdent(shadowDb)};`);\n await db.query(`DEFINE DATABASE ${escapeIdent(shadowDb)};`);\n try {\n await db.use({ namespace, database: shadowDb });\n for (const m of listMigrations(config.migrationsDir)) {\n onApply?.(m.tag);\n const sql = readFileSync(join(config.migrationsDir, m.file), \"utf8\");\n try {\n await db.query(sql, { direction: \"up\" });\n } catch (e) {\n throw new Error(\n `migration ${m.tag} failed to replay: ${(e as Error).message.split(\"\\n\")[0]}`,\n );\n }\n }\n return await introspect(db);\n } finally {\n await db.use({ namespace, database });\n await db.query(`REMOVE DATABASE IF EXISTS ${escapeIdent(shadowDb)};`);\n }\n}\n\n/**\n * Verify that replaying every migration from zero reconstructs the declared schema — the only check\n * that catches \"the sum of the migrations no longer equals the schema\" (a hand-edited migration, or\n * a schema change someone forgot to `schemic gen`). Replays the migrations into one scratch DB and applies\n * the current schema into another, then diffs the two introspected snapshots; since BOTH sides are\n * normalized through SurrealDB (`INFO`), only genuine drift shows up. An empty diff means they agree.\n * `up` is what the migrations are missing relative to the schema. Needs root/namespace auth.\n */\nexport async function verifyMigrations(\n db: Surreal,\n config: ResolvedConfig,\n filter: Filter = parseFilter({}),\n onApply?: (tag: string) => void,\n): Promise<Diff> {\n const migrated = await replayMigrations(db, config, SHADOW_MIG_DB, onApply);\n const { tables, defs } = await loadDefs(config.schemaPath);\n const ddl = Object.values(buildSnapshot(tables, defs).statements)\n .sort(byCreate)\n .map((s) => s.ddl)\n .join(\"\\n\");\n const desired = await applyToShadow(db, config, SHADOW_DB, ddl);\n return diffSnapshots(\n filterSnapshot(migrated, filter),\n filterSnapshot(desired, filter),\n );\n}\n\n/**\n * Diff the current schemas against the **live database**. Both sides are normalized through\n * SurrealDB — the target via `INFO`, the desired by applying the schema to a temporary shadow\n * database and reading IT back — so the comparison is free of formatting noise. The shadow\n * database is created and dropped in the target's namespace (needs root/namespace auth).\n */\nexport async function diffAgainstDb(\n db: Surreal,\n config: ResolvedConfig,\n filter: Filter = parseFilter({}),\n): Promise<Diff> {\n // Exclude the CLI's own bookkeeping tables — they're not part of the schema (pull excludes\n // them too); otherwise `diff --live`/`sync` always report dropping `_migrations_lock`.\n const target = await introspect(\n db,\n new Set([config.migrationsTable, `${config.migrationsTable}_lock`]),\n );\n\n const { tables, defs } = await loadDefs(config.schemaPath);\n const schema = buildSnapshot(tables, defs);\n const ddl = Object.values(schema.statements)\n .sort(byCreate)\n .map((s) => s.ddl)\n .join(\"\\n\");\n const desired = await applyToShadow(db, config, SHADOW_DB, ddl);\n\n // up = statements that would bring the live database in line with the schema. The filter drops\n // both sides' excluded kinds (access is off by default) so they're neither applied nor pruned.\n const diff = diffSnapshots(\n filterSnapshot(target, filter),\n filterSnapshot(desired, filter),\n );\n\n // Access is COMPARED via its canonical form (the signing key is redacted identically on both\n // sides, so no false diff), but that form can't be APPLIED — the redacted KEY is gone. Swap in\n // the schema's emit DDL (which carries the key) for any DEFINE ACCESS in the apply plan.\n const accessEmit = new Map<string, string>();\n for (const s of Object.values(schema.statements))\n if (s.kind === \"access\") accessEmit.set(s.name, s.ddl);\n if (accessEmit.size) {\n const swap = (stmt: string): string => {\n const m = /^DEFINE ACCESS (OVERWRITE )?(\\S+)/.exec(stmt);\n const emit = m && accessEmit.get(m[2]);\n return emit ? (m[1] ? overwriteStatement(emit) : emit) : stmt;\n };\n diff.up = diff.up.map(swap);\n }\n\n // Implicit-wildcard fields (the `.*` element of an `array<object>`/`set<object>`, etc.) are\n // auto-created when their parent field is defined, so the emitter marks them `DEFINE FIELD\n // OVERWRITE`. The INFO-canonical diff form drops that OVERWRITE, so applying it to the live DB\n // fails \"already exists\" and aborts the whole `push`/`sync` transaction. Re-mark exactly those\n // fields OVERWRITE in the apply plan — the comparison form above is untouched.\n const untick = (s: string) => s.replace(/`/g, \"\");\n const overwriteFields = new Set<string>();\n for (const s of Object.values(schema.statements))\n if (\n s.kind === \"field\" &&\n s.table &&\n /^DEFINE FIELD OVERWRITE\\b/.test(s.ddl)\n )\n overwriteFields.add(`${s.table}\u0000${untick(s.name)}`);\n if (overwriteFields.size) {\n const fieldRef =\n /^DEFINE FIELD (?:OVERWRITE |IF NOT EXISTS )?(`[^`]+`|\\S+) ON TABLE (`[^`]+`|\\S+)/;\n diff.up = diff.up.map((stmt) => {\n const m = fieldRef.exec(stmt);\n return m && overwriteFields.has(`${untick(m[2])}\u0000${untick(m[1])}`)\n ? overwriteStatement(stmt)\n : stmt;\n });\n }\n return diff;\n}\n\n/**\n * The statements that would reconcile the live database with the schema (the `diff --live`\n * forward changes). With `prune: false`, drops (`REMOVE`) are excluded so existing extras\n * are kept. Run through `applyStatements` to apply.\n */\nexport function syncPlan(diff: Diff, prune?: boolean): string[] {\n return prune === false\n ? diff.up.filter((s) => !s.startsWith(\"REMOVE\"))\n : diff.up;\n}\n\n/** Apply a set of statements to the database in a single transaction. */\nexport async function applyStatements(\n db: Surreal,\n stmts: string[],\n): Promise<void> {\n if (stmts.length) await db.query(`BEGIN;\\n${stmts.join(\"\\n\")}\\nCOMMIT;`);\n}\n","import { BoundQuery, escapeIdent, toSurqlString } from \"surrealdb\";\nimport type { z } from \"zod\";\nimport {\n type AccessDef,\n type AnalyzerDef,\n type Expr,\n type FieldPermissions,\n type FunctionDef,\n objectFieldsRegistry,\n type PermOp,\n type SField,\n type Shape,\n type StandaloneDef,\n type SurrealMeta,\n surrealTypeRegistry,\n type TableDef,\n type TableEvent,\n type TablePermissions,\n} from \"./pure\";\n\n/** Inline a BoundQuery's bindings into a literal SurrealQL string for DDL use. Exported so the\n * Struct-IR lowering (`fromTableDef`) renders DEFAULT/VALUE/COMPUTED/permission exprs identically. */\nexport function inline(query: BoundQuery): string {\n let out = query.query;\n for (const [name, value] of Object.entries(query.bindings ?? {})) {\n out = out.replaceAll(`$${name}`, toSurqlString(value));\n }\n return out.trim();\n}\n\n/**\n * The bare AND-joined `ASSERT` expression (no `ASSERT ` keyword): inline any `BoundQuery` entries\n * (custom `surql` asserts), keep strings (computed checks) as-is, dedupe while preserving order,\n * and AND-join. Each fragment is already a complete boolean expr. Returns \"\" when there are none.\n * Exported so the Struct-IR lowering (`fromTableDef`) can populate `StructField.assert` (the bare\n * expr) while the DDL emitter prepends the `ASSERT ` keyword via {@link renderAsserts}.\n */\nexport function assertExpr(asserts: SurrealMeta[\"asserts\"]): string {\n if (!asserts?.length) return \"\";\n const frags: string[] = [];\n for (const a of asserts) {\n const frag = a instanceof BoundQuery ? inline(a) : a;\n if (frag && !frags.includes(frag)) frags.push(frag);\n }\n return frags.join(\" AND \");\n}\n\n/** The full `ASSERT <expr>` clause for the DDL emitter (or \"\" when there are no fragments). */\nfunction renderAsserts(asserts: SurrealMeta[\"asserts\"]): string {\n const expr = assertExpr(asserts);\n return expr ? `ASSERT ${expr}` : \"\";\n}\n\n/** Read a Zod schema's internal def with a loose type for traversal. */\nfunction zdef(schema: z.ZodType): { type: string; [k: string]: unknown } {\n return schema._zod.def as unknown as { type: string; [k: string]: unknown };\n}\n\n/** Format a literal value as a SurrealQL literal type (e.g. `'admin'`, `42`). */\nfunction surqlLiteral(value: unknown): string {\n if (typeof value === \"string\") return JSON.stringify(value);\n if (\n typeof value === \"number\" ||\n typeof value === \"boolean\" ||\n typeof value === \"bigint\"\n ) {\n return String(value);\n }\n return toSurqlString(value).replace(/^s\"/, '\"');\n}\n\n/**\n * The SurrealQL type of a field plus any nested fields it expands into:\n * object subfields (`path.key`) and array/record element fields (`path.*`).\n * Exported (with {@link inferField}) so the Struct-IR lowering walks the SAME child tree the\n * emitter does — so the two can't disagree on type strings or dotted field paths.\n */\nexport interface FieldInfo {\n type: string;\n flexible: boolean;\n children: { suffix: string; info: FieldInfo; surreal?: SurrealMeta }[];\n}\nconst leaf = (type: string): FieldInfo => ({\n type,\n flexible: false,\n children: [],\n});\n\n/** Infer a field's SurrealQL type + nested structure from a Zod schema. Exported so the Struct-IR\n * lowering (`fromTableDef`) and the emitter share one source of truth for type strings + paths. */\nexport function inferField(\n schema: z.ZodType,\n seen: Set<z.ZodType> = new Set(),\n): FieldInfo {\n // Surreal-native schemas (datetime, recordId) carry their type explicitly.\n const explicit = surrealTypeRegistry.get(schema);\n if (explicit) return leaf(explicit);\n\n const def = zdef(schema);\n switch (def.type) {\n case \"string\":\n return leaf(\"string\");\n case \"number\": {\n // z.int/int32/uint32/float64 share def.type \"number\"; the format discriminates.\n const fmt = def.format as string | undefined;\n if (fmt?.includes(\"float\")) return leaf(\"float\");\n if (fmt?.includes(\"int\")) return leaf(\"int\");\n return leaf(\"number\");\n }\n case \"bigint\":\n return leaf(\"int\");\n case \"boolean\":\n return leaf(\"bool\");\n case \"date\":\n return leaf(\"datetime\");\n case \"any\":\n case \"unknown\":\n return leaf(\"any\");\n case \"null\":\n return leaf(\"null\");\n\n // No SurrealQL mapping — these exist on `s.*` only for drop-in `z.*` parity, and are\n // rejected when used as a table field. (Registered native types — datetime/uuid/record/…\n // — are caught by the `surrealTypeRegistry` check at the top, so they never reach here.)\n case \"symbol\":\n case \"undefined\":\n case \"void\":\n case \"never\":\n case \"nan\":\n case \"function\":\n case \"promise\":\n case \"custom\":\n throw new Error(\n `s.${def.type}() has no SurrealQL type and can't be used as a table field. ` +\n `Use a Surreal-native builder (e.g. s.string / s.int / s.datetime / s.uuid / ` +\n `s.recordId) instead, or keep this schema out of your table definitions.`,\n );\n\n case \"optional\":\n case \"default\":\n case \"prefault\": {\n const inner = inferField(def.innerType as z.ZodType, seen);\n // `any` already admits NONE/NULL, so `option<any>` is invalid SurrealQL — leave it as `any`.\n if (inner.type === \"any\") return inner;\n return { ...inner, type: `option<${inner.type}>` };\n }\n case \"nullable\": {\n const inner = inferField(def.innerType as z.ZodType, seen);\n if (inner.type === \"any\") return inner; // `any` already includes null\n // Fold null INTO an existing option<X> so .optional().nullable() matches\n // .nullish()/.nullable().optional(): option<X> | null -> option<X | null>.\n if (inner.type.startsWith(\"option<\") && inner.type.endsWith(\">\")) {\n const x = inner.type.slice(\"option<\".length, -1);\n return { ...inner, type: `option<${x} | null>` };\n }\n return { ...inner, type: `${inner.type} | null` };\n }\n case \"readonly\":\n case \"catch\": // app-side error recovery — the stored type is the inner type\n return inferField(def.innerType as z.ZodType, seen);\n case \"pipe\": // a codec with no explicit type — use its encoded (wire) side\n return inferField(def.in as z.ZodType, seen);\n\n case \"lazy\": {\n // Track the lazy schema itself: its getter returns a fresh instance each call,\n // but the recursive reference reuses the same lazy node.\n if (seen.has(schema)) return leaf(\"any\");\n seen.add(schema);\n const info = inferField((def.getter as () => z.ZodType)(), seen);\n seen.delete(schema);\n return info;\n }\n\n case \"object\": {\n const shape = def.shape as Record<string, z.ZodType>;\n const fields = objectFieldsRegistry.get(schema); // SField shape if built via s.object\n const catchall = def.catchall as z.ZodType | undefined;\n const flexible = !!catchall && zdef(catchall).type === \"unknown\";\n const children = Object.entries(shape).map(([key, value]) => ({\n suffix: `.${escapeIdent(key)}`,\n info: inferField(value, seen),\n surreal: fields?.[key]?.surreal,\n }));\n return { type: \"object\", flexible, children };\n }\n\n case \"intersection\": {\n const left = inferField(def.left as z.ZodType, seen);\n const right = inferField(def.right as z.ZodType, seen);\n if (left.type === \"object\" && right.type === \"object\") {\n const merged = new Map(left.children.map((c) => [c.suffix, c]));\n for (const c of right.children) merged.set(c.suffix, c); // right wins on overlap\n return {\n type: \"object\",\n flexible: left.flexible || right.flexible,\n children: [...merged.values()],\n };\n }\n return leaf(\"any\");\n }\n\n case \"array\":\n case \"set\": {\n const elem = inferField(\n (def.element ?? def.valueType) as z.ZodType,\n seen,\n );\n // Element subfields live under `path.*`, but only when the element is structured.\n const children =\n elem.children.length > 0 || elem.type === \"object\"\n ? [{ suffix: \".*\", info: elem }]\n : [];\n // `set<T>` is distinct from `array<T>` in SurrealDB (dedup) and round-trips — preserve it.\n const kw = def.type === \"set\" ? \"set\" : \"array\";\n // `array<T, N>` / `set<T, N>` — N is a MAX size from a Zod `.max()` check\n // (`max_length` on arrays, `max_size` on sets). No min in the SurrealQL form.\n const checks =\n (\n def as {\n checks?: {\n _zod?: { def?: { check?: string; maximum?: number } };\n }[];\n }\n ).checks ?? [];\n const maximum = checks\n .map((c) => c._zod?.def)\n .find(\n (d) => d?.check === \"max_length\" || d?.check === \"max_size\",\n )?.maximum;\n const size = typeof maximum === \"number\" ? `, ${maximum}` : \"\";\n return { type: `${kw}<${elem.type}${size}>`, flexible: false, children };\n }\n\n case \"record\":\n case \"map\": {\n const value = inferField(def.valueType as z.ZodType, seen);\n return {\n type: \"object\",\n flexible: false,\n children: [{ suffix: \".*\", info: value }],\n };\n }\n\n case \"union\": {\n const opts = (def.options ?? []) as z.ZodType[];\n // A `none`-ish member (z.undefined()/z.void()) makes the union optional: `T | none` -> `option<T>`.\n const noneish = (o: z.ZodType) => {\n const t = zdef(o).type;\n return t === \"undefined\" || t === \"void\";\n };\n const hasNone = opts.some(noneish);\n const types = [\n ...new Set(\n opts.filter((o) => !noneish(o)).map((o) => inferField(o, seen).type),\n ),\n ];\n // `any` absorbs every other member (including none) — `any | string` is invalid → `any`.\n if (types.includes(\"any\")) return leaf(\"any\");\n const joined = types.join(\" | \") || \"any\";\n if (hasNone) return leaf(joined === \"any\" ? \"any\" : `option<${joined}>`);\n return leaf(joined);\n }\n case \"enum\": {\n const entries = (def.entries ?? {}) as Record<string, string | number>;\n // Drop TS numeric-enum reverse mappings (name->number); keep the real values.\n const values = Object.values(entries).filter(\n (v) => typeof entries[v as string] !== \"number\",\n );\n const types = [...new Set(values.map(surqlLiteral))];\n return leaf(types.join(\" | \") || \"any\");\n }\n case \"literal\": {\n const values = (def.values ?? []) as unknown[];\n const types = [...new Set(values.map(surqlLiteral))];\n return leaf(types.join(\" | \") || \"any\");\n }\n case \"tuple\": {\n if (def.rest) return leaf(\"array\"); // variadic tuple -> generic array\n const items = (def.items ?? []) as z.ZodType[];\n return leaf(`[${items.map((i) => inferField(i, seen).type).join(\", \")}]`);\n }\n\n default:\n return leaf(\"any\");\n }\n}\n\n/** DDL generation options. `exists: \"overwrite\"` -> OVERWRITE; \"ignore\" -> IF NOT EXISTS. */\nexport type DefineOptions = { exists?: \"overwrite\" | \"ignore\" };\n\nfunction existsPrefix(opts?: DefineOptions): string {\n return opts?.exists === \"overwrite\"\n ? \"OVERWRITE \"\n : opts?.exists === \"ignore\"\n ? \"IF NOT EXISTS \"\n : \"\";\n}\n\n/**\n * Render a `PERMISSIONS …` clause for a table or field from a permissions spec. `ops` is\n * the canonical op set: `[\"select\",\"create\",\"update\",\"delete\"]` for tables,\n * `[\"select\",\"create\",\"update\"]` for fields (fields have no `delete`).\n *\n * - `true` -> `PERMISSIONS FULL`\n * - `false` -> `PERMISSIONS NONE`\n * - a `BoundQuery` -> every op shares it: `PERMISSIONS FOR <all ops> WHERE <expr>`\n * - an object -> 1. resolve each present op to a concrete rule (`boolean | BoundQuery`);\n * a `` `same as X` `` reuses X's resolved rule (errors if X is absent or on a cycle).\n * 2. merge ops whose resolved rule is identical (booleans by `===`, BoundQuery by its\n * `inline()`-ed string) into one `FOR a, b … <rule>` clause, in canonical op order.\n *\n * Omitted ops emit nothing — and the SurrealDB defaults for an omitted op are intentionally\n * ASYMMETRIC: a TABLE defaults it to NONE (deny), a FIELD defaults it to FULL (the table is\n * the gate). So to lock a field op you must set it `false` explicitly.\n */\nexport function renderPermissions(\n spec: TablePermissions | FieldPermissions,\n ops: readonly PermOp[],\n): string {\n if (spec === true) return \"PERMISSIONS FULL\";\n if (spec === false) return \"PERMISSIONS NONE\";\n if (spec instanceof BoundQuery)\n return `PERMISSIONS FOR ${ops.join(\", \")} WHERE ${inline(spec)}`;\n\n const rules = spec as Partial<Record<PermOp, boolean | BoundQuery | string>>;\n const present = ops.filter((op) => rules[op] !== undefined);\n const resolved = new Map<PermOp, boolean | BoundQuery>();\n\n // Resolve an op's rule, following `same as X` references; `chain` detects cycles.\n const resolve = (op: PermOp, chain: PermOp[]): boolean | BoundQuery => {\n const cached = resolved.get(op);\n if (cached !== undefined) return cached;\n const rule = rules[op];\n if (rule === undefined) {\n throw new Error(\n `PERMISSIONS: \"same as ${op}\" references op \"${op}\", which is not in the spec`,\n );\n }\n if (chain.includes(op)) {\n throw new Error(\n `PERMISSIONS: \"same as\" reference cycle: ${[...chain, op].join(\" -> \")}`,\n );\n }\n const value =\n typeof rule === \"string\"\n ? resolve(rule.slice(\"same as \".length).trim() as PermOp, [\n ...chain,\n op,\n ])\n : rule;\n resolved.set(op, value);\n return value;\n };\n\n // Group present ops by their resolved rule's clause body (canonical order preserved).\n const groups = new Map<string, PermOp[]>();\n for (const op of present) {\n const rule = resolve(op, []);\n const body =\n rule === true\n ? \"FULL\"\n : rule === false\n ? \"NONE\"\n : `WHERE ${inline(rule)}`;\n const group = groups.get(body);\n if (group) group.push(op);\n else groups.set(body, [op]);\n }\n const clauses = [...groups].map(\n ([body, group]) => `FOR ${group.join(\", \")} ${body}`,\n );\n return clauses.length ? `PERMISSIONS ${clauses.join(\" \")}` : \"\";\n}\n\n/**\n * One generated DDL statement, tied to the schema object it defines. `kind` is the object\n * kind; `name` identifies it within its scope (a table name, or a field path like\n * `settings.theme` / `tags.*`, already escaped as it appears in the DDL); `table` is the\n * owning table for fields. Used by the CLI's migration diff to add/change/remove objects\n * individually. `emitTable`/`emitField` are the string-joined views of these.\n */\nexport interface DefineStatement {\n kind:\n | \"table\"\n | \"field\"\n | \"index\"\n | \"event\"\n | \"function\"\n | \"access\"\n | \"analyzer\";\n name: string;\n table?: string;\n ddl: string;\n /**\n * Rendered clause fragments keyed by clause name (`TYPE`, `DEFAULT`, `ASSERT`, …) — only on\n * `field`/`table` statements. Each value is the exact fragment used in the DDL, which is also\n * the `ALTER … <set>` form, so the migration engine can compute a clause-level delta without\n * parsing SurrealQL. Absent on older snapshots (those changes fall back to `OVERWRITE`).\n */\n clauses?: Record<string, string>;\n}\n\n/** The SurrealQL type of a field schema (e.g. `string`, `option<int>`, `record<user>`). */\nexport function fieldType(field: SField): string {\n return inferField(field.schema).type;\n}\n\n/** Inline a single event clause (`when`/one `then`): a `BoundQuery` is inlined, a string passes\n * through. Exported so the Struct-IR lowering renders event/permission exprs identically. */\nexport function eventClause(e: Expr): string {\n return e instanceof BoundQuery ? inline(e) : e;\n}\n\n/** A `{ … }` block body — wraps a bare statement list in braces; a `surql\\`{ … }\\`` passes through.\n * Exported so the Struct-IR lowering renders function/access blocks to match INFO's `{ … }` form. */\nexport function braceBody(e: Expr): string {\n const s = eventClause(e).trim();\n return s.startsWith(\"{\") ? s : `{ ${s} }`;\n}\n\n/** `DEFINE EVENT <name> ON TABLE <table> [WHEN <when>] THEN <then>`. Multiple `then`s run in order. */\nfunction emitEvent(\n table: string,\n ev: TableEvent,\n opts?: DefineOptions,\n): string {\n const parts = [\n `DEFINE EVENT ${existsPrefix(opts)}${escapeIdent(ev.name)} ON TABLE ${escapeIdent(table)}`,\n ];\n if (ev.when !== undefined) parts.push(`WHEN ${eventClause(ev.when)}`);\n const thens = (Array.isArray(ev.then) ? ev.then : [ev.then]).map(eventClause);\n // One `THEN` rides bare; several are parenthesized so the comma list parses unambiguously.\n parts.push(\n `THEN ${thens.length === 1 ? thens[0] : thens.map((t) => `(${t})`).join(\", \")}`,\n );\n return `${parts.join(\" \")};`;\n}\n\n/** `DEFINE FUNCTION fn::<name>(<args>) [-> <returns>] { <body> } [PERMISSIONS …] [COMMENT …]`. */\nfunction emitFunction(fn: FunctionDef, opts?: DefineOptions): string {\n if (fn.config.body === undefined) {\n throw new Error(\n `function fn::${fn.name} has no body — call .body(surql\\`…\\`)`,\n );\n }\n const args = Object.entries(fn.args)\n .map(([n, f]) => `$${n}: ${fieldType(f)}`)\n .join(\", \");\n const parts = [\n `DEFINE FUNCTION ${existsPrefix(opts)}fn::${escapeIdent(fn.name)}(${args})`,\n ];\n if (fn.config.returns) parts.push(`-> ${fieldType(fn.config.returns)}`);\n parts.push(braceBody(fn.config.body));\n const p = fn.config.permissions;\n if (p !== undefined) {\n parts.push(\n p === true\n ? \"PERMISSIONS FULL\"\n : p === false\n ? \"PERMISSIONS NONE\"\n : `PERMISSIONS ${eventClause(p)}`,\n );\n }\n if (fn.config.comment)\n parts.push(`COMMENT ${JSON.stringify(fn.config.comment)}`);\n return `${parts.join(\" \")};`;\n}\n\n/** `DEFINE ACCESS <name> ON <DATABASE|NAMESPACE> TYPE <RECORD|JWT|BEARER> … [DURATION …]`. */\nfunction emitAccess(a: AccessDef, opts?: DefineOptions): string {\n const on = a.config.on === \"namespace\" ? \"NAMESPACE\" : \"DATABASE\";\n const k = a.config.kind;\n let typeClause: string;\n if (k.type === \"bearer\") {\n typeClause = `TYPE BEARER FOR ${k.subject === \"user\" ? \"USER\" : \"RECORD\"}`;\n } else if (k.type === \"jwt\") {\n typeClause = k.url\n ? `TYPE JWT URL ${JSON.stringify(k.url)}`\n : `TYPE JWT ALGORITHM ${k.alg ?? \"HS512\"} KEY ${JSON.stringify(k.key ?? \"\")}`;\n } else {\n typeClause = \"TYPE RECORD\";\n }\n const parts = [\n `DEFINE ACCESS ${existsPrefix(opts)}${escapeIdent(a.name)} ON ${on} ${typeClause}`,\n ];\n // SIGNUP/SIGNIN/AUTHENTICATE only apply to RECORD access.\n if (k.type === \"record\") {\n if (a.config.signup) parts.push(`SIGNUP ${braceBody(a.config.signup)}`);\n if (a.config.signin) parts.push(`SIGNIN ${braceBody(a.config.signin)}`);\n if (a.config.authenticate)\n parts.push(`AUTHENTICATE ${braceBody(a.config.authenticate)}`);\n }\n const d = a.config.duration;\n if (d?.grant || d?.token || d?.session) {\n const fors: string[] = [];\n if (d.grant) fors.push(`FOR GRANT ${d.grant}`);\n if (d.token) fors.push(`FOR TOKEN ${d.token}`);\n if (d.session) fors.push(`FOR SESSION ${d.session}`);\n parts.push(`DURATION ${fors.join(\", \")}`);\n }\n return `${parts.join(\" \")};`;\n}\n\n/** `DEFINE ANALYZER <name> TOKENIZERS … [FILTERS …]`. Tokenizers/filters are uppercased to match\n * `INFO … STRUCTURE`, so an authored analyzer compares equal to the introspected one. */\nfunction emitAnalyzer(a: AnalyzerDef, opts?: DefineOptions): string {\n const toks = a.config.tokenizers.map((t) => t.toUpperCase()).join(\", \");\n let s = `DEFINE ANALYZER ${existsPrefix(opts)}${escapeIdent(a.name)} TOKENIZERS ${toks}`;\n if (a.config.filters?.length)\n s += ` FILTERS ${a.config.filters.map((f) => f.toUpperCase()).join(\", \")}`;\n return `${s};`;\n}\n\n/** The `DefineStatement` for a standalone def — `defineEvent`/`defineFunction`/`defineAccess`/`defineAnalyzer`. */\nexport function emitDefStatement(\n def: StandaloneDef,\n opts?: DefineOptions,\n): DefineStatement {\n if (def.kind === \"event\") {\n return {\n kind: \"event\",\n name: def.name,\n table: def.table,\n ddl: emitEvent(def.table, def, opts),\n };\n }\n if (def.kind === \"access\") {\n return { kind: \"access\", name: def.name, ddl: emitAccess(def, opts) };\n }\n if (def.kind === \"analyzer\") {\n return { kind: \"analyzer\", name: def.name, ddl: emitAnalyzer(def, opts) };\n }\n return { kind: \"function\", name: def.name, ddl: emitFunction(def, opts) };\n}\n\n/** Emit `DEFINE FIELD path ...` for a node, then recurse into its children. */\n/** A trivial array element is the plain auto-created form — no FLEXIBLE and no `$`-clauses. */\nfunction isTrivialElement(info: FieldInfo, surreal?: SurrealMeta): boolean {\n if (info.flexible) return false;\n if (!surreal) return true;\n return (\n !surreal.permissions &&\n !surreal.readonly &&\n !surreal.default &&\n !surreal.value &&\n !surreal.asserts?.length &&\n !surreal.comment &&\n !surreal.internal &&\n !surreal.index\n );\n}\n\nfunction emit(\n path: string,\n table: string,\n info: FieldInfo,\n surreal: SurrealMeta | undefined,\n opts: DefineOptions | undefined,\n out: DefineStatement[],\n forceOverwrite = false,\n): void {\n let type = info.type;\n // A DB-side DEFAULT/VALUE/COMPUTED means the column is always populated -> drop a leading option<>.\n if (\n (surreal?.default || surreal?.value || surreal?.computed) &&\n type.startsWith(\"option<\")\n ) {\n type = type.slice(\"option<\".length, -1);\n }\n // An array element is auto-created by SurrealDB, so a (kept) element DEFINE must OVERWRITE it.\n const prefix = forceOverwrite ? \"OVERWRITE \" : existsPrefix(opts);\n // Clause fragments keyed by clause name (insertion order == DDL order). Each fragment is also\n // the `ALTER FIELD … <set>` form, so the migration engine diffs clauses without parsing.\n const clauses: Record<string, string> = { TYPE: `TYPE ${type}` };\n if (info.flexible) clauses.FLEXIBLE = \"FLEXIBLE\";\n if (surreal?.reference) {\n let ref = \"REFERENCE\";\n const onDelete =\n surreal.reference === true ? undefined : surreal.reference.onDelete;\n if (onDelete !== undefined) {\n ref +=\n onDelete instanceof BoundQuery\n ? ` ON DELETE THEN ${inline(onDelete)}`\n : ` ON DELETE ${onDelete.toUpperCase()}`;\n }\n clauses.REFERENCE = ref;\n }\n if (surreal?.default) {\n clauses.DEFAULT = `DEFAULT ${surreal.defaultAlways ? \"ALWAYS \" : \"\"}${inline(surreal.default)}`;\n }\n if (surreal?.value) clauses.VALUE = `VALUE ${inline(surreal.value)}`;\n if (surreal?.computed)\n clauses.COMPUTED = `COMPUTED ${inline(surreal.computed)}`;\n const assertClause = renderAsserts(surreal?.asserts);\n if (assertClause) clauses.ASSERT = assertClause;\n if (surreal?.readonly) clauses.READONLY = \"READONLY\";\n if (surreal?.comment)\n clauses.COMMENT = `COMMENT ${JSON.stringify(surreal.comment)}`;\n // Internal fields still exist on the table (so SCHEMAFULL writes succeed) but grant\n // no record-user access — internal wins over any `$permissions` on the same field.\n if (surreal?.internal) {\n clauses.PERMISSIONS = \"PERMISSIONS NONE\";\n } else if (surreal?.permissions !== undefined) {\n const clause = renderPermissions(surreal.permissions, [\n \"select\",\n \"create\",\n \"update\",\n ]);\n if (clause) clauses.PERMISSIONS = clause;\n }\n const ddl = `DEFINE FIELD ${prefix}${path} ON TABLE ${escapeIdent(table)} ${Object.values(clauses).join(\" \")};`;\n out.push({ kind: \"field\", name: path, table, ddl, clauses });\n\n // A single-field index defined via `.index()` / `.unique()`.\n if (surreal?.index) {\n const idxName = `${table}_${path.replace(/[`]/g, \"\").replace(/[^a-zA-Z0-9]+/g, \"_\")}_idx`;\n const unique = surreal.index.unique ? \" UNIQUE\" : \"\";\n out.push({\n kind: \"index\",\n name: idxName,\n table,\n ddl: `DEFINE INDEX ${existsPrefix(opts)}${escapeIdent(idxName)} ON TABLE ${escapeIdent(table)} FIELDS ${path}${unique};`,\n });\n }\n\n // SurrealDB auto-creates an array's `.*` element from the `array<…>` type. A TRIVIAL element is\n // that exact form, so we skip its DEFINE (a plain one errors \"already exists\") and emit only its\n // sub-fields. A CUSTOMIZED element (FLEXIBLE / permissions / …) is emitted with OVERWRITE. Other\n // parents (an `object` map's `.*` value) are emitted normally.\n const isArray = /^(?:array|set)\\b/.test(info.type);\n for (const child of info.children) {\n const childPath = `${path}${child.suffix}`;\n if (isArray && child.suffix === \".*\") {\n if (isTrivialElement(child.info, child.surreal)) {\n for (const sub of child.info.children) {\n emit(\n `${childPath}${sub.suffix}`,\n table,\n sub.info,\n sub.surreal,\n opts,\n out,\n );\n }\n } else {\n emit(childPath, table, child.info, child.surreal, opts, out, true);\n }\n } else {\n emit(childPath, table, child.info, child.surreal, opts, out);\n }\n }\n}\n\n/** Structured `DEFINE FIELD` statements for a field (and its nested subfields). */\nexport function emitFieldStatements(\n name: string,\n table: string,\n field: SField,\n opts?: DefineOptions,\n): DefineStatement[] {\n const out: DefineStatement[] = [];\n let info: FieldInfo;\n try {\n info = inferField(field.schema);\n } catch (e) {\n // inferField only sees the schema; pin the failure to the field + table for the user.\n const msg = e instanceof Error ? e.message : String(e);\n throw new Error(`${msg} (field \"${name}\" on table \"${table}\")`);\n }\n emit(escapeIdent(name), table, info, field.surreal, opts, out);\n return out;\n}\n\n/** `DEFINE FIELD ...` for a field (and any nested object/array/record subfields). */\nexport function emitField(\n name: string,\n table: string,\n field: SField,\n opts?: DefineOptions,\n): string {\n return emitFieldStatements(name, table, field, opts)\n .map((s) => s.ddl)\n .join(\"\\n\");\n}\n\n/** Structured statements for a table: its `DEFINE TABLE` head, then one per (nested) field. */\nexport function emitStatements(\n t: TableDef<string, Shape>,\n opts?: DefineOptions,\n): DefineStatement[] {\n const rel = t.config.relation;\n // Surreal manages id (and in/out for relations) implicitly.\n const implicit = rel ? new Set([\"id\", \"in\", \"out\"]) : new Set([\"id\"]);\n let type: string;\n if (rel) {\n // Endpoints are optional: omit FROM/TO when unrestricted (`TYPE RELATION`).\n type = \"RELATION\";\n if (rel.from.length)\n type += ` FROM ${rel.from.map(escapeIdent).join(\" | \")}`;\n if (rel.to.length) type += ` TO ${rel.to.map(escapeIdent).join(\" | \")}`;\n if (rel.enforced) type += \" ENFORCED\";\n } else {\n type = t.config.type === \"any\" ? \"ANY\" : \"NORMAL\";\n }\n\n // Build clauses keyed by name (insertion order == DDL order) so the migration engine can diff\n // table-level changes into the `ALTER TABLE … <set>` form without parsing SurrealQL — the\n // stored fragment IS the ALTER set form, exactly as for fields.\n const clauses: Record<string, string> = { TYPE: `TYPE ${type}` };\n if (t.config.drop) clauses.DROP = \"DROP\";\n clauses.SCHEMA = t.config.schemafull ? \"SCHEMAFULL\" : \"SCHEMALESS\";\n // A pre-computed VIEW: `AS <SELECT …>` (the query is inlined like any other expression).\n if (t.config.view !== undefined)\n clauses.AS = `AS ${eventClause(t.config.view)}`;\n if (t.config.changefeed) {\n clauses.CHANGEFEED = `CHANGEFEED ${t.config.changefeed.expiry}${\n t.config.changefeed.includeOriginal ? \" INCLUDE ORIGINAL\" : \"\"\n }`;\n }\n if (t.config.comment)\n clauses.COMMENT = `COMMENT ${JSON.stringify(t.config.comment)}`;\n // Fold permissions into the single DEFINE TABLE head (no separate OVERWRITE … PERMISSIONS).\n if (t.config.permissions !== undefined) {\n const clause = renderPermissions(t.config.permissions, [\n \"select\",\n \"create\",\n \"update\",\n \"delete\",\n ]);\n if (clause) clauses.PERMISSIONS = clause;\n }\n\n const out: DefineStatement[] = [\n {\n kind: \"table\",\n name: t.name,\n ddl: `DEFINE TABLE ${existsPrefix(opts)}${escapeIdent(t.name)} ${Object.values(clauses).join(\" \")};`,\n clauses,\n },\n ];\n // A view's rows are computed from its query — it has no DEFINE FIELD statements.\n if (!t.config.view)\n for (const [name, field] of Object.entries(t.fields)) {\n if (implicit.has(name)) continue;\n out.push(...emitFieldStatements(name, t.name, field as SField, opts));\n }\n // Composite indexes declared via `.index(name, fields, …)`. A `count` index has no FIELDS.\n for (const idx of t.config.indexes ?? []) {\n let spec: string;\n if (idx.count) {\n spec = \"COUNT\";\n } else {\n spec = `FIELDS ${idx.fields.map(escapeIdent).join(\", \")}`;\n if (idx.unique) spec += \" UNIQUE\";\n if (idx.spec) spec += ` ${idx.spec}`; // HNSW/DISKANN/FULLTEXT\n }\n const comment = idx.comment\n ? ` COMMENT ${JSON.stringify(idx.comment)}`\n : \"\";\n out.push({\n kind: \"index\",\n name: idx.name,\n table: t.name,\n ddl: `DEFINE INDEX ${existsPrefix(opts)}${escapeIdent(idx.name)} ON TABLE ${escapeIdent(t.name)} ${spec}${comment};`,\n });\n }\n // Row-change events declared via `.event(name, { when?, then })`.\n for (const ev of t.config.events ?? []) {\n out.push({\n kind: \"event\",\n name: ev.name,\n table: t.name,\n ddl: emitEvent(t.name, ev, opts),\n });\n }\n return out;\n}\n\n/** `DEFINE TABLE ...` plus a `DEFINE FIELD` per field. */\nexport function emitTable(\n t: TableDef<string, Shape>,\n opts?: DefineOptions,\n): string {\n return emitStatements(t, opts)\n .map((s) => s.ddl)\n .join(\"\\n\");\n}\n\n/** The `REMOVE ...` statement that drops the object a `DefineStatement` defines. */\nexport function removeStatement(\n s: Pick<DefineStatement, \"kind\" | \"name\" | \"table\">,\n): string {\n if (s.kind === \"table\")\n return `REMOVE TABLE IF EXISTS ${escapeIdent(s.name)};`;\n if (s.kind === \"index\") {\n return `REMOVE INDEX IF EXISTS ${escapeIdent(s.name)} ON TABLE ${escapeIdent(s.table ?? \"\")};`;\n }\n if (s.kind === \"event\") {\n return `REMOVE EVENT IF EXISTS ${escapeIdent(s.name)} ON TABLE ${escapeIdent(s.table ?? \"\")};`;\n }\n if (s.kind === \"function\") {\n return `REMOVE FUNCTION IF EXISTS fn::${escapeIdent(s.name)};`;\n }\n if (s.kind === \"access\") {\n return `REMOVE ACCESS IF EXISTS ${escapeIdent(s.name)} ON DATABASE;`;\n }\n if (s.kind === \"analyzer\") {\n return `REMOVE ANALYZER IF EXISTS ${escapeIdent(s.name)};`;\n }\n return `REMOVE FIELD IF EXISTS ${s.name} ON TABLE ${escapeIdent(s.table ?? \"\")};`;\n}\n\n/** Inject `OVERWRITE` into a plain `DEFINE <kind> …` statement (idempotent re-definition). */\nexport function overwriteStatement(ddl: string): string {\n return ddl.replace(\n /^DEFINE (TABLE|FIELD|INDEX|EVENT|ANALYZER|ACCESS|PARAM|FUNCTION) (?!OVERWRITE\\b)/,\n \"DEFINE $1 OVERWRITE \",\n );\n}\n\n/** Canonical clause order for a deterministic `ALTER FIELD` body (matches the DDL order). */\nconst FIELD_CLAUSE_ORDER = [\n \"TYPE\",\n \"FLEXIBLE\",\n \"REFERENCE\",\n \"DEFAULT\",\n \"VALUE\",\n \"COMPUTED\",\n \"ASSERT\",\n \"READONLY\",\n \"COMMENT\",\n \"PERMISSIONS\",\n] as const;\n/** Clauses `ALTER FIELD` can `DROP` (remove). `PERMISSIONS` has no DROP (reset to FULL);\n * `COMPUTED` has no ALTER form at all (forces an OVERWRITE fallback). */\nconst FIELD_DROPPABLE = new Set([\n \"FLEXIBLE\",\n \"READONLY\",\n \"VALUE\",\n \"ASSERT\",\n \"DEFAULT\",\n \"COMMENT\",\n \"REFERENCE\",\n]);\n\n/**\n * Emit an `ALTER FIELD` that turns the `prev` clause set into `next` — re-set changed/added\n * clauses, `DROP` removed ones (a true delta). Returns `null` (the caller should fall back to\n * `DEFINE … OVERWRITE`) when the delta touches a clause `ALTER FIELD` can't express (`COMPUTED`),\n * or when clause data is unavailable (e.g. an older snapshot without `clauses`).\n */\nexport function alterField(\n table: string,\n path: string,\n prev: Record<string, string> | undefined,\n next: Record<string, string> | undefined,\n): string | null {\n if (!prev || !next) return null;\n const sets: string[] = [];\n for (const k of FIELD_CLAUSE_ORDER) {\n const before = prev[k];\n const after = next[k];\n if (before === after) continue;\n if (k === \"COMPUTED\") return null; // no `ALTER FIELD … COMPUTED` form\n if (after !== undefined) {\n sets.push(after); // added or changed -> re-set (the fragment IS the ALTER set form)\n } else if (k === \"PERMISSIONS\") {\n sets.push(\"PERMISSIONS FULL\"); // no `DROP PERMISSIONS`; reset to the field default\n } else if (k === \"TYPE\") {\n return null; // a field always has a TYPE; \"removing\" it is meaningless -> OVERWRITE\n } else if (FIELD_DROPPABLE.has(k)) {\n sets.push(`DROP ${k}`);\n } else {\n return null;\n }\n }\n if (!sets.length) return null;\n return `ALTER FIELD ${path} ON TABLE ${escapeIdent(table)} ${sets.join(\" \")};`;\n}\n\n/** Canonical clause order for a deterministic `ALTER TABLE` body (matches the DDL order). */\nconst TABLE_CLAUSE_ORDER = [\n \"TYPE\",\n \"DROP\",\n \"SCHEMA\",\n \"AS\",\n \"CHANGEFEED\",\n \"COMMENT\",\n \"PERMISSIONS\",\n] as const;\n/** Clauses `ALTER TABLE` can express. `TYPE`/`DROP` have no ALTER form (force an OVERWRITE\n * fallback); `SCHEMA` is always SCHEMAFULL|SCHEMALESS (re-set, never dropped); `CHANGEFEED`\n * and `COMMENT` have `DROP` forms; `PERMISSIONS` resets to the table default (NONE). */\nconst TABLE_ALTERABLE = new Set([\n \"SCHEMA\",\n \"CHANGEFEED\",\n \"COMMENT\",\n \"PERMISSIONS\",\n]);\nconst TABLE_DROPPABLE = new Set([\"CHANGEFEED\", \"COMMENT\"]);\n\n/**\n * Emit an `ALTER TABLE` that turns the `prev` clause set into `next`. Returns `null` (caller falls\n * back to `DEFINE … OVERWRITE`) when the delta touches a clause `ALTER TABLE` can't express\n * (`TYPE` NORMAL/RELATION/ANY, or the `DROP` flag), or when clause data is unavailable.\n */\nexport function alterTable(\n name: string,\n prev: Record<string, string> | undefined,\n next: Record<string, string> | undefined,\n): string | null {\n if (!prev || !next) return null;\n const sets: string[] = [];\n for (const k of TABLE_CLAUSE_ORDER) {\n const before = prev[k];\n const after = next[k];\n if (before === after) continue;\n if (!TABLE_ALTERABLE.has(k)) return null; // TYPE / DROP changed -> OVERWRITE\n if (after !== undefined) {\n sets.push(after); // added or changed -> re-set\n } else if (k === \"PERMISSIONS\") {\n sets.push(\"PERMISSIONS NONE\"); // no `DROP PERMISSIONS`; reset to the table default\n } else if (TABLE_DROPPABLE.has(k)) {\n sets.push(`DROP ${k}`);\n } else {\n return null; // SCHEMA is never absent; anything else unexpected -> OVERWRITE\n }\n }\n if (!sets.length) return null;\n return `ALTER TABLE ${escapeIdent(name)} ${sets.join(\" \")};`;\n}\n","import {\n type Bound,\n BoundExcluded,\n BoundIncluded,\n BoundQuery,\n DateTime,\n Decimal,\n Duration,\n FileRef,\n Geometry,\n RecordId,\n RecordIdRange,\n type RecordIdValue,\n surql,\n Table,\n Uuid,\n} from \"surrealdb\";\nimport { z } from \"zod\";\n\n/**\n * The \"pure\" approach: a field is a stock Zod schema + SurrealQL DDL metadata.\n * The JS<->DB mapping rides on Zod's two native channels via codecs:\n * - encoded side (`z.input`) = DB wire type\n * - decoded side (`z.output`) = app type\n * `z.decode` reads from the DB, `z.encode` writes to it.\n */\n\n/**\n * Maps a Surreal-native schema (datetime codec, recordId) to its SurrealQL type.\n * Kept on the schema — not the field — so it composes through array()/optional()/nesting.\n */\nexport const surrealTypeRegistry = new WeakMap<z.ZodType, string>();\n\n/**\n * Maps an object schema built via `s.object` to its original SField shape, so\n * nested fields keep their DDL metadata ($default/$assert/...) during generation.\n */\nexport const objectFieldsRegistry = new WeakMap<\n z.ZodType,\n Record<string, AnyField>\n>();\n\n/**\n * Per-table/field row-level permissions. A `PermOp` is one access operation; `Perm` is\n * the rule for one op — `true` (FULL) / `false` (NONE) / a `BoundQuery` (a `WHERE` expr) /\n * `` `same as X` `` to reuse another op's resolved rule. A `TablePermissions` is a blanket\n * rule, a shared `WHERE`, or per-op rules. Fields have NO `delete` op (verified against\n * the DB), so they use `FieldPerm` / `FieldPermissions`.\n */\nexport type PermOp = \"select\" | \"create\" | \"update\" | \"delete\";\nexport type Perm = boolean | BoundQuery | `same as ${PermOp}`;\nexport type TablePermissions =\n | boolean\n | BoundQuery\n | Partial<Record<PermOp, Perm>>;\nexport type FieldPerm =\n | boolean\n | BoundQuery\n | \"same as select\"\n | \"same as create\"\n | \"same as update\";\nexport type FieldPermissions =\n | boolean\n | BoundQuery\n | Partial<Record<\"select\" | \"create\" | \"update\", FieldPerm>>;\n\n/** SurrealQL DDL metadata — the `$`-prefixed field options. */\nexport interface SurrealMeta {\n default?: BoundQuery;\n defaultAlways?: boolean;\n value?: BoundQuery;\n /** `COMPUTED <expr>` — a derived, read-only column (computed on read; never written). */\n computed?: BoundQuery;\n /**\n * `ASSERT` fragments that AND-combine into one clause. Computed checks (format\n * builders, `$`-constraints, `.$assert()`-derived) are plain strings; a custom\n * `.$assert(surql\\`…\\`)` is a `BoundQuery` (inlined during DDL generation).\n */\n asserts?: (string | BoundQuery)[];\n readonly?: boolean;\n comment?: string;\n /** Field-level `PERMISSIONS` (no `delete` op). Omitted ops default to FULL in\n * SurrealDB — the table is the gate; set an op `false` to lock it. See `.$permissions()`. */\n permissions?: FieldPermissions;\n /** DB-managed, client-hidden: still emits DEFINE FIELD (+ PERMISSIONS NONE) but is\n * excluded from the public app/create/update surface. See `.$internal()` / `.system`. */\n internal?: boolean;\n /** Single-field index: `.index()` (normal) / `.unique()` (uniqueness). Emits a `DEFINE\n * INDEX <table>_<field>_idx ON TABLE <table> FIELDS <field> [UNIQUE]`. */\n index?: { unique?: boolean };\n /** `REFERENCE [ON DELETE …]` on a record-link field. See `.reference()`. */\n reference?:\n | true\n | { onDelete?: \"reject\" | \"cascade\" | \"ignore\" | \"unset\" | BoundQuery };\n}\n\n/** Render a primitive as a clean SurrealQL literal; non-primitives return \"\". */\nfunction primitiveLiteral(value: unknown): string {\n if (typeof value === \"string\") return JSON.stringify(value);\n if (\n typeof value === \"number\" ||\n typeof value === \"boolean\" ||\n typeof value === \"bigint\"\n ) {\n return String(value);\n }\n return \"\";\n}\n\n/** Coerce a `$default`/`$defaultAlways` argument (a value or a `surql` expr) to a BoundQuery. */\nfunction toExpr(value: unknown): BoundQuery {\n if (value instanceof BoundQuery) return value;\n const literal = primitiveLiteral(value);\n return literal ? new BoundQuery(literal) : surql`${value}`;\n}\n\n/**\n * Zod string formats whose `string::is_<fmt>` validator exists on SurrealDB v3.x\n * (probed live on 3.1.3: `RETURN string::is_<fmt>(\"x\")`). A matching format builder\n * bakes `string::is_<fmt>($value)` by default; formats absent here (nanoid/cuid/cuid2/\n * xid/ksuid/cidrv4/cidrv6/guid/base64/base64url/e164/jwt/emoji) stay assert-free — no\n * fabricated regex. `uuid` is the native `uuid` type, not a string format (no assert).\n */\nconst STRING_IS_FORMATS = new Set([\n \"email\",\n \"url\",\n \"ulid\",\n \"ipv4\",\n \"ipv6\",\n // batch 2: 3.1.3 `string::is_*` validators with no Zod format builder (plain string\n // app-side; the ASSERT enforces the format in SurrealDB).\n \"alpha\",\n \"alphanum\",\n \"ascii\",\n \"numeric\",\n \"semver\",\n \"hexadecimal\",\n \"latitude\",\n \"longitude\",\n \"ip\",\n \"domain\",\n]);\n\n/** Map a Zod string format to its SurrealDB `string::is_*` assert, when one exists. */\nfunction formatAssert(format: string): string | undefined {\n return STRING_IS_FORMATS.has(format)\n ? `string::is_${format}($value)`\n : undefined;\n}\n\n/**\n * Reverse of {@link formatAssert}: recover a format name from a baked `string::is_<fmt>($value)`\n * assert. Used by `pull` to restore `s.<format>()` instead of `s.string().$assert(...)`. Returns\n * undefined for any other assert — including one that combines a format with extra text — so only an\n * exact, single-format assert reverses (a user's own assert is never swallowed).\n */\nexport function formatForAssert(assert: string): string | undefined {\n const m = /^string::is_([a-z0-9]+)\\(\\s*\\$value\\s*\\)$/.exec(assert.trim());\n return m && STRING_IS_FORMATS.has(m[1]) ? m[1] : undefined;\n}\n\n/** Build an SField for a Zod string-format schema, baking `string::is_<fmt>($value)`\n * when SurrealDB has that validator (else no assert). */\nfunction formatField<S extends z.ZodType>(\n schema: S,\n format: string,\n): SField<S> {\n const frag = formatAssert(format);\n return new SField(schema, frag ? { asserts: [frag] } : {});\n}\n\n/** The check methods that live on concrete Zod subtypes (ZodString/ZodNumber) but not\n * the base `z.ZodType` — `$`-constraints call these (cast through this shape). */\ntype CheckableSchema = {\n min(n: number): z.ZodType;\n max(n: number): z.ZodType;\n length(n: number): z.ZodType;\n regex(re: RegExp): z.ZodType;\n gt(n: number): z.ZodType;\n gte(n: number): z.ZodType;\n lt(n: number): z.ZodType;\n lte(n: number): z.ZodType;\n};\n\n/** One entry in a Zod schema's `_zod.def.checks`. */\ntype ZodCheck = {\n _zod: {\n def: {\n check?: string;\n minimum?: number;\n maximum?: number;\n length?: number;\n value?: number;\n inclusive?: boolean;\n format?: string;\n pattern?: RegExp;\n };\n };\n};\n\n/**\n * Best-effort: derive DB `ASSERT` fragments from a Zod schema's checks. Reads the Zod 4\n * check shape (`schema._zod.def.checks[]._zod.def`): string `min_length`/`max_length`/\n * `length_equals`, `string_format` (regex -> `$value = /…/`; email/url/… -> `string::is_*`),\n * and number `greater_than`/`less_than` (with `inclusive`). The schema may itself be a\n * `string_format` (e.g. `z.email()`), so its top-level `def.format` is mapped too. Unknown\n * checks are skipped silently.\n */\nfunction deriveAsserts(schema: z.ZodType): string[] {\n const def = schema._zod.def as {\n check?: string;\n format?: string;\n checks?: ZodCheck[];\n };\n const out: string[] = [];\n\n // The schema itself may be a string-format (z.email()/z.url()/…).\n if (def.check === \"string_format\" && typeof def.format === \"string\") {\n const frag = formatAssert(def.format);\n if (frag) out.push(frag);\n }\n\n for (const c of def.checks ?? []) {\n const d = c._zod.def;\n switch (d.check) {\n case \"min_length\":\n out.push(`string::len($value) >= ${d.minimum}`);\n break;\n case \"max_length\":\n out.push(`string::len($value) <= ${d.maximum}`);\n break;\n case \"length_equals\":\n out.push(`string::len($value) == ${d.length}`);\n break;\n case \"string_format\":\n if (d.format === \"regex\" && d.pattern) {\n out.push(`$value = /${d.pattern.source}/`);\n } else if (typeof d.format === \"string\") {\n const frag = formatAssert(d.format);\n if (frag) out.push(frag);\n }\n break;\n case \"greater_than\":\n out.push(`$value >${d.inclusive ? \"=\" : \"\"} ${d.value}`);\n break;\n case \"less_than\":\n out.push(`$value <${d.inclusive ? \"=\" : \"\"} ${d.value}`);\n break;\n }\n }\n return out;\n}\n\n/** The schema one wrapper down — what `unwrap()` returns. */\ntype InnerOf<S extends z.ZodType> =\n S extends z.ZodOptional<infer I extends z.ZodType>\n ? I\n : S extends z.ZodNullable<infer I extends z.ZodType>\n ? I\n : S extends z.ZodDefault<infer I extends z.ZodType>\n ? I\n : S extends z.ZodPrefault<infer I extends z.ZodType>\n ? I\n : S extends z.ZodCatch<infer I extends z.ZodType>\n ? I\n : S extends z.ZodReadonly<infer I extends z.ZodType>\n ? I\n : S extends z.ZodArray<infer I extends z.ZodType>\n ? I\n : S;\n\n/**\n * A Zod schema paired with SurrealQL DDL metadata. `Flags` tracks input traits\n * used by `Create<>`/`Update<>`: `\"create\"` (DB-filled -> optional on create) and\n * `\"readonly\"` (excluded from updates). It only appears in method return types, so\n * `SField` is covariant in it.\n */\n/**\n * The PORTABLE, dialect-agnostic field base (extraction phase B — see docs/AUTHORING-SPLIT.md).\n * Holds the Zod schema, an opaque per-dialect `native` metadata slot, the field-level codecs, and\n * the App-land Zod wrappers (which carry `native` forward via the `rebuild` hook so a chain keeps\n * its concrete dialect type). It references NOTHING SurrealDB-specific. Each dialect subclasses it\n * (see {@link SField} for SurrealDB) to add native authoring (`$`-methods) and re-type the wrappers.\n */\nexport abstract class SFieldBase<\n S extends z.ZodType = z.ZodType,\n Flags extends string = never,\n N = unknown,\n> {\n constructor(\n readonly schema: S,\n readonly native: N,\n ) {}\n\n /** Rebuild a sibling field of the SAME dialect with a new schema/flags. Each dialect overrides it. */\n protected abstract rebuild<S2 extends z.ZodType, F2 extends string>(\n schema: S2,\n native: N,\n ): SFieldBase<S2, F2, N>;\n /** A fresh, empty native-metadata bag (for wrappers like `or`/`and` that reset it). */\n protected abstract blank(): N;\n\n // --- Field-level codec (raw, on `this.schema`): `decode` reads (wire -> app), `encode`\n // writes (app -> wire). Create-shaping is a table concept, so these are NOT create-shaped —\n // e.g. `s.datetime().decode(dbDateTime) -> Date`, `s.uuid().encode(\"…\") -> Uuid`. ---\n /** Decode a DB value to its app type (wire -> app). */\n decode(value: unknown): z.output<S> {\n return z.decode(this.schema, value as never);\n }\n /** Encode an app value to its DB wire type (app -> wire). */\n encode(value: z.output<S>): z.input<S> {\n return z.encode(this.schema, value);\n }\n decodeAsync(value: unknown): Promise<z.output<S>> {\n return z.decodeAsync(this.schema, value as never);\n }\n encodeAsync(value: z.output<S>): Promise<z.input<S>> {\n return z.encodeAsync(this.schema, value);\n }\n safeDecode(value: unknown) {\n return z.safeDecode(this.schema, value as never);\n }\n safeEncode(value: z.output<S>) {\n return z.safeEncode(this.schema, value);\n }\n safeDecodeAsync(value: unknown) {\n return z.safeDecodeAsync(this.schema, value as never);\n }\n safeEncodeAsync(value: z.output<S>) {\n return z.safeEncodeAsync(this.schema, value);\n }\n // Deprecated Zod-style aliases — `parse` runs the DECODE direction (wire -> app), so it's\n // just `decode` under a misleading name. Kept for `z`-API familiarity (struck through).\n /** @deprecated `parse` decodes a value (wire -> app). Use {@link SField.decode | decode}. */\n parse(value: unknown): z.output<S> {\n return this.decode(value);\n }\n /** @deprecated Use {@link SField.safeDecode | safeDecode}. */\n safeParse(value: unknown) {\n return this.safeDecode(value);\n }\n /** @deprecated Use {@link SField.decodeAsync | decodeAsync}. */\n parseAsync(value: unknown): Promise<z.output<S>> {\n return this.decodeAsync(value);\n }\n /** @deprecated Use {@link SField.safeDecodeAsync | safeDecodeAsync}. */\n safeParseAsync(value: unknown) {\n return this.safeDecodeAsync(value);\n }\n\n // Zod wrappers — delegate to the inner schema, carry native metadata + flags forward.\n optional(): SFieldBase<z.ZodOptional<S>, Flags, N> {\n return this.rebuild(this.schema.optional(), this.native);\n }\n nullable(): SFieldBase<z.ZodNullable<S>, Flags, N> {\n return this.rebuild(this.schema.nullable(), this.native);\n }\n default(value: z.input<S>): SFieldBase<z.ZodDefault<S>, Flags, N> {\n return this.rebuild(this.schema.default(value as never), this.native);\n }\n /** Zod prefault: fill an absent value with `value`, then validate it (unlike `.default`). */\n prefault(value: z.input<S>): SFieldBase<z.ZodPrefault<S>, Flags, N> {\n return this.rebuild(z.prefault(this.schema, value as never), this.native);\n }\n /** Zod catch: fall back to `value` when parsing fails. */\n catch(value: z.output<S>): SFieldBase<z.ZodCatch<S>, Flags, N> {\n return this.rebuild(this.schema.catch(value as never), this.native);\n }\n array(): SFieldBase<z.ZodArray<S>, Flags, N> {\n return this.rebuild(z.array(this.schema), this.native);\n }\n nullish(): SFieldBase<z.ZodOptional<z.ZodNullable<S>>, Flags, N> {\n return this.rebuild(this.schema.nullish(), this.native);\n }\n /** Zod union — `a.or(b)` accepts either; SurrealQL `<a> | <b>`. Mirrors Zod's `.or()`. */\n or<F extends AnyField | z.ZodType>(\n other: F,\n ): SFieldBase<z.ZodUnion<[S, SchemaOf<F>]>, never, N> {\n return this.rebuild<z.ZodUnion<[S, SchemaOf<F>]>, never>(\n z.union([this.schema, toZod(other)]) as z.ZodUnion<[S, SchemaOf<F>]>,\n this.blank(),\n );\n }\n /** Zod intersection — `a.and(b)`; merges object fields in DDL. Mirrors Zod's `.and()`. */\n and<F extends AnyField | z.ZodType>(\n other: F,\n ): SFieldBase<z.ZodIntersection<S, SchemaOf<F>>, never, N> {\n return this.rebuild<z.ZodIntersection<S, SchemaOf<F>>, never>(\n z.intersection(this.schema, toZod(other) as SchemaOf<F>),\n this.blank(),\n );\n }\n\n // --- Native Zod passthrough (drop-in for `z.*`): app-side validation / transform / metadata,\n // delegated to the inner schema. These mirror Zod exactly; the SurrealDB-DDL side stays under the\n // `$`-prefixed methods (`$readonly`/`$comment`/…). A field's SurrealQL type is its WIRE/input\n // type, so refine/check/brand/readonly/describe leave the DDL type untouched; transform/pipe keep\n // the storable input type and change only the decoded `App<>`. A resulting type SurrealDB can't\n // represent is rejected at emit — use `$surreal(type, codec)`. (Explicit method signatures, not\n // `Parameters<…>`, so these stay method-bivariant and don't break table-name covariance.)\n refine(\n check: (arg: z.output<S>) => unknown,\n params?: string | z.core.$ZodCustomParams,\n ): this {\n return this.rebuild(\n this.schema.refine(check, params) as S,\n this.native,\n ) as unknown as this;\n }\n superRefine(\n refinement: (\n arg: z.output<S>,\n ctx: z.core.$RefinementCtx<z.output<S>>,\n ) => void,\n ): this {\n return this.rebuild(\n this.schema.superRefine(refinement) as S,\n this.native,\n ) as unknown as this;\n }\n check(\n ...checks: (z.core.CheckFn<z.output<S>> | z.core.$ZodCheck<z.output<S>>)[]\n ): this {\n return this.rebuild(\n this.schema.check(...checks) as S,\n this.native,\n ) as unknown as this;\n }\n overwrite(fn: (x: z.output<S>) => z.output<S>): this {\n return this.rebuild(\n this.schema.overwrite(fn) as S,\n this.native,\n ) as unknown as this;\n }\n brand<B extends PropertyKey = PropertyKey>(value?: B): this {\n return this.rebuild(\n this.schema.brand(value) as unknown as S,\n this.native,\n ) as unknown as this;\n }\n /** Zod's app-side metadata (JSON-schema/docs) — distinct from `$comment()` (SurrealDB COMMENT). */\n describe(description: string): this {\n return this.rebuild(\n this.schema.describe(description) as S,\n this.native,\n ) as unknown as this;\n }\n meta(data: z.core.GlobalMeta): this {\n return this.rebuild(\n this.schema.meta(data) as S,\n this.native,\n ) as unknown as this;\n }\n /** Zod's app-side readonly (TS-immutable output) — distinct from `$readonly()` (SurrealDB READONLY). */\n readonly(): SFieldBase<z.ZodReadonly<S>, Flags, N> {\n return this.rebuild(this.schema.readonly(), this.native);\n }\n /** Zod transform — changes the decoded `App<>` value; the stored (wire) type is unchanged. */\n transform<NewOut>(\n fn: (arg: z.output<S>, ctx: z.core.$RefinementCtx<z.output<S>>) => NewOut,\n ): SFieldBase<\n z.ZodPipe<S, z.ZodTransform<Awaited<NewOut>, z.output<S>>>,\n Flags,\n N\n > {\n return this.rebuild(this.schema.transform(fn), this.native);\n }\n /** Zod pipe — feed this field's output into `target`; the stored (wire) type stays `this`. */\n pipe<T extends z.core.$ZodType<unknown, z.output<S>>>(\n target: T,\n ): SFieldBase<z.ZodPipe<S, T>, Flags, N> {\n return this.rebuild(\n this.schema.pipe(target) as z.ZodPipe<S, T>,\n this.native,\n );\n }\n /** Peel one wrapper (optional/nullable/default/prefault/catch/readonly/array) off the field. */\n unwrap(): SFieldBase<InnerOf<S>, Flags, N> {\n const def = this.schema._zod.def as {\n innerType?: z.ZodType;\n element?: z.ZodType;\n };\n const inner = def.innerType ?? def.element ?? this.schema;\n return this.rebuild(inner, this.native) as unknown as SFieldBase<\n InnerOf<S>,\n Flags,\n N\n >;\n }\n\n /** Object-only: allow arbitrary extra keys — `FLEXIBLE` in DDL. Mirrors Zod's `.loose()`. */\n loose(): this {\n return this.objectMode(\"loose\");\n }\n /** Object-only: reject unknown keys — non-`FLEXIBLE` (the default). Mirrors Zod's `.strict()`. */\n strict(): this {\n return this.objectMode(\"strict\");\n }\n /** Alias for {@link loose} — a `FLEXIBLE` object accepting arbitrary keys. */\n flexible(): this {\n return this.loose();\n }\n private objectMode(mode: \"loose\" | \"strict\"): this {\n const obj = this.schema as unknown as {\n loose?: () => z.ZodType;\n strict?: () => z.ZodType;\n };\n if (typeof obj.loose !== \"function\" || typeof obj.strict !== \"function\") {\n return this; // not an object schema — no-op\n }\n const next = (mode === \"loose\"\n ? obj.loose()\n : obj.strict()) as unknown as S;\n // Carry the nested-field registry forward so DDL/create-shaping still see the subfields.\n const fields = objectFieldsRegistry.get(this.schema);\n if (fields) objectFieldsRegistry.set(next, fields);\n return this.rebuild(next, this.native) as unknown as this;\n }\n}\n\n/**\n * The SurrealDB field — the dialect extension of {@link SFieldBase}. Adds SurrealDB-native authoring\n * (the `$`-methods over `SurrealMeta`: DEFAULT/VALUE/ASSERT/PERMISSIONS/REFERENCE/…) and re-types the\n * inherited portable Zod wrappers so a chain stays a `SField`. `s.*` produces these. In the package\n * split this class moves to `@schemic/surrealdb` (see docs/AUTHORING-SPLIT.md).\n */\nexport class SField<\n S extends z.ZodType = z.ZodType,\n Flags extends string = never,\n> extends SFieldBase<S, Flags, SurrealMeta> {\n constructor(schema: S, surreal: SurrealMeta = {}) {\n super(schema, surreal);\n }\n /** The SurrealDB-native field metadata (DEFAULT/VALUE/ASSERT/PERMISSIONS/…). */\n get surreal(): SurrealMeta {\n return this.native;\n }\n protected rebuild<S2 extends z.ZodType, F2 extends string>(\n schema: S2,\n native: SurrealMeta,\n ): SField<S2, F2> {\n return new SField<S2, F2>(schema, native);\n }\n protected blank(): SurrealMeta {\n return {};\n }\n\n // Re-type the inherited schema-changing portable wrappers so a chain keeps its `SField` type. These\n // are real METHOD overrides (not `declare` properties) so they stay method-bivariant — a property\n // would be param-contravariant and break table-name covariance / record-id `default` (see below).\n // Each just delegates to the SFieldBase body (which rebuilds a SField via the `rebuild` hook).\n override optional(): SField<z.ZodOptional<S>, Flags> {\n return super.optional() as SField<z.ZodOptional<S>, Flags>;\n }\n override nullable(): SField<z.ZodNullable<S>, Flags> {\n return super.nullable() as SField<z.ZodNullable<S>, Flags>;\n }\n override default(value: z.input<S>): SField<z.ZodDefault<S>, Flags> {\n return super.default(value) as SField<z.ZodDefault<S>, Flags>;\n }\n override prefault(value: z.input<S>): SField<z.ZodPrefault<S>, Flags> {\n return super.prefault(value) as SField<z.ZodPrefault<S>, Flags>;\n }\n override catch(value: z.output<S>): SField<z.ZodCatch<S>, Flags> {\n return super.catch(value) as SField<z.ZodCatch<S>, Flags>;\n }\n override array(): SField<z.ZodArray<S>, Flags> {\n return super.array() as SField<z.ZodArray<S>, Flags>;\n }\n override nullish(): SField<z.ZodOptional<z.ZodNullable<S>>, Flags> {\n return super.nullish() as SField<z.ZodOptional<z.ZodNullable<S>>, Flags>;\n }\n override or<F extends AnyField | z.ZodType>(\n other: F,\n ): SField<z.ZodUnion<[S, SchemaOf<F>]>> {\n return super.or(other) as SField<z.ZodUnion<[S, SchemaOf<F>]>>;\n }\n override and<F extends AnyField | z.ZodType>(\n other: F,\n ): SField<z.ZodIntersection<S, SchemaOf<F>>> {\n return super.and(other) as SField<z.ZodIntersection<S, SchemaOf<F>>>;\n }\n override readonly(): SField<z.ZodReadonly<S>, Flags> {\n return super.readonly() as SField<z.ZodReadonly<S>, Flags>;\n }\n override transform<NewOut>(\n fn: (arg: z.output<S>, ctx: z.core.$RefinementCtx<z.output<S>>) => NewOut,\n ): SField<z.ZodPipe<S, z.ZodTransform<Awaited<NewOut>, z.output<S>>>, Flags> {\n return super.transform(fn) as SField<\n z.ZodPipe<S, z.ZodTransform<Awaited<NewOut>, z.output<S>>>,\n Flags\n >;\n }\n override pipe<T extends z.core.$ZodType<unknown, z.output<S>>>(\n target: T,\n ): SField<z.ZodPipe<S, T>, Flags> {\n return super.pipe(target) as SField<z.ZodPipe<S, T>, Flags>;\n }\n override unwrap(): SField<InnerOf<S>, Flags> {\n return super.unwrap() as unknown as SField<InnerOf<S>, Flags>;\n }\n\n // SurrealQL DDL metadata. $default/$defaultAlways mark the field create-optional;\n // $readonly marks it non-updatable (see Create<>/Update<>). The default accepts a\n // plain value (rendered as a literal) or a `surql` expression.\n $default(value: z.output<S> | BoundQuery): SField<S, Flags | \"create\"> {\n return new SField(this.schema, {\n ...this.surreal,\n default: toExpr(value),\n defaultAlways: false,\n });\n }\n $defaultAlways(value: z.output<S> | BoundQuery): SField<S, Flags | \"create\"> {\n return new SField(this.schema, {\n ...this.surreal,\n default: toExpr(value),\n defaultAlways: true,\n });\n }\n /**\n * Set a DB-side `VALUE` clause. Whether the field is create-OPTIONAL depends on\n * whether the expression consumes the client input (`$value`), which can't be\n * inferred — so it's explicit via the `optional` option:\n * - `time::now()` ignores input -> `{ optional: true }` (create-optional)\n * - `string::lowercase($value)` requires input -> default (create-required)\n * Optionality is purely type-level (the option drives the `\"create\"` flag that\n * `Create<>`/`encode()` read); it does not touch the app type or DB nullability.\n * There is no separate update option — every field is already optional in `Update<>`.\n */\n $value<O extends boolean = false>(\n expr: BoundQuery,\n // biome-ignore lint/correctness/noUnusedFunctionParameters: drives the O generic (type-level only)\n opts?: { optional?: O },\n ): SField<S, O extends true ? Flags | \"create\" : Flags> {\n return new SField(this.schema, { ...this.surreal, value: expr });\n }\n /**\n * `COMPUTED <expr>` — a derived, read-only column computed from other fields. Never written, so\n * it's create-OPTIONAL: `s.string().$computed(surql\\`string::concat(first, \" \", last)\\`)`.\n */\n $computed(expr: BoundQuery): SField<S, Flags | \"create\"> {\n return new SField(this.schema, { ...this.surreal, computed: expr });\n }\n /**\n * Add an `ASSERT` fragment (fragments AND-combine into one clause):\n * - `.$assert(surql\\`…\\`)` pushes a custom expression (inlined during DDL generation).\n * - `.$assert()` (no args) derives fragments from the field's existing Zod checks\n * (formats, string length/regex, number bounds) — best-effort; unknowns are skipped.\n */\n $assert(expr?: BoundQuery): SField<S, Flags> {\n const frags = expr ? [expr] : deriveAsserts(this.schema);\n return this.pushAsserts(frags);\n }\n\n // --- $-constraints: apply the app-side Zod check AND push a type-aware DB ASSERT. ---\n // String-vs-number is read from the schema's own `def.type`; unsupported type/method\n // combos no-op (return the field unchanged).\n\n /** Min length (string) / minimum value (number). */\n $min(n: number): SField<S, Flags> {\n if (this.schemaType === \"string\")\n return this.constrain(\"min\", n, `string::len($value) >= ${n}`);\n if (this.schemaType === \"number\")\n return this.constrain(\"min\", n, `$value >= ${n}`);\n return this;\n }\n /** Max length (string) / maximum value (number). */\n $max(n: number): SField<S, Flags> {\n if (this.schemaType === \"string\")\n return this.constrain(\"max\", n, `string::len($value) <= ${n}`);\n if (this.schemaType === \"number\")\n return this.constrain(\"max\", n, `$value <= ${n}`);\n return this;\n }\n /** Exact length (string). */\n $length(n: number): SField<S, Flags> {\n if (this.schemaType === \"string\") {\n return this.constrain(\"length\", n, `string::len($value) == ${n}`);\n }\n return this;\n }\n /** Pattern match (string). */\n $regex(re: RegExp): SField<S, Flags> {\n if (this.schemaType === \"string\")\n return this.constrain(\"regex\", re, `$value = /${re.source}/`);\n return this;\n }\n /** Greater than (number). */\n $gt(n: number): SField<S, Flags> {\n if (this.schemaType === \"number\")\n return this.constrain(\"gt\", n, `$value > ${n}`);\n return this;\n }\n /** Greater than or equal (number). */\n $gte(n: number): SField<S, Flags> {\n if (this.schemaType === \"number\")\n return this.constrain(\"gte\", n, `$value >= ${n}`);\n return this;\n }\n /** Less than (number). */\n $lt(n: number): SField<S, Flags> {\n if (this.schemaType === \"number\")\n return this.constrain(\"lt\", n, `$value < ${n}`);\n return this;\n }\n /** Less than or equal (number). */\n $lte(n: number): SField<S, Flags> {\n if (this.schemaType === \"number\")\n return this.constrain(\"lte\", n, `$value <= ${n}`);\n return this;\n }\n\n /** The underlying Zod schema's `def.type` (\"string\" / \"number\" / …). */\n private get schemaType(): string {\n return (this.schema._zod.def as { type: string }).type;\n }\n /** Append ASSERT fragments, returning a new field (same type param + flags). */\n private pushAsserts(frags: (string | BoundQuery)[]): SField<S, Flags> {\n if (frags.length === 0) return this;\n return new SField(this.schema, {\n ...this.surreal,\n asserts: [...(this.surreal.asserts ?? []), ...frags],\n });\n }\n /** Apply a concrete-subtype Zod check (`min`/`max`/`length`/`regex`/`gt`/…) and push its\n * matching DB fragment, returning a new field carrying the refined schema. */\n private constrain(\n method: keyof CheckableSchema,\n arg: number | RegExp,\n frag: string,\n ): SField<S, Flags> {\n const apply = (\n this.schema as unknown as Record<\n string,\n (a: number | RegExp) => z.ZodType\n >\n )[method];\n return new SField(apply(arg) as S, {\n ...this.surreal,\n asserts: [...(this.surreal.asserts ?? []), frag],\n });\n }\n /** Set field-level `PERMISSIONS` (no `delete` op). Omitted ops default to FULL. */\n $permissions(spec: FieldPermissions): SField<S, Flags> {\n return new SField(this.schema, { ...this.surreal, permissions: spec });\n }\n $readonly(readonly = true): SField<S, Flags | \"readonly\"> {\n return new SField(this.schema, { ...this.surreal, readonly });\n }\n $comment(comment: string): SField<S, Flags> {\n return new SField(this.schema, { ...this.surreal, comment });\n }\n /** Index this field — `DEFINE INDEX <table>_<field>_idx ON TABLE <table> FIELDS <field>`. */\n index(): SField<S, Flags> {\n return new SField(this.schema, {\n ...this.surreal,\n index: { ...this.surreal.index },\n });\n }\n /** Index this field with a uniqueness constraint (`… FIELDS <field> UNIQUE`). */\n unique(): SField<S, Flags> {\n return new SField(this.schema, {\n ...this.surreal,\n index: { unique: true },\n });\n }\n /**\n * Mark a record-link field as a `REFERENCE` so the DB tracks back-links. `onDelete` sets the\n * `ON DELETE` action — `\"reject\" | \"cascade\" | \"ignore\" | \"unset\"`, or a `surql` expression\n * (emitted as `ON DELETE THEN …`). Omit it for a bare `REFERENCE`.\n */\n reference(opts?: {\n onDelete?: \"reject\" | \"cascade\" | \"ignore\" | \"unset\" | BoundQuery;\n }): SField<S, Flags> {\n return new SField(this.schema, {\n ...this.surreal,\n reference:\n opts?.onDelete === undefined ? true : { onDelete: opts.onDelete },\n });\n }\n /**\n * Teach @schemic/core how to store this value in SurrealDB: give the **wire type** as an `s.*`\n * field (its SurrealQL DDL type and Zod schema are derived from it) plus a codec\n * (`encode`: app -> wire, `decode`: wire -> app). This turns an otherwise-unmappable field\n * (e.g. `s.custom`/`s.instanceof`) into a real table field and clears the no-mapping brand;\n * `s.input<>` then reports the wire type. Omit the codec for an identity mapping (the app\n * value is stored as-is). `$`-prefixed to avoid clashing with Zod.\n */\n $surreal<WF extends AnyField | z.ZodType, A = z.output<S>>(\n wire: WF,\n codec?: {\n encode: (app: A) => z.output<SchemaOf<WF>>;\n decode: (wire: z.output<SchemaOf<WF>>) => A;\n },\n ): SField<z.ZodCodec<SchemaOf<WF>, S>, Exclude<Flags, NoDdl>> {\n const wireSchema = toZod(wire) as SchemaOf<WF>;\n const c = z.codec(wireSchema, this.schema, {\n decode: (w) => (codec ? codec.decode(w as never) : w) as never,\n encode: (a) => (codec ? codec.encode(a as A) : a) as never,\n });\n return new SField(c, this.surreal) as SField<\n z.ZodCodec<SchemaOf<WF>, S>,\n Exclude<Flags, NoDdl>\n >;\n }\n /**\n * Mark the field DB-managed and client-hidden. It still emits its `DEFINE FIELD`\n * (so SCHEMAFULL writes from a record-access SIGNUP block succeed) plus\n * `PERMISSIONS NONE`, but is excluded from the public app/create/update surface.\n * Reach internal fields via the `.system` view (server/system code).\n */\n $internal(): SField<S, Flags | \"internal\"> {\n return new SField(this.schema, { ...this.surreal, internal: true });\n }\n}\n\n/** A flag-agnostic SField, for internal storage where flags don't matter. */\ntype AnyField = SField<z.ZodType, string>;\n\n// --- Surreal-native field schemas ---\n\n/** Surreal `datetime` <-> JS `Date` (a real codec — the types differ). */\nfunction datetimeCodec() {\n const codec = z.codec(z.instanceof(DateTime), z.date(), {\n decode: (dt) => new Date(dt.toString()),\n encode: (d) => new DateTime(d),\n });\n surrealTypeRegistry.set(codec, \"datetime\");\n return codec;\n}\n\n/** Like `datetimeCodec`, but the app side coerces to `Date` (`s.coerce.date`). Same `datetime` DDL. */\nfunction coercedDatetimeCodec() {\n const codec = z.codec(z.instanceof(DateTime), z.coerce.date(), {\n decode: (dt): Date => new Date(dt.toString()),\n // the schema coerces the value to a `Date` before `encode` runs (typed `unknown` by Zod).\n encode: (d) => new DateTime(d as Date),\n });\n surrealTypeRegistry.set(codec, \"datetime\");\n return codec;\n}\n\n/** Register a schema's SurrealQL type and return it (for instanceof-backed native types). */\nfunction native<T>(schema: z.ZodType<T>, surrealType: string): z.ZodType<T, T> {\n surrealTypeRegistry.set(schema, surrealType);\n return schema as z.ZodType<T, T>;\n}\n\n/** Surreal `uuid` <-> JS `string` (a codec: app `string`, DB `Uuid`). */\nfunction uuidCodec() {\n const codec = z.codec(z.instanceof(Uuid), z.uuid(), {\n decode: (u) => u.toString(),\n encode: (s) => new Uuid(s),\n });\n surrealTypeRegistry.set(codec, \"uuid\");\n return codec;\n}\n\n/** Surreal `bytes` <-> JS `Uint8Array` (the DB may return an ArrayBuffer; normalize it). */\nfunction bytesCodec() {\n const codec = z.codec(\n z.union([z.instanceof(Uint8Array), z.instanceof(ArrayBuffer)]),\n z.instanceof(Uint8Array),\n {\n decode: (b) => (b instanceof Uint8Array ? b : new Uint8Array(b)),\n encode: (u) => u,\n },\n );\n surrealTypeRegistry.set(codec, \"bytes\");\n return codec;\n}\n\ntype GeometryKind =\n | \"point\"\n | \"line\"\n | \"polygon\"\n | \"multipoint\"\n | \"multiline\"\n | \"multipolygon\"\n | \"collection\";\n\n/** A `RecordId` restricted to `tables` (+ optional id-value type). Identity, so no codec. */\nfunction recordIdSchema<\n T extends string,\n V extends RecordIdValue = RecordIdValue,\n>(\n tables: T[],\n valueType?: z.ZodType<V>,\n): z.ZodType<RecordId<T, V>, RecordId<T, V>> {\n // Empty `tables` = an unrestricted `record` (any table) — used for endpoint-less relations.\n const anyTable = tables.length === 0;\n const schema = z.instanceof(RecordId).refine(\n // RecordId.table is a Table object; .name is the unescaped name.\n (r) =>\n (anyTable || (tables as readonly string[]).includes(r.table.name)) &&\n (valueType ? valueType.safeParse(r.id).success : true),\n {\n error: anyTable\n ? \"Expected a record\"\n : `Expected record<${tables.join(\" | \")}>`,\n },\n );\n surrealTypeRegistry.set(\n schema,\n anyTable ? \"record\" : `record<${tables.join(\" | \")}>`,\n );\n return schema as unknown as z.ZodType<RecordId<T, V>, RecordId<T, V>>;\n}\n\n/** A `record<…>` field: table restriction (+ optional id-value type) and construction helpers. */\nexport class RecordIdField<\n T extends string,\n V extends RecordIdValue = RecordIdValue,\n> extends SField<z.ZodType<RecordId<T, V>, RecordId<T, V>>> {\n constructor(\n readonly tables: T[],\n readonly valueType?: z.ZodType<V>,\n surreal: SurrealMeta = {},\n // The `this`-returning Zod passthroughs (refine/check/…) wrap the schema and rebuild via the hook\n // below; this lets such a rebuild carry the wrapped schema instead of rebuilding the bare record\n // schema. Defaults to the record schema for the normal `s.recordId(...)` construction.\n schemaOverride?: z.ZodType<RecordId<T, V>, RecordId<T, V>>,\n ) {\n super(schemaOverride ?? recordIdSchema<T, V>(tables, valueType), surreal);\n }\n\n // The base `this`-returning wrappers (refine/superRefine/check/…) construct via `rebuild`. SField's\n // rebuild makes a plain SField, which would make `this` (typed RecordIdField) a LIE at runtime —\n // `s.recordId(\"x\").refine(p).for(id)` would crash. Override so those chains stay a RecordIdField\n // (the schema-CHANGING wrappers like `.optional()` still narrow to SField via SField's overrides).\n protected override rebuild<S2 extends z.ZodType, F2 extends string>(\n schema: S2,\n native: SurrealMeta,\n ): SField<S2, F2> {\n return new RecordIdField<T, V>(\n this.tables,\n this.valueType,\n native,\n schema as unknown as z.ZodType<RecordId<T, V>, RecordId<T, V>>,\n ) as unknown as SField<S2, F2>;\n }\n\n /** Restrict the id value's type — reflected as `RecordId<T, V>` and validated at runtime. */\n type<V2 extends RecordIdValue>(schema: z.ZodType<V2>): RecordIdField<T, V2> {\n return new RecordIdField<T, V2>(this.tables, schema, this.surreal);\n }\n\n /** Build a RecordId. Single-table: `for(id)`; multi-table: `for(table, id)`. */\n for(idOrTable: V | T, id?: V): RecordId<T, V> {\n return (\n id === undefined\n ? new RecordId(this.tables[0]!, idOrTable as V)\n : new RecordId(idOrTable as T, id)\n ) as RecordId<T, V>;\n }\n\n /** A record-id range for queries (default: inclusive start .. exclusive end). */\n range(from?: V | Bound<V>, to?: V | Bound<V>): RecordIdRange<T, V> {\n // `undefined` -> an open bound (`user:..x` / `user:x..`); otherwise wrap the value\n // (default inclusive start, exclusive end). Pass a Bound to override inclusivity.\n const bound = (b: V | Bound<V> | undefined, exclusive: boolean) =>\n b === undefined\n ? undefined\n : b instanceof BoundIncluded || b instanceof BoundExcluded\n ? b\n : exclusive\n ? new BoundExcluded(b)\n : new BoundIncluded(b);\n return new RecordIdRange(\n this.tables[0]!,\n bound(from, false) as Bound<RecordIdValue>,\n bound(to, true) as Bound<RecordIdValue>,\n ) as RecordIdRange<T, V>;\n }\n}\n\n/** Unwrap an SField to its Zod schema (raw Zod schemas pass through). */\nconst toZod = (v: AnyField | z.ZodType): z.ZodType =>\n v instanceof SField ? v.schema : v;\n\n/**\n * Internal `Flags` brand for a field with no SurrealQL mapping. It rides the `Flags` channel,\n * so it survives every wrapper (`.optional()`/`.array()`/…); `defineTable`/`defineRelation`\n * reject a branded field at compile time, and `.$surreal(...)` clears it. (Runtime `inferField`\n * is the backstop for nested/dynamic shapes.)\n */\ntype NoDdl = \"~no-ddl\";\nconst noDdl = <S extends z.ZodType>(f: SField<S>): SField<S, NoDdl> =>\n f as SField<S, NoDdl>;\ntype ZodsOf<T extends readonly (AnyField | z.ZodType)[]> = {\n -readonly [K in keyof T]: SchemaOf<T[K]>;\n};\n\n/** Field constructors — the authoring surface. */\nexport const s = {\n string: () => new SField(z.string()),\n number: () => new SField(z.number()),\n boolean: () => new SField(z.boolean()),\n // String formats — all map to DDL `string` (their Zod def.type is \"string\"). Builders\n // whose `string::is_<fmt>` validator exists on SurrealDB bake that ASSERT by default\n // (see STRING_IS_FORMATS); the rest stay assert-free (no fabricated regex).\n email: () => formatField(z.email(), \"email\"),\n url: (params?: Parameters<typeof z.url>[0]) =>\n formatField(z.url(params), \"url\"),\n /** Surreal native `uuid`: a `string` app-side, stored as a `Uuid` (no ASSERT — native type). */\n uuid: () => new SField(uuidCodec()),\n guid: (params?: Parameters<typeof z.guid>[0]) =>\n formatField(z.guid(params), \"guid\"),\n nanoid: (params?: Parameters<typeof z.nanoid>[0]) =>\n formatField(z.nanoid(params), \"nanoid\"),\n cuid: (params?: Parameters<typeof z.cuid>[0]) =>\n formatField(z.cuid(params), \"cuid\"),\n cuid2: (params?: Parameters<typeof z.cuid2>[0]) =>\n formatField(z.cuid2(params), \"cuid2\"),\n ulid: (params?: Parameters<typeof z.ulid>[0]) =>\n formatField(z.ulid(params), \"ulid\"),\n xid: (params?: Parameters<typeof z.xid>[0]) =>\n formatField(z.xid(params), \"xid\"),\n ksuid: (params?: Parameters<typeof z.ksuid>[0]) =>\n formatField(z.ksuid(params), \"ksuid\"),\n ipv4: (params?: Parameters<typeof z.ipv4>[0]) =>\n formatField(z.ipv4(params), \"ipv4\"),\n ipv6: (params?: Parameters<typeof z.ipv6>[0]) =>\n formatField(z.ipv6(params), \"ipv6\"),\n cidrv4: (params?: Parameters<typeof z.cidrv4>[0]) =>\n formatField(z.cidrv4(params), \"cidrv4\"),\n cidrv6: (params?: Parameters<typeof z.cidrv6>[0]) =>\n formatField(z.cidrv6(params), \"cidrv6\"),\n base64: (params?: Parameters<typeof z.base64>[0]) =>\n formatField(z.base64(params), \"base64\"),\n base64url: (params?: Parameters<typeof z.base64url>[0]) =>\n formatField(z.base64url(params), \"base64url\"),\n e164: (params?: Parameters<typeof z.e164>[0]) =>\n formatField(z.e164(params), \"e164\"),\n jwt: (params?: Parameters<typeof z.jwt>[0]) =>\n formatField(z.jwt(params), \"jwt\"),\n emoji: (params?: Parameters<typeof z.emoji>[0]) =>\n formatField(z.emoji(params), \"emoji\"),\n\n // String fields validated by SurrealDB's `string::is_*` (no Zod format — plain string\n // app-side, the baked ASSERT enforces the format in the DB).\n alpha: () => formatField(z.string(), \"alpha\"),\n alphanum: () => formatField(z.string(), \"alphanum\"),\n ascii: () => formatField(z.string(), \"ascii\"),\n numeric: () => formatField(z.string(), \"numeric\"),\n semver: () => formatField(z.string(), \"semver\"),\n hexadecimal: () => formatField(z.string(), \"hexadecimal\"),\n latitude: () => formatField(z.string(), \"latitude\"),\n longitude: () => formatField(z.string(), \"longitude\"),\n ip: () => formatField(z.string(), \"ip\"),\n domain: () => formatField(z.string(), \"domain\"),\n\n // Numbers. int/int32/uint32 -> DDL `int`; float -> DDL `float` (def.format-driven).\n int: (params?: Parameters<typeof z.int>[0]) => new SField(z.int(params)),\n float: (params?: Parameters<typeof z.float64>[0]) =>\n new SField(z.float64(params)),\n int32: (params?: Parameters<typeof z.int32>[0]) =>\n new SField(z.int32(params)),\n uint32: (params?: Parameters<typeof z.uint32>[0]) =>\n new SField(z.uint32(params)),\n bigint: (params?: Parameters<typeof z.bigint>[0]) =>\n new SField(z.bigint(params)),\n\n datetime: () => new SField(datetimeCodec()),\n /** Alias of `datetime` (Surreal stores a `datetime`; there is no plain date). */\n date: () => new SField(datetimeCodec()),\n /** Surreal `duration` (a `Duration` instance). */\n duration: () => new SField(native(z.instanceof(Duration), \"duration\")),\n /** Surreal `decimal` (a `Decimal` instance — arbitrary precision). */\n decimal: () => new SField(native(z.instanceof(Decimal), \"decimal\")),\n /** Surreal `bytes` (a `Uint8Array`). */\n bytes: () => new SField(bytesCodec()),\n /** Surreal `file` (a `FileRef`). */\n file: () => new SField(native(z.instanceof(FileRef), \"file\")),\n /** Surreal `geometry` (a `Geometry`), optionally narrowed to a kind. */\n geometry: (kind?: GeometryKind) =>\n new SField(\n native(z.instanceof(Geometry), kind ? `geometry<${kind}>` : \"geometry\"),\n ),\n /**\n * A `record<…>` link. Pass a table name, the imported `TableDef`/`RelationDef`, or an array for a\n * multi-table union — `s.recordId(User)`, `s.recordId([User, Service])` — so a table's name is\n * only ever written in its own definition. (For a single-table link `User.record()` is preferred:\n * it also carries the id value type; `User.record().or(Post.record())` composes a union.)\n *\n * Called with NO argument — `s.recordId()` — it emits a bare `record` (a link to ANY table), since a\n * record id's table is optional in SurrealDB.\n */\n recordId: <T extends string | AnyTable = string>(\n table?: T | readonly T[],\n ): RecordIdField<T extends string ? T : NamesOf<T>> =>\n new RecordIdField(\n (table === undefined ? [] : Array.isArray(table) ? table : [table]).map(\n (t) => (typeof t === \"string\" ? t : t.name),\n ) as (T extends string ? T : NamesOf<T>)[],\n ),\n /**\n * A nested object whose fields keep their surreal metadata + native types. The returned\n * schema TYPE carries the original shape `S` via the `~szShape` brand (type-only — runtime\n * is unchanged) so `CreateValue`/`ShapeOf` can recover the nested fields' create-flags\n * (e.g. a nested `$default`) and make them create-optional. The brand survives every\n * `$`-method and Zod wrapper (`.optional()`/`.array()`/`.$default()`), which all reuse\n * `this.schema`.\n */\n object: <S extends Shape>(shape: S): SField<SZObject<S>> => {\n const fields: Record<string, AnyField> = {};\n const zshape: Record<string, z.ZodType> = {};\n for (const [k, v] of Object.entries(shape)) {\n const f = v instanceof SField ? v : new SField(v);\n fields[k] = f;\n zshape[k] = f.schema;\n }\n const schema = z.object(zshape) as SZObject<S>;\n objectFieldsRegistry.set(schema, fields);\n return new SField(schema);\n },\n /** An array of `element`. `opts.max` -> sized `array<T, N>` (N is the MAX length). */\n array: <F extends AnyField | z.ZodType>(\n element: F,\n opts?: { max?: number },\n ): SField<z.ZodArray<SchemaOf<F>>> => {\n const base = (\n element instanceof SField ? element : new SField(element)\n ).array() as SField<z.ZodArray<SchemaOf<F>>>;\n return opts?.max === undefined\n ? base\n : new SField(base.schema.max(opts.max), base.surreal);\n },\n /** A literal value type. */\n literal: <const T extends string | number | boolean | bigint>(value: T) =>\n new SField(z.literal(value)),\n /** A string enum. */\n enum: <const T extends readonly [string, ...string[]]>(values: T) =>\n new SField(z.enum(values)),\n /** A union of fields/schemas. */\n union: <\n const T extends readonly [\n AnyField | z.ZodType,\n ...(AnyField | z.ZodType)[],\n ],\n >(\n options: T,\n ): SField<z.ZodUnion<ZodsOf<T>>> =>\n new SField(z.union(options.map(toZod) as ZodsOf<T>)),\n /** A fixed-length tuple of fields/schemas. */\n tuple: <\n const T extends readonly [\n AnyField | z.ZodType,\n ...(AnyField | z.ZodType)[],\n ],\n >(\n items: T,\n ): SField<z.ZodTuple<ZodsOf<T>>> =>\n new SField(z.tuple(items.map(toZod) as ZodsOf<T>)),\n\n /** An open-keyed record `record<key, value>` -> SurrealQL `object` with a `.*` value field. */\n record: <K extends z.core.$ZodRecordKey, V extends AnyField | z.ZodType>(\n key: K,\n value: V,\n ): SField<z.ZodRecord<K, SchemaOf<V>>> =>\n new SField(z.record(key, toZod(value) as SchemaOf<V>)),\n /** A `Map<key, value>` -> SurrealQL `object` with a `.*` value field. */\n map: <K extends AnyField | z.ZodType, V extends AnyField | z.ZodType>(\n key: K,\n value: V,\n ): SField<z.ZodMap<SchemaOf<K>, SchemaOf<V>>> =>\n new SField(z.map(toZod(key) as SchemaOf<K>, toZod(value) as SchemaOf<V>)),\n /** A `Set<element>` -> SurrealQL `set<element>`. `opts.max` -> sized `set<T, N>` (MAX). */\n set: <V extends AnyField | z.ZodType>(\n element: V,\n opts?: { max?: number },\n ): SField<z.ZodSet<SchemaOf<V>>> => {\n const base = z.set(toZod(element) as SchemaOf<V>);\n return new SField(\n opts?.max === undefined ? base : base.max(opts.max),\n ) as SField<z.ZodSet<SchemaOf<V>>>;\n },\n /** The intersection of two schemas (object fields are merged in DDL). */\n intersection: <\n A extends AnyField | z.ZodType,\n B extends AnyField | z.ZodType,\n >(\n a: A,\n b: B,\n ): SField<z.ZodIntersection<SchemaOf<A>, SchemaOf<B>>> =>\n new SField(\n z.intersection(toZod(a) as SchemaOf<A>, toZod(b) as SchemaOf<B>),\n ),\n /** A lazily-resolved schema/field (for recursive types). */\n lazy: <V extends AnyField | z.ZodType>(\n getter: () => V,\n ): SField<z.ZodLazy<SchemaOf<V>>> =>\n new SField(z.lazy(() => toZod(getter()) as SchemaOf<V>)),\n\n /** A native TS enum — string or numeric (numeric reverse-mappings are filtered out). */\n nativeEnum: <const T extends Record<string, string | number>>(entries: T) =>\n new SField(z.nativeEnum(entries)),\n /** A discriminated union of object schemas/fields -> DDL `object`. */\n discriminatedUnion: <\n Disc extends string,\n const T extends readonly [\n AnyField | z.ZodType,\n ...(AnyField | z.ZodType)[],\n ],\n >(\n discriminator: Disc,\n options: T,\n ): SField<z.ZodDiscriminatedUnion<ZodsOf<T>, Disc>> =>\n new SField(\n z.discriminatedUnion(\n discriminator,\n options.map(toZod) as never,\n ) as unknown as z.ZodDiscriminatedUnion<ZodsOf<T>, Disc>,\n ),\n\n /** Wrap a field/schema as optional (constructor form of `.optional()`). */\n optional: <F extends AnyField | z.ZodType>(\n field: F,\n ): SField<z.ZodOptional<SchemaOf<F>>, FlagsOf<F>> =>\n (field instanceof SField ? field : new SField(field)).optional() as SField<\n z.ZodOptional<SchemaOf<F>>,\n FlagsOf<F>\n >,\n /** Wrap a field/schema as nullable (constructor form of `.nullable()`). */\n nullable: <F extends AnyField | z.ZodType>(\n field: F,\n ): SField<z.ZodNullable<SchemaOf<F>>, FlagsOf<F>> =>\n (field instanceof SField ? field : new SField(field)).nullable() as SField<\n z.ZodNullable<SchemaOf<F>>,\n FlagsOf<F>\n >,\n\n /** Optional **and** nullable — Zod's `nullish`. */\n nullish: <F extends AnyField | z.ZodType>(\n field: F,\n ): SField<z.ZodNullable<z.ZodOptional<SchemaOf<F>>>, FlagsOf<F>> => {\n const f = field instanceof SField ? field : new SField(field);\n return f.optional().nullable() as SField<\n z.ZodNullable<z.ZodOptional<SchemaOf<F>>>,\n FlagsOf<F>\n >;\n },\n\n /**\n * Zod-style coercion. Each maps to the **same** SurrealQL type as its non-coerced builder —\n * coercion only loosens the app/input side; the DB/wire type is unchanged.\n */\n coerce: {\n string: () => new SField(z.coerce.string()),\n number: () => new SField(z.coerce.number()),\n boolean: () => new SField(z.coerce.boolean()),\n bigint: () => new SField(z.coerce.bigint()),\n date: () => new SField(coercedDatetimeCodec()),\n },\n\n // Catch-alls.\n any: () => new SField(z.any()),\n unknown: () => new SField(z.unknown()),\n null: () => new SField(z.null()),\n\n // --- Non-Surreal types ---\n // Present so a global `z.*` -> `s.*` swap never collides. They carry NO SurrealQL mapping,\n // so they're rejected as a table field at compile time (and by `inferField` at runtime) —\n // unless you teach them to serialize via `.$surreal(type, codec)`.\n symbol: () => noDdl(new SField(z.symbol())),\n undefined: () => noDdl(new SField(z.undefined())),\n void: () => noDdl(new SField(z.void())),\n never: () => noDdl(new SField(z.never())),\n nan: () => noDdl(new SField(z.nan())),\n custom: <T>(check?: (val: unknown) => boolean) =>\n noDdl(new SField(z.custom<T>(check))),\n instanceof: <T extends Parameters<typeof z.instanceof>[0]>(cls: T) =>\n noDdl(new SField(z.instanceof(cls))),\n promise: <F extends AnyField | z.ZodType>(schema: F) =>\n noDdl(new SField(z.promise(toZod(schema)))),\n /** Zod's function factory (not a schema/field — present for drop-in `z.*` parity). */\n function: (...args: Parameters<typeof z.function>) => z.function(...args),\n};\n\n// --- Tables & relations ---\n\nexport type Shape = Record<string, AnyField | z.ZodType>;\ntype SchemaOf<F> =\n F extends SField<infer S, infer _> ? S : F extends z.ZodType ? F : never;\ntype FlagsOf<F> = F extends SField<z.ZodType, infer Fl> ? Fl : never;\n/**\n * Whether a field carries the `\"internal\"` flag (set by `.$internal()`). The\n * `string extends FlagsOf<F>` guard short-circuits the broad `Shape` case (where\n * flags widen to `string`, and `\"internal\" extends string` would wrongly be true),\n * so `ZShape<Shape>` keeps every key for shape-agnostic refs like `TableDef<string, Shape>`.\n */\ntype IsInternal<F> =\n string extends FlagsOf<F>\n ? false\n : \"internal\" extends FlagsOf<F>\n ? true\n : false;\n/** The public zshape — internal fields are excluded (see `ZShapeAll` for the system view). */\ntype ZShape<S extends Shape> = {\n [K in keyof S as IsInternal<S[K]> extends true ? never : K]: SchemaOf<S[K]>;\n};\n/** Every field's zshape, including internal ones — backs the `.system` view. */\ntype ZShapeAll<S extends Shape> = { [K in keyof S]: SchemaOf<S[K]> };\n/**\n * The schema type returned by `s.object`: a plain `z.ZodObject` carrying its original\n * `Shape` via a type-only `~szShape` brand. The brand is optional, so the runtime cast\n * (`z.object(...) as SZObject<S>`) is sound and the brand is invisible to `z.input`/\n * `z.output`/`App`/`Wire` — nested fields stay REQUIRED on the decoded side. It exists\n * solely so `ShapeOf`/`CreateValue` can recover the nested shape for the create surface.\n */\ntype SZObject<S extends Shape> = z.ZodObject<ZShape<S>> & {\n readonly \"~szShape\"?: S;\n};\ntype ToField<F> =\n F extends SField<infer Sc, infer Fl> ? SField<Sc, Fl> : SField<SchemaOf<F>>;\ntype Fields<S extends Shape> = { [K in keyof S]: ToField<S[K]> };\ntype Unwrap<F> =\n F extends SField<z.ZodOptional<infer Inner extends z.ZodType>, infer Fl>\n ? SField<Inner, Fl>\n : F;\ntype PartialShape<S extends Shape> = {\n [K in keyof S]: SField<z.ZodOptional<SchemaOf<S[K]>>, FlagsOf<S[K]>>;\n};\ntype RequiredShape<S extends Shape> = { [K in keyof S]: Unwrap<Fields<S>[K]> };\n\nexport interface TableConfig {\n schemafull: boolean;\n /** Table `TYPE`: `normal` (default) or `any` (holds both records and graph edges). */\n type?: \"normal\" | \"any\";\n drop?: boolean;\n comment?: string;\n /** Table-level `PERMISSIONS`. Omitted ops default to NONE in SurrealDB. See `.permissions()`. */\n permissions?: TablePermissions;\n relation?: { from: string[]; to: string[]; enforced?: boolean };\n /** Composite (multi-field) indexes. See `.index(name, fields, opts)`. */\n indexes?: TableIndex[];\n /** Row-change events. See `.event(name, { when?, then })`. */\n events?: TableEvent[];\n /** `CHANGEFEED <dur> [INCLUDE ORIGINAL]`. See `.changefeed(dur, opts?)`. */\n changefeed?: { expiry: string; includeOriginal?: boolean };\n /**\n * A pre-computed (materialized) VIEW — `AS <SELECT …>`. When set, the table is computed from the\n * query (forced `TYPE ANY SCHEMALESS`, no authored fields). See {@link defineView}.\n */\n view?: Expr;\n}\n\n/** A table index definition (single- or multi-field, or a row-count index). */\nexport interface TableIndex {\n name: string;\n fields: string[];\n unique?: boolean;\n /** A materialized row-count index (`DEFINE INDEX … COUNT`, no fields). */\n count?: boolean;\n /** `COMMENT <string>` on the index. */\n comment?: string;\n /**\n * A special index spec appended after `FIELDS` — a vector (`HNSW …`/`DISKANN …`) or full-text\n * (`FULLTEXT ANALYZER …`) index. Built from the `.index()` opts; minimal form (SurrealDB\n * materializes the rest), so it round-trips against the introspected, canonicalized spec.\n */\n spec?: string;\n}\n\n/** Options for a HNSW vector index (`.index(name, [field], { hnsw: {…} })`). */\nexport interface HnswOptions {\n dimension: number;\n dist?: \"euclidean\" | \"cosine\" | \"manhattan\" | \"minkowski\" | \"hamming\";\n type?: \"f64\" | \"f32\" | \"i64\" | \"i32\" | \"i16\";\n efc?: number;\n m?: number;\n}\n/** Options for a DISKANN vector index (`.index(name, [field], { diskann: {…} })`). */\nexport interface DiskannOptions {\n dimension: number;\n dist?: \"euclidean\" | \"cosine\" | \"manhattan\";\n type?: \"f64\" | \"f32\" | \"i64\" | \"i32\" | \"i16\";\n degree?: number;\n l_build?: number;\n alpha?: number;\n}\n/** Options for a FULL-TEXT search index (`.index(name, [field], { fulltext: {…} })`). Needs a\n * `defineAnalyzer` of the same name. `bm25: [k1, b]` tunes scoring; `true` uses the defaults. */\nexport interface FulltextOptions {\n analyzer: string;\n bm25?: boolean | [number, number];\n highlights?: boolean;\n}\n\n/** Build the special index spec string (minimal — SurrealDB fills in the rest). */\nfunction buildIndexSpec(opts: {\n hnsw?: HnswOptions;\n diskann?: DiskannOptions;\n fulltext?: FulltextOptions;\n}): string | undefined {\n if (opts.hnsw) {\n const h = opts.hnsw;\n let s = `HNSW DIMENSION ${h.dimension}`;\n if (h.dist) s += ` DIST ${h.dist.toUpperCase()}`;\n if (h.type) s += ` TYPE ${h.type.toUpperCase()}`;\n if (h.efc !== undefined) s += ` EFC ${h.efc}`;\n if (h.m !== undefined) s += ` M ${h.m}`;\n return s;\n }\n if (opts.diskann) {\n const d = opts.diskann;\n let s = `DISKANN DIMENSION ${d.dimension}`;\n if (d.dist) s += ` DIST ${d.dist.toUpperCase()}`;\n if (d.type) s += ` TYPE ${d.type.toUpperCase()}`;\n if (d.degree !== undefined) s += ` DEGREE ${d.degree}`;\n if (d.l_build !== undefined) s += ` L_BUILD ${d.l_build}`;\n if (d.alpha !== undefined) s += ` ALPHA ${d.alpha}`;\n return s;\n }\n if (opts.fulltext) {\n const f = opts.fulltext;\n let s = `FULLTEXT ANALYZER ${f.analyzer}`;\n if (Array.isArray(f.bm25)) s += ` BM25(${f.bm25[0]},${f.bm25[1]})`;\n if (f.highlights) s += \" HIGHLIGHTS\";\n return s;\n }\n return undefined;\n}\n\n/** A SurrealQL expression: a `surql\\`…\\`` bound query (bindings inlined) or a raw string. */\nexport type Expr = BoundQuery | string;\n\n/**\n * A table event: `DEFINE EVENT <name> ON TABLE <table> [WHEN <when>] THEN <then>`. The event\n * body sees `$before`/`$after`/`$event`/`$value`. `then` may be one expression or several\n * (run in order). Author expressions with `surql\\`…\\`` (bindings inline) or a raw string.\n */\nexport interface TableEvent {\n name: string;\n when?: Expr;\n then: Expr | Expr[];\n}\n\nfunction normalizeFields<S extends Shape>(shape: S): Fields<S> {\n const out: Record<string, AnyField> = {};\n for (const [k, v] of Object.entries(shape)) {\n out[k] = v instanceof SField ? v : new SField(v);\n }\n return out as unknown as Fields<S>;\n}\n\n/** The wrappers `safeEncodeValue` peels to reach a schema registered in `objectFieldsRegistry`\n * (and the array element) — the same identity-preserving set `ShapeOf` strips at the type\n * level. `array` is intentionally NOT peeled (it's handled separately). */\nconst ENCODE_PEEL = new Set([\n \"optional\",\n \"nullable\",\n \"default\",\n \"prefault\",\n \"catch\",\n \"readonly\",\n]);\n\n/** Peel identity-preserving wrappers off a schema to reach its core (registered) schema. */\nfunction unwrapCore(schema: z.ZodType): z.ZodType {\n let s = schema;\n while (ENCODE_PEEL.has((s._zod.def as { type: string }).type)) {\n const inner = (s._zod.def as { innerType?: z.ZodType }).innerType;\n if (!inner) break;\n s = inner;\n }\n return s;\n}\n\n/** If `core` is a `ZodArray` whose (unwrapped) element is a registered `s.object`, return\n * that element's fields; otherwise undefined. */\nfunction arrayElementFields(\n core: z.ZodType,\n): Record<string, AnyField> | undefined {\n if ((core._zod.def as { type: string }).type !== \"array\") return undefined;\n const element = (core._zod.def as { element?: z.ZodType }).element;\n if (!element) return undefined;\n return objectFieldsRegistry.get(unwrapCore(element));\n}\n\n/**\n * Validate + encode one provided field value to its wire form (non-throwing — the shared core\n * of both `encode` and `safeEncode`). A nested `s.object` (or an array of one) recurses via\n * `safeEncodeInput`, so absent nested keys are OMITTED — on CREATE the DB fills their defaults;\n * on UPDATE `encodePartial` is deep-partial and pairs with `MERGE` (which deep-merges), so\n * omitted siblings are preserved. Leaf fields go through `z.safeEncode` (which validates);\n * issues are pushed into `issues` with their path prefixed by `path`, so the aggregate\n * `ZodError` carries fully-qualified paths. Object-LEVEL refinements on a nested `s.object`\n * are skipped (rare; leaf validation still runs).\n */\nfunction safeEncodeValue(\n field: AnyField,\n v: unknown,\n path: PropertyKey[],\n issues: z.core.$ZodIssue[],\n): unknown {\n const core = unwrapCore(field.schema);\n const nested = objectFieldsRegistry.get(core);\n if (nested)\n return safeEncodeInput(nested, v as Record<string, unknown>, path, issues);\n const elem = arrayElementFields(core);\n if (elem) {\n return (v as unknown[]).map((el, i) =>\n safeEncodeInput(\n elem,\n el as Record<string, unknown>,\n [...path, i],\n issues,\n ),\n );\n }\n const res = z.safeEncode(field.schema, v as never);\n if (res.success) return res.data;\n for (const issue of res.error.issues)\n issues.push({ ...issue, path: [...path, ...issue.path] });\n return undefined;\n}\n\n/** Recurse over the provided keys (see `safeEncodeValue`), omitting absent (`undefined`) ones,\n * building the wire object and collecting issues. */\nfunction safeEncodeInput(\n fields: Record<string, AnyField>,\n input: Record<string, unknown>,\n path: PropertyKey[],\n issues: z.core.$ZodIssue[],\n): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(input)) {\n if (v === undefined) continue;\n const field = fields[k];\n out[k] = field ? safeEncodeValue(field, v, [...path, k], issues) : v;\n }\n return out;\n}\n\n/**\n * The core of `safeEncode`/`safeEncodePartial` AND `encode`/`encodePartial`: validate+encode\n * the PROVIDED keys, aggregating every leaf issue (with correct paths) into one `z.ZodError`.\n * `safeEncode` returns the result; `encode` throws `error` (so `encode` and `safeEncode` are\n * the same operation — `encode` = `safeEncode` + throw — including for a PARTIAL nested\n * `s.object`).\n */\nfunction safeEncodeFields(\n fields: Record<string, AnyField>,\n input: Record<string, unknown>,\n): z.ZodSafeParseResult<unknown> {\n const issues: z.core.$ZodIssue[] = [];\n const data = safeEncodeInput(fields, input, [], issues);\n return issues.length > 0\n ? { success: false, error: new z.ZodError(issues) }\n : { success: true, data };\n}\n\n/** Async mirror of `safeEncodeValue` — awaits `z.safeEncodeAsync` per leaf and recurses into a\n * nested `s.object` (or array of one) via `safeEncodeInputAsync`. Backs the `*Async` writes. */\nasync function safeEncodeValueAsync(\n field: AnyField,\n v: unknown,\n path: PropertyKey[],\n issues: z.core.$ZodIssue[],\n): Promise<unknown> {\n const core = unwrapCore(field.schema);\n const nested = objectFieldsRegistry.get(core);\n if (nested)\n return safeEncodeInputAsync(\n nested,\n v as Record<string, unknown>,\n path,\n issues,\n );\n const elem = arrayElementFields(core);\n if (elem) {\n return Promise.all(\n (v as unknown[]).map((el, i) =>\n safeEncodeInputAsync(\n elem,\n el as Record<string, unknown>,\n [...path, i],\n issues,\n ),\n ),\n );\n }\n const res = await z.safeEncodeAsync(field.schema, v as never);\n if (res.success) return res.data;\n for (const issue of res.error.issues)\n issues.push({ ...issue, path: [...path, ...issue.path] });\n return undefined;\n}\n\n/** Async mirror of `safeEncodeInput` — recurse over the provided keys, omitting absent ones. */\nasync function safeEncodeInputAsync(\n fields: Record<string, AnyField>,\n input: Record<string, unknown>,\n path: PropertyKey[],\n issues: z.core.$ZodIssue[],\n): Promise<Record<string, unknown>> {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(input)) {\n if (v === undefined) continue;\n const field = fields[k];\n out[k] = field\n ? await safeEncodeValueAsync(field, v, [...path, k], issues)\n : v;\n }\n return out;\n}\n\n/** Async mirror of `safeEncodeFields` — backs `safeEncodeAsync`/`encodeAsync` (run + throw). */\nasync function safeEncodeFieldsAsync(\n fields: Record<string, AnyField>,\n input: Record<string, unknown>,\n): Promise<z.ZodSafeParseResult<unknown>> {\n const issues: z.core.$ZodIssue[] = [];\n const data = await safeEncodeInputAsync(fields, input, [], issues);\n return issues.length > 0\n ? { success: false, error: new z.ZodError(issues) }\n : { success: true, data };\n}\n\n// --- Create / Update input shapes ---\ntype Prettify<T> = { [K in keyof T]: T[K] } & {};\ntype AppOf<F> = z.output<SchemaOf<F>>;\ntype InputOptional<F> = undefined extends z.input<SchemaOf<F>> ? true : false;\n\n/**\n * Recover the nested `Shape` of an `s.object` schema (`never` if the schema isn't one).\n * Identity-preserving wrappers (optional/default/readonly/nullable) are peeled first, then\n * the `~szShape` brand is read. The inner `NS extends Shape ? NS : never` drops the\n * `| undefined` that inferring from an optional property can introduce, so the result is the\n * clean shape — or `never` for any non-object schema.\n */\ntype ShapeOf<Sc> =\n Sc extends z.ZodOptional<infer I>\n ? ShapeOf<I>\n : Sc extends z.ZodDefault<infer I>\n ? ShapeOf<I>\n : Sc extends z.ZodReadonly<infer I>\n ? ShapeOf<I>\n : Sc extends z.ZodNullable<infer I>\n ? ShapeOf<I>\n : Sc extends { \"~szShape\"?: infer NS }\n ? NS extends Shape\n ? NS\n : never\n : never;\n\n/**\n * The element `Shape` of an `s.object(...).array()` field (`never` otherwise). Peels the\n * same identity-preserving wrappers off the array, then reads the element's `~szShape`.\n */\ntype ArrayShapeOf<Sc> =\n Sc extends z.ZodOptional<infer I>\n ? ArrayShapeOf<I>\n : Sc extends z.ZodDefault<infer I>\n ? ArrayShapeOf<I>\n : Sc extends z.ZodReadonly<infer I>\n ? ArrayShapeOf<I>\n : Sc extends z.ZodNullable<infer I>\n ? ArrayShapeOf<I>\n : Sc extends z.ZodArray<infer E>\n ? ShapeOf<E>\n : never;\n\n/**\n * The create-input VALUE type for a field. A nested `s.object` recurses into its own\n * `CreateShape` (so nested `$default`/`\"create\"` fields become optional too); an array of\n * `s.object` becomes that nested create-shape's array; everything else is the plain app\n * type (`AppOf`). `[X] extends [never]` guards each branch because `never extends Shape` is\n * vacuously true and would otherwise wrongly match the object branch for scalar fields.\n */\ntype CreateValue<F, Sc = SchemaOf<F>> = [ShapeOf<Sc>] extends [never]\n ? [ArrayShapeOf<Sc>] extends [never]\n ? AppOf<F>\n : ArrayShapeOf<Sc> extends infer ENS extends Shape\n ? CreateShape<ENS>[]\n : AppOf<F>\n : ShapeOf<Sc> extends infer NS extends Shape\n ? CreateShape<NS>\n : AppOf<F>;\n\ntype CreateOptional<S extends Shape, K extends keyof S> = K extends \"id\"\n ? true\n : \"create\" extends FlagsOf<S[K]>\n ? true\n : InputOptional<S[K]>;\n// Public create input: internal fields are never settable by clients. Field VALUES use\n// `CreateValue` so a nested `s.object`'s own create-optional fields (a nested `$default`)\n// are optional too — while `CreateOptional` (the `?` modifier) is unchanged.\ntype CreateShape<S extends Shape> = Prettify<\n {\n [K in keyof S as IsInternal<S[K]> extends true\n ? never\n : CreateOptional<S, K> extends true\n ? never\n : K]: CreateValue<S[K]>;\n } & {\n [K in keyof S as IsInternal<S[K]> extends true\n ? never\n : CreateOptional<S, K> extends true\n ? K\n : never]?: CreateValue<S[K]>;\n }\n>;\n// System create input: includes internal fields (the old, all-fields behavior).\ntype CreateShapeAll<S extends Shape> = Prettify<\n {\n [K in keyof S as CreateOptional<S, K> extends true\n ? never\n : K]: CreateValue<S[K]>;\n } & {\n [K in keyof S as CreateOptional<S, K> extends true\n ? K\n : never]?: CreateValue<S[K]>;\n }\n>;\n\ntype UpdateExcluded<S extends Shape, K extends keyof S> = K extends \"id\"\n ? true\n : \"readonly\" extends FlagsOf<S[K]>\n ? true\n : false;\n/**\n * The update-input VALUE type for a field — a DEEP partial, since `MERGE` recursively\n * deep-merges nested objects (so any subset of nested keys is a valid patch). A nested\n * `s.object` recurses into its own `UpdateShape` (every nested field optional); an array\n * of `s.object` becomes that update-shape's array; everything else is the plain app type\n * (`AppOf`). The `[X] extends [never]` guards mirror `CreateValue` (so scalar fields don't\n * wrongly match the object branch via `never extends Shape`).\n */\ntype UpdateValue<F, Sc = SchemaOf<F>> = [ShapeOf<Sc>] extends [never]\n ? [ArrayShapeOf<Sc>] extends [never]\n ? AppOf<F>\n : ArrayShapeOf<Sc> extends infer ENS extends Shape\n ? UpdateShape<ENS>[]\n : AppOf<F>\n : ShapeOf<Sc> extends infer NS extends Shape\n ? UpdateShape<NS>\n : AppOf<F>;\n// Public update input: internal fields are excluded. Field VALUES use `UpdateValue` so a\n// nested `s.object` is itself a deep partial (every nested key optional), matching MERGE.\ntype UpdateShape<S extends Shape> = Prettify<{\n [K in keyof S as IsInternal<S[K]> extends true\n ? never\n : UpdateExcluded<S, K> extends true\n ? never\n : K]?: UpdateValue<S[K]>;\n}>;\n// System update input: includes internal fields (the old, all-fields behavior).\ntype UpdateShapeAll<S extends Shape> = Prettify<{\n [K in keyof S as UpdateExcluded<S, K> extends true ? never : K]?: UpdateValue<\n S[K]\n >;\n}>;\n\n/** A Zod-style non-throwing result: `{ success: true; data }` | `{ success: false; error }`\n * (mirrors `z.safeEncode`/`z.safeDecode`). */\ntype SafeResult<T> = z.ZodSafeParseResult<T>;\n/** The wire payload `encode`/`safeEncode` build: the provided keys' wire (`z.input`) types. Only\n * the supplied keys are present at runtime, hence `Partial`. */\ntype MakeWire<S extends Shape> = Partial<z.input<z.ZodObject<ZShape<S>>>>;\n/** Same, over ALL fields — the `.system` view includes `$internal()` ones. */\ntype MakeWireAll<S extends Shape> = Partial<z.input<z.ZodObject<ZShapeAll<S>>>>;\n\n/** A table (or relation) definition: shape + DDL config, with chainable builders. */\nexport class TableDef<Name extends string, S extends Shape> {\n /** Zod object over the inner schemas — drives validation, encode/decode, types. */\n readonly object: z.ZodObject<ZShape<S>>;\n\n constructor(\n readonly name: Name,\n readonly fields: Fields<S>,\n readonly config: TableConfig = { schemafull: true },\n ) {\n // Public object skips internal fields (zod also strips unknown keys — double-safe);\n // `emitTable` still iterates ALL `this.fields`, so internal fields stay in the DDL.\n const zshape: Record<string, z.ZodType> = {};\n for (const [k, f] of Object.entries(fields)) {\n if ((f as AnyField).surreal.internal) continue;\n zshape[k] = (f as AnyField).schema;\n }\n this.object = z.object(zshape) as z.ZodObject<ZShape<S>>;\n }\n\n get kind(): \"table\" | \"relation\" {\n return this.config.relation ? \"relation\" : \"table\";\n }\n\n /**\n * A SurrealDB `Table` instance for this table — for direct SDK calls that take a table reference,\n * e.g. `db.select(User.table)`. (For a record id, chain `User.record().for(id)`.)\n */\n get table(): Table<Name> {\n return new Table(this.name);\n }\n\n /** DB wire row -> app object. */\n decode(row: unknown): z.output<z.ZodObject<ZShape<S>>> {\n return z.decode(this.object, row as never);\n }\n /** DB wire row -> app object (async — for async refinements). */\n decodeAsync(row: unknown): Promise<z.output<z.ZodObject<ZShape<S>>>> {\n return z.decodeAsync(this.object, row as never);\n }\n\n // No-throw read variants — return { success, data } | { success, error }.\n safeDecode(row: unknown) {\n return z.safeDecode(this.object, row as never);\n }\n safeDecodeAsync(row: unknown) {\n return z.safeDecodeAsync(this.object, row as never);\n }\n\n // Deprecated Zod-style aliases. For codecs `parse` runs the DECODE direction (wire -> app),\n // so it's just `decode` under a misleading name — prefer `decode` (and `encode` for create\n // payloads). Kept for `z`-API familiarity; editors will strike them through.\n /** @deprecated `parse` decodes a DB row (wire -> app). Use {@link TableDef.decode | decode}. */\n parse(row: unknown): z.output<z.ZodObject<ZShape<S>>> {\n return this.decode(row);\n }\n /** @deprecated Use {@link TableDef.safeDecode | safeDecode} (or {@link TableDef.safeEncode | safeEncode} to validate an app object). */\n safeParse(row: unknown) {\n return this.safeDecode(row);\n }\n /** @deprecated Use {@link TableDef.decodeAsync | decodeAsync}. */\n parseAsync(row: unknown): Promise<z.output<z.ZodObject<ZShape<S>>>> {\n return this.decodeAsync(row);\n }\n /** @deprecated Use {@link TableDef.safeDecodeAsync | safeDecodeAsync}. */\n safeParseAsync(row: unknown) {\n return this.safeDecodeAsync(row);\n }\n\n // --- Write side (app -> wire). `encode`/`encodePartial` are create/patch-shaped: DB-filled\n // (`$default`/`id`) fields are optional (the DB fills them), absent keys are OMITTED, and each\n // provided leaf is validated via the recursive encoder. The raw full-object codec (no create-\n // shaping) is `z.encode(table.object, app)` if ever needed. ---\n\n /**\n * Build a wire payload for `CREATE` (DB-filled fields optional). Validates+encodes each\n * provided field — so this VALIDATES and THROWS the aggregated `z.ZodError` on invalid\n * input. Use `safeEncode` for the non-throwing form.\n */\n encode(input: CreateShape<S>): MakeWire<S> {\n const r = this.safeEncode(input);\n if (!r.success) throw r.error;\n return r.data;\n }\n /**\n * Build a wire payload for `UPDATE`/`MERGE` (a partial patch; excludes id/readonly).\n * VALIDATES and THROWS on invalid input; use `safeEncodePartial` for the non-throwing form.\n */\n encodePartial(input: UpdateShape<S>): MakeWire<S> {\n const r = this.safeEncodePartial(input);\n if (!r.success) throw r.error;\n return r.data;\n }\n /**\n * Non-throwing `encode`: validates+encodes the provided keys and returns a Zod-style\n * `{ success: true; data }` | `{ success: false; error }`. All field errors are\n * aggregated (with correct paths) into a single `z.ZodError`.\n */\n safeEncode(input: CreateShape<S>): SafeResult<MakeWire<S>> {\n return safeEncodeFields(\n this.fields as unknown as Record<string, AnyField>,\n input as Record<string, unknown>,\n ) as SafeResult<MakeWire<S>>;\n }\n /** Non-throwing `encodePartial` (see `safeEncode`). */\n safeEncodePartial(input: UpdateShape<S>): SafeResult<MakeWire<S>> {\n return safeEncodeFields(\n this.fields as unknown as Record<string, AnyField>,\n input as Record<string, unknown>,\n ) as SafeResult<MakeWire<S>>;\n }\n /** Async `encode` (awaits async refinements per leaf); throws the aggregated error. */\n async encodeAsync(input: CreateShape<S>): Promise<MakeWire<S>> {\n const r = await this.safeEncodeAsync(input);\n if (!r.success) throw r.error;\n return r.data;\n }\n /** Async `encodePartial`; throws the aggregated error. */\n async encodePartialAsync(input: UpdateShape<S>): Promise<MakeWire<S>> {\n const r = await this.safeEncodePartialAsync(input);\n if (!r.success) throw r.error;\n return r.data;\n }\n /** Non-throwing async `encode` (see `safeEncode`). */\n safeEncodeAsync(input: CreateShape<S>): Promise<SafeResult<MakeWire<S>>> {\n return safeEncodeFieldsAsync(\n this.fields as unknown as Record<string, AnyField>,\n input as Record<string, unknown>,\n ) as Promise<SafeResult<MakeWire<S>>>;\n }\n /** Non-throwing async `encodePartial`. */\n safeEncodePartialAsync(\n input: UpdateShape<S>,\n ): Promise<SafeResult<MakeWire<S>>> {\n return safeEncodeFieldsAsync(\n this.fields as unknown as Record<string, AnyField>,\n input as Record<string, unknown>,\n ) as Promise<SafeResult<MakeWire<S>>>;\n }\n\n /**\n * The server/system view: the same table over ALL fields, including `$internal()`\n * ones the public surface hides. Use it in trusted server code that must read or\n * write internal fields (e.g. a `passhash`).\n */\n get system(): SystemView<Name, S> {\n return new SystemView<Name, S>(\n this.fields as unknown as Record<string, AnyField>,\n );\n }\n\n // --- DDL config (chainable, immutable) ---\n private withConfig(config: Partial<TableConfig>): TableDef<Name, S> {\n return new TableDef(this.name, this.fields, { ...this.config, ...config });\n }\n schemafull() {\n return this.withConfig({ schemafull: true });\n }\n schemaless() {\n return this.withConfig({ schemafull: false });\n }\n /** `TYPE ANY` — the table may hold both normal records and graph edges. */\n typeAny() {\n return this.withConfig({ type: \"any\" });\n }\n drop(drop = true) {\n return this.withConfig({ drop });\n }\n comment(comment: string) {\n return this.withConfig({ comment });\n }\n /** Set table-level `PERMISSIONS` (folded into the single `DEFINE TABLE` head). */\n permissions(spec: TablePermissions) {\n return this.withConfig({ permissions: spec });\n }\n /** `CHANGEFEED <dur> [INCLUDE ORIGINAL]` — track row changes for `SHOW CHANGES`. */\n changefeed(expiry: string, opts: { includeOriginal?: boolean } = {}) {\n return this.withConfig({\n changefeed: { expiry, includeOriginal: opts.includeOriginal },\n });\n }\n /**\n * Add a composite index: `DEFINE INDEX <name> ON TABLE <table> FIELDS <fields> [UNIQUE]`, or a\n * materialized row-count index with `{ count: true }` (no fields → `DEFINE INDEX <name> … COUNT`).\n */\n index(\n name: string,\n fields: (keyof S & string)[],\n opts: {\n unique?: boolean;\n count?: boolean;\n comment?: string;\n /** A HNSW vector index over the field. */\n hnsw?: HnswOptions;\n /** A DISKANN vector index over the field. */\n diskann?: DiskannOptions;\n /** A full-text search index — needs a `defineAnalyzer` of `analyzer`'s name. */\n fulltext?: FulltextOptions;\n } = {},\n ) {\n const index: TableIndex = {\n name,\n fields,\n unique: opts.unique,\n count: opts.count,\n comment: opts.comment,\n spec: buildIndexSpec(opts),\n };\n return this.withConfig({\n indexes: [...(this.config.indexes ?? []), index],\n });\n }\n /**\n * Add a row-change event: `DEFINE EVENT <name> ON TABLE <table> [WHEN <when>] THEN <then>`.\n * The body sees `$before`/`$after`/`$event`/`$value`; author with `surql\\`…\\`` or a raw string.\n */\n event(name: string, spec: { when?: Expr; then: Expr | Expr[] }) {\n // biome-ignore lint/suspicious/noThenProperty: `then` is the SurrealQL THEN clause (a string/BoundQuery), not a PromiseLike.\n const event: TableEvent = { name, when: spec.when, then: spec.then };\n return this.withConfig({\n events: [...(this.config.events ?? []), event],\n });\n }\n\n // --- Shape ops (mirror Zod's object methods; carry DDL metadata + config) ---\n extend<E extends Shape>(ext: E): TableDef<Name, Omit<S, keyof E> & E> {\n const f: Record<string, AnyField> = {\n ...(this.fields as unknown as Record<string, AnyField>),\n ...normalizeFields(ext),\n };\n return new TableDef(\n this.name,\n f as unknown as Fields<Omit<S, keyof E> & E>,\n this.config,\n );\n }\n pick<K extends keyof S>(...keys: K[]): TableDef<Name, Pick<S, K>> {\n const src = this.fields as unknown as Record<string, AnyField>;\n const f: Record<string, AnyField> = {};\n for (const k of keys) f[k as string] = src[k as string]!;\n return new TableDef(\n this.name,\n f as unknown as Fields<Pick<S, K>>,\n this.config,\n );\n }\n omit<K extends keyof S>(...keys: K[]): TableDef<Name, Omit<S, K>> {\n const f: Record<string, AnyField> = {\n ...(this.fields as unknown as Record<string, AnyField>),\n };\n for (const k of keys) delete f[k as string];\n return new TableDef(\n this.name,\n f as unknown as Fields<Omit<S, K>>,\n this.config,\n );\n }\n partial(): TableDef<Name, PartialShape<S>> {\n const f: Record<string, AnyField> = {};\n for (const [k, field] of Object.entries(this.fields))\n f[k] = (field as AnyField).optional();\n return new TableDef(\n this.name,\n f as unknown as Fields<PartialShape<S>>,\n this.config,\n );\n }\n required(): TableDef<Name, RequiredShape<S>> {\n const f: Record<string, AnyField> = {};\n for (const [k, field] of Object.entries(this.fields)) {\n const sf = field as AnyField;\n const def = sf.schema._zod.def as unknown as {\n type: string;\n innerType?: z.ZodType;\n };\n f[k] =\n def.type === \"optional\" && def.innerType\n ? new SField(def.innerType, sf.surreal)\n : sf;\n }\n return new TableDef(\n this.name,\n f as unknown as Fields<RequiredShape<S>>,\n this.config,\n );\n }\n\n /** Derive a `record<name>` link to this table (carrying its id value type). */\n record(): S extends { id: RecordIdField<Name, infer V> }\n ? RecordIdField<Name, V>\n : RecordIdField<Name> {\n const idField = (this.fields as unknown as Record<string, AnyField>).id as\n | RecordIdField<Name>\n | undefined;\n return new RecordIdField([this.name], idField?.valueType) as never;\n }\n}\n\n/**\n * The server/system view of a table (`TableDef.system`): the same data methods typed\n * over ALL fields, including `$internal()` ones the public `TableDef` hides. Its\n * `.object` validates/encodes/decodes the full shape, and `encode`/`encodePartial` accept\n * internal fields. Exposed for trusted server code; never hand it to a browser client.\n */\n// biome-ignore lint/correctness/noUnusedVariables: Name mirrors TableDef<Name, S> for symmetry (type-only)\nexport class SystemView<Name extends string, S extends Shape> {\n /** Zod object over ALL fields (internal included). */\n readonly object: z.ZodObject<ZShapeAll<S>>;\n\n constructor(readonly fields: Record<string, AnyField>) {\n const zshape: Record<string, z.ZodType> = {};\n for (const [k, f] of Object.entries(fields)) zshape[k] = f.schema;\n this.object = z.object(zshape) as z.ZodObject<ZShapeAll<S>>;\n }\n\n /** DB wire row -> app object (internal fields kept). */\n decode(row: unknown): z.output<z.ZodObject<ZShapeAll<S>>> {\n return z.decode(this.object, row as never);\n }\n /** DB wire row -> app object (async; internal fields kept). */\n decodeAsync(row: unknown): Promise<z.output<z.ZodObject<ZShapeAll<S>>>> {\n return z.decodeAsync(this.object, row as never);\n }\n\n // No-throw read variants.\n safeDecode(row: unknown) {\n return z.safeDecode(this.object, row as never);\n }\n safeDecodeAsync(row: unknown) {\n return z.safeDecodeAsync(this.object, row as never);\n }\n\n // Deprecated Zod-style aliases (parse runs the decode direction; use `decode`).\n /** @deprecated `parse` decodes a DB row (wire -> app). Use {@link SystemView.decode | decode}. */\n parse(row: unknown): z.output<z.ZodObject<ZShapeAll<S>>> {\n return this.decode(row);\n }\n /** @deprecated Use {@link SystemView.safeDecode | safeDecode}. */\n safeParse(row: unknown) {\n return this.safeDecode(row);\n }\n /** @deprecated Use {@link SystemView.decodeAsync | decodeAsync}. */\n parseAsync(row: unknown): Promise<z.output<z.ZodObject<ZShapeAll<S>>>> {\n return this.decodeAsync(row);\n }\n /** @deprecated Use {@link SystemView.safeDecodeAsync | safeDecodeAsync}. */\n safeParseAsync(row: unknown) {\n return this.safeDecodeAsync(row);\n }\n\n // --- Write side over ALL fields (internal included). Mirrors `TableDef`'s create/patch-shaped\n // `encode`/`encodePartial`; the raw full-object codec is `z.encode(view.object, app)`. ---\n\n /**\n * Build a `CREATE` payload allowed to set internal fields. VALIDATES and THROWS the\n * aggregated `z.ZodError` on invalid input; use `safeEncode` for the non-throwing form.\n */\n encode(input: CreateShapeAll<S>): MakeWireAll<S> {\n const r = this.safeEncode(input);\n if (!r.success) throw r.error;\n return r.data;\n }\n /**\n * Build an `UPDATE`/`MERGE` payload allowed to set internal fields. VALIDATES and THROWS\n * on invalid input; use `safeEncodePartial` for the non-throwing form.\n */\n encodePartial(input: UpdateShapeAll<S>): MakeWireAll<S> {\n const r = this.safeEncodePartial(input);\n if (!r.success) throw r.error;\n return r.data;\n }\n /** Non-throwing `encode` over ALL fields (see `TableDef.safeEncode`). */\n safeEncode(input: CreateShapeAll<S>): SafeResult<MakeWireAll<S>> {\n return safeEncodeFields(\n this.fields,\n input as Record<string, unknown>,\n ) as SafeResult<MakeWireAll<S>>;\n }\n /** Non-throwing `encodePartial` over ALL fields. */\n safeEncodePartial(input: UpdateShapeAll<S>): SafeResult<MakeWireAll<S>> {\n return safeEncodeFields(\n this.fields,\n input as Record<string, unknown>,\n ) as SafeResult<MakeWireAll<S>>;\n }\n /** Async `encode` over ALL fields; throws the aggregated error. */\n async encodeAsync(input: CreateShapeAll<S>): Promise<MakeWireAll<S>> {\n const r = await this.safeEncodeAsync(input);\n if (!r.success) throw r.error;\n return r.data;\n }\n /** Async `encodePartial` over ALL fields; throws the aggregated error. */\n async encodePartialAsync(input: UpdateShapeAll<S>): Promise<MakeWireAll<S>> {\n const r = await this.safeEncodePartialAsync(input);\n if (!r.success) throw r.error;\n return r.data;\n }\n /** Non-throwing async `encode` over ALL fields. */\n safeEncodeAsync(\n input: CreateShapeAll<S>,\n ): Promise<SafeResult<MakeWireAll<S>>> {\n return safeEncodeFieldsAsync(\n this.fields,\n input as Record<string, unknown>,\n ) as Promise<SafeResult<MakeWireAll<S>>>;\n }\n /** Non-throwing async `encodePartial` over ALL fields. */\n safeEncodePartialAsync(\n input: UpdateShapeAll<S>,\n ): Promise<SafeResult<MakeWireAll<S>>> {\n return safeEncodeFieldsAsync(\n this.fields,\n input as Record<string, unknown>,\n ) as Promise<SafeResult<MakeWireAll<S>>>;\n }\n}\n\n// --- Smart id: the `id` field describes the id value type; wrapped as record<thisTable, V>. ---\ntype IdValue<Id> =\n Id extends RecordIdField<string, infer V>\n ? V\n : Id extends SField<infer Sc, infer _>\n ? z.output<Sc> extends RecordIdValue\n ? z.output<Sc>\n : RecordIdValue\n : Id extends z.ZodType\n ? z.output<Id> extends RecordIdValue\n ? z.output<Id>\n : RecordIdValue\n : RecordIdValue;\ntype WithSmartId<Name extends string, S extends Shape> = Omit<S, \"id\"> & {\n id: RecordIdField<\n Name,\n \"id\" extends keyof S ? IdValue<S[\"id\"]> : RecordIdValue\n >;\n};\n\n/** Build a table's `id` field: a `record<name>` whose value type comes from `given`. */\nfunction buildIdField(\n name: string,\n given: AnyField | z.ZodType | undefined,\n): RecordIdField<string> {\n if (given === undefined) return new RecordIdField([name]);\n if (given instanceof RecordIdField)\n return new RecordIdField([name], given.valueType);\n const valueSchema = given instanceof SField ? given.schema : given;\n return new RecordIdField([name], valueSchema as z.ZodType<RecordIdValue>);\n}\n\n/** Normalize a shape, replacing/adding the special `id` field via buildIdField. */\nfunction applySmartId(name: string, shape: Shape): Record<string, AnyField> {\n const out: Record<string, AnyField> = {};\n for (const [k, v] of Object.entries(shape)) {\n if (k === \"id\") continue;\n out[k] = v instanceof SField ? v : new SField(v);\n }\n out.id = buildIdField(\n name,\n (shape as Record<string, AnyField | z.ZodType>).id,\n );\n return out;\n}\n\n/**\n * Define a normal table (schemafull by default). The shape may be a plain object, or a callback\n * `(self) => ({...})` that receives a `record<thisTable>` field — use it for self-referential\n * links: `manager: self.optional()`. Type-safe with no repeated table name: `self`'s type comes\n * from the `name` arg, not from `typeof <theConst>`, so it sidesteps the self-in-its-own-\n * initializer cycle (TS 7022) that would otherwise widen the whole table to `any`.\n */\n/**\n * Reject a shape field carrying the `NoDdl` brand (no SurrealQL mapping) at compile time: the\n * offending key resolves to an error string, so the shape literal won't type-check. Give such a\n * field `.$surreal(type, codec)` to make it storable, or drop it.\n */\ntype RejectNoDdl<S extends Shape> = {\n // `string extends FlagsOf` -> flags are unresolved (e.g. the callback form leaves `S` broad);\n // only reject when the brand is a concrete member, never on the generic fallback.\n [K in keyof S]: string extends FlagsOf<S[K]>\n ? S[K]\n : NoDdl extends FlagsOf<S[K]>\n ? \"no SurrealQL mapping for this field — give it `.$surreal(type, codec)` or remove it\"\n : S[K];\n};\n\n// The output (id value) type of an authored `id` field — WITHOUT the widen-to-RecordIdValue fallback\n// `IdValue` does, so `RejectBadId` can see whether it's actually a valid record-id value type.\ntype IdOutput<Id> =\n Id extends RecordIdField<string, infer V>\n ? V\n : Id extends SField<infer Sc, infer _>\n ? z.output<Sc>\n : Id extends z.ZodType\n ? z.output<Id>\n : never;\n\n/** Compile-time guard: an explicit `id` field must have a valid `RecordIdValue` value type — a\n * `s.symbol()`/`s.boolean()` id (not a valid id value) is rejected rather than silently widened. */\ntype RejectBadId<S extends Shape> = \"id\" extends keyof S\n ? [IdOutput<S[\"id\"]>] extends [RecordIdValue]\n ? unknown\n : {\n id: \"the `id` field's value must be a valid RecordId value type (string | number | bigint | uuid | array | object) — e.g. s.string(), s.int(), s.uuid()\";\n }\n : unknown;\n\nexport function defineTable<Name extends string, S extends Shape>(\n name: Name,\n // The object form is rejected at compile time (`RejectNoDdl` + `RejectBadId`); the callback form\n // keeps its precise `S` inference (a `& RejectNoDdl<S>` in a function-return position collapses it),\n // so a no-DDL field there is caught by the runtime `inferField` backstop instead.\n shape:\n | (S & RejectNoDdl<S> & RejectBadId<S>)\n | ((self: RecordIdField<Name>) => S),\n): TableDef<Name, WithSmartId<Name, S>> {\n const resolved =\n typeof shape === \"function\" ? shape(new RecordIdField([name])) : shape;\n return new TableDef(\n name,\n applySmartId(name, resolved) as unknown as Fields<WithSmartId<Name, S>>,\n {\n schemafull: true,\n },\n );\n}\n\n// biome-ignore lint/suspicious/noExplicitAny: shape-agnostic table reference for relation endpoints\ntype AnyTable = TableDef<string, any>;\ntype TableRef = AnyTable | readonly AnyTable[];\ntype NamesOf<T> =\n T extends TableDef<infer N extends string, infer _>\n ? N\n : T extends readonly (infer E)[]\n ? E extends TableDef<infer N extends string, infer _>\n ? N\n : never\n : never;\n\n/** A relation's full shape: the edge fields plus the `in`/`out` record endpoints. */\ntype RelationShape<\n Name extends string,\n S extends Shape,\n In extends string,\n Out extends string,\n> = Omit<WithSmartId<Name, S>, \"in\" | \"out\"> & {\n in: RecordIdField<In>;\n out: RecordIdField<Out>;\n};\n\nfunction tableNames(ref: TableRef): string[] {\n return (Array.isArray(ref) ? ref : [ref as AnyTable]).map((t) => t.name);\n}\n\n/** Build a relation's runtime fields: the edge fields + `in`/`out` (empty endpoints = any record). */\nfunction relationFields(\n name: string,\n edge: Shape,\n fromNames: string[],\n toNames: string[],\n): Record<string, AnyField> {\n return {\n ...applySmartId(name, edge),\n in: new RecordIdField(fromNames),\n out: new RecordIdField(toNames),\n };\n}\n\n/**\n * A graph relation (edge table). It's a usable `TableDef` immediately — endpoints are OPTIONAL\n * (`TYPE RELATION` with no `FROM`/`TO` restricts nothing) — and `.from(X)` / `.to(Y)` narrow the\n * `in` / `out` record types. Both return a new `RelationDef` (immutable), chainable in any order.\n */\nexport class RelationDef<\n Name extends string,\n S extends Shape,\n In extends string = string,\n Out extends string = string,\n> extends TableDef<Name, RelationShape<Name, S, In, Out>> {\n constructor(\n name: Name,\n private readonly edge: S,\n private readonly fromNames: string[] = [],\n private readonly toNames: string[] = [],\n private readonly isEnforced: boolean = false,\n ) {\n super(\n name,\n relationFields(name, edge, fromNames, toNames) as unknown as Fields<\n RelationShape<Name, S, In, Out>\n >,\n {\n schemafull: true,\n relation: {\n from: fromNames,\n to: toNames,\n ...(isEnforced ? { enforced: true } : {}),\n },\n },\n );\n }\n /** Restrict the source endpoint(s) (`in`). */\n from<F extends TableRef>(ref: F): RelationDef<Name, S, NamesOf<F>, Out> {\n return new RelationDef(\n this.name,\n this.edge,\n tableNames(ref),\n this.toNames,\n this.isEnforced,\n ) as unknown as RelationDef<Name, S, NamesOf<F>, Out>;\n }\n /** Restrict the target endpoint(s) (`out`). */\n to<T extends TableRef>(ref: T): RelationDef<Name, S, In, NamesOf<T>> {\n return new RelationDef(\n this.name,\n this.edge,\n this.fromNames,\n tableNames(ref),\n this.isEnforced,\n ) as unknown as RelationDef<Name, S, In, NamesOf<T>>;\n }\n /** Require both endpoints to exist on RELATE (`TYPE RELATION … ENFORCED`). */\n enforced(): RelationDef<Name, S, In, Out> {\n return new RelationDef(\n this.name,\n this.edge,\n this.fromNames,\n this.toNames,\n true,\n ) as unknown as RelationDef<Name, S, In, Out>;\n }\n}\n\n/**\n * Define a graph relation (edge table). Endpoints are optional — the result is a usable table\n * right away; chain `.from(X).to(Y)` to restrict the `in`/`out` records.\n */\nexport function defineRelation<Name extends string, S extends Shape = {}>(\n name: Name,\n fields?: S & RejectNoDdl<S>,\n): RelationDef<Name, S> {\n return new RelationDef(name, (fields ?? {}) as S);\n}\n\n/**\n * Define a pre-computed (materialized) VIEW table — `DEFINE TABLE <name> TYPE ANY SCHEMALESS AS\n * <query>`. Its rows are computed from the SELECT (SurrealDB keeps them in sync as the source tables\n * change), so a view has NO authored fields/id. Chain `.permissions()` / `.comment()` / `.changefeed()`\n * as on any table:\n *\n * ```ts\n * export const Adults = defineView(\"adults\", surql`SELECT name, age FROM person WHERE age >= 18`);\n * ```\n */\nexport function defineView<Name extends string>(\n name: Name,\n // biome-ignore lint/complexity/noBannedTypes: an empty shape — a view has no authored fields.\n query: Expr,\n): TableDef<Name, {}> {\n // biome-ignore lint/complexity/noBannedTypes: see above.\n return new TableDef<Name, {}>(name, {} as Fields<{}>, {\n schemafull: false,\n type: \"any\",\n view: query,\n });\n}\n\n/**\n * A standalone `DEFINE EVENT`, declared apart from its table (vs the inline `TableDef.event(…)`).\n * Export one per event when you want each event as its own named symbol. It compiles to the same\n * statement as the inline form — `pull` regenerates events inline, so the two are interchangeable.\n */\nexport class EventDef {\n readonly kind = \"event\" as const;\n constructor(\n /** Owning table name. */\n readonly table: string,\n readonly name: string,\n readonly when: Expr | undefined,\n readonly then: Expr | Expr[],\n ) {}\n}\n\n/**\n * Declare a row-change event on `table` as a standalone, exportable object:\n * `export const reverify = defineEvent(User, \"reverify\", { when, then })`. Pass the `TableDef`\n * (preferred — no name repetition) or a table name string. See {@link TableDef.event} for the\n * inline, chainable form.\n */\nexport function defineEvent(\n table: TableDef<string, Shape> | string,\n name: string,\n spec: { when?: Expr; then: Expr | Expr[] },\n): EventDef {\n const tableName = typeof table === \"string\" ? table : table.name;\n return new EventDef(tableName, name, spec.when, spec.then);\n}\n\ninterface FunctionConfig {\n /** Return type (an s schema, inferred to a SurrealQL type — like a field). */\n returns?: AnyField;\n /** Function body: a `surql\\`…\\`` block (or raw string). Required to emit. */\n body?: Expr;\n /** `PERMISSIONS FULL` (true) / `NONE` (false) / a `surql` condition. */\n permissions?: boolean | Expr;\n comment?: string;\n}\n\n/**\n * A custom function — `DEFINE FUNCTION fn::<name>(<args>) [-> <returns>] { <body> }`. Built with a\n * chainable, immutable API (like {@link TableDef}): `defineFunction(name, args).returns(…).body(…)`.\n * Args and the return type are s schemas (inferred to SurrealQL types, same as table fields).\n */\nexport class FunctionDef {\n readonly kind = \"function\" as const;\n constructor(\n readonly name: string,\n /** Ordered named args, each an s schema. */\n readonly args: Record<string, AnyField>,\n readonly config: FunctionConfig = {},\n ) {}\n private withConfig(c: Partial<FunctionConfig>): FunctionDef {\n return new FunctionDef(this.name, this.args, { ...this.config, ...c });\n }\n /** Declare the return type (an s schema). */\n returns(type: AnyField): FunctionDef {\n return this.withConfig({ returns: type });\n }\n /** The function body — a `surql\\`…\\`` block (braces optional) or a raw string. */\n body(body: Expr): FunctionDef {\n return this.withConfig({ body });\n }\n /** `PERMISSIONS`: `FULL` (true, the default), `NONE` (false), or a `surql` condition. */\n permissions(p: boolean | Expr): FunctionDef {\n return this.withConfig({ permissions: p });\n }\n comment(comment: string): FunctionDef {\n return this.withConfig({ comment });\n }\n}\n\n/**\n * Declare a custom function as a standalone, exportable object:\n * `export const greet = defineFunction(\"greet\", { name: s.string() }).returns(s.string()).body(surql\\`…\\`)`.\n * Emitted as `DEFINE FUNCTION fn::greet(...)`. Args are s schemas (inferred to SurrealQL types).\n */\nexport function defineFunction(name: string, args: Shape = {}): FunctionDef {\n return new FunctionDef(\n name,\n normalizeFields(args) as unknown as Record<string, AnyField>,\n );\n}\n\n/** The access type + its type-specific config. `RECORD` (default) / `JWT` / `BEARER`. */\nexport type AccessKind =\n | { type: \"record\" }\n | { type: \"jwt\"; alg?: string; key?: string; url?: string }\n | { type: \"bearer\"; subject: \"record\" | \"user\" };\n\n/** Token/session/grant lifetimes, e.g. `{ token: \"1h\", session: \"12h\", grant: \"30d\" }`. */\nexport interface AccessDuration {\n grant?: string;\n token?: string;\n session?: string;\n}\n\ninterface AccessConfig {\n /** `ON DATABASE` (default) or `ON NAMESPACE`. */\n on: \"database\" | \"namespace\";\n kind: AccessKind;\n /** RECORD-only: SIGNUP/SIGNIN/AUTHENTICATE blocks. */\n signup?: Expr;\n signin?: Expr;\n authenticate?: Expr;\n duration?: AccessDuration;\n}\n\n/**\n * An access definition — `DEFINE ACCESS <name> ON DATABASE TYPE …`. Chainable like {@link TableDef}.\n * Pick a type with `.record()` (default; SIGNUP/SIGNIN), `.jwt({ alg, key } | { url })` (validate\n * external tokens), or `.bearer({ for })` (API-key grants). The RECORD bodies are `surql\\`…\\`` blocks\n * (braces optional). NOTE: SurrealDB redacts signing keys in introspection, so `pull` can't recover\n * them — see the CLI (`--access` is opt-in for that reason).\n */\nexport class AccessDef {\n readonly kind = \"access\" as const;\n constructor(\n readonly name: string,\n readonly config: AccessConfig = {\n on: \"database\",\n kind: { type: \"record\" },\n },\n ) {}\n private withConfig(c: Partial<AccessConfig>): AccessDef {\n return new AccessDef(this.name, { ...this.config, ...c });\n }\n /** `TYPE RECORD` (the default) — end users sign up / sign in directly. */\n record(): AccessDef {\n return this.withConfig({ kind: { type: \"record\" } });\n }\n /** `TYPE JWT` — validate tokens from an external issuer: `{ alg, key }` (symmetric/PEM) or `{ url }` (JWKS). */\n jwt(opts: { alg?: string; key?: string; url?: string }): AccessDef {\n return this.withConfig({ kind: { type: \"jwt\", ...opts } });\n }\n /** `TYPE BEARER FOR USER|RECORD` — bearer-token / API-key grants. */\n bearer(opts: { for: \"record\" | \"user\" }): AccessDef {\n return this.withConfig({ kind: { type: \"bearer\", subject: opts.for } });\n }\n onNamespace(): AccessDef {\n return this.withConfig({ on: \"namespace\" });\n }\n onDatabase(): AccessDef {\n return this.withConfig({ on: \"database\" });\n }\n /** `SIGNUP { … }` (RECORD) — a `surql\\`…\\`` block (braces optional) run on sign-up. */\n signup(body: Expr): AccessDef {\n return this.withConfig({ signup: body });\n }\n /** `SIGNIN { … }` (RECORD) — a `surql\\`…\\`` block run on sign-in. */\n signin(body: Expr): AccessDef {\n return this.withConfig({ signin: body });\n }\n /** `AUTHENTICATE { … }` — a `surql\\`…\\`` block run on each authenticated request. */\n authenticate(body: Expr): AccessDef {\n return this.withConfig({ authenticate: body });\n }\n /** Token/session/grant lifetimes (`DURATION FOR TOKEN …, FOR SESSION …, FOR GRANT …`). */\n duration(d: AccessDuration): AccessDef {\n return this.withConfig({ duration: d });\n }\n}\n\n/**\n * Declare an access definition: `export const account = defineAccess(\"account\").record()\n * .signup(surql\\`…\\`).signin(surql\\`…\\`).duration({ token: \"1h\", session: \"12h\" })`. See {@link AccessDef}\n * for `.jwt(…)` / `.bearer(…)`.\n */\nexport function defineAccess(name: string): AccessDef {\n return new AccessDef(name);\n}\n\n/** A text-search `DEFINE ANALYZER`'s config: an ordered tokenizer + filter pipeline. */\nexport interface AnalyzerConfig {\n /** `TOKENIZERS …` — e.g. `[\"blank\", \"class\", \"camel\", \"punct\"]` (at least one). */\n tokenizers: string[];\n /** `FILTERS …` — e.g. `[\"lowercase\", \"ascii\", \"snowball(english)\", \"ngram(1,3)\"]`. */\n filters?: string[];\n}\n\n/**\n * A text-search analyzer (`DEFINE ANALYZER`), referenced by a `FULLTEXT` index. Declared standalone:\n * `export const english = defineAnalyzer(\"english\", { tokenizers: [\"blank\"], filters: [\"lowercase\", \"snowball(english)\"] })`.\n */\nexport class AnalyzerDef {\n readonly kind = \"analyzer\" as const;\n constructor(\n readonly name: string,\n readonly config: AnalyzerConfig,\n ) {}\n}\n\n/** Declare a text-search analyzer. See {@link AnalyzerConfig}; reference it from a `fulltext` index. */\nexport function defineAnalyzer(\n name: string,\n config: AnalyzerConfig,\n): AnalyzerDef {\n return new AnalyzerDef(name, config);\n}\n\n/** A schema object declared apart from a table (collected by the CLI loader and emitted on its own). */\nexport type StandaloneDef = EventDef | FunctionDef | AccessDef | AnalyzerDef;\n\n/**\n * The underlying Zod schema of any s value: a field (`SField`), a table/relation def\n * (anything carrying an `.object`), or a raw Zod type.\n */\ntype ZodOf<T> = T extends { object: infer O }\n ? O extends z.ZodType\n ? O\n : never\n : SchemaOf<T>;\n\n/** The app-facing type (what your code reads). Same as `s.output` / Zod's `infer`. */\nexport type App<T> = z.output<ZodOf<T>>;\n/** The DB wire type (what crosses the wire). Same as `s.input`. */\nexport type Wire<T> = z.input<ZodOf<T>>;\n\n/**\n * Zod-style inference helpers, exposed on `s` (a type-only namespace merged with the `s`\n * value — the same trick Zod uses for `z.infer`). They accept fields, table/relation defs,\n * and raw schemas alike:\n * - `s.infer<T>` / `s.output<T>` / `s.TypeOf<T>` -> the decoded **app** type (== `App<T>`)\n * - `s.input<T>` -> the **wire/DB** type (== `Wire<T>`)\n */\nexport namespace s {\n export type infer<T> = z.output<ZodOf<T>>;\n export type output<T> = z.output<ZodOf<T>>;\n export type input<T> = z.input<ZodOf<T>>;\n export type TypeOf<T> = z.output<ZodOf<T>>;\n /** Any s field — the `z.ZodTypeAny` analogue, for typing generic schemas. */\n export type Field = AnyField;\n}\n/** The typed input for creating a record (DB-filled fields optional). */\nexport type Create<T> =\n T extends TableDef<string, infer S> ? CreateShape<S> : never;\n/** The typed input for updating a record (partial; excludes id and readonly fields). */\nexport type Update<T> =\n T extends TableDef<string, infer S> ? UpdateShape<S> : never;\n","// The Struct-IR normalizer: ONE `normalize(Struct) -> Struct` pass that both lowerings\n// (fromTableDef / fromInfo) run through, so equality becomes a deep-compare and diffing is\n// structural. This factors the deterministic transforms previously baked into the `canonical*`\n// DDL builders (structure.ts) out into a standalone Struct->Struct form. See docs/STRUCT-IR.md.\n//\n// Status: normalize() + deep-equal. fromTableDef() / fromInfo() lowerings land next (the latter is\n// today's introspectStructured). This module does NOT touch the live `diff --live` path yet.\n\nimport type {\n DbStructured,\n StructAccess,\n StructEvent,\n StructField,\n StructFunction,\n StructIndex,\n StructPermissions,\n StructTable,\n} from \"./structure\";\n\n// --- Type-expression normalization -----------------------------------------------------------\n\n/** Split a type expression on its top-level `|` (ignoring `|` inside `<…>`). */\nfunction splitTopUnion(expr: string): string[] {\n const parts: string[] = [];\n let depth = 0;\n let cur = \"\";\n for (const c of expr) {\n if (c === \"<\") depth++;\n else if (c === \">\") depth--;\n if (c === \"|\" && depth === 0) {\n parts.push(cur.trim());\n cur = \"\";\n } else cur += c;\n }\n parts.push(cur.trim());\n return parts;\n}\n\n/**\n * Canonical form of a SurrealQL type expression, applied recursively:\n * - fold a top-level `none` member into `option<…>` (gotcha 1: `T | none` == `option<T>`), while\n * keeping `T | null` distinct (nullable is a different type);\n * - sort union members deterministically — at the top level AND inside `record<…>` (gotcha 3),\n * `array<…>`, `set<…>`, `option<…>`;\n * - leave a single literal / primitive untouched.\n *\n * `'a' | 'b'` literal unions and `record<b|a>` therefore converge regardless of authoring order, and\n * enum-vs-union is left to the renderer (both produce the same sorted `kind`).\n */\nexport function normalizeType(kind: string): string {\n // Canonicalize literal quotes first (checklist item 2): inferField emits double-quoted literals\n // (`\"admin\"` via JSON.stringify), INFO STRUCTURE returns single-quoted (`'admin'`). Convert\n // double → single so both lowerings converge. Idempotent (single-quoted tokens are left alone).\n const t = canonicalizeLiterals(kind.trim());\n\n // option<X> wrapper — normalize the inner type, stay `option<…>`.\n const opt = /^option<([\\s\\S]+)>$/.exec(t);\n if (opt) return `option<${normalizeType(opt[1])}>`;\n\n const parts = splitTopUnion(t);\n if (parts.length > 1) {\n const hasNone = parts.includes(\"none\");\n const rest = parts.filter((p) => p !== \"none\").map(normalizeType);\n const inner = rest.length === 1 ? rest[0] : [...rest].sort().join(\" | \");\n if (hasNone) return rest.length ? `option<${inner}>` : \"none\";\n return inner;\n }\n\n // Single constructor term `ctor<inner>`: recurse. record<…>'s inner is a `|`-list of targets.\n const ctor = /^(array|set|record|references)<([\\s\\S]+)>$/.exec(t);\n if (ctor) {\n const [, name, innerRaw] = ctor;\n // array<T, N> / set<T, N>: keep a trailing size arg as-is, normalize the element only.\n const comma = topLevelSplitOnce(innerRaw, \",\");\n if (comma && (name === \"array\" || name === \"set\")) {\n return `${name}<${normalizeType(comma[0])}, ${comma[1].trim()}>`;\n }\n if (name === \"record\" || name === \"references\") {\n const targets = innerRaw\n .split(\"|\")\n .map((s) => s.trim())\n .filter(Boolean);\n return `${name}<${[...targets].sort().join(\" | \")}>`;\n }\n return `${name}<${normalizeType(innerRaw)}>`;\n }\n\n return t;\n}\n\n/** Convert double-quoted string literals to single-quoted (SurrealQL's output form), leaving single ones. */\nfunction canonicalizeLiterals(s: string): string {\n return s.replace(/\"(?:[^\"\\\\]|\\\\.)*\"/g, (m) => {\n let value: string;\n try {\n value = JSON.parse(m) as string;\n } catch {\n return m;\n }\n return `'${value.replace(/\\\\/g, \"\\\\\\\\\").replace(/'/g, \"\\\\'\")}'`;\n });\n}\n\n/** Split `s` once on the first top-level `sep` (outside `<…>`), or null if absent. */\nfunction topLevelSplitOnce(s: string, sep: string): [string, string] | null {\n let depth = 0;\n for (let i = 0; i < s.length; i++) {\n const c = s[i];\n if (c === \"<\") depth++;\n else if (c === \">\") depth--;\n else if (c === sep && depth === 0) return [s.slice(0, i), s.slice(i + 1)];\n }\n return null;\n}\n\n// --- Permission normalization ----------------------------------------------------------------\n\nconst TABLE_OPS = [\"select\", \"create\", \"update\", \"delete\"] as const;\nconst FIELD_OPS = [\"select\", \"create\", \"update\"] as const;\n\n/**\n * Canonical permissions (gotcha 5): `undefined` when every op is the kind default (FULL for\n * fields/functions, NONE for tables), else only the non-default ops, so an unspecified\n * `PERMISSIONS` deep-compares equal to a materialized default on the other side.\n */\nfunction normalizePermissions(\n perms: StructPermissions | undefined,\n ops: readonly (keyof StructPermissions)[],\n defaultFull: boolean,\n): StructPermissions | undefined {\n // An omitted op (undefined) always means the kind default; otherwise default is FULL for fields\n // and NONE for tables.\n const isDefault = (v: StructPermissions[keyof StructPermissions]) =>\n v === undefined || (defaultFull ? v === true : v === false);\n const out: StructPermissions = {};\n let any = false;\n for (const op of ops) {\n const v = perms?.[op];\n if (isDefault(v)) continue;\n out[op] = v as StructPermissions[keyof StructPermissions];\n any = true;\n }\n return any ? out : undefined;\n}\n\n// --- Array-element folding -------------------------------------------------------------------\n\n/** Fold an element type into a bare `array`/`set` kind, so `array` + `array.* TYPE object` == `array<object>`. */\nfunction foldArrayElement(kind: string, elementKind: string): string {\n const elem = normalizeType(elementKind);\n return kind.replace(/\\b(array|set)\\b(?!<)/, (kw) => `${kw}<${elem}>`);\n}\n\n/** Whether every listed op is FULL (`true`) or unset — the field default. */\nfunction isFullPerms(\n perms: StructPermissions | undefined,\n ops: readonly (keyof StructPermissions)[],\n): boolean {\n return ops.every((op) => perms?.[op] === undefined || perms?.[op] === true);\n}\n\n/**\n * A trivial `x.*` element — exactly what SurrealDB auto-creates from `array<…>` (no extra clause) —\n * is folded into the parent type and dropped. A customized element is kept.\n */\nfunction isTrivialElement(f: StructField): boolean {\n return (\n !f.flexible &&\n !f.readonly &&\n f.default === undefined &&\n f.value === undefined &&\n f.assert === undefined &&\n f.comment === undefined &&\n isFullPerms(f.permissions, FIELD_OPS)\n );\n}\n\n// --- Field / table / standalone normalization ------------------------------------------------\n\n/** A field's parent-before-child sort key: compare path segments so `address` precedes `address.city`. */\nfunction fieldSortKey(name: string): string {\n // Append a separator that sorts before any path char so a prefix sorts before its extensions.\n return name\n .split(\".\")\n .map((seg) => `${seg}\u0000`)\n .join(\"\");\n}\n\n/** Strip a leading `option<…>` wrapper (used when a clause makes the field always-present). */\nfunction stripOption(kind: string): string {\n const m = /^option<([\\s\\S]+)>$/.exec(kind);\n return m ? m[1] : kind;\n}\n\n/** Normalize one field (kind + permissions + drop the back-pointer table name from the compare). */\nfunction normalizeField(f: StructField): StructField {\n let kind = normalizeType(f.kind);\n // A DEFAULT / VALUE / COMPUTED field is always present, so SurrealDB stores it as the BARE type\n // (INFO drops `option<>`, and the emitter strips it before applying). fromTableDef keeps the\n // `option<>` — strip it here on both sides so they converge.\n if (\n f.default !== undefined ||\n f.value !== undefined ||\n f.computed !== undefined\n )\n kind = stripOption(kind);\n const out: StructField = { name: f.name, kind, table: f.table };\n if (f.flexible) out.flexible = true;\n if (f.readonly) out.readonly = true;\n // Clause exprs are canonicalized for quotes too (inferField/inline emit double-quoted literals;\n // INFO returns single-quoted).\n if (f.default !== undefined) {\n out.default = canonicalizeLiterals(f.default);\n if (f.default_always) out.default_always = true;\n }\n if (f.value !== undefined) out.value = canonicalizeLiterals(f.value);\n if (f.computed !== undefined) out.computed = canonicalizeLiterals(f.computed);\n if (f.assert !== undefined) out.assert = canonicalizeLiterals(f.assert);\n if (f.comment !== undefined) out.comment = f.comment;\n if (f.reference !== undefined) out.reference = f.reference;\n const perms = normalizePermissions(f.permissions, FIELD_OPS, true);\n if (perms) out.permissions = perms;\n return out;\n}\n\n/** Implicit fields INFO materializes that the generator omits — dropped on both sides. */\nfunction implicitFields(t: StructTable): Set<string> {\n return t.kind.kind === \"RELATION\"\n ? new Set([\"id\", \"in\", \"out\"])\n : new Set([\"id\"]);\n}\n\n/**\n * Normalize a table to its canonical Struct: fold trivial array elements, drop implicit fields,\n * normalize + sort fields (parent-before-child), normalize permissions, sort relation endpoints /\n * indexes / events. Two semantically-equal tables normalize to deep-equal Structs.\n */\nexport function normalizeTable(t: StructTable): StructTable {\n const implicit = implicitFields(t);\n const byName = new Map(t.fields.map((f) => [f.name, f]));\n const elementOf = new Map<string, StructField>();\n for (const f of t.fields)\n if (f.name.endsWith(\".*\")) elementOf.set(f.name.slice(0, -2), f);\n\n const fields: StructField[] = [];\n for (const f of t.fields) {\n if (implicit.has(f.name)) continue;\n if (f.name.endsWith(\".*\")) {\n const parent = byName.get(f.name.slice(0, -2));\n const parentIsArray = parent\n ? /\\b(?:array|set)\\b/.test(parent.kind)\n : false;\n if (parentIsArray && isTrivialElement(f)) continue; // folded into the parent type\n }\n const elem = elementOf.get(f.name);\n const folded = elem\n ? { ...f, kind: foldArrayElement(f.kind, elem.kind) }\n : f;\n fields.push(normalizeField(folded));\n }\n fields.sort((a, b) =>\n fieldSortKey(a.name).localeCompare(fieldSortKey(b.name)),\n );\n\n const kind: StructTable[\"kind\"] = { kind: t.kind.kind };\n if (t.kind.in?.length) kind.in = [...t.kind.in].sort();\n if (t.kind.out?.length) kind.out = [...t.kind.out].sort();\n if (t.kind.enforced) kind.enforced = true;\n\n const out: StructTable = {\n name: t.name,\n kind,\n schemafull: t.schemafull,\n fields,\n indexes: [...t.indexes]\n .map(normalizeIndex)\n .sort((a, b) => a.name.localeCompare(b.name)),\n events: [...t.events]\n .map(normalizeEvent)\n .sort((a, b) => a.name.localeCompare(b.name)),\n };\n if (t.drop) out.drop = true;\n if (t.comment !== undefined) out.comment = t.comment;\n if (t.changefeed) out.changefeed = t.changefeed;\n const perms = normalizePermissions(t.permissions, TABLE_OPS, false);\n if (perms) out.permissions = perms;\n return out;\n}\n\nfunction normalizeIndex(idx: StructIndex): StructIndex {\n return { name: idx.name, cols: idx.cols, index: idx.index };\n}\n\nfunction normalizeEvent(ev: StructEvent): StructEvent {\n // An omitted WHEN is stored by SurrealDB as the literal \"true\" — drop it so authored-with/without\n // compare equal.\n // biome-ignore lint/suspicious/noThenProperty: `then` mirrors SurrealQL's event THEN clause.\n const out: StructEvent = { name: ev.name, what: ev.what, then: ev.then };\n if (ev.when !== undefined && ev.when !== \"true\") out.when = ev.when;\n return out;\n}\n\n/** Strip a trailing `;` before the closing brace of a block — INFO drops it, the emitter keeps it. */\nfunction normalizeBlock(block: string): string {\n return block.replace(/;(\\s*})\\s*$/, \"$1\");\n}\n\n/** Normalize a db-level function: default (FULL) execute permission becomes undefined. */\nexport function normalizeFunction(fn: StructFunction): StructFunction {\n const out: StructFunction = {\n name: fn.name,\n args: fn.args,\n block: normalizeBlock(fn.block),\n };\n if (fn.returns !== undefined) out.returns = fn.returns;\n if (fn.permissions !== undefined && fn.permissions !== true)\n out.permissions = fn.permissions;\n if (fn.comment !== undefined) out.comment = fn.comment;\n return out;\n}\n\n/** Normalize a db-level access def (signing key is intentionally excluded — SurrealDB redacts it). */\nexport function normalizeAccess(a: StructAccess): StructAccess {\n return a;\n}\n\n/** Normalize a whole introspected/lowered database to its canonical Struct form. */\nexport function normalizeDb(db: DbStructured): DbStructured {\n return {\n tables: db.tables.map(normalizeTable),\n functions: db.functions.map(normalizeFunction),\n accesses: db.accesses.map(normalizeAccess),\n // Analyzers carry an ordered tokenizer/filter pipeline (order-significant) — passed through as-is.\n analyzers: db.analyzers,\n };\n}\n\n// --- Structural equality ---------------------------------------------------------------------\n\n/** Order-insensitive deep equality over plain JSON-ish values (the Struct shapes). */\nexport function deepEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (typeof a !== typeof b || a === null || b === null) return false;\n if (Array.isArray(a) || Array.isArray(b)) {\n if (!Array.isArray(a) || !Array.isArray(b) || a.length !== b.length)\n return false;\n return a.every((v, i) => deepEqual(v, b[i]));\n }\n if (typeof a === \"object\") {\n const ao = a as Record<string, unknown>;\n const bo = b as Record<string, unknown>;\n const ak = Object.keys(ao);\n const bk = Object.keys(bo);\n if (ak.length !== bk.length) return false;\n return ak.every((k) => k in bo && deepEqual(ao[k], bo[k]));\n }\n return false;\n}\n","import { escapeIdent, type Surreal } from \"surrealdb\";\nimport type { DefineStatement } from \"../ddl\";\n\n/** A snapshot statement: the emitted DDL plus the source file it came from (for `diff` annotations). */\nexport type SnapshotStatement = DefineStatement & {\n /** Project-root-relative source file (absent for objects introspected from a live DB). */\n file?: string;\n};\n\n/**\n * The legacy STATEMENT snapshot — canonical SurrealQL DDL keyed by `kind:table:name`, + the\n * optional normalized Struct (for `diff --ts`). This is the Surreal driver's INTERNAL diff data\n * model (`buildSnapshot`/`diffSnapshots`/`structuredSnapshot`), derived on demand from the portable\n * IR. The NEUTRAL stored snapshot is `StoredSnapshot` in cli/meta.ts.\n */\nexport interface Snapshot {\n version: 1;\n statements: Record<string, SnapshotStatement>;\n struct?: DbStructured;\n}\n\n/** The empty STATEMENT snapshot — the Surreal engine's \"nothing yet\" sentinel (e.g. baseline diff). */\nexport const EMPTY_SNAPSHOT: Snapshot = { version: 1, statements: {} };\n\n/**\n * Typed views of `INFO FOR … STRUCTURE` (SurrealDB 3.x). Unlike plain `INFO FOR …` (which\n * returns DDL strings that have to be regex-parsed), STRUCTURE returns the schema as data — so\n * names, clauses, flags, and permissions arrive pre-separated. Only `kind` stays a type\n * expression (`object | none`, `array<record<user>>`, `'a' | 'b'`), parsed by `szType`.\n */\n\n/** A permission op's rule: `true` (FULL) / `false` (NONE) / a WHERE expression string. */\nexport type StructPerm = boolean | string;\n\nexport interface StructPermissions {\n select?: StructPerm;\n create?: StructPerm;\n update?: StructPerm;\n delete?: StructPerm;\n}\n\nexport interface StructField {\n /** Field path, e.g. `email`, `address.city`, `tags.*` — bare (no backtick escaping). */\n name: string;\n /** The SurrealQL type expression (kind), e.g. `string`, `option<int>`, `array<string>`. */\n kind: string;\n flexible?: boolean;\n readonly?: boolean;\n default?: string;\n default_always?: boolean;\n value?: string;\n /** `COMPUTED <expr>` — a derived, read-only column. */\n computed?: string;\n assert?: string;\n comment?: string;\n /** `REFERENCE [ON DELETE …]` on a record-link field. `on_delete` mirrors `INFO … STRUCTURE`\n * (snake_case) and the offline lowering (`lowerReference`): an action keyword (`CASCADE`/…) or a\n * `surql` expression. Absent = no reference; present-without-`on_delete` = a bare `REFERENCE`. */\n reference?: { on_delete?: string };\n permissions?: StructPermissions;\n table: string;\n}\n\nexport interface StructIndex {\n name: string;\n /** Indexed columns/fields. */\n cols: string[];\n /** `\"UNIQUE\"`, `\"\"` (plain), `\"COUNT\"`, or a `FULLTEXT …`/`HNSW …`/`DISKANN …` spec (canonicalized). */\n index: string;\n /** `COMMENT <string>` on the index. */\n comment?: string;\n}\n\nexport interface StructEvent {\n name: string;\n /** Owning table (STRUCTURE calls it `what`). */\n what: string;\n /** The `WHEN` condition. SurrealDB stores an omitted `WHEN` as the literal `\"true\"`. */\n when?: string;\n /** One or more `THEN` expressions (parens/`;` already stripped). */\n then: string[];\n}\n\nexport interface StructFunction {\n name: string;\n /** Ordered `[argName, surqlType]` pairs. */\n args: [string, string][];\n /** The body block, e.g. `{ RETURN $a + $b }`. */\n block: string;\n /** Declared return type, if any. */\n returns?: string;\n /** Execute permission: `true` (FULL, the default) / `false` (NONE) / a WHERE expression. */\n permissions?: boolean | string;\n comment?: string;\n}\n\nexport interface StructAccess {\n name: string;\n kind: {\n kind: string; // \"RECORD\" | \"JWT\" | \"BEARER\"\n /** BEARER: `\"RECORD\"` | `\"USER\"`. */\n subject?: string;\n /** RECORD bodies. */\n signup?: string;\n signin?: string;\n authenticate?: string;\n /** JWT/BEARER token config. The `key` is REDACTED by SurrealDB; `alg`/`url` are not. */\n jwt?: {\n issuer?: { alg?: string; key?: string };\n verify?: { alg?: string; key?: string; url?: string };\n };\n };\n duration?: { grant?: string; token?: string; session?: string };\n}\n\n/** A text-search `DEFINE ANALYZER` — `INFO … STRUCTURE` returns uppercase tokenizer/filter lists. */\nexport interface StructAnalyzer {\n name: string;\n tokenizers: string[];\n filters?: string[];\n}\n\nexport interface StructTableKind {\n kind: \"NORMAL\" | \"ANY\" | \"RELATION\";\n in?: string[];\n out?: string[];\n enforced?: boolean;\n}\n\nexport interface StructTable {\n name: string;\n kind: StructTableKind;\n schemafull: boolean;\n drop?: boolean;\n comment?: string;\n /** `CHANGEFEED <expiry> [INCLUDE ORIGINAL]`. */\n changefeed?: { expiry: string; original: boolean };\n permissions?: StructPermissions;\n /** A pre-computed VIEW's `SELECT …` (the `AS ` keyword stripped; canonical re-adds it). */\n view?: string;\n fields: StructField[];\n indexes: StructIndex[];\n events: StructEvent[];\n}\n\ninterface DbStructure {\n tables?: (Omit<StructTable, \"fields\" | \"indexes\" | \"kind\"> & {\n kind: {\n kind: StructTableKind[\"kind\"];\n in?: unknown[];\n out?: unknown[];\n enforced?: boolean;\n };\n id?: number;\n })[];\n functions?: StructFunction[];\n accesses?: StructAccess[];\n analyzers?: StructAnalyzer[];\n}\n\n/** The structured database: tables (with their fields/indexes/events) and db-level functions/access/analyzers. */\nexport interface DbStructured {\n tables: StructTable[];\n functions: StructFunction[];\n accesses: StructAccess[];\n analyzers: StructAnalyzer[];\n}\ninterface TableStructure {\n fields?: StructField[];\n indexes?: StructIndex[];\n events?: StructEvent[];\n}\n\n/** The unescaped name of a relation endpoint — the SDK deserializes `in`/`out` as `Table` objects. */\nfunction endpointName(v: unknown): string {\n if (typeof v === \"string\") return v;\n const name = (v as { name?: unknown })?.name;\n return typeof name === \"string\" ? name : String(v);\n}\n\n// --- Canonical DDL ----------------------------------------------------------------------------\n// Build a deterministic DDL string per object from the structured data, so two semantically-equal\n// schemas compare equal regardless of how SurrealDB happened to format/order them. Both sides of\n// `diff --live` (the live DB and the shadow-applied schema) go through this same builder.\n\n/** Split a type expression on its top-level `|` (ignoring `|` inside `<…>`). */\nfunction splitTopUnion(expr: string): string[] {\n const parts: string[] = [];\n let depth = 0;\n let cur = \"\";\n for (const c of expr) {\n if (c === \"<\") depth++;\n else if (c === \">\") depth--;\n if (c === \"|\" && depth === 0) {\n parts.push(cur.trim());\n cur = \"\";\n } else cur += c;\n }\n parts.push(cur.trim());\n return parts;\n}\n\n/**\n * Canonical form of a type `kind`: fold a top-level `none` member into `option<…>` and sort the\n * remaining union members, so `object | none` / `none | object` / `option<object>` all collapse\n * to the same string (the union-ordering false-diff fix, done structurally).\n */\nfunction canonicalKind(kind: string): string {\n const parts = splitTopUnion(kind).map((p) => p.trim());\n if (parts.length <= 1) return kind.trim();\n const hasNone = parts.includes(\"none\");\n const rest = parts.filter((p) => p !== \"none\");\n if (hasNone) {\n if (!rest.length) return \"none\";\n const inner = rest.length === 1 ? rest[0] : [...rest].sort().join(\" | \");\n return `option<${inner}>`;\n }\n return [...parts].sort().join(\" | \");\n}\n\n/**\n * Canonical `PERMISSIONS …` clause from structured perms (`\"\"` when it matches the kind default).\n * `defaultFull` is the kind's default: FULL for fields/functions, NONE for tables. INFO materializes\n * the default explicitly; the generator omits it — so we drop the clause when all ops are the\n * default, making an unspecified `PERMISSIONS` compare equal across the two emitters.\n */\nfunction canonicalPerms(\n perms: StructPermissions | undefined,\n ops: (keyof StructPermissions)[],\n defaultFull: boolean,\n): string {\n if (!perms) return \"\";\n const vals = ops.map((op) => perms[op]);\n const allFull = vals.every((v) => v === true);\n const allNone = vals.every((v) => v === false || v === undefined);\n if (defaultFull ? allFull : allNone) return \"\";\n if (allFull) return \"PERMISSIONS FULL\";\n if (allNone) return \"PERMISSIONS NONE\";\n // Mixed: emit only the ops that differ from the kind default (the generator omits default ops).\n const isDefault = (v: StructPermissions[keyof StructPermissions]) =>\n defaultFull ? v === true : v === false || v === undefined;\n const clauses = ops\n .filter((op) => !isDefault(perms[op]))\n .map((op) => {\n const v = perms[op];\n if (v === true) return `FOR ${op} FULL`;\n if (v === false || v === undefined) return `FOR ${op} NONE`;\n return `FOR ${op} WHERE ${v}`;\n });\n return clauses.length ? `PERMISSIONS ${clauses.join(\" \")}` : \"\";\n}\n\n/**\n * Field CLAUSES keyed by clause name (insertion order == DDL order), each value already in the\n * `ALTER FIELD … <set>` form — so the migration engine can diff clauses structurally without\n * re-parsing the DDL (matches the authoring `emit` in ddl.ts). Keys are drawn from\n * `FIELD_CLAUSE_ORDER` — including REFERENCE (emitted below + reversed by `pull`'s `renderField`).\n */\nfunction fieldClauses(f: StructField): Record<string, string> {\n const clauses: Record<string, string> = {\n TYPE: `TYPE ${canonicalKind(f.kind)}`,\n };\n if (f.flexible) clauses.FLEXIBLE = \"FLEXIBLE\";\n // REFERENCE. SurrealDB defaults a bare `REFERENCE` to `ON DELETE IGNORE` and MATERIALIZES that in\n // `INFO … STRUCTURE` (reference: { on_delete: 'IGNORE' }), whereas the offline lowering leaves a\n // bare reference's on_delete absent — so IGNORE (and absent) both canonicalize to a bare `REFERENCE`\n // (else every bare reference phantom-diffs against a live DB). A non-default action keyword renders\n // `ON DELETE <ACTION>`; anything else (a surql expression) renders `ON DELETE THEN <expr>`. Inserted\n // after FLEXIBLE to match FIELD_CLAUSE_ORDER, so a reference change diffs as ALTER FIELD, not OVERWRITE.\n if (f.reference) {\n const od = f.reference.on_delete;\n clauses.REFERENCE =\n !od || od.toUpperCase() === \"IGNORE\"\n ? \"REFERENCE\"\n : `REFERENCE ON DELETE ${/^(REJECT|CASCADE|UNSET)$/i.test(od) ? od : `THEN ${od}`}`;\n }\n if (f.default !== undefined)\n clauses.DEFAULT = `DEFAULT ${f.default_always ? \"ALWAYS \" : \"\"}${f.default}`;\n if (f.value !== undefined) clauses.VALUE = `VALUE ${f.value}`;\n if (f.computed !== undefined) clauses.COMPUTED = `COMPUTED ${f.computed}`;\n if (f.assert !== undefined) clauses.ASSERT = `ASSERT ${f.assert}`;\n if (f.readonly) clauses.READONLY = \"READONLY\";\n if (f.comment !== undefined)\n clauses.COMMENT = `COMMENT ${JSON.stringify(f.comment)}`;\n const perms = canonicalPerms(\n f.permissions,\n [\"select\", \"create\", \"update\"],\n true,\n );\n if (perms) clauses.PERMISSIONS = perms;\n return clauses;\n}\n\n/** Canonical `DEFINE FIELD …`. The name is taken as-is (STRUCTURE already escapes reserved words). */\nfunction canonicalField(f: StructField): string {\n const { TYPE, ...rest } = fieldClauses(f);\n const head = `DEFINE FIELD ${f.name} ON TABLE ${f.table} ${TYPE}`;\n const tail = Object.values(rest).join(\" \");\n return tail ? `${head} ${tail};` : `${head};`;\n}\n\n/**\n * Table-head CLAUSES keyed by clause name (insertion order == DDL order), in the `ALTER TABLE …\n * <set>` form so the migration engine can diff them structurally. Keys are drawn from\n * `TABLE_CLAUSE_ORDER` (the head's own clauses; fields/indexes/events are their own statements).\n */\nfunction tableHeadClauses(t: StructTable): Record<string, string> {\n const k = t.kind;\n let type: string;\n if (k.kind === \"RELATION\") {\n // Endpoints optional — omit FROM/TO when unrestricted (matches `emit`). INFO stores them as\n // IN/OUT; the generator (and our canonical form) use the FROM/TO alias.\n type = \"RELATION\";\n if (k.in?.length) type += ` FROM ${k.in.join(\" | \")}`;\n if (k.out?.length) type += ` TO ${k.out.join(\" | \")}`;\n if (k.enforced) type += \" ENFORCED\";\n } else {\n type = k.kind;\n }\n const clauses: Record<string, string> = { TYPE: `TYPE ${type}` };\n clauses.SCHEMA = t.schemafull ? \"SCHEMAFULL\" : \"SCHEMALESS\";\n if (t.view !== undefined) clauses.AS = `AS ${t.view}`;\n if (t.drop) clauses.DROP = \"DROP\";\n if (t.changefeed)\n clauses.CHANGEFEED = `CHANGEFEED ${t.changefeed.expiry}${t.changefeed.original ? \" INCLUDE ORIGINAL\" : \"\"}`;\n if (t.comment !== undefined)\n clauses.COMMENT = `COMMENT ${JSON.stringify(t.comment)}`;\n const perms = canonicalPerms(\n t.permissions,\n [\"select\", \"create\", \"update\", \"delete\"],\n false,\n );\n if (perms) clauses.PERMISSIONS = perms;\n return clauses;\n}\n\n/** Canonical `DEFINE TABLE …` head. */\nfunction canonicalTableHead(t: StructTable): string {\n const { TYPE, ...rest } = tableHeadClauses(t);\n const head = `DEFINE TABLE ${t.name} ${TYPE}`;\n const tail = Object.values(rest).join(\" \");\n return tail ? `${head} ${tail};` : `${head};`;\n}\n\n// SurrealDB MATERIALIZES default vector/fulltext index clauses on apply — e.g. `HNSW DIMENSION 4` is\n// stored as `HNSW DIMENSION 4 DIST EUCLIDEAN TYPE F32 EFC 150 M 12 M0 24 LM <1/ln(M)>f`, and `FULLTEXT\n// ANALYZER a` always carries `BM25(1.2,0.75)`. So the CANONICAL form strips default-valued + derived\n// clauses and normalizes numbers (drops the SurrealQL `f` float suffix), making an authored MINIMAL\n// spec compare equal to the introspected FULL one. Non-default values are kept.\n\n/** Normalize a SurrealQL number token: drop a trailing `f`, collapse float noise (`1.20` -> `1.2`). */\nfunction normNum(v: string): string {\n const n = Number(v.replace(/f$/i, \"\"));\n return Number.isFinite(n) ? String(n) : v;\n}\n\n/** Default-valued clauses SurrealDB fills in (stripped from canonical when they match). */\nconst VECTOR_DEFAULTS: Record<string, Record<string, string>> = {\n HNSW: { DIST: \"EUCLIDEAN\", TYPE: \"F32\", EFC: \"150\", M: \"12\" },\n DISKANN: {\n DIST: \"EUCLIDEAN\",\n TYPE: \"F32\",\n DEGREE: \"64\",\n L_BUILD: \"100\",\n ALPHA: \"1.2\",\n },\n};\n/** Clauses fully DERIVED from others (never authored, always stripped): HNSW `M0`=2·M, `LM`=1/ln(M). */\nconst VECTOR_DERIVED: Record<string, Set<string>> = {\n HNSW: new Set([\"M0\", \"LM\"]),\n DISKANN: new Set(),\n};\n/** Canonical clause order (matches the authoring emit). */\nconst VECTOR_ORDER: Record<string, string[]> = {\n HNSW: [\"DIMENSION\", \"DIST\", \"TYPE\", \"EFC\", \"M\"],\n DISKANN: [\"DIMENSION\", \"DIST\", \"TYPE\", \"DEGREE\", \"L_BUILD\", \"ALPHA\"],\n};\n\n/** Canonicalize an `HNSW …`/`DISKANN …` spec: drop derived + default clauses, normalize numbers. */\nfunction normVector(algo: \"HNSW\" | \"DISKANN\", spec: string): string {\n const toks = spec.slice(algo.length).trim().split(/\\s+/).filter(Boolean);\n const kept = new Map<string, string>();\n for (let i = 0; i < toks.length; i += 2) {\n const key = toks[i];\n let val = toks[i + 1] ?? \"\";\n if (VECTOR_DERIVED[algo].has(key)) continue;\n if (/^[\\d.]/.test(val) || /f$/i.test(val)) val = normNum(val);\n if (VECTOR_DEFAULTS[algo][key] === val) continue;\n kept.set(key, val);\n }\n const parts: string[] = [algo];\n for (const k of VECTOR_ORDER[algo]) {\n const v = kept.get(k);\n if (v !== undefined) parts.push(k, v);\n }\n return parts.join(\" \");\n}\n\n/** Canonicalize a `FULLTEXT ANALYZER … [BM25[(k,b)]] [HIGHLIGHTS]` spec: drop the default BM25(1.2,0.75). */\nfunction normFulltext(spec: string): string {\n const m = /^FULLTEXT ANALYZER (\\S+)(.*)$/.exec(spec);\n if (!m) return spec;\n let out = `FULLTEXT ANALYZER ${m[1]}`;\n const bm = /BM25(?:\\(([^)]*)\\))?/.exec(m[2]);\n if (bm?.[1]) {\n const args = bm[1].split(\",\").map((a) => normNum(a.trim()));\n if (!(args.length === 2 && args[0] === \"1.2\" && args[1] === \"0.75\"))\n out += ` BM25(${args.join(\",\")})`; // a non-default BM25 is kept\n }\n if (/\\bHIGHLIGHTS\\b/.test(m[2])) out += \" HIGHLIGHTS\";\n return out;\n}\n\n/** Strip SurrealDB's materialized defaults from a vector/fulltext index spec (passthrough otherwise). */\nfunction normalizeIndexSpec(spec: string): string {\n if (spec.startsWith(\"HNSW\")) return normVector(\"HNSW\", spec);\n if (spec.startsWith(\"DISKANN\")) return normVector(\"DISKANN\", spec);\n if (spec.startsWith(\"FULLTEXT\")) return normFulltext(spec);\n return spec; // \"\", UNIQUE, COUNT (or a legacy SEARCH/MTREE spec) — left as-is\n}\n\n/** Canonical `DEFINE INDEX …`. `index` is `\"UNIQUE\"`/`\"\"`/`\"COUNT\"`, or a FULLTEXT/HNSW/DISKANN spec —\n * the latter normalized (materialized defaults stripped) so authored and introspected sides match. */\nfunction canonicalIndex(t: StructTable, idx: StructIndex): string {\n // A COUNT index has no columns → no `FIELDS` clause (`idx.index` carries `COUNT`).\n const fields = idx.cols.length ? ` FIELDS ${idx.cols.join(\", \")}` : \"\";\n const norm = normalizeIndexSpec(idx.index);\n const spec = norm ? ` ${norm}` : \"\";\n const comment =\n idx.comment !== undefined ? ` COMMENT ${JSON.stringify(idx.comment)}` : \"\";\n return `DEFINE INDEX ${idx.name} ON TABLE ${t.name}${fields}${spec}${comment};`;\n}\n\n/**\n * Canonical `DEFINE EVENT …`. An omitted `WHEN` (stored by SurrealDB as `\"true\"`) is dropped, and\n * the `then` expressions are comma-joined — so an event authored with/without a `WHEN true` and any\n * `THEN` formatting compares equal across the live DB and the shadow-applied schema.\n */\nfunction canonicalEvent(t: StructTable, ev: StructEvent): string {\n const parts = [`DEFINE EVENT ${ev.name} ON TABLE ${t.name}`];\n if (ev.when !== undefined && ev.when !== \"true\")\n parts.push(`WHEN ${ev.when}`);\n parts.push(`THEN ${ev.then.join(\", \")}`);\n return `${parts.join(\" \")};`;\n}\n\n/**\n * Canonical `DEFINE FUNCTION …`. The `block` is taken verbatim (already `{ … }`); a `true`\n * (FULL — SurrealDB's default) permission is dropped so an unspecified `PERMISSIONS` compares equal\n * across the live DB and the shadow-applied schema.\n */\nfunction canonicalFunction(fn: StructFunction): string {\n const args = fn.args.map(([n, t]) => `$${n}: ${t}`).join(\", \");\n const parts = [`DEFINE FUNCTION fn::${fn.name}(${args})`];\n if (fn.returns !== undefined) parts.push(`-> ${fn.returns}`);\n parts.push(fn.block);\n if (fn.permissions === false) parts.push(\"PERMISSIONS NONE\");\n else if (typeof fn.permissions === \"string\")\n parts.push(`PERMISSIONS ${fn.permissions}`);\n if (fn.comment !== undefined)\n parts.push(`COMMENT ${JSON.stringify(fn.comment)}`);\n return `${parts.join(\" \")};`;\n}\n\n/**\n * Canonical `DEFINE ACCESS …`. The signing KEY is INTENTIONALLY ignored — SurrealDB redacts it\n * identically on both diff sides, so comparing it is meaningless (key changes go undetected by\n * `diff --live`; documented). The JWT `alg`/`url` are kept (not redacted). Always `ON DATABASE`.\n */\nfunction canonicalAccess(a: StructAccess): string {\n const k = a.kind;\n let typeClause: string;\n if (k.kind === \"BEARER\") {\n typeClause = `TYPE BEARER FOR ${k.subject}`;\n } else if (k.kind === \"JWT\") {\n const v = k.jwt?.verify;\n typeClause = v?.url\n ? `TYPE JWT URL ${JSON.stringify(v.url)}`\n : `TYPE JWT ALGORITHM ${v?.alg ?? \"\"}`; // KEY omitted (redacted)\n } else {\n typeClause = \"TYPE RECORD\";\n }\n const parts = [`DEFINE ACCESS ${a.name} ON DATABASE ${typeClause}`];\n if (k.kind === \"RECORD\") {\n if (k.signup) parts.push(`SIGNUP ${k.signup}`);\n if (k.signin) parts.push(`SIGNIN ${k.signin}`);\n if (k.authenticate) parts.push(`AUTHENTICATE ${k.authenticate}`);\n }\n const d = a.duration;\n if (d?.grant || d?.token || d?.session) {\n const fors: string[] = [];\n if (d.grant) fors.push(`FOR GRANT ${d.grant}`);\n if (d.token) fors.push(`FOR TOKEN ${d.token}`);\n if (d.session) fors.push(`FOR SESSION ${d.session}`);\n parts.push(`DURATION ${fors.join(\", \")}`);\n }\n return `${parts.join(\" \")};`;\n}\n\n/** Canonical `DEFINE ANALYZER …` — tokenizer/filter lists joined `, ` (uppercase, as INFO returns them). */\nfunction canonicalAnalyzer(a: StructAnalyzer): string {\n let s = `DEFINE ANALYZER ${a.name} TOKENIZERS ${a.tokenizers.join(\", \")}`;\n if (a.filters?.length) s += ` FILTERS ${a.filters.join(\", \")}`;\n return `${s};`;\n}\n\n/**\n * Fold an array element type into a BARE `array`/`set` kind, so a field stored as `array` with an\n * `array.* TYPE object` element compares equal to `array<object>` (the typed form @schemic/core\n * emits). Typed kinds (`array<X>`) and the `.*` itself are left alone — the element is in the type.\n */\nfunction foldArrayElement(kind: string, elementKind: string): string {\n const elem = canonicalKind(elementKind);\n // Replace a bare `array`/`set` (not already followed by `<…>`) — handles `option<array>` too.\n return kind.replace(/\\b(array|set)\\b(?!<)/, (kw) => `${kw}<${elem}>`);\n}\n\n/** True if every listed permission op is FULL (`true`) or unset — i.e. the default. */\nfunction isFullPerms(\n perms: StructPermissions | undefined,\n ops: (keyof StructPermissions)[],\n): boolean {\n if (!perms) return true;\n return ops.every((op) => perms[op] === undefined || perms[op] === true);\n}\n\n/**\n * An array element (`x.*`) is \"trivial\" when it's exactly the form SurrealDB auto-creates from\n * `array<…>` — a plain element with default permissions and no other clause. Trivial elements are\n * folded into the parent type and not emitted; a CUSTOMIZED element (FLEXIBLE / permissions /\n * readonly / default / value / assert / comment) is kept so its config isn't silently lost.\n */\nfunction isTrivialElement(f: StructField): boolean {\n return (\n !f.flexible &&\n !f.readonly &&\n f.default === undefined &&\n f.value === undefined &&\n f.assert === undefined &&\n f.comment === undefined &&\n isFullPerms(f.permissions, [\"select\", \"create\", \"update\"])\n );\n}\n\nconst keyOf = (s: Pick<DefineStatement, \"kind\" | \"name\" | \"table\">) =>\n `${s.kind}:${s.table ?? \"\"}:${s.name}`;\n\n/**\n * Build a canonical-DDL {@link Snapshot} from the structured database (tables + db-level functions).\n * Skips implicit `id` (and `in`/`out` on relations) and childless `*` array-element fields —\n * @schemic/core's emit doesn't produce them, so the snapshot must not either (else diff would\n * try to drop/add them).\n */\nexport function structuredSnapshot({\n tables,\n functions,\n accesses,\n analyzers,\n}: DbStructured): Snapshot {\n const statements: Record<string, DefineStatement> = {};\n for (const t of tables) {\n const tableStmt: DefineStatement = {\n kind: \"table\",\n name: t.name,\n ddl: canonicalTableHead(t),\n clauses: tableHeadClauses(t),\n };\n statements[keyOf(tableStmt)] = tableStmt;\n\n const implicit =\n t.kind.kind === \"RELATION\"\n ? new Set([\"id\", \"in\", \"out\"])\n : new Set([\"id\"]);\n // A trivial array element (`x.*`) is folded into the parent's `array<…>` type and not emitted\n // (so bare `array` + `x.* object` == typed `array<object>`). A CUSTOMIZED element (FLEXIBLE /\n // permissions / …) is kept so its config isn't lost. Map/record `.*` values are kept too.\n const byName = new Map(t.fields.map((f) => [f.name, f]));\n const elementOf = new Map<string, StructField>();\n for (const f of t.fields)\n if (f.name.endsWith(\".*\")) elementOf.set(f.name.slice(0, -2), f);\n\n for (const f of t.fields) {\n if (implicit.has(f.name)) continue;\n if (f.name.endsWith(\".*\")) {\n const parent = byName.get(f.name.slice(0, -2));\n const parentIsArray = parent\n ? /\\b(?:array|set)\\b/.test(parent.kind)\n : false;\n if (parentIsArray && isTrivialElement(f)) continue; // auto-created form → folded\n }\n const elem = elementOf.get(f.name);\n const field = elem\n ? { ...f, kind: foldArrayElement(f.kind, elem.kind) }\n : f;\n const s: DefineStatement = {\n kind: \"field\",\n name: f.name,\n table: t.name,\n ddl: canonicalField(field),\n clauses: fieldClauses(field),\n };\n statements[keyOf(s)] = s;\n }\n for (const idx of t.indexes) {\n const s: DefineStatement = {\n kind: \"index\",\n name: idx.name,\n table: t.name,\n ddl: canonicalIndex(t, idx),\n };\n statements[keyOf(s)] = s;\n }\n for (const ev of t.events) {\n const s: DefineStatement = {\n kind: \"event\",\n name: ev.name,\n table: t.name,\n ddl: canonicalEvent(t, ev),\n };\n statements[keyOf(s)] = s;\n }\n }\n for (const fn of functions) {\n const s: DefineStatement = {\n kind: \"function\",\n name: fn.name,\n ddl: canonicalFunction(fn),\n };\n statements[keyOf(s)] = s;\n }\n for (const a of accesses) {\n const s: DefineStatement = {\n kind: \"access\",\n name: a.name,\n ddl: canonicalAccess(a),\n };\n statements[keyOf(s)] = s;\n }\n for (const an of analyzers) {\n const s: DefineStatement = {\n kind: \"analyzer\",\n name: an.name,\n ddl: canonicalAnalyzer(an),\n };\n statements[keyOf(s)] = s;\n }\n return { version: 1, statements };\n}\n\n/**\n * Read the live database structure via `INFO FOR DB STRUCTURE` (table heads + db-level functions)\n * plus one `INFO FOR TABLE … STRUCTURE` per table (its fields/indexes/events), skipping `exclude`d\n * tables. Functions are db-level and not excludable.\n */\nexport async function introspectStructured(\n db: Surreal,\n exclude: Set<string> = new Set(),\n): Promise<DbStructured> {\n const [dbInfo] = await db.query<[DbStructure]>(\"INFO FOR DB STRUCTURE\");\n const tables: StructTable[] = [];\n for (const t of dbInfo.tables ?? []) {\n if (exclude.has(t.name)) continue;\n const [tinfo] = await db.query<[TableStructure]>(\n `INFO FOR TABLE ${escapeIdent(t.name)} STRUCTURE`,\n );\n tables.push({\n name: t.name,\n kind: {\n kind: t.kind.kind,\n in: t.kind.in?.map(endpointName),\n out: t.kind.out?.map(endpointName),\n enforced: t.kind.enforced,\n },\n schemafull: t.schemafull,\n drop: t.drop,\n comment: t.comment,\n changefeed: t.changefeed,\n permissions: t.permissions,\n // INFO STRUCTURE stores a view as `AS SELECT …`; strip the keyword to match the lowered form.\n view: t.view?.replace(/^AS\\s+/i, \"\"),\n fields: tinfo.fields ?? [],\n // Strip SurrealDB's materialized vector/fulltext defaults so the spec matches the authored form.\n indexes: (tinfo.indexes ?? []).map((i) => ({\n ...i,\n index: normalizeIndexSpec(i.index),\n })),\n events: tinfo.events ?? [],\n });\n }\n return {\n tables,\n functions: dbInfo.functions ?? [],\n accesses: dbInfo.accesses ?? [],\n analyzers: dbInfo.analyzers ?? [],\n };\n}\n","// The SurrealDB STATEMENT-diff engine: builds canonical `DEFINE` snapshots from authored schemas\n// and diffs two snapshots into SurrealQL up/down (clause-level ALTER where possible). This is the\n// Surreal driver's internal diff strategy — invoked via `surrealDriver.diff` and the migrations\n// capability's `render`. The dialect-free diff DISPLAY + types live in `./diff`. In the package\n// split this module moves to `@schemic/surrealdb` (see docs/AUTHORING-SPLIT.md / MULTI-DB-SPIKE.md).\n\nimport { relative } from \"node:path\";\nimport type { AnyTable, AuthoredDef, Diff, DiffItem } from \"@schemic/core\";\nimport type { DefineStatement } from \"../ddl\";\nimport {\n alterField,\n alterTable,\n emitDefStatement,\n emitStatements,\n overwriteStatement,\n removeStatement,\n} from \"../ddl\";\nimport { schemaStruct } from \"./lower\";\nimport { deepEqual } from \"./struct\";\nimport type { DbStructured, Snapshot, SnapshotStatement } from \"./structure\";\n\nconst keyOf = (s: Pick<DefineStatement, \"kind\" | \"name\" | \"table\">) =>\n `${s.kind}:${s.table ?? \"\"}:${s.name}`;\n\n/** Index a normalized DbStructured by statement key (matching `keyOf`) for structural equality. */\nfunction structIndex(db: DbStructured): Map<string, unknown> {\n const idx = new Map<string, unknown>();\n for (const t of db.tables) {\n // The table STATEMENT is just the head — fields/indexes/events are their own statements.\n idx.set(`table::${t.name}`, {\n kind: t.kind,\n schemafull: t.schemafull,\n drop: t.drop,\n comment: t.comment,\n changefeed: t.changefeed,\n permissions: t.permissions,\n });\n for (const f of t.fields) idx.set(`field:${t.name}:${f.name}`, f);\n for (const i of t.indexes) idx.set(`index:${t.name}:${i.name}`, i);\n for (const e of t.events) idx.set(`event:${t.name}:${e.name}`, e);\n }\n for (const fn of db.functions) idx.set(`function::${fn.name}`, fn);\n for (const a of db.accesses) idx.set(`access::${a.name}`, a);\n return idx;\n}\n\n/**\n * Build the canonical snapshot (keyed `DEFINE` statements) for the current schemas: every table's\n * statements, plus any standalone defs (`defineEvent`/`defineFunction`), keyed by kind+table+name.\n */\nexport function buildSnapshot(\n tables: AnyTable[],\n defs: AuthoredDef[] = [],\n opts: {\n fileOf?: Map<unknown, string>;\n root?: string;\n /** Also compute + store the normalized Struct-IR (for `diff --ts`). Off by default. */\n withStruct?: boolean;\n } = {},\n): Snapshot {\n const statements: Record<string, SnapshotStatement> = {};\n // The source file each object came from, project-root-relative for portable, readable snapshots.\n const fileFor = (obj: unknown): string | undefined => {\n const abs = opts.fileOf?.get(obj);\n return abs ? (opts.root ? relative(opts.root, abs) : abs) : undefined;\n };\n for (const t of tables) {\n const file = fileFor(t);\n try {\n for (const s of emitStatements(\n t as unknown as Parameters<typeof emitStatements>[0],\n ))\n statements[keyOf(s)] = file ? { ...s, file } : s;\n } catch (e) {\n // Pin an emit failure (e.g. a non-Surreal field type) to the source file.\n const msg = e instanceof Error ? e.message : String(e);\n throw new Error(file ? `${msg}\\n in ${file}` : msg);\n }\n }\n for (const d of defs) {\n const s = emitDefStatement(\n d as unknown as Parameters<typeof emitDefStatement>[0],\n );\n const file = fileFor(d);\n statements[keyOf(s)] = file ? { ...s, file } : s;\n }\n const snap: Snapshot = { version: 1, statements };\n if (opts.withStruct)\n // Bridge the lib/src type duality (AnyTable is the built-lib TableDef; schemaStruct uses src).\n snap.struct = schemaStruct(\n tables as unknown as Parameters<typeof schemaStruct>[0],\n defs as unknown as Parameters<typeof schemaStruct>[1],\n );\n return snap;\n}\n\n// Within a table, create order is table -> field -> index (each depends on the prior); drop\n// order is the reverse. Statements are grouped by table (see `diffSnapshots`).\nconst RANK: Record<DefineStatement[\"kind\"], number> = {\n analyzer: 0, // db-level; defined first (a FULLTEXT index references its analyzer)\n function: 0, // db-level; defined first (tables/events may reference fn::…)\n table: 1,\n field: 2,\n index: 3,\n event: 4,\n access: 5, // db-level; defined last (SIGNUP/SIGNIN reference tables)\n};\nconst tableOf = (s: DefineStatement) => s.table ?? s.name;\n\n/**\n * The up-migration statement(s) for a CHANGED object:\n * - `table` -> a clause-level `ALTER TABLE` (falls back to `DEFINE … OVERWRITE` when the delta\n * can't be expressed via ALTER, e.g. a `TYPE` NORMAL/RELATION change or an older snapshot),\n * - `field` -> a clause-level `ALTER FIELD` (falls back to `DEFINE … OVERWRITE` when the delta\n * can't be expressed via ALTER, e.g. a `COMPUTED` change or an older snapshot w/o clauses),\n * - `index` -> `REMOVE` + `DEFINE` (ALTER INDEX can't change fields/kind),\n * - everything else (event/function/access) -> `DEFINE … OVERWRITE`.\n */\nfunction changeUp(old: DefineStatement, next: DefineStatement): string[] {\n if (next.kind === \"table\") {\n const alt = alterTable(next.name, old.clauses, next.clauses);\n return [alt ?? overwriteStatement(next.ddl)];\n }\n if (next.kind === \"field\") {\n const alt = alterField(tableOf(next), next.name, old.clauses, next.clauses);\n return [alt ?? overwriteStatement(next.ddl)];\n }\n if (next.kind === \"index\") return [removeStatement(old), next.ddl];\n return [overwriteStatement(next.ddl)];\n}\n/** The inverse (next -> old) statement(s) for the down migration. */\nfunction changeDown(old: DefineStatement, next: DefineStatement): string[] {\n if (next.kind === \"table\") {\n const alt = alterTable(old.name, next.clauses, old.clauses);\n return [alt ?? overwriteStatement(old.ddl)];\n }\n if (next.kind === \"field\") {\n const alt = alterField(tableOf(old), old.name, next.clauses, old.clauses);\n return [alt ?? overwriteStatement(old.ddl)];\n }\n if (next.kind === \"index\") return [removeStatement(next), old.ddl];\n return [overwriteStatement(old.ddl)];\n}\n\n/**\n * Diff two snapshots into `up`/`down` SurrealQL. Added/changed objects → `DEFINE` (with\n * `OVERWRITE` when changed); dropped objects → `REMOVE`. `down` is the exact inverse, so a\n * migration can be rolled back. Fields of a dropped/added table are skipped (the `TABLE`\n * statement covers them).\n */\nexport function diffSnapshots(prev: Snapshot, next: Snapshot): Diff {\n const prevS = prev.statements;\n const nextS = next.statements;\n\n // Group output by table: tables in snapshot order, each followed by its own fields/indexes.\n const tableOrder = new Map<string, number>();\n for (const s of [...Object.values(nextS), ...Object.values(prevS)]) {\n const t = tableOf(s);\n if (!tableOrder.has(t)) tableOrder.set(t, tableOrder.size);\n }\n const ord = (s: DefineStatement) => tableOrder.get(tableOf(s)) ?? 0;\n const byCreate = (a: DefineStatement, b: DefineStatement) =>\n ord(a) - ord(b) || RANK[a.kind] - RANK[b.kind];\n const byDrop = (a: DefineStatement, b: DefineStatement) =>\n ord(b) - ord(a) || RANK[b.kind] - RANK[a.kind];\n\n const removed = Object.keys(prevS)\n .filter((k) => !(k in nextS))\n .map((k) => prevS[k]);\n const removedTables = new Set(\n removed.filter((s) => s.kind === \"table\").map((s) => s.name),\n );\n\n // Structural change-detection: a DDL difference that normalizes away (e.g. an enum/union/record\n // reorder) is NOT a real change. Only applies when BOTH snapshots carry a Struct; older snapshots\n // (or keys absent from the struct, like folded array elements) fall back to the DDL comparison.\n const prevIdx = prev.struct ? structIndex(prev.struct) : null;\n const nextIdx = next.struct ? structIndex(next.struct) : null;\n const added: SnapshotStatement[] = [];\n const changed: { old: SnapshotStatement; next: SnapshotStatement }[] = [];\n for (const k of Object.keys(nextS)) {\n const s = nextS[k];\n if (!(k in prevS)) {\n added.push(s);\n continue;\n }\n if (prevS[k].ddl === s.ddl) continue;\n if (prevIdx && nextIdx) {\n const a = prevIdx.get(k);\n const b = nextIdx.get(k);\n if (a !== undefined && b !== undefined && deepEqual(a, b)) continue; // cosmetic-only\n }\n changed.push({ old: prevS[k], next: s });\n }\n const addedTables = new Set(\n added.filter((s) => s.kind === \"table\").map((s) => s.name),\n );\n\n // A field/index whose owning table is dropped (or added) is covered by the TABLE statement.\n const isOrphan = (s: DefineStatement, droppedTables: Set<string>) =>\n s.kind !== \"table\" && droppedTables.has(s.table ?? \"\");\n\n const up: string[] = [];\n for (const s of removed\n .filter((s) => !isOrphan(s, removedTables))\n .sort(byDrop)) {\n up.push(removeStatement(s));\n }\n for (const s of [...added].sort(byCreate)) up.push(s.ddl);\n for (const c of [...changed].sort((a, b) => byCreate(a.next, b.next)))\n up.push(...changeUp(c.old, c.next));\n\n const down: string[] = [];\n for (const s of added.filter((s) => !isOrphan(s, addedTables)).sort(byDrop)) {\n down.push(removeStatement(s));\n }\n for (const s of [...removed].sort(byCreate)) down.push(s.ddl);\n for (const c of [...changed].sort((a, b) => byCreate(a.next, b.next)))\n down.push(...changeDown(c.old, c.next));\n\n // Structured display items, grouped by table (table → its fields → its indexes).\n const tagged: { sort: [number, number]; item: DiffItem }[] = [];\n const at = (s: DefineStatement): [number, number] => [ord(s), RANK[s.kind]];\n for (const s of removed.filter((s) => !isOrphan(s, removedTables))) {\n tagged.push({\n sort: at(s),\n item: {\n op: \"remove\",\n kind: s.kind,\n key: keyOf(s),\n table: tableOf(s),\n file: s.file,\n ddl: removeStatement(s),\n old: s.ddl,\n },\n });\n }\n for (const s of added) {\n tagged.push({\n sort: at(s),\n item: {\n op: \"add\",\n kind: s.kind,\n key: keyOf(s),\n table: tableOf(s),\n file: s.file,\n ddl: s.ddl,\n },\n });\n }\n for (const c of changed) {\n tagged.push({\n sort: at(c.next),\n item: {\n op: \"change\",\n kind: c.next.kind,\n key: keyOf(c.next),\n table: tableOf(c.next),\n file: c.next.file ?? c.old.file,\n before: c.old.ddl,\n after: c.next.ddl,\n },\n });\n }\n tagged.sort((a, b) => a.sort[0] - b.sort[0] || a.sort[1] - b.sort[1]);\n const items = tagged.map((t) => t.item);\n\n const full = Object.values(nextS)\n .sort(byCreate)\n .map((s) => ({ key: keyOf(s), table: tableOf(s), ddl: s.ddl }));\n\n return { up, down, items, full };\n}\n\n/** The table a statement targets (for grouping the migration body). */\nfunction stmtTable(s: string): string {\n const on = /\\bON (?:TABLE )?`?([^\\s`;]+)`?/.exec(s);\n if (on) return on[1];\n const t = /\\bTABLE (?:OVERWRITE |IF (?:NOT )?EXISTS )?`?([^\\s`;]+)`?/.exec(s);\n return t ? t[1] : \"\";\n}\n\n/** Indent statements, with a blank line between consecutive table groups. */\nconst indent = (stmts: string[]): string => {\n const out: string[] = [];\n let prev: string | undefined;\n for (const s of stmts) {\n const t = stmtTable(s);\n if (prev !== undefined && t !== prev) out.push(\"\");\n out.push(` ${s}`);\n prev = t;\n }\n return out.join(\"\\n\");\n};\n\n/**\n * Render a migration as a single self-contained SurrealQL program. Applied with the\n * `$direction` parameter bound to `\"up\"` or `\"down\"` — verified to support `DEFINE`/`REMOVE`\n * inside `IF` blocks on SurrealDB 3.x.\n */\nexport function renderMigration(tag: string, diff: Diff): string {\n // A migration is REPLAYED from a fixed file regardless of the database's current state (unlike\n // `diff`/`push`, which recompute a delta each run), so its DEFINEs must be idempotent: re-marking\n // them DEFINE … OVERWRITE re-applies cleanly whether or not the object already exists — and\n // OVERWRITE preserves row data (REMOVEs already use IF EXISTS). This is what lets `schemic migrate`\n // run against a database whose objects were applied out-of-band (e.g. `schemic push`/`schemic pull`). The\n // changed-object statements are already OVERWRITE/ALTER, and `overwriteStatement` is a no-op on\n // those and on REMOVE/ALTER, so only plain DEFINEs (added objects) gain the keyword.\n const idempotent = (stmts: string[]) => stmts.map(overwriteStatement);\n return [\n `-- ${tag}`,\n \"-- Generated by @schemic/core. Review before applying.\",\n \"\",\n 'IF $direction = \"up\" {',\n indent(idempotent(diff.up)),\n \"} ELSE {\",\n indent(idempotent(diff.down)),\n \"};\",\n \"\",\n ].join(\"\\n\");\n}\n","// The Struct-IR lowering for the OFFLINE side: turn an in-memory @schemic/core `TableDef`/`RelationDef`\n// (and standalone `defineFunction`/`defineAccess`/`defineEvent`) into the `Struct` IR, so it can be\n// `normalize`d and structurally diffed against the live DB's `fromInfo` (introspectStructured). This\n// is the inverse of `pull` and the keystone of the Struct-IR effort. See docs/STRUCT-IR.md.\n//\n// It reads the `TableDef`/`SField` directly (no DDL round-trip) and reuses the emitter's\n// `inferField()` so the type strings and dotted field paths are identical by construction; clauses\n// come straight off `SField.surreal` and `TableConfig`. The output is RAW (unsorted, defaults not\n// stripped, `option<>` not folded, `x.*` elements present) — `normalizeTable` closes those gaps.\n\nimport { BoundQuery, escapeIdent } from \"surrealdb\";\nimport {\n assertExpr,\n braceBody,\n eventClause,\n type FieldInfo,\n fieldType,\n inferField,\n inline,\n} from \"../ddl\";\nimport type {\n AccessDef,\n AnalyzerDef,\n FieldPermissions,\n FunctionDef,\n PermOp,\n SField,\n Shape,\n StandaloneDef,\n SurrealMeta,\n TableDef,\n TableEvent,\n TablePermissions,\n} from \"../pure\";\nimport { normalizeDb } from \"./struct\";\nimport type {\n DbStructured,\n StructAccess,\n StructAnalyzer,\n StructEvent,\n StructField,\n StructFunction,\n StructIndex,\n StructPerm,\n StructPermissions,\n StructTable,\n StructTableKind,\n} from \"./structure\";\n\nconst FIELD_PERM_OPS = [\"select\", \"create\", \"update\"] as const;\nconst TABLE_PERM_OPS = [\"select\", \"create\", \"update\", \"delete\"] as const;\n\n/**\n * Lower a permissions spec to `StructPermissions` (per-op `true`/`false`/WHERE-expr string). A\n * blanket `true`/`false`/`BoundQuery` materializes every op; an object resolves each present op,\n * following `same as X` references (with cycle detection, mirroring `renderPermissions`) and\n * inlining a `BoundQuery` to its WHERE expression. Omitted ops are left unset — `normalize` reads\n * them as the kind default, so an unspecified op compares equal to the materialized default.\n */\nfunction lowerPermissions(\n spec: TablePermissions | FieldPermissions,\n ops: readonly PermOp[],\n): StructPermissions {\n const out: StructPermissions = {};\n if (spec === true) {\n for (const op of ops) out[op] = true;\n return out;\n }\n if (spec === false) {\n for (const op of ops) out[op] = false;\n return out;\n }\n if (spec instanceof BoundQuery) {\n const where = inline(spec);\n for (const op of ops) out[op] = where;\n return out;\n }\n\n const rules = spec as Partial<Record<PermOp, boolean | BoundQuery | string>>;\n const resolved = new Map<PermOp, StructPerm>();\n const resolve = (op: PermOp, chain: PermOp[]): StructPerm => {\n const cached = resolved.get(op);\n if (cached !== undefined) return cached;\n const rule = rules[op];\n if (rule === undefined) {\n throw new Error(\n `PERMISSIONS: \"same as ${op}\" references op \"${op}\", which is not in the spec`,\n );\n }\n if (chain.includes(op)) {\n throw new Error(\n `PERMISSIONS: \"same as\" reference cycle: ${[...chain, op].join(\" -> \")}`,\n );\n }\n let value: StructPerm;\n if (typeof rule === \"string\") {\n value = resolve(rule.slice(\"same as \".length).trim() as PermOp, [\n ...chain,\n op,\n ]);\n } else if (rule instanceof BoundQuery) {\n value = inline(rule);\n } else {\n value = rule;\n }\n resolved.set(op, value);\n return value;\n };\n\n for (const op of ops) {\n if (rules[op] === undefined) continue;\n out[op] = resolve(op, []);\n }\n return out;\n}\n\n/** Lower a field `REFERENCE` to the IR's structured form: `{}` (bare) or `{ on_delete: <action> }`. */\nfunction lowerReference(ref: NonNullable<SurrealMeta[\"reference\"]>): {\n on_delete?: string;\n} {\n if (ref === true || ref.onDelete === undefined) return {};\n const onDelete = ref.onDelete;\n return {\n on_delete:\n onDelete instanceof BoundQuery\n ? inline(onDelete)\n : onDelete.toUpperCase(),\n };\n}\n\n/**\n * Walk an `inferField` node into flattened dotted `StructField`s — exactly the paths the emitter\n * produces (`address`, `address.city`, `tags.*`). Unlike the emitter this keeps `option<>` (it does\n * NOT strip it for defaulted/valued/computed fields), and it EMITS the `x.*` element node (rather\n * than folding it) — `normalizeTable` does both folds. Single-field indexes (`.index()`/`.unique()`)\n * are collected into `indexes`.\n */\nfunction lowerField(\n path: string,\n table: string,\n info: FieldInfo,\n surreal: SurrealMeta | undefined,\n fields: StructField[],\n indexes: StructIndex[],\n): void {\n const sf: StructField = { name: path, kind: info.type, table };\n if (info.flexible) sf.flexible = true;\n if (surreal) {\n if (surreal.reference) sf.reference = lowerReference(surreal.reference);\n if (surreal.default) {\n sf.default = inline(surreal.default);\n if (surreal.defaultAlways) sf.default_always = true;\n }\n if (surreal.value) sf.value = inline(surreal.value);\n if (surreal.computed) sf.computed = inline(surreal.computed);\n const assert = assertExpr(surreal.asserts);\n if (assert) sf.assert = assert;\n if (surreal.readonly) sf.readonly = true;\n if (surreal.comment !== undefined) sf.comment = surreal.comment;\n // An internal field grants no record-user access (PERMISSIONS NONE) — it wins over `$permissions`.\n if (surreal.internal) {\n sf.permissions = { select: false, create: false, update: false };\n } else if (surreal.permissions !== undefined) {\n sf.permissions = lowerPermissions(surreal.permissions, FIELD_PERM_OPS);\n }\n if (surreal.index) {\n // The single-field index name the emitter derives: `<table>_<sanitized-path>_idx`.\n const idxName = `${table}_${path\n .replace(/[`]/g, \"\")\n .replace(/[^a-zA-Z0-9]+/g, \"_\")}_idx`;\n indexes.push({\n name: idxName,\n cols: [path],\n index: surreal.index.unique ? \"UNIQUE\" : \"\",\n });\n }\n }\n fields.push(sf);\n\n for (const child of info.children) {\n lowerField(\n `${path}${child.suffix}`,\n table,\n child.info,\n child.surreal,\n fields,\n indexes,\n );\n }\n}\n\n/** Lower a table/relation event to a `StructEvent` (one or several `THEN` exprs, bare). */\nfunction lowerEvent(table: string, ev: TableEvent): StructEvent {\n const thens = (Array.isArray(ev.then) ? ev.then : [ev.then]).map(eventClause);\n // biome-ignore lint/suspicious/noThenProperty: `then` mirrors SurrealQL's event THEN clause.\n const out: StructEvent = { name: ev.name, what: table, then: thens };\n if (ev.when !== undefined) out.when = eventClause(ev.when);\n return out;\n}\n\n/**\n * Lower an in-memory `TableDef`/`RelationDef` to the `Struct` IR. The result is raw — feed it\n * through `normalizeTable` before comparing. Skips the implicit `id` field (and `in`/`out` on a\n * relation); they are managed by SurrealDB and never emitted.\n */\nexport function fromTableDef(t: TableDef<string, Shape>): StructTable {\n const cfg = t.config;\n const rel = cfg.relation;\n const implicit = rel ? new Set([\"id\", \"in\", \"out\"]) : new Set([\"id\"]);\n\n const fields: StructField[] = [];\n const indexes: StructIndex[] = [];\n for (const [name, field] of Object.entries(t.fields)) {\n if (implicit.has(name)) continue;\n const f = field as SField;\n lowerField(\n escapeIdent(name),\n t.name,\n inferField(f.schema),\n f.surreal,\n fields,\n indexes,\n );\n }\n // Composite (multi-field) indexes — and the row-count index (no FIELDS).\n for (const idx of cfg.indexes ?? []) {\n indexes.push({\n name: idx.name,\n cols: idx.count ? [] : idx.fields.map(escapeIdent),\n index: idx.count ? \"COUNT\" : (idx.spec ?? (idx.unique ? \"UNIQUE\" : \"\")), // HNSW/DISKANN/FULLTEXT or UNIQUE/plain\n ...(idx.comment !== undefined ? { comment: idx.comment } : {}),\n });\n }\n\n let kind: StructTableKind;\n if (rel) {\n kind = { kind: \"RELATION\" };\n if (rel.from.length) kind.in = [...rel.from];\n if (rel.to.length) kind.out = [...rel.to];\n if (rel.enforced) kind.enforced = true;\n } else if (cfg.type === \"any\") {\n kind = { kind: \"ANY\" };\n } else {\n kind = { kind: \"NORMAL\" };\n }\n\n const out: StructTable = {\n name: t.name,\n kind,\n schemafull: cfg.schemafull,\n fields,\n indexes,\n events: (cfg.events ?? []).map((ev) => lowerEvent(t.name, ev)),\n };\n if (cfg.drop) out.drop = true;\n if (cfg.comment !== undefined) out.comment = cfg.comment;\n if (cfg.changefeed) {\n out.changefeed = {\n expiry: cfg.changefeed.expiry,\n original: !!cfg.changefeed.includeOriginal,\n };\n }\n if (cfg.permissions !== undefined) {\n out.permissions = lowerPermissions(cfg.permissions, TABLE_PERM_OPS);\n }\n // A pre-computed VIEW — the inlined `SELECT …` (without the `AS ` keyword; canonical adds it).\n if (cfg.view !== undefined) out.view = eventClause(cfg.view);\n return out;\n}\n\n/** Lower a `defineFunction` to a `StructFunction` (block wrapped as `{ … }` to match INFO). */\nfunction lowerFunction(fn: FunctionDef): StructFunction {\n const args: [string, string][] = Object.entries(fn.args).map(([n, f]) => [\n n,\n fieldType(f),\n ]);\n const out: StructFunction = {\n name: fn.name,\n args,\n block: fn.config.body !== undefined ? braceBody(fn.config.body) : \"{}\",\n };\n if (fn.config.returns) out.returns = fieldType(fn.config.returns);\n const p = fn.config.permissions;\n if (p !== undefined)\n out.permissions = typeof p === \"boolean\" ? p : eventClause(p);\n if (fn.config.comment !== undefined) out.comment = fn.config.comment;\n return out;\n}\n\n/** Lower a `defineAccess` to a `StructAccess`. Signing keys are NOT carried (SurrealDB redacts them). */\nfunction lowerAccess(a: AccessDef): StructAccess {\n const cfg = a.config;\n const k = cfg.kind;\n let kind: StructAccess[\"kind\"];\n if (k.type === \"bearer\") {\n kind = {\n kind: \"BEARER\",\n subject: k.subject === \"user\" ? \"USER\" : \"RECORD\",\n };\n } else if (k.type === \"jwt\") {\n kind = {\n kind: \"JWT\",\n jwt: { verify: k.url ? { url: k.url } : { alg: k.alg ?? \"HS512\" } },\n };\n } else {\n kind = { kind: \"RECORD\" };\n if (cfg.signup) kind.signup = braceBody(cfg.signup);\n if (cfg.signin) kind.signin = braceBody(cfg.signin);\n if (cfg.authenticate) kind.authenticate = braceBody(cfg.authenticate);\n }\n\n const out: StructAccess = { name: a.name, kind };\n const d = cfg.duration;\n if (d && (d.grant || d.token || d.session)) {\n out.duration = {};\n if (d.grant) out.duration.grant = d.grant;\n if (d.token) out.duration.token = d.token;\n if (d.session) out.duration.session = d.session;\n }\n return out;\n}\n\n/** Lower a `defineAnalyzer` to a `StructAnalyzer` (tokenizers/filters uppercased to match INFO). */\nfunction lowerAnalyzer(a: AnalyzerDef): StructAnalyzer {\n const out: StructAnalyzer = {\n name: a.name,\n tokenizers: a.config.tokenizers.map((t) => t.toUpperCase()),\n };\n if (a.config.filters?.length)\n out.filters = a.config.filters.map((f) => f.toUpperCase());\n return out;\n}\n\n/** Lower a standalone def (`defineFunction`/`defineAccess`/`defineEvent`/`defineAnalyzer`) to its `Struct` IR. */\nexport function fromStandalone(\n def: StandaloneDef,\n): StructFunction | StructAccess | StructEvent | StructAnalyzer {\n // An `EventDef` already carries `name`/`when`/`then` — the `TableEvent` shape `lowerEvent` reads.\n if (def.kind === \"event\") return lowerEvent(def.table, def);\n if (def.kind === \"function\") return lowerFunction(def);\n if (def.kind === \"analyzer\") return lowerAnalyzer(def);\n return lowerAccess(def);\n}\n\n/**\n * The NORMALIZED Struct-IR for a whole loaded schema — the offline counterpart of `fromInfo`\n * (introspectStructured). Standalone events are attached to their owning table. Used to render the\n * schema as TypeScript (`diff --ts`) and stored in the snapshot.\n */\nexport function schemaStruct(\n tables: TableDef<string, Shape>[],\n defs: StandaloneDef[],\n): DbStructured {\n const structTables = tables.map(fromTableDef);\n const byName = new Map(structTables.map((t) => [t.name, t]));\n const functions: StructFunction[] = [];\n const accesses: StructAccess[] = [];\n const analyzers: StructAnalyzer[] = [];\n for (const d of defs) {\n if (d.kind === \"function\")\n functions.push(fromStandalone(d) as StructFunction);\n else if (d.kind === \"access\")\n accesses.push(fromStandalone(d) as StructAccess);\n else if (d.kind === \"analyzer\")\n analyzers.push(fromStandalone(d) as StructAnalyzer);\n else if (d.kind === \"event\")\n byName.get(d.table)?.events.push(fromStandalone(d) as StructEvent);\n }\n return normalizeDb({ tables: structTables, functions, accesses, analyzers });\n}\n","// The SurrealDB STATEMENT/STRUCT filters — the dialect halves of the per-kind object filter. They\n// operate on `DefineStatement`/`Snapshot` (the statement engine) and `DbStructured` (introspection).\n// The dialect-free `Filter` definition + the portable-IR filters live in `./filter`. In the package\n// split this module moves to `@schemic/surrealdb` (see docs/MULTI-DB-SPIKE.md).\n\nimport { type Filter, inCat } from \"@schemic/core\";\nimport type { DefineStatement } from \"../ddl\";\nimport type { DbStructured, Snapshot } from \"./structure\";\n\n/** Whether a `DefineStatement` passes the filter (table-scoped objects also need their table in). */\nexport function included(f: Filter, s: DefineStatement): boolean {\n const table = s.table ?? s.name;\n switch (s.kind) {\n case \"table\":\n case \"field\":\n case \"index\":\n return inCat(f.tables, table);\n case \"event\":\n return inCat(f.tables, table) && inCat(f.events, s.name);\n case \"function\":\n return inCat(f.functions, s.name);\n case \"access\":\n return inCat(f.access, s.name);\n case \"analyzer\":\n // Analyzers are shared infra a FULLTEXT index depends on — always kept (no filter category).\n return true;\n }\n}\n\n/** Keep only the snapshot statements that pass the filter (for `diff`/`sync`/`generate`). */\nexport function filterSnapshot(snap: Snapshot, f: Filter): Snapshot {\n const statements: Record<string, DefineStatement> = {};\n for (const [k, s] of Object.entries(snap.statements))\n if (included(f, s)) statements[k] = s;\n return { ...snap, statements };\n}\n\n/**\n * The snapshot to persist after a filtered `generate`: included kinds take their new state from\n * `next`, excluded kinds keep their prior state from `prev`. So generating without `--access`\n * leaves the snapshot's access untouched (no phantom add/remove) rather than dropping it.\n */\nexport function mergeSnapshot(\n prev: Snapshot,\n next: Snapshot,\n f: Filter,\n): Snapshot {\n const statements: Record<string, DefineStatement> = {};\n for (const [k, s] of Object.entries(prev.statements))\n if (!included(f, s)) statements[k] = s;\n for (const [k, s] of Object.entries(next.statements))\n if (included(f, s)) statements[k] = s;\n return { ...next, statements };\n}\n\n/** Keep only the introspected objects that pass the filter (for `pull`). */\nexport function filterStructured(db: DbStructured, f: Filter): DbStructured {\n const tables = db.tables\n .filter((t) => inCat(f.tables, t.name))\n .map((t) => ({\n ...t,\n events: t.events.filter((e) => inCat(f.events, e.name)),\n }));\n const functions = db.functions.filter((fn) => inCat(f.functions, fn.name));\n const accesses = db.accesses.filter((a) => inCat(f.access, a.name));\n return { tables, functions, accesses, analyzers: db.analyzers };\n}\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { join, relative } from \"node:path\";\nimport type { ResolvedConfig } from \"@schemic/core\";\nimport {\n existingTables,\n type Filter,\n type LocalOnly,\n mergeUnits,\n type PullFilePlan,\n type PullPlan,\n parseFilter,\n type RenderedUnit,\n scanLocalEntities,\n} from \"@schemic/core\";\nimport type { Surreal } from \"surrealdb\";\nimport { formatForAssert } from \"../pure\";\nimport {\n type DbStructured,\n introspectStructured,\n type StructAccess,\n type StructAnalyzer,\n type StructField,\n type StructFunction,\n type StructPerm,\n type StructPermissions,\n type StructTable,\n} from \"./structure\";\nimport { filterStructured } from \"./surreal-filter\";\n\n/** The field clauses pull reverses into `s.*` chains (sourced from `INFO … STRUCTURE`). */\ninterface ParsedField {\n type: string;\n default?: string;\n defaultAlways?: boolean;\n value?: string;\n computed?: string;\n assert?: string;\n readonly?: boolean;\n comment?: string;\n flexible?: boolean;\n permissions?: StructPermissions;\n /** `REFERENCE [ON DELETE …]` on a record-link field (mirrors `StructField.reference`). */\n reference?: { on_delete?: string };\n}\n\n/** A single permission op as a `.permissions()` argument value (`true`/`false`/a `surql` WHERE). */\nfunction permValue(v: StructPerm | undefined): string {\n if (v === true) return \"true\";\n if (v === false || v === undefined) return \"false\";\n return `surql\\`${v}\\``;\n}\n\n/**\n * The `.permissions(...)` / `.$permissions(...)` argument for a structured permission set, or null\n * to omit it (when it matches the default: FULL for fields, NONE for tables). Collapses all-FULL →\n * `true`, all-NONE → `false`, and one shared `WHERE` across every op → a single `surql` expr.\n */\nfunction renderPerms(\n perms: StructPermissions | undefined,\n ops: (keyof StructPermissions)[],\n defaultFull: boolean,\n): string | null {\n if (!perms) return null;\n const vals = ops.map((op) => perms[op]);\n const allTrue = vals.every((v) => v === true);\n const allFalse = vals.every((v) => v === false || v === undefined);\n if (defaultFull ? allTrue : allFalse) return null; // matches the default\n if (allTrue) return \"true\";\n if (allFalse) return \"false\";\n if (vals.every((v) => typeof v === \"string\") && new Set(vals).size === 1) {\n return `surql\\`${vals[0]}\\``; // one WHERE shared by every op\n }\n return `{ ${ops.map((op) => `${op}: ${permValue(perms[op])}`).join(\", \")} }`;\n}\n\n/**\n * The bare field path — STRUCTURE backtick-escapes reserved-word segments (`` `value` ``), so we\n * strip them; `ident()` re-quotes only what TS needs, and emit re-escapes for SurrealQL (avoids\n * double-escaping the name).\n */\nfunction unescapeName(name: string): string {\n return name\n .split(\".\")\n .map((seg) => seg.replace(/^`([\\s\\S]*)`$/, \"$1\"))\n .join(\".\");\n}\n\n/** Map a structured field (from STRUCTURE) to the clause bag `renderField` consumes. */\nfunction toParsed(f: StructField): ParsedField {\n return {\n type: f.kind,\n default: f.default,\n defaultAlways: f.default_always,\n value: f.value,\n computed: f.computed,\n assert: f.assert,\n readonly: f.readonly,\n comment: f.comment,\n flexible: f.flexible,\n permissions: f.permissions,\n reference: f.reference,\n };\n}\n\n// --- Cross-table reference resolution (imports / self-refs / relation endpoints) -------------\n\nconst pascal = (name: string) =>\n name\n .replace(/(^|[_-])([a-z])/g, (_, __, c) => c.toUpperCase())\n .replace(/[^A-Za-z0-9]/g, \"\");\n\n/** All `record<…>` target table names in a type expression (handles option/array/union nesting). */\nfunction recordTargets(kind: string): string[] {\n const out: string[] = [];\n const re = /record<([^>]+)>/g;\n let m: RegExpExecArray | null = re.exec(kind);\n while (m) {\n for (const t of m[1].split(\"|\")) out.push(t.trim());\n m = re.exec(kind);\n }\n return out;\n}\n\n/** The pulled tables a table points at: `record<…>` field targets + relation endpoints. */\nfunction tableRefs(t: StructTable, pulled: Set<string>): Set<string> {\n const out = new Set<string>();\n const add = (n: string) => {\n if (pulled.has(n)) out.add(n);\n };\n for (const f of t.fields) for (const tgt of recordTargets(f.kind)) add(tgt);\n if (t.kind.kind === \"RELATION\") {\n for (const n of t.kind.in ?? []) add(n);\n for (const n of t.kind.out ?? []) add(n);\n }\n return out;\n}\n\n/** Everything reachable from `start` in the reference graph (excluding `start` itself). */\nfunction reachable(\n graph: Map<string, Set<string>>,\n start: string,\n): Set<string> {\n const seen = new Set<string>();\n const stack = [...(graph.get(start) ?? [])];\n while (stack.length) {\n const n = stack.pop();\n if (n === undefined || seen.has(n)) continue;\n seen.add(n);\n for (const m of graph.get(n) ?? []) stack.push(m);\n }\n return seen;\n}\n\n/** How a `record<target>` / endpoint reference should be expressed in the generated code. */\ntype RefKind = \"self\" | \"direct\" | \"string\";\n\n/** Per-table render context: resolves references and accumulates the imports they need. */\ninterface RenderCtx {\n table: string;\n /** Imported table names (→ value imports of their `const`). */\n imports: Set<string>;\n /** Set when a `record<self>` field used the callback `self` parameter. */\n usesSelf: boolean;\n /** Whether the `self` callback is available (only `defineTable`, not `defineRelation`). */\n allowSelf: boolean;\n /** PascalCase const name for a table. */\n constOf: (name: string) => string;\n /** Resolve a reference from this table to `target`. */\n resolve: (target: string) => RefKind;\n}\n\nfunction makeResolver(graph: Map<string, Set<string>>, pulled: Set<string>) {\n const cache = new Map<string, Set<string>>();\n const reach = (n: string) => {\n let r = cache.get(n);\n if (!r) {\n r = reachable(graph, n);\n cache.set(n, r);\n }\n return r;\n };\n return (from: string, target: string): RefKind => {\n if (target === from) return \"self\";\n if (!pulled.has(target)) return \"string\"; // not pulled — can't import it\n return reach(target).has(from) ? \"string\" : \"direct\"; // cycle → string, else import\n };\n}\n\n/** Split a type expression on its top-level `|` (ignoring `|` inside `<…>`). */\nfunction splitTopUnion(expr: string): string[] {\n const parts: string[] = [];\n let depth = 0;\n let cur = \"\";\n for (const c of expr) {\n if (c === \"<\") depth++;\n else if (c === \">\") depth--;\n if (c === \"|\" && depth === 0) {\n parts.push(cur.trim());\n cur = \"\";\n } else cur += c;\n }\n parts.push(cur.trim());\n return parts;\n}\n\n/** Parse a SurrealQL literal token (`'a'`, `\"a\"`, `42`, `true`) to its JS value, else null. */\nfunction parseLiteral(s: string): { value: string | number | boolean } | null {\n const t = s.trim();\n const q = /^'((?:\\\\.|[^'])*)'$/.exec(t) ?? /^\"((?:\\\\.|[^\"])*)\"$/.exec(t);\n if (q) return { value: q[1] };\n if (/^-?\\d+$/.test(t)) return { value: Number.parseInt(t, 10) };\n if (/^-?\\d+\\.\\d+$/.test(t)) return { value: Number.parseFloat(t) };\n if (t === \"true\" || t === \"false\") return { value: t === \"true\" };\n return null;\n}\n\n/** Render a `record<…>` reference, using imports / `self` / a string fallback per `ctx`. */\nfunction renderRecord(targetsRaw: string, ctx?: RenderCtx): string {\n const targets = targetsRaw.split(\"|\").map((s) => s.trim());\n if (ctx && targets.length === 1) {\n const kind = ctx.resolve(targets[0]);\n if (kind === \"self\" && ctx.allowSelf) {\n ctx.usesSelf = true;\n return \"self\";\n }\n if (kind === \"direct\") {\n ctx.imports.add(targets[0]);\n return `${ctx.constOf(targets[0])}.record()`;\n }\n }\n const arg =\n targets.length === 1\n ? JSON.stringify(targets[0])\n : `[${targets.map((t) => JSON.stringify(t)).join(\", \")}]`;\n return `s.recordId(${arg})`;\n}\n\n/** Map a SurrealQL type to an `s.*` expression (`ctx` resolves `record<…>` references). */\nfunction szType(type: string, ctx?: RenderCtx): string {\n const t = type.trim();\n // option<X> and the `none | X` form the DB reports.\n const opt = /^option<(.+)>$/.exec(t);\n if (opt) return `${szType(opt[1], ctx)}.optional()`;\n if (/(^|\\|)\\s*none\\s*(\\||$)/.test(t)) {\n const inner = t.replace(/\\s*\\|?\\s*none\\s*\\|?\\s*/g, \"\").trim();\n return `${szType(inner || \"any\", ctx)}.optional()`;\n }\n const nullable = /^(.+?)\\s*\\|\\s*null$/.exec(t);\n if (nullable) return `${szType(nullable[1], ctx)}.nullable()`;\n\n const arr = /^array<(.+)>$/.exec(t);\n if (arr) return `${szType(arr[1], ctx)}.array()`;\n const set = /^set<(.+)>$/.exec(t);\n if (set) return `s.set(${szType(set[1], ctx)})`;\n const rec = /^record<(.+?)>$/.exec(t);\n if (rec) return renderRecord(rec[1], ctx);\n\n // Literal unions: `'a' | 'b'` -> s.enum (all strings) or a union of literals; lone -> s.literal.\n const lits = splitTopUnion(t).map(parseLiteral);\n if (lits.length && lits.every((l) => l !== null)) {\n const vals = lits.map(\n (l) => (l as { value: string | number | boolean }).value,\n );\n if (vals.length === 1) return `s.literal(${JSON.stringify(vals[0])})`;\n if (vals.every((v) => typeof v === \"string\"))\n return `s.enum([${vals.map((v) => JSON.stringify(v)).join(\", \")}])`;\n return `s.union([${vals.map((v) => `s.literal(${JSON.stringify(v)})`).join(\", \")}])`;\n }\n\n // Native types carrying a `<kind>` parameter (e.g. `geometry<point>`).\n const geo = /^geometry(?:<(\\w+)>)?$/.exec(t);\n if (geo)\n return geo[1] ? `s.geometry(${JSON.stringify(geo[1])})` : \"s.geometry()\";\n\n switch (t) {\n case \"string\":\n return \"s.string()\";\n case \"file\":\n return \"s.file()\";\n case \"int\":\n return \"s.int()\";\n case \"float\":\n return \"s.float()\";\n case \"number\":\n return \"s.number()\";\n case \"bool\":\n return \"s.boolean()\";\n case \"datetime\":\n return \"s.datetime()\";\n case \"uuid\":\n return \"s.uuid()\";\n case \"decimal\":\n return \"s.decimal()\";\n case \"duration\":\n return \"s.duration()\";\n case \"bytes\":\n return \"s.bytes()\";\n case \"object\":\n return \"s.object({})\";\n case \"any\":\n return \"s.any()\";\n default:\n return `s.any() /* ${t} */`;\n }\n}\n\ninterface FieldNode {\n parsed?: ParsedField;\n children: Map<string, FieldNode>;\n}\n\n/** Build a nested tree from dotted field paths (`settings.theme`, `tags.*`). */\nfunction fieldTree(fields: { name: string; parsed: ParsedField }[]): FieldNode {\n const root: FieldNode = { children: new Map() };\n for (const f of fields) {\n let node = root;\n for (const seg of f.name.split(\".\")) {\n let child = node.children.get(seg);\n if (!child) {\n child = { children: new Map() };\n node.children.set(seg, child);\n }\n node = child;\n }\n node.parsed = f.parsed;\n }\n return root;\n}\n\n/**\n * Strip optionality/nullability wrappers, reporting which were present. Handles both\n * `option<X>` and the `X | none` form SurrealDB's `INFO` reports, plus `X | null`.\n */\nfunction unwrapType(type: string): {\n base: string;\n optional: boolean;\n nullable: boolean;\n} {\n let t = type.trim();\n let optional = false;\n let nullable = false;\n const opt = /^option<(.+)>$/.exec(t);\n if (opt) {\n optional = true;\n t = opt[1].trim();\n }\n // `X | none` / `none | X` — SurrealDB's normalized form of `option<X>`.\n if (/(^|\\|)\\s*none\\s*(\\||$)/.test(t)) {\n optional = true;\n t = t.replace(/\\s*\\|?\\s*none\\s*\\|?\\s*/g, \"\").trim();\n }\n const nul = /^(.+?)\\s*\\|\\s*null$/.exec(t);\n if (nul) {\n nullable = true;\n t = nul[1].trim();\n }\n return { base: t, optional, nullable };\n}\n\n/** Render an `s.*` expression for a field node, recursing into nested objects/array elements. */\nfunction renderField(node: FieldNode, indent: string, ctx?: RenderCtx): string {\n const p = node.parsed;\n const objChildren = [...node.children].filter(([k]) => k !== \"*\");\n const star = node.children.get(\"*\");\n const wrap = p ? unwrapType(p.type) : null;\n // A `string` field whose ASSERT is exactly a baked `string::is_<fmt>($value)` round-trips back to\n // the format builder (`s.email()`, …) — the assert is the only signal, and it's dropped below\n // since the builder re-bakes it. Combined/extra asserts don't match, so they stay `string` + assert.\n const fmt = p?.assert !== undefined ? formatForAssert(p.assert) : undefined;\n let expr: string;\n if (p && wrap?.base === \"object\") {\n // Rebuild s.object from dotted children (empty if none) — even when wrapped in\n // option<…>/| null, so optional/nullable/flexible nested objects keep their shape.\n const inner = objChildren.length\n ? `{\\n${objChildren\n .map(\n ([k, c]) =>\n `${indent} ${ident(k)}: ${renderField(c, `${indent} `, ctx)},`,\n )\n .join(\"\\n\")}\\n${indent}}`\n : \"{}\";\n expr = `s.object(${inner})`;\n if (p.flexible) expr += \".loose()\"; // FLEXIBLE — accepts arbitrary keys\n if (wrap.nullable) expr += \".nullable()\";\n if (wrap.optional) expr += \".optional()\";\n } else if (p && star && /^(array|set)\\b/.test(wrap?.base ?? \"\")) {\n // Any array/set: the element's full structure (incl. nested sub-fields) lives in the `*`\n // child — fold it into `<elem>.array()` / `s.set(<elem>)`. This beats parsing the element\n // type from the parent kind, which would lose the element's sub-fields.\n const elem = renderField(star, indent, ctx);\n expr = /^set\\b/.test(wrap?.base ?? \"\")\n ? `s.set(${elem})`\n : `${elem}.array()`;\n if (wrap?.nullable) expr += \".nullable()\";\n if (wrap?.optional) expr += \".optional()\";\n } else if (p && wrap?.base === \"string\" && fmt) {\n expr = `s.${fmt}()`;\n if (wrap.nullable) expr += \".nullable()\";\n if (wrap.optional) expr += \".optional()\";\n } else if (!p) {\n expr = \"s.any()\";\n } else {\n expr = szType(p.type, ctx);\n }\n\n if (p) {\n // `REFERENCE [ON DELETE …]` on a record-link field. A bare reference (or the materialized default\n // `IGNORE`) round-trips as `.reference()`; an action keyword as `{ onDelete: '<kw>' }`; anything\n // else (a `surql` expression) as `{ onDelete: surql\\`…\\` }`. Mirrors `canonicalField` in structure.ts.\n if (p.reference !== undefined) {\n const od = p.reference.on_delete;\n if (!od || od.toUpperCase() === \"IGNORE\") {\n expr += \".reference()\";\n } else if (/^(REJECT|CASCADE|UNSET)$/i.test(od)) {\n expr += `.reference({ onDelete: ${JSON.stringify(od.toLowerCase())} })`;\n } else {\n expr += `.reference({ onDelete: surql\\`${od}\\` })`;\n }\n }\n if (p.default !== undefined) {\n // A bare literal (false/42/\"x\") round-trips as a plain JS value the `s` API accepts directly;\n // only non-literal expressions (time::now(), …) need the `surql` tag. Wrapping literals in\n // `surql` would churn hand-authored `.$default(false)` into `.$default(surql\\`false\\`)`.\n const method = p.defaultAlways ? \"$defaultAlways\" : \"$default\";\n const lit = parseLiteral(p.default);\n expr += `.${method}(${lit ? JSON.stringify(lit.value) : `surql\\`${p.default}\\``})`;\n }\n if (p.value !== undefined) expr += `.$value(surql\\`${p.value}\\`)`;\n if (p.computed !== undefined) expr += `.$computed(surql\\`${p.computed}\\`)`;\n // The format builder re-bakes its `string::is_<fmt>` assert, so drop it when we reversed one.\n if (p.assert !== undefined && !fmt)\n expr += `.$assert(surql\\`${p.assert}\\`)`;\n if (p.readonly) expr += \".$readonly()\";\n if (p.comment) expr += `.$comment(${JSON.stringify(p.comment)})`;\n const perm = renderPerms(\n p.permissions,\n [\"select\", \"create\", \"update\"],\n true,\n );\n if (perm) expr += `.$permissions(${perm})`;\n }\n return expr;\n}\n\n/** A safe object-key: a bare identifier, or a quoted string. */\nfunction ident(key: string): string {\n return /^[A-Za-z_$][\\w$]*$/.test(key) ? key : JSON.stringify(key);\n}\n\n/** Resolve a relation endpoint set to `.from`/`.to` args (imported consts) — or null if any can't be. */\nfunction wireEndpoints(names: string[], ctx: RenderCtx): string | null {\n if (!names.length) return null;\n const resolved = names.map((n) => {\n const kind = ctx.resolve(n);\n if (kind === \"direct\") {\n ctx.imports.add(n);\n return ctx.constOf(n);\n }\n if (kind === \"self\") return ctx.constOf(ctx.table);\n return null; // not pulled / cyclic → can't pass a string to .from/.to\n });\n if (resolved.some((r) => r === null)) return null;\n return resolved.length === 1\n ? (resolved[0] as string)\n : `[${resolved.join(\", \")}]`;\n}\n\n/**\n * A vector/full-text index spec (canonical/minimal form) -> the `.index()` opts fragment, e.g.\n * `HNSW DIMENSION 4 DIST COSINE` -> `hnsw: { dimension: 4, dist: \"cosine\" }`. Returns null for a\n * plain/UNIQUE/COUNT spec (those are handled separately).\n */\nfunction indexSpecOpts(spec: string): string | null {\n if (spec.startsWith(\"HNSW \") || spec.startsWith(\"DISKANN \")) {\n const algo = spec.startsWith(\"HNSW\") ? \"hnsw\" : \"diskann\";\n const toks = spec.split(/\\s+/).slice(1);\n const kv: Record<string, string> = {};\n for (let i = 0; i < toks.length; i += 2) kv[toks[i]] = toks[i + 1] ?? \"\";\n const f: string[] = [`dimension: ${kv.DIMENSION}`];\n if (kv.DIST) f.push(`dist: ${JSON.stringify(kv.DIST.toLowerCase())}`);\n if (kv.TYPE) f.push(`type: ${JSON.stringify(kv.TYPE.toLowerCase())}`);\n if (kv.EFC) f.push(`efc: ${kv.EFC}`);\n if (kv.M) f.push(`m: ${kv.M}`);\n if (kv.DEGREE) f.push(`degree: ${kv.DEGREE}`);\n if (kv.L_BUILD) f.push(`l_build: ${kv.L_BUILD}`);\n if (kv.ALPHA) f.push(`alpha: ${kv.ALPHA}`);\n return `${algo}: { ${f.join(\", \")} }`;\n }\n const ft = /^FULLTEXT ANALYZER (\\S+)(.*)$/.exec(spec);\n if (ft) {\n const f: string[] = [`analyzer: ${JSON.stringify(ft[1])}`];\n const bm = /BM25\\(([^)]*)\\)/.exec(ft[2]);\n if (bm) {\n const [k, b] = bm[1].split(\",\").map((x) => x.trim());\n f.push(`bm25: [${k}, ${b}]`);\n }\n if (/\\bHIGHLIGHTS\\b/.test(ft[2])) f.push(\"highlights: true\");\n return `fulltext: { ${f.join(\", \")} }`;\n }\n return null;\n}\n\n/** Render just the `export const … = define…(…);` for one table (no import lines). */\nfunction renderTableConst(\n t: StructTable,\n ctx: RenderCtx,\n): { code: string; factory: string } {\n // A pre-computed VIEW: `defineView(name, surql\\`SELECT …\\`)` — no fields, then the common table\n // config (comment / permissions / changefeed); TYPE ANY + SCHEMALESS are implied by defineView.\n if (t.view !== undefined) {\n let code = `export const ${ctx.constOf(t.name)} = defineView(${JSON.stringify(t.name)}, surql\\`${t.view}\\`)`;\n if (t.comment) code += `\\n .comment(${JSON.stringify(t.comment)})`;\n const vperm = renderPerms(\n t.permissions,\n [\"select\", \"create\", \"update\", \"delete\"],\n false,\n );\n if (vperm) code += `\\n .permissions(${vperm})`;\n if (t.changefeed) {\n const incl = t.changefeed.original ? \", { includeOriginal: true }\" : \"\";\n code += `\\n .changefeed(${JSON.stringify(t.changefeed.expiry)}${incl})`;\n }\n return { code: `${code};`, factory: \"defineView\" };\n }\n\n const isRelation = t.kind.kind === \"RELATION\";\n const fields = t.fields.map((f) => ({\n name: unescapeName(f.name),\n parsed: toParsed(f),\n }));\n const tree = fieldTree(fields);\n const fieldLines = [...tree.children]\n .filter(([k]) => k !== \"id\" && k !== \"in\" && k !== \"out\")\n .map(([k, node]) => ` ${ident(k)}: ${renderField(node, \" \", ctx)},`)\n .join(\"\\n\");\n\n const name = ctx.constOf(t.name);\n const factory = isRelation ? \"defineRelation\" : \"defineTable\";\n // A `record<self>` field needs the callback shape so `self` is in scope.\n const head = ctx.usesSelf\n ? `export const ${name} = ${factory}(${JSON.stringify(t.name)}, (self) => ({`\n : `export const ${name} = ${factory}(${JSON.stringify(t.name)}, {`;\n const open = ctx.usesSelf ? \"}))\" : \"})\";\n\n const body: string[] = [head];\n if (!isRelation) body.push(` id: s.string(),`);\n body.push(fieldLines);\n\n let close = open;\n if (isRelation) {\n const from = wireEndpoints(t.kind.in ?? [], ctx);\n const to = wireEndpoints(t.kind.out ?? [], ctx);\n if (from) close += `\\n .from(${from})`;\n if (to) close += `\\n .to(${to})`;\n if (t.kind.enforced) close += `\\n .enforced()`;\n } else if (t.kind.kind === \"ANY\") {\n close += `\\n .typeAny()`;\n }\n // Common table config (applies to tables and relations alike).\n if (!t.schemafull) close += `\\n .schemaless()`;\n if (t.drop) close += `\\n .drop()`;\n if (t.comment) close += `\\n .comment(${JSON.stringify(t.comment)})`;\n const tperm = renderPerms(\n t.permissions,\n [\"select\", \"create\", \"update\", \"delete\"],\n false,\n );\n if (tperm) close += `\\n .permissions(${tperm})`;\n if (t.changefeed) {\n const incl = t.changefeed.original ? \", { includeOriginal: true }\" : \"\";\n close += `\\n .changefeed(${JSON.stringify(t.changefeed.expiry)}${incl})`;\n }\n for (const idx of t.indexes) {\n const cols = idx.cols.map((c) => JSON.stringify(c)).join(\", \");\n const parts: string[] = [];\n if (idx.index === \"UNIQUE\") parts.push(\"unique: true\");\n else if (idx.index === \"COUNT\") parts.push(\"count: true\");\n else {\n const so = indexSpecOpts(idx.index); // HNSW/DISKANN/FULLTEXT -> hnsw/diskann/fulltext opts\n if (so) parts.push(so);\n }\n if (idx.comment !== undefined)\n parts.push(`comment: ${JSON.stringify(idx.comment)}`);\n const opts = parts.length ? `, { ${parts.join(\", \")} }` : \"\";\n close += `\\n .index(${JSON.stringify(idx.name)}, [${cols}]${opts})`;\n }\n for (const ev of t.events) {\n // Drop a `WHEN true` (SurrealDB's stored form of an omitted WHEN). Author bodies as `surql\\`…\\``.\n const when =\n ev.when !== undefined && ev.when !== \"true\"\n ? `when: surql\\`${ev.when}\\`, `\n : \"\";\n const then =\n ev.then.length === 1\n ? `surql\\`${ev.then[0]}\\``\n : `[${ev.then.map((e) => `surql\\`${e}\\``).join(\", \")}]`;\n close += `\\n .event(${JSON.stringify(ev.name)}, { ${when}then: ${then} })`;\n }\n body.push(`${close};`);\n\n return { code: body.join(\"\\n\"), factory };\n}\n\n/** Assemble a single-object module (imports + the const) for the directory layout. */\nfunction unitModule(u: RenderedUnit): string {\n return `${u.imports.join(\"\\n\")}\\n\\n${u.code}\\n`;\n}\n\n/** The rendered unit (const statement + the imports it needs) for one table/relation. */\nfunction tableUnit(t: StructTable, ctx: RenderCtx): RenderedUnit {\n const { code, factory } = renderTableConst(t, ctx);\n // A view's code uses no `s.*` builder — import only the factory then (avoids an unused `s` import).\n const needsS = t.view === undefined && code.includes(\"s.\");\n const imports = [\n `import { ${needsS ? \"s, \" : \"\"}${factory} } from \"@schemic/surrealdb\";`,\n ];\n // Cross-table value imports (one per referenced table, sorted, self excluded).\n for (const dep of [...ctx.imports].filter((d) => d !== t.name).sort()) {\n imports.push(`import { ${ctx.constOf(dep)} } from \"./${dep}\";`);\n }\n // `surql` lives in surrealdb (where hand-authored files import it from) — a separate line, never\n // folded into the @schemic/surrealdb import (which would reprint/reorder that import on every pull).\n if (code.includes(\"surql`\"))\n imports.push(`import { surql } from \"surrealdb\";`);\n return {\n kind: \"table\",\n name: t.name,\n exportName: ctx.constOf(t.name),\n code,\n imports,\n };\n}\n\n/** A const name for a function — `fn.name` sanitized to an identifier (`math::add` → `math_add`). */\nfunction fnConst(name: string): string {\n const id = name.replace(/[^A-Za-z0-9]+/g, \"_\").replace(/^_+|_+$/g, \"\");\n return /^[A-Za-z]/.test(id) ? id : `fn_${id}`;\n}\n\n/** Reverse a `StructFunction` into a `defineFunction(name, args).returns(…).body(…)…` const. */\nfunction renderFunctionConst(fn: StructFunction): string {\n const args = fn.args.map(([n, t]) => `${ident(n)}: ${szType(t)}`).join(\", \");\n let code = `export const ${fnConst(fn.name)} = defineFunction(${JSON.stringify(fn.name)}, { ${args} })`;\n if (fn.returns !== undefined) code += `\\n .returns(${szType(fn.returns)})`;\n code += `\\n .body(surql\\`${fn.block}\\`)`;\n if (fn.permissions === false) code += `\\n .permissions(false)`;\n else if (typeof fn.permissions === \"string\")\n code += `\\n .permissions(surql\\`${fn.permissions}\\`)`;\n if (fn.comment !== undefined)\n code += `\\n .comment(${JSON.stringify(fn.comment)})`;\n return `${code};`;\n}\n\n/** Reverse a `StructAccess` into a `defineAccess(name).<type>(…)…` const. Signing keys are NOT recovered. */\nfunction renderAccessConst(a: StructAccess): string {\n const k = a.kind;\n const v = k.jwt?.verify;\n // A signing key is present (and redacted) for everything except JWT-via-JWKS-URL.\n const hasRedactedKey = !(k.kind === \"JWT\" && v?.url);\n const lines: string[] = [];\n if (hasRedactedKey)\n lines.push(\n \"// NOTE: signing key not pulled (SurrealDB redacts it) — re-applying rotates it.\",\n );\n let head = `export const ${fnConst(a.name)} = defineAccess(${JSON.stringify(a.name)})`;\n if (k.kind === \"BEARER\") {\n head += `\\n .bearer({ for: ${JSON.stringify((k.subject ?? \"record\").toLowerCase())} })`;\n } else if (k.kind === \"JWT\") {\n head += v?.url\n ? `\\n .jwt({ url: ${JSON.stringify(v.url)} })`\n : `\\n .jwt({ alg: ${JSON.stringify(v?.alg ?? \"HS512\")} /* key not pulled */ })`;\n } else {\n head += `\\n .record()`;\n }\n lines.push(head);\n if (k.kind === \"RECORD\") {\n if (k.signup) lines.push(` .signup(surql\\`${k.signup}\\`)`);\n if (k.signin) lines.push(` .signin(surql\\`${k.signin}\\`)`);\n if (k.authenticate)\n lines.push(` .authenticate(surql\\`${k.authenticate}\\`)`);\n }\n const d = a.duration;\n if (d?.grant || d?.token || d?.session) {\n const obj = [\n d.grant && `grant: ${JSON.stringify(d.grant)}`,\n d.token && `token: ${JSON.stringify(d.token)}`,\n d.session && `session: ${JSON.stringify(d.session)}`,\n ]\n .filter(Boolean)\n .join(\", \");\n lines.push(` .duration({ ${obj} })`);\n }\n return `${lines.join(\"\\n\")};`;\n}\n\n/** Topologically sort so a table comes after every same-file table it references (deps first). */\nfunction topoSort<T extends { name: string; deps: string[] }>(items: T[]): T[] {\n const byName = new Map(items.map((it) => [it.name, it]));\n const out: T[] = [];\n const done = new Set<string>();\n const onStack = new Set<string>();\n const visit = (it: T) => {\n if (done.has(it.name) || onStack.has(it.name)) return;\n onStack.add(it.name);\n for (const dep of it.deps) {\n const d = byName.get(dep);\n if (d) visit(d);\n }\n onStack.delete(it.name);\n done.add(it.name);\n out.push(it);\n };\n for (const it of items) visit(it);\n return out;\n}\n\nconst EMPTY_LOCAL: LocalOnly = { fields: [], objects: [] };\n\n/**\n * Build the per-file pull plan: introspect the live DB (via `INFO … STRUCTURE`) and compute what\n * each schema file would become. Nothing is written — {@link applyPull} does that. Existing files\n * are *merged* (the DB wins per object/field, but unrelated code, comments, and local-only content\n * survive); new files are created. `keepLocal` keeps local-only fields/objects instead of mirroring.\n */\nexport async function planPull(\n db: Surreal,\n config: ResolvedConfig,\n opts: { filter?: Filter; keepLocal?: boolean } = {},\n): Promise<PullPlan> {\n const introspected = await introspectStructured(\n db,\n new Set([config.migrationsTable, `${config.migrationsTable}_lock`]),\n );\n const { tables, functions, accesses, analyzers } = filterStructured(\n introspected,\n opts.filter ?? parseFilter({}),\n );\n\n const makeCtx = ctxFactory(tables);\n const keepLocal = opts.keepLocal ?? false;\n\n // Single-file layout: one combined module.\n if (config.schemaIsFile) {\n const units = [\n ...tables.map((t) => tableUnit(t, makeCtx(t))),\n ...functions.map(functionUnit),\n ...accesses.map(accessUnit),\n ...analyzers.map(analyzerUnit),\n ];\n return {\n files: [\n planFile(config.schemaPath, units, keepLocal, config, () =>\n assembleCombined({ tables, functions, accesses, analyzers }, makeCtx),\n ),\n ],\n };\n }\n\n // Directory layout: one file per object, merged into wherever the object already lives (falling\n // back to its kind folder). A table the user keeps in some other file is updated there, in place.\n const dir = config.schemaPath;\n const tableLoc = await existingTables(dir);\n const groups = new Map<string, RenderedUnit[]>();\n const add = (abs: string, u: RenderedUnit) => {\n const arr = groups.get(abs);\n if (arr) arr.push(u);\n else groups.set(abs, [u]);\n };\n for (const t of tables)\n add(\n tableLoc.get(t.name) ?? join(dir, \"tables\", `${t.name}.ts`),\n tableUnit(t, makeCtx(t)),\n );\n for (const fn of functions)\n add(join(dir, \"functions\", `${fn.name}.ts`), functionUnit(fn));\n for (const a of accesses)\n add(join(dir, \"access\", `${a.name}.ts`), accessUnit(a));\n for (const an of analyzers)\n add(join(dir, \"analyzers\", `${an.name}.ts`), analyzerUnit(an));\n\n const files = [...groups].map(([abs, units]) =>\n planFile(abs, units, keepLocal, config, () =>\n units.length === 1\n ? unitModule(units[0])\n : mergeUnits(\"\", units, {\n keepLocalFields: true,\n keepLocalObjects: true,\n }).content,\n ),\n );\n\n // Whole-entity local-only: locally-defined tables/functions/accesses the live DB doesn't have. A\n // file that ALSO holds a DB object is already reconciled above (mergeUnits keeps/drops the\n // local-only entity per `keepLocal`); only files whose entities are ALL local-only are invisible\n // to the DB-driven plan, so surface them here. A file that is PURELY those entities is deletable\n // when mirroring (not --merge); one that mixes them with other code is surfaced but left in place.\n const dbNames = new Set<string>([\n ...tables.map((t) => t.name),\n ...functions.map((f) => f.name),\n ...accesses.map((a) => a.name),\n ...analyzers.map((a) => a.name),\n ]);\n const planned = new Set(files.map((f) => f.abs));\n for (const [file, info] of await scanLocalEntities(dir)) {\n if (planned.has(file)) continue;\n const localOnly = info.entities.filter((e) => !dbNames.has(e.name));\n if (!localOnly.length) continue;\n const before = readFileSync(file, \"utf8\");\n const deletable =\n !keepLocal &&\n info.pureSchema &&\n localOnly.length === info.entities.length;\n files.push({\n rel: relative(config.root, file),\n abs: file,\n action: deletable ? \"delete\" : \"unchanged\",\n before,\n after: deletable ? \"\" : before,\n localOnly: { fields: [], objects: localOnly.map((e) => e.exportName) },\n });\n }\n files.sort((a, b) => a.rel.localeCompare(b.rel));\n return { files };\n}\n\n/** Plan one file: create it from `fresh()` if absent, else merge the units into it. */\nfunction planFile(\n abs: string,\n units: RenderedUnit[],\n keepLocal: boolean,\n config: ResolvedConfig,\n fresh: () => string,\n): PullFilePlan {\n const rel = relative(config.root, abs);\n if (!existsSync(abs)) {\n const after = fresh();\n return {\n rel,\n abs,\n action: \"create\",\n before: \"\",\n after: after.endsWith(\"\\n\") ? after : `${after}\\n`,\n localOnly: EMPTY_LOCAL,\n };\n }\n const before = readFileSync(abs, \"utf8\");\n const { content, localOnly } = mergeUnits(before, units, {\n keepLocalFields: keepLocal,\n keepLocalObjects: keepLocal,\n });\n return {\n rel,\n abs,\n action: content === before ? \"unchanged\" : \"update\",\n before,\n after: content,\n localOnly,\n };\n}\n\n/** The rendered unit for one db-level function. */\nfunction functionUnit(fn: StructFunction): RenderedUnit {\n const code = renderFunctionConst(fn);\n const names = [\"defineFunction\", ...(code.includes(\"s.\") ? [\"s\"] : [])];\n const imports = [`import { ${names.join(\", \")} } from \"@schemic/surrealdb\";`];\n // `surql` from surrealdb on its own line (see tableUnit) — a function body is always a surql expr.\n if (code.includes(\"surql`\"))\n imports.push(`import { surql } from \"surrealdb\";`);\n return {\n kind: \"function\",\n name: fn.name,\n exportName: fnConst(fn.name),\n code,\n imports,\n };\n}\n\n/** The rendered unit for one db-level access def. */\nfunction accessUnit(a: StructAccess): RenderedUnit {\n const code = renderAccessConst(a);\n const imports = [`import { defineAccess } from \"@schemic/surrealdb\";`];\n if (code.includes(\"surql`\"))\n imports.push(`import { surql } from \"surrealdb\";`);\n return {\n kind: \"access\",\n name: a.name,\n exportName: fnConst(a.name),\n code,\n imports,\n };\n}\n\n/** Reverse a `StructAnalyzer` into a `defineAnalyzer(name, { tokenizers, filters })` const (lowercased\n * to the authored form; `lowerAnalyzer` re-uppercases for the canonical/diff comparison). */\nfunction renderAnalyzerConst(a: StructAnalyzer): string {\n const list = (xs: string[]) =>\n `[${xs.map((x) => JSON.stringify(x.toLowerCase())).join(\", \")}]`;\n let cfg = `{ tokenizers: ${list(a.tokenizers)}`;\n if (a.filters?.length) cfg += `, filters: ${list(a.filters)}`;\n cfg += \" }\";\n return `export const ${fnConst(a.name)} = defineAnalyzer(${JSON.stringify(a.name)}, ${cfg});`;\n}\n\nfunction analyzerUnit(a: StructAnalyzer): RenderedUnit {\n return {\n // core `RenderedUnit.kind` lacks \"analyzer\" yet — group with the other db-level objects for now.\n kind: \"access\",\n name: a.name,\n exportName: fnConst(a.name),\n code: renderAnalyzerConst(a),\n imports: [`import { defineAnalyzer } from \"@schemic/surrealdb\";`],\n };\n}\n\n/** Build the per-table {@link RenderCtx} factory: cycle-aware ref resolution + import accumulation. */\nfunction ctxFactory(tables: StructTable[]): (t: StructTable) => RenderCtx {\n // Reference graph (record<…> targets + relation endpoints) → cycle-aware imports / ordering.\n const pulled = new Set(tables.map((t) => t.name));\n const graph = new Map(tables.map((t) => [t.name, tableRefs(t, pulled)]));\n const resolve = makeResolver(graph, pulled);\n const constOf = (n: string) => pascal(n) || n;\n return (t) => ({\n table: t.name,\n imports: new Set(),\n usesSelf: false,\n allowSelf: t.kind.kind !== \"RELATION\", // only defineTable takes the `self` callback\n constOf,\n resolve: (target) => resolve(t.name, target),\n });\n}\n\n/** Render a whole structured schema to one canonical TypeScript module (the source of `diff --ts`). */\nexport function renderSchemaToTS(db: DbStructured): string {\n return assembleCombined(db, ctxFactory(db.tables));\n}\n\n/** Merge several units' import lines into a deduped block (union of specifiers per source). */\nfunction mergeImports(units: RenderedUnit[]): string[] {\n const bySource = new Map<string, Set<string>>();\n const order: string[] = [];\n for (const u of units)\n for (const line of u.imports) {\n const m = /import\\s*\\{([^}]*)\\}\\s*from\\s*[\"']([^\"']+)[\"']/.exec(line);\n if (!m) continue;\n let set = bySource.get(m[2]);\n if (!set) {\n set = new Set();\n bySource.set(m[2], set);\n order.push(m[2]);\n }\n for (const s of m[1]\n .split(\",\")\n .map((x) => x.trim())\n .filter(Boolean))\n set.add(s);\n }\n // @schemic/surrealdb first, then the relative cross-file imports (sorted).\n order.sort((a, b) =>\n a === \"@schemic/surrealdb\"\n ? -1\n : b === \"@schemic/surrealdb\"\n ? 1\n : a.localeCompare(b),\n );\n return order.map(\n (src) =>\n `import { ${[...(bySource.get(src) ?? [])].join(\", \")} } from \"${src}\";`,\n );\n}\n\n/**\n * Render a structured schema to per-file TypeScript modules keyed by file path — exactly the\n * layout `pull` writes (one file per object, with cross-file imports). `fileFor` maps an object to\n * its file. Used by `diff --ts` so its output matches the user's actual files.\n */\nexport function renderPerFile(\n db: DbStructured,\n fileFor: (kind: RenderedUnit[\"kind\"], name: string) => string,\n): Map<string, string> {\n const makeCtx = ctxFactory(db.tables);\n const byFile = new Map<string, RenderedUnit[]>();\n const add = (file: string, u: RenderedUnit) => {\n const arr = byFile.get(file);\n if (arr) arr.push(u);\n else byFile.set(file, [u]);\n };\n for (const t of db.tables)\n add(fileFor(\"table\", t.name), tableUnit(t, makeCtx(t)));\n for (const fn of db.functions)\n add(fileFor(\"function\", fn.name), functionUnit(fn));\n for (const a of db.accesses) add(fileFor(\"access\", a.name), accessUnit(a));\n for (const an of db.analyzers)\n add(fileFor(\"access\", an.name), analyzerUnit(an));\n\n const out = new Map<string, string>();\n for (const [file, units] of byFile)\n out.set(\n file,\n units.length === 1\n ? unitModule(units[0])\n : `${mergeImports(units).join(\"\\n\")}\\n\\n${units.map((u) => u.code).join(\"\\n\\n\")}\\n`,\n );\n return out;\n}\n\n/** Assemble the single-file combined module (tables ordered so same-file refs resolve). */\nfunction assembleCombined(\n { tables, functions, accesses, analyzers }: DbStructured,\n makeCtx: (t: StructTable) => RenderCtx,\n): string {\n // Render each const (collecting its same-file direct deps via ctx.imports), then order so deps\n // come first — same-file `Target.record()` refs need `Target` defined above them.\n const rendered = tables.map((t) => {\n const ctx = makeCtx(t);\n const { code, factory } = renderTableConst(t, ctx);\n return {\n name: t.name,\n code,\n factory,\n usesSurql: code.includes(\"surql`\"),\n deps: [...ctx.imports].filter((d) => d !== t.name),\n };\n });\n const ordered = topoSort(rendered);\n const fnCode = functions.map(renderFunctionConst);\n const accessCode = accesses.map(renderAccessConst);\n const analyzerCode = analyzers.map(renderAnalyzerConst);\n const factories = [...new Set(ordered.map((r) => r.factory))];\n if (functions.length) factories.push(\"defineFunction\");\n if (accesses.length) factories.push(\"defineAccess\");\n if (analyzers.length) factories.push(\"defineAnalyzer\");\n factories.sort();\n const usesSurql =\n functions.length > 0 ||\n accesses.length > 0 ||\n ordered.some((r) => r.usesSurql);\n const names = [\"s\", ...factories];\n const imports = [`import { ${names.join(\", \")} } from \"@schemic/surrealdb\";`];\n // `surql` from surrealdb on its own line (see tableUnit), kept out of the @schemic/surrealdb import.\n if (usesSurql) imports.push(`import { surql } from \"surrealdb\";`);\n // Analyzers first — a FULLTEXT index references its analyzer.\n const body = [\n ...analyzerCode,\n ...ordered.map((r) => r.code),\n ...fnCode,\n ...accessCode,\n ].join(\"\\n\\n\");\n return `${imports.join(\"\\n\")}\\n\\n${body}\\n`;\n}\n","// The files `schemic init` writes for a fresh SurrealDB project — a connections-only config via the\n// surrealConnection factory, a sample s.* schema, a seed stub, and a .env.example. The CLI (dialect-\n// free) calls surrealDriver.initScaffold() and writes these verbatim, then records the neutral snapshot.\n\nconst CONFIG = `import { defineConfig } from \"@schemic/core/config\";\nimport { surrealConnection } from \"@schemic/surrealdb\";\n\n// Connections-only config: each named connection comes from a driver's \\`<driver>Connection(...)\\`\n// factory, so there's no \\`driver: \"…\"\\` string to keep in sync. Values are explicit — read env here\n// yourself (no implicit SURREAL_* magic). Add more named connections for multi-tenant / multi-DB setups.\nexport default defineConfig({\n connections: {\n default: surrealConnection({\n schema: \"./database/schema\",\n url: process.env.SURREAL_URL ?? \"ws://127.0.0.1:8000/rpc\",\n namespace: process.env.SURREAL_NAMESPACE ?? \"app\",\n database: process.env.SURREAL_DATABASE ?? \"app\",\n username: process.env.SURREAL_USER,\n password: process.env.SURREAL_PASS,\n authLevel: \"root\", // \"root\" | \"namespace\" | \"database\"\n // \\`schemic check\\` replays migrations into a throwaway engine; defaults to an ephemeral in-memory\n // SurrealDB from your local \\`surreal\\` CLI. Override here, e.g.:\n // check: { engine: \"remote\", db: { url: \"ws://localhost:8000\", namespace: \"scratch\" } },\n }),\n },\n});\n`;\n\nconst USER_TABLE = `import { defineTable, s, surql } from \"@schemic/surrealdb\";\n\n// A SCHEMAFULL \\`user\\` table. Each field is a \\`s.*\\` builder (a drop-in for Zod's \\`z.*\\`) that also\n// carries its SurrealQL DDL — \\`s.email()\\` validates the address, \\`.unique()\\` defines a UNIQUE index,\n// and \\`$default\\`/\\`$readonly\\` map to the DEFAULT / READONLY clauses.\nexport const User = defineTable(\"user\", {\n name: s.string().$assert(surql\\`string::len($value) > 0\\`),\n email: s.email().unique(),\n createdAt: s.datetime().$default(surql\\`time::now()\\`).$readonly(),\n}).schemafull();\n`;\n\nconst SEED = `import { RecordId, type Surreal } from \"surrealdb\";\n\n/** Run with \\`schemic seed\\` — receives a connected client. */\nexport default async function seed(db: Surreal) {\n await db.create(new RecordId(\"user\", \"ada\")).content({\n name: \"Ada Lovelace\",\n email: \"ada@example.com\",\n });\n}\n`;\n\nconst ENV_EXAMPLE = `# Point these at your SurrealDB. The config reads them explicitly (no implicit SURREAL_* magic).\nSURREAL_URL=ws://127.0.0.1:8000/rpc\nSURREAL_NAMESPACE=app\nSURREAL_DATABASE=app\nSURREAL_USER=root\nSURREAL_PASS=root\n`;\n\n/** The dialect-specific files `schemic init` writes, keyed by project-relative path. */\nexport function initScaffold(): Record<string, string> {\n return {\n \"schemic.config.ts\": CONFIG,\n \"database/schema/tables/user.ts\": USER_TABLE,\n \"database/seed.ts\": SEED,\n \".env.example\": ENV_EXAMPLE,\n };\n}\n\n// --- `schemic new <kind> <name>` — per-kind starter modules ----------------------------------------\n\n/** `\"user_profile\"` -> `\"UserProfile\"` (the exported const name). Non-alphanumerics split words. */\nfunction pascalCase(name: string): string {\n const parts = name.split(/[^a-zA-Z0-9]+/).filter(Boolean);\n const pascal = parts.map((p) => p[0].toUpperCase() + p.slice(1)).join(\"\");\n // Keep it a valid identifier: prefix a leading digit, fall back to a generic name.\n return /^[0-9]/.test(pascal) ? `_${pascal}` : pascal || \"Entity\";\n}\n\n/**\n * Author a starter module for `kind`/`name`. One template per authorable SurrealDB object, each a\n * realistic starting point (not a bare stub). THROWS for a kind SurrealDB doesn't author standalone\n * (notably `index`/`field`, which live inline on a table) or an unknown kind — the CLI surfaces the\n * message. Used by `schemic new`; the CLI writes the result under the kind's display folder.\n */\nexport function scaffoldEntity(kind: string, name: string): string {\n const C = pascalCase(name);\n switch (kind) {\n case \"table\":\n return `import { defineTable, s, surql } from \"@schemic/surrealdb\";\n\n// A SCHEMAFULL table. Each field is an \\`s.*\\` builder (a drop-in for Zod's \\`z.*\\`) that also carries\n// its SurrealQL DDL. Add fields, then run \\`schemic gen\\`.\nexport const ${C} = defineTable(\"${name}\", {\n name: s.string(),\n createdAt: s.datetime().$default(surql\\`time::now()\\`).$readonly(),\n}).schemafull();\n`;\n case \"relation\":\n return `import { defineRelation, s, surql } from \"@schemic/surrealdb\";\n\n// A graph edge (\\`TYPE RELATION\\`). Chain \\`.from(A).to(B)\\` to restrict the endpoints and\n// \\`.enforced()\\` to require both records to exist on RELATE.\nexport const ${C} = defineRelation(\"${name}\", {\n since: s.datetime().$default(surql\\`time::now()\\`),\n});\n// .from(SomeTable).to(OtherTable).enforced()\n`;\n case \"view\":\n return `import { defineView, surql } from \"@schemic/surrealdb\";\n\n// A pre-computed (materialized) view — SurrealDB keeps its rows in sync with the source query.\nexport const ${C} = defineView(\n \"${name}\",\n surql\\`SELECT * FROM thing WHERE true\\`,\n);\n`;\n case \"function\":\n return `import { defineFunction, s, surql } from \"@schemic/surrealdb\";\n\n// A custom function (\\`fn::${name}\\`). Functions referenced from fields/events/access become\n// dependency edges, so a caller emits after its callee.\nexport const ${C} = defineFunction(\"${name}\", { arg: s.string() })\n .returns(s.string())\n .body(surql\\`RETURN $arg\\`);\n`;\n case \"access\":\n return `import { defineAccess, surql } from \"@schemic/surrealdb\";\n\n// A RECORD access method (signup/signin). See \\`.jwt({ … })\\` / \\`.bearer({ … })\\` for other types.\nexport const ${C} = defineAccess(\"${name}\")\n .record()\n .signup(surql\\`CREATE user SET email = $email, pass = crypto::argon2::generate($pass)\\`)\n .signin(surql\\`SELECT * FROM user WHERE email = $email AND crypto::argon2::compare(pass, $pass)\\`)\n .duration({ token: \"1h\", session: \"12h\" });\n`;\n case \"event\":\n return `import { defineEvent, surql } from \"@schemic/surrealdb\";\n\n// A standalone event — replace \"thing\" with the table it fires on. \\`then\\` takes one expression or\n// an ordered array.\nexport const ${C} = defineEvent(\"thing\", \"${name}\", {\n when: surql\\`$event = \"CREATE\"\\`,\n then: surql\\`CREATE log SET at = time::now()\\`,\n});\n`;\n case \"analyzer\":\n return `import { defineAnalyzer } from \"@schemic/surrealdb\";\n\n// A text analyzer for FULLTEXT search. A \\`.index(field, { fulltext: { analyzer: \"${name}\" } })\\` on a\n// table depends on it.\nexport const ${C} = defineAnalyzer(\"${name}\", {\n tokenizers: [\"blank\"],\n filters: [\"lowercase\"],\n});\n`;\n case \"index\":\n case \"field\":\n throw new Error(\n `SurrealDB ${kind}s are authored inline on a table, not as their own file — add it to a table (e.g. \\`defineTable(\"…\", { … }).index(\"${name}\", [field])\\` or \\`s.string().unique()\\`). Try \\`schemic new table <name>\\`.`,\n );\n default:\n throw new Error(\n `the surrealdb driver can't scaffold a \"${kind}\" — known kinds: table, relation, view, function, access, event, analyzer.`,\n );\n }\n}\n","// SurrealDB connection runtime — split out of cli/config.ts so that module stays dialect-neutral\n// (config types + loadConfig only). This is the Surreal driver's `connect` implementation; it imports\n// the surrealdb SDK and belongs to @schemic/surrealdb at the physical split.\n\nimport type { ConnectionOverrides, ResolvedConfig } from \"@schemic/core\";\nimport { escapeIdent, Surreal } from \"surrealdb\";\nimport type { AuthLevel, SurrealParams } from \"../config\";\n\nconst errMsg = (e: unknown) => (e instanceof Error ? e.message : String(e));\n\nconst CONNECT_TIMEOUT_MS = 5_000;\n\n/** Reject if `promise` doesn't settle within `ms` — guards against a hung connect. */\nfunction withTimeout<T>(\n promise: Promise<T>,\n ms: number,\n message: string,\n): Promise<T> {\n return new Promise<T>((resolve, reject) => {\n const timer = setTimeout(() => reject(new Error(message)), ms);\n promise.then(\n (v) => {\n clearTimeout(timer);\n resolve(v);\n },\n (e) => {\n clearTimeout(timer);\n reject(e);\n },\n );\n });\n}\n\n/** Connect + authenticate + select the namespace/database. Caller closes the handle. */\nexport async function connect(\n config: ResolvedConfig,\n over: ConnectionOverrides = {},\n): Promise<Surreal> {\n const params = config.params as unknown as SurrealParams;\n const url = over.url ?? params.url;\n const namespace = over.namespace ?? params.namespace;\n const database = over.database ?? params.database;\n const username = over.username ?? params.username;\n const password = over.password ?? params.password;\n const level: AuthLevel = (over.authLevel ??\n params.authLevel ??\n \"root\") as AuthLevel;\n\n const db = new Surreal();\n // On ANY failure, close the handle before throwing — otherwise the SDK's reconnect timer\n // keeps the event loop alive and the command hangs instead of exiting.\n try {\n try {\n // `reconnect: false` so a dead server rejects immediately instead of entering a retry\n // loop; `withTimeout` is a fallback for an unreachable host that never rejects.\n await withTimeout(\n db.connect(url, { reconnect: false }),\n CONNECT_TIMEOUT_MS,\n \"connection timed out\",\n );\n } catch (e) {\n throw new Error(\n `Can't reach SurrealDB at ${url} — is the server running? (${errMsg(e)})`,\n );\n }\n if (username && password) {\n // Scope the signin to the requested level (mirrors `surreal sql --auth-level`).\n const auth =\n level === \"root\"\n ? { username, password }\n : level === \"namespace\"\n ? { namespace, username, password }\n : { namespace, database, username, password };\n try {\n await db.signin(auth);\n } catch (e) {\n throw new Error(\n `Authentication failed (auth level \"${level}\") — check SURREAL_USER / SURREAL_PASS. (${errMsg(e)})`,\n );\n }\n }\n // Best-effort: create the namespace/database when we likely have the rights. A `database`\n // user can't define either; a `namespace` user can define databases; `root` can do both.\n try {\n if (level === \"root\") {\n await db.query(\n `DEFINE NAMESPACE IF NOT EXISTS ${escapeIdent(namespace)};`,\n );\n }\n if (level !== \"database\") {\n await db.use({ namespace });\n await db.query(\n `DEFINE DATABASE IF NOT EXISTS ${escapeIdent(database)};`,\n );\n }\n } catch {\n // insufficient privileges — assume the namespace/database already exist\n }\n try {\n await db.use({ namespace, database });\n } catch (e) {\n throw new Error(\n `Couldn't select ${namespace}/${database} — does it exist and do you have access? (${errMsg(e)})`,\n );\n }\n return db;\n } catch (e) {\n // Fire-and-forget: closing a half-open socket can be slow; don't block the error path.\n void db.close().catch(() => {});\n throw e;\n }\n}\n","// The driver-side EXPLODE (docs/kind-registry-contract.md §7, sanctioned by core-dev): SurrealDB\n// authors index/event/field-index INLINE on the table, so a single `TableDef` fans out into one TABLE\n// object + N INDEX + M EVENT objects (and the db-level FUNCTION/ACCESS objects ride alongside). We\n// flatten the whole schema into per-kind portable objects BEFORE lowering, so `KindEngine.lower` stays\n// a clean 1:1 and the contract needs no \"explode hook\". This is what `Driver.lower` will wrap around\n// `lowerSchema` at the eventual wholesale flip.\n//\n// It reuses the EXISTING canonical pipeline — `schemaStruct` (TableDef -> normalized Struct IR, with\n// standalone events attached + functions/accesses resolved) then `structuredSnapshot` (Struct ->\n// canonical `DEFINE` statements keyed kind:table:name) — so every emitted DDL string is byte-identical\n// to the fixed-slot `surrealDriver.diff` path.\n//\n// CROSS-KIND DEPS: an object that calls `fn::name` must emit AFTER that function (the function-before-\n// table case the ordinal alone gets wrong). We scan each object's rendered DDL for `fn::` references and\n// attach `deps -> {kind:\"function\", name}` — on a table (field VALUE/ASSERT/DEFAULT/PERMISSIONS + table\n// PERMISSIONS), an event (WHEN/THEN), an access (SIGNUP/SIGNIN/AUTHENTICATE), and a function (its body\n// calling another fn::). Edges to functions outside the diff are ignored by the spine, so over-reporting\n// is harmless. (SEARCH index -> analyzer edges land when the analyzer kind is registered.)\n\nimport type { AnyTable, AuthoredDef, Ref } from \"@schemic/core\";\nimport type { Surreal } from \"surrealdb\";\nimport { schemaStruct } from \"../cli/lower\";\nimport { normalizeDb } from \"../cli/struct\";\nimport type {\n DbStructured,\n StructAccess,\n StructAnalyzer,\n StructFunction,\n StructTable,\n} from \"../cli/structure\";\nimport { introspectStructured, structuredSnapshot } from \"../cli/structure\";\nimport type { DefineStatement } from \"../ddl\";\nimport type { Shape, StandaloneDef, TableDef } from \"../pure\";\nimport type { SurrealPortable } from \"./portable\";\n\n/** Match a `fn::name` reference (incl. namespaced `fn::a::b`), capturing the bare function name. */\nconst FN_REF = /fn::([A-Za-z0-9_]+(?:::[A-Za-z0-9_]+)*)/g;\n\n/**\n * The cross-kind dependency edges for one object: a `base` set (its table, for index/event) plus the\n * `fn::` functions referenced in its DDL — deduped, and excluding `self` (a function's body referencing\n * itself is recursion, not an ordering edge).\n */\nfunction depsOf(ddls: string[], base: Ref[] = [], self?: string): Ref[] {\n const seen = new Set(base.map((r) => `${r.kind}:${r.name}`));\n const out: Ref[] = [...base];\n for (const ddl of ddls) {\n for (const m of ddl.matchAll(FN_REF)) {\n const name = m[1];\n if (name === self) continue;\n const key = `function:${name}`;\n if (seen.has(key)) continue;\n seen.add(key);\n out.push({ kind: \"function\", name });\n }\n }\n return out;\n}\n\n/**\n * The shared core: a NORMALIZED Struct IR -> per-kind portable objects. Renders each object's canonical\n * `DEFINE` statement(s) via `structuredSnapshot`, then partitions: a {@link PTable} per table (head +\n * nested fields), a {@link PIndex} per index, a {@link PEvent} per event, and the db-level\n * {@link PFunction}/{@link PAccess} objects — each carrying its `fn::`/endpoint dependency edges. A\n * table also carries its normalized {@link StructTable} and the opaque kinds their `native` struct, so\n * `renderSchema` reconstructs `DbStructured` without re-parsing DDL. Both entry points\n * ({@link explodeSchema} from authoring, {@link introspectAll} from a live DB) feed their normalized\n * Struct here, so they produce byte-identical portable objects.\n */\nexport function fromStructured(db: DbStructured): SurrealPortable[] {\n const stmts = Object.values(structuredSnapshot(db).statements);\n const of = (kind: DefineStatement[\"kind\"]) =>\n stmts.filter((s) => s.kind === kind);\n\n const out: SurrealPortable[] = [];\n\n // Tables: head + nested fields. deps = RELATION in/out endpoints + fn:: from the head/fields.\n const headByTable = new Map(of(\"table\").map((s) => [s.name, s]));\n const fieldsByTable = new Map<string, DefineStatement[]>();\n for (const s of of(\"field\")) {\n const arr = fieldsByTable.get(s.table ?? \"\") ?? [];\n arr.push(s);\n fieldsByTable.set(s.table ?? \"\", arr);\n }\n for (const st of db.tables) {\n const head = headByTable.get(st.name);\n if (!head) continue; // a table always has a head; defensive only\n const fields = fieldsByTable.get(st.name) ?? [];\n const endpoints: Ref[] = [];\n for (const t of st.kind.in ?? [])\n endpoints.push({ kind: \"table\", name: t });\n for (const t of st.kind.out ?? [])\n endpoints.push({ kind: \"table\", name: t });\n const deps = depsOf([head.ddl, ...fields.map((f) => f.ddl)], endpoints);\n out.push({ kind: \"table\", name: st.name, head, fields, deps, struct: st });\n }\n\n for (const s of of(\"index\")) {\n // A FULLTEXT index depends on its analyzer (so the analyzer emits first); all indexes -> their table.\n const deps: Ref[] = [{ kind: \"table\", name: s.table ?? \"\" }];\n const ft = /FULLTEXT ANALYZER (\\S+)/.exec(s.ddl);\n if (ft) deps.push({ kind: \"analyzer\", name: ft[1] });\n out.push({\n kind: \"index\",\n name: s.name,\n table: s.table ?? \"\",\n stmt: s,\n deps,\n });\n }\n for (const s of of(\"event\"))\n out.push({\n kind: \"event\",\n name: s.name,\n table: s.table ?? \"\",\n stmt: s,\n deps: depsOf([s.ddl], [{ kind: \"table\", name: s.table ?? \"\" }]),\n });\n // The opaque kinds carry their structured `native` (matched by name) for renderSchema.\n const fnByName = new Map(db.functions.map((f) => [f.name, f]));\n const accByName = new Map(db.accesses.map((a) => [a.name, a]));\n for (const s of of(\"function\")) {\n const native = fnByName.get(s.name);\n if (native)\n out.push({\n kind: \"function\",\n name: s.name,\n stmt: s,\n deps: depsOf([s.ddl], [], s.name),\n native,\n });\n }\n for (const s of of(\"access\")) {\n const native = accByName.get(s.name);\n if (native)\n out.push({\n kind: \"access\",\n name: s.name,\n stmt: s,\n deps: depsOf([s.ddl]),\n native,\n });\n }\n const anByName = new Map(db.analyzers.map((a) => [a.name, a]));\n for (const s of of(\"analyzer\")) {\n const native = anByName.get(s.name);\n if (native)\n out.push({ kind: \"analyzer\", name: s.name, stmt: s, deps: [], native });\n }\n\n return out;\n}\n\n/** Reassemble `DbStructured` from per-kind portable objects — the inverse of {@link fromStructured},\n * for `renderSchema` TS codegen. Tables carry their full normalized struct; the opaque kinds their\n * `native`. (No DDL re-parsing: the structured data rides on the objects per flip-plan §6b.) */\nexport function toStructured(objects: SurrealPortable[]): DbStructured {\n const tables: StructTable[] = [];\n const functions: StructFunction[] = [];\n const accesses: StructAccess[] = [];\n const analyzers: StructAnalyzer[] = [];\n for (const o of objects) {\n if (o.kind === \"table\") tables.push(o.struct);\n else if (o.kind === \"function\") functions.push(o.native);\n else if (o.kind === \"access\") accesses.push(o.native);\n else if (o.kind === \"analyzer\") analyzers.push(o.native);\n }\n return { tables, functions, accesses, analyzers };\n}\n\n/**\n * Authoring -> per-kind portable objects (what `Driver.lower` wraps around `lowerSchema`). Params mirror\n * `buildSnapshot`'s public bound (`AnyTable`/`AuthoredDef`) and cast to the src `TableDef` the canonical\n * pipeline reads. `schemaStruct` already normalizes (events attached, functions/accesses resolved).\n */\nexport function explodeSchema(\n tables: AnyTable[],\n defs: AuthoredDef[] = [],\n): SurrealPortable[] {\n return fromStructured(\n schemaStruct(\n tables as unknown as TableDef<string, Shape>[],\n defs as unknown as StandaloneDef[],\n ),\n );\n}\n\n/**\n * The reverse path (flip-plan §4): a live connection -> per-kind portable objects, via ONE\n * `INFO … STRUCTURE` read (`introspectStructured`) fanned across every kind. Normalized the same way as\n * {@link decompose}/{@link explodeSchema} (`normalizeDb` → canonical `structuredSnapshot`), so an\n * introspected schema canonicalizes IDENTICALLY to a lowered one — no introspect phantom-diffs. This is\n * the COMPLETE introspection the flip needs: it returns objects for every registered kind that round-\n * trips (table/index/event/function/access). `exclude` drops tables by name (e.g. the migrations table).\n */\nexport async function introspectAll(\n conn: Surreal,\n exclude?: Set<string>,\n): Promise<SurrealPortable[]> {\n return fromStructured(normalizeDb(await introspectStructured(conn, exclude)));\n}\n","// The SurrealDB KIND REGISTRY (core-v2, docs/kind-registry-contract.md): the per-driver registry +\n// the `table`/`index`/`event`/`function`/`access` engines. Core orchestrates generically over this registry\n// (lower -> diff -> order -> emit); each engine delegates to the EXISTING fixed-slot primitives, so the\n// generic path is byte-exact with `surrealDriver.diff`:\n// - table.overwrite -> `diffSnapshots` (the whole field + table-head ALTER engine, scoped to one table)\n// - index -> recreate (the spine's remove+emit default == legacy `changeUp` for an index)\n// - event.overwrite -> `overwriteStatement` (DEFINE EVENT OVERWRITE == legacy `changeUp` for an event)\n//\n// Registration ORDER is each kind's ordinal (the tie-break among independent objects): table (0) before\n// index (1) before event (2). index/event point `deps`+`owner` at their table, so the graph emits them\n// AFTER and clusters them next to it. Fields are NESTED in the table object (substrate, not a kind).\n//\n// NOTE (slice 2): the legacy `Driver.lower/emit/diff` path is UNTOUCHED and still production. This\n// registry is built + parity-tested ALONGSIDE it; the wholesale flip (routing `Driver` + the `s.*`\n// authoring `build` through here) lands once access/function/natives are migrated too.\n\nimport {\n type AnyTable,\n type AuthoredDef,\n type DiffItem,\n type KindEngine,\n KindRegistry,\n lowerSchema,\n type PortableObject,\n type Ref,\n} from \"@schemic/core\";\nimport { EMPTY_SNAPSHOT, type Snapshot } from \"../cli/structure\";\nimport { diffSnapshots } from \"../cli/surreal-diff\";\nimport type { DefineStatement } from \"../ddl\";\nimport { overwriteStatement, removeStatement } from \"../ddl\";\nimport { explodeSchema } from \"./explode\";\nimport type {\n PAccess,\n PAnalyzer,\n PEvent,\n PFunction,\n PIndex,\n PTable,\n} from \"./portable\";\n\n/** Statement key matching the legacy engine's `keyOf` (`kind:table:name`). */\nconst keyOf = (s: Pick<DefineStatement, \"kind\" | \"name\" | \"table\">) =>\n `${s.kind}:${s.table ?? \"\"}:${s.name}`;\n\n/** A one-table {@link Snapshot} (head + its fields) for the legacy `diffSnapshots` to diff. */\nfunction snapOf(head: DefineStatement, fields: DefineStatement[]): Snapshot {\n const statements: Snapshot[\"statements\"] = {};\n for (const s of [head, ...fields]) statements[keyOf(s)] = s;\n return { version: 1, statements };\n}\n\n// --- table: structured, field-level diff inside `overwrite` -------------------------------------\n\nconst tableEngine: KindEngine<PTable, PTable> = {\n lower: (t) => t,\n emit: (t) => [t.head.ddl, ...t.fields.map((f) => f.ddl)],\n // REMOVE TABLE covers its fields (no orphan REMOVE FIELDs) — matches the legacy drop.\n remove: (t) => [removeStatement(t.head)],\n // The field + table-head delta IS the legacy engine: build both sides as one-table snapshots and\n // take the up. The spine calls `overwrite(next, prev)` for the down, so this stays symmetric.\n overwrite: (prev, next) =>\n diffSnapshots(\n snapOf(prev.head, prev.fields),\n snapOf(next.head, next.fields),\n ).up,\n deps: (t) => t.deps,\n // PER-FIELD display (Manuel's call): the table's diff items are its head + per-field statements\n // (each carrying its `table` so the display groups under it) — exactly `diffSnapshots().items`.\n // `full` uses displayItems(undefined, next) -> the per-field add items.\n displayItems: (prev, next): DiffItem[] =>\n diffSnapshots(\n prev ? snapOf(prev.head, prev.fields) : EMPTY_SNAPSHOT,\n next ? snapOf(next.head, next.fields) : EMPTY_SNAPSHOT,\n ).items ?? [],\n};\n\n// --- index: own kind, owned by its table, recreated on change -----------------------------------\n\nconst indexEngine: KindEngine<PIndex, PIndex> = {\n lower: (i) => i,\n emit: (i) => [i.stmt.ddl],\n remove: (i) => [removeStatement(i.stmt)],\n // No `overwrite` -> the spine recreates (remove + emit): `REMOVE INDEX … ; DEFINE INDEX …`,\n // exactly the legacy `changeUp` for an index (ALTER INDEX can't change fields/kind).\n // -> its table (owner) + a FULLTEXT index's analyzer (so the analyzer emits first).\n deps: (i) => i.deps,\n owner: (i) => ({ kind: \"table\", name: i.table }),\n};\n\n// --- event: own kind, owned by its table, OVERWRITE on change -----------------------------------\n\nconst eventEngine: KindEngine<PEvent, PEvent> = {\n lower: (e) => e,\n emit: (e) => [e.stmt.ddl],\n remove: (e) => [removeStatement(e.stmt)],\n // DEFINE EVENT OVERWRITE in place — matches the legacy `changeUp`/`changeDown` for an event.\n overwrite: (_prev, next) => [overwriteStatement(next.stmt.ddl)],\n // -> its table (owner) + any `fn::` the WHEN/THEN call (so the function emits first).\n deps: (e) => e.deps,\n owner: (e) => ({ kind: \"table\", name: e.table }),\n};\n\n// --- function / access: db-level OPAQUE kinds, OVERWRITE on change -------------------------------\n\nconst functionEngine: KindEngine<PFunction, PFunction> = {\n lower: (f) => f,\n emit: (f) => [f.stmt.ddl],\n remove: (f) => [removeStatement(f.stmt)],\n // DEFINE FUNCTION OVERWRITE in place — matches the legacy `changeUp`/`changeDown` for a function.\n overwrite: (_prev, next) => [overwriteStatement(next.stmt.ddl)],\n // Other `fn::` its body calls (db-level, no owner cluster).\n deps: (f) => f.deps,\n};\n\nconst accessEngine: KindEngine<PAccess, PAccess> = {\n lower: (a) => a,\n emit: (a) => [a.stmt.ddl],\n remove: (a) => [removeStatement(a.stmt)],\n // DEFINE ACCESS OVERWRITE in place — matches the legacy `changeUp`/`changeDown` for an access.\n overwrite: (_prev, next) => [overwriteStatement(next.stmt.ddl)],\n // Any `fn::` the SIGNUP/SIGNIN/AUTHENTICATE call (db-level, no owner cluster).\n deps: (a) => a.deps,\n};\n\n// --- analyzer: db-level OPAQUE kind (a FULLTEXT index depends on it) -----------------------------\n\nconst analyzerEngine: KindEngine<PAnalyzer, PAnalyzer> = {\n lower: (a) => a,\n emit: (a) => [a.stmt.ddl],\n remove: (a) => [removeStatement(a.stmt)],\n // DEFINE ANALYZER OVERWRITE in place.\n overwrite: (_prev, next) => [overwriteStatement(next.stmt.ddl)],\n deps: (a) => a.deps,\n};\n\n/**\n * The SurrealDB driver's kind registry. Registration order == kind ordinal (the tie-break among\n * objects with no dependency relation): table < index < event < function < access. Correctness is the\n * dependency GRAPH (deps), not the ordinal — a `fn::`-called function still emits before its caller via\n * the function `deps` regardless of its ordinal.\n */\nexport const surrealKinds = new KindRegistry();\n\n// `build` is the kind's authoring entry. At the wholesale flip these route the `s.*` authoring through\n// the registry; for the facade-test phase the explode produces portable objects directly, so the builds\n// are the identity (the registry only needs the engine behavior registered here).\nsurrealKinds.define({ name: \"table\", build: (t: PTable) => t, ...tableEngine });\nsurrealKinds.define({ name: \"index\", build: (i: PIndex) => i, ...indexEngine });\nsurrealKinds.define({ name: \"event\", build: (e: PEvent) => e, ...eventEngine });\nsurrealKinds.define({\n name: \"function\",\n build: (f: PFunction) => f,\n ...functionEngine,\n});\nsurrealKinds.define({\n name: \"access\",\n build: (a: PAccess) => a,\n // The generic pluralizer would make \"access\" -> \"Accesses\"/\"accesses\"; SurrealQL's noun is\n // invariant (\"Access\") and the dir is `access/`, so pin both.\n display: { plural: \"Access\", folder: \"access\" },\n ...accessEngine,\n});\nsurrealKinds.define({\n name: \"analyzer\",\n build: (a: PAnalyzer) => a,\n ...analyzerEngine,\n});\n\n/** Author -> portable via the registry: explode tables/defs into per-kind objects, then lower each. */\nexport function lowerAll(\n tables: AnyTable[],\n defs: AuthoredDef[] = [],\n): PortableObject[] {\n return lowerSchema(surrealKinds, explodeSchema(tables, defs));\n}\n\nexport type { Ref };\n","/**\n * @schemic/surrealdb — author SurrealDB schemas with Zod, and the SurrealDB driver.\n *\n * Define tables/relations with `s.*` (a drop-in for `z.*`), generate SurrealQL DDL, and map JS <-> DB\n * across Zod's two channels via codecs (`decode`/`encode`). Importing this package registers the\n * SurrealDB driver with `@schemic/core` (so the CLI's `getDriver(\"surrealdb\")` resolves).\n */\n\n// Side-effect: register `surrealDriver` with the core registry on import.\nimport \"./driver/surreal\";\n\nimport { type BoundQuery, surql as sdkSurql } from \"surrealdb\";\n\n/**\n * Author SurrealQL expressions — the `s.*` authoring API takes these `BoundQuery` values everywhere a\n * dynamic expression is allowed (`$default`/`$value`/`$computed`/`$assert`, `reference({ onDelete })`,\n * event `when`/`then`, function bodies, permissions). A thin GENERIC wrapper over the SDK's tag so a\n * direct SDK query can also carry its RESULT type — one tuple entry per statement:\n * `db.query(surql<[string[]]>\\`RETURN ['a', 'b', 'c']\\`)`. Plain `surql\\`…\\`` (no type arg) is unchanged.\n * Provided here (typed) so you stay on a single import, decoupled from the SDK version.\n */\nexport function surql<R extends unknown[] = unknown[]>(\n strings: TemplateStringsArray,\n ...values: unknown[]\n): BoundQuery<R> {\n return sdkSurql(strings, ...values) as BoundQuery<R>;\n}\nexport type { BoundQuery } from \"surrealdb\";\n/** SurrealDB config types (relocated from @schemic/core/config, now connections-only + dialect-free). */\nexport type {\n AuthLevel,\n CapabilityList,\n EmbeddedCapabilities,\n SurrealParams,\n SurrealZodCheck,\n SurrealZodCheckEmbedded,\n SurrealZodConnection,\n} from \"./config\";\nexport type { SurrealConnectionConfig } from \"./connection\";\n/** Multi-connection factory: `defineConfig({ connections: { db: surrealConnection({ … }) } })`. */\nexport { surrealConnection } from \"./connection\";\nexport type { DefineOptions, DefineStatement, FieldInfo } from \"./ddl\";\nexport {\n alterField,\n alterTable,\n assertExpr,\n braceBody,\n emitDefStatement,\n emitField,\n emitFieldStatements,\n emitStatements,\n emitTable,\n eventClause,\n fieldType,\n inferField,\n inline,\n overwriteStatement,\n removeStatement,\n} from \"./ddl\";\nexport { surrealDriver } from \"./driver/surreal\";\nexport type {\n AnalyzerConfig,\n App,\n Create,\n DiskannOptions,\n Expr,\n FulltextOptions,\n HnswOptions,\n Shape,\n StandaloneDef,\n SurrealMeta,\n TableConfig,\n TableEvent,\n TableIndex,\n Update,\n Wire,\n} from \"./pure\";\nexport {\n AccessDef,\n AnalyzerDef,\n defineAccess,\n defineAnalyzer,\n defineEvent,\n defineFunction,\n defineRelation,\n defineTable,\n defineView,\n EventDef,\n FunctionDef,\n formatForAssert,\n objectFieldsRegistry,\n RecordIdField,\n RelationDef,\n SField,\n SystemView,\n s,\n surrealTypeRegistry,\n TableDef,\n} from \"./pure\";\n","// The SurrealDB connection factory — binds the neutral `connectionEntry` (from @schemic/core) to the\n// SurrealDB connection shape, so `defineConfig({ connections: { … } })` gets a typed `surrealConnection`\n// with no hand-authored `driver: \"…\"` string. Design: @schemic/core docs/MULTI-CONNECTION.md.\n\nimport {\n type ConnectionConfigBase,\n type ConnectionEntry,\n type ConnectionInput,\n connectionEntry,\n type ResolveContext,\n} from \"@schemic/core/driver\";\nimport type { SurrealZodCheck, SurrealZodConnection } from \"./config\";\n\n/**\n * A SurrealDB connection's config: the dialect-neutral base (`schema`, optional `key`/`migrations`)\n * plus the SurrealDB-specific connection params and the optional `check` replay config. Read env\n * yourself in a resolver if you need it — there is no implicit `SURREAL_*` magic. The resolution engine\n * strips the neutral base; the surreal half (url/namespace/…/check) lands in `ResolvedConfig.params`.\n */\nexport interface SurrealConnectionConfig\n extends ConnectionConfigBase,\n SurrealZodConnection {\n /** `schemic check` overrides — e.g. a dedicated scratch connection for the migration replay. */\n check?: SurrealZodCheck;\n}\n\n/**\n * Build a SurrealDB {@link ConnectionEntry} for a config's `connections` map. Three forms:\n * a single static config, a resolver returning one config, or a resolver returning a keyed\n * COLLECTION (one connection per entry — `key` is then required and addressable as `<name>:<key>`).\n */\nexport function surrealConnection(\n config: SurrealConnectionConfig,\n): ConnectionEntry;\nexport function surrealConnection(\n resolve: (\n ctx: ResolveContext,\n ) => SurrealConnectionConfig | Promise<SurrealConnectionConfig>,\n): ConnectionEntry;\nexport function surrealConnection(\n resolve: (\n ctx: ResolveContext,\n ) =>\n | (SurrealConnectionConfig & { key: string })[]\n | Promise<(SurrealConnectionConfig & { key: string })[]>,\n): ConnectionEntry;\nexport function surrealConnection(\n input: ConnectionInput<SurrealConnectionConfig>,\n): ConnectionEntry {\n return connectionEntry<SurrealConnectionConfig>(\"surrealdb\", input);\n}\n"],"mappings":"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","names":["escapeIdent","escapeIdent","BoundQuery","escapeIdent","native","s","BoundQuery","escapeIdent","s","s","isTrivialElement","escapeIdent","splitTopUnion","s","foldArrayElement","isFullPerms","isTrivialElement","BoundQuery","escapeIdent","BoundQuery","escapeIdent","keyOf","s","byCreate","s","RANK","escapeIdent","s","emit","readFileSync","join","relative","parseFilter","splitTopUnion","s","indent","parseFilter","join","readFileSync","relative","pascal","escapeIdent","Surreal","s","native","keyOf","s","escapeIdent","s","surql"]}