@loradb/lora-graphql 0.16.2 → 0.18.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.
@@ -1 +0,0 @@
1
- {"version":3,"file":"driver-C8vA5fV-.js","sources":["../src/compile/cypher.ts","../src/model/cypher-lexer.ts","../src/analyze/cypher-check.ts","../src/analyze/indexes.ts","../src/analyze/plans.ts","../src/analyze/lint.ts","../src/analyze/statistics.ts","../src/compile/context.ts","../src/errors.ts","../src/compile/aggregate.ts","../src/model/directives.ts","../src/model/build.ts","../src/schema/names.ts","../src/model/points.ts","../src/model/relations.ts","../src/compile/filter.ts","../src/compile/auth.ts","../src/compile/hmac.ts","../src/compile/cursor.ts","../src/compile/selection.ts","../src/compile/read.ts","../src/execute/changes.ts","../src/schema/guard.ts","../src/schema/mutations.ts","../src/execute/mutate.ts","../src/execute/cypher-mutation.ts","../src/execute/transaction.ts","../src/execute/feed.ts","../src/codegen.ts","../src/guards.ts","../src/observe.ts","../src/schema/global-id.ts","../src/schema/scalars.ts","../src/schema/build.ts","../src/lora-graphql.ts","../src/driver.ts"],"sourcesContent":["// A small typed Cypher AST and its printer. The compiler never\n// concatenates Cypher text: it builds these nodes and prints them, so\n// identifiers are always escaped and values are always parameters.\n\nexport type BinaryOp =\n | \"=\"\n | \"<>\"\n | \"<\"\n | \"<=\"\n | \">\"\n | \">=\"\n | \"AND\"\n | \"OR\"\n | \"IN\"\n | \"CONTAINS\"\n | \"STARTS WITH\"\n | \"ENDS WITH\"\n | \"+\"\n | \"-\"\n | \"*\"\n | \"/\";\n\nexport type Expr =\n | { kind: \"var\"; name: string }\n | { kind: \"param\"; name: string }\n | { kind: \"literal\"; value: null | boolean | number | string }\n | { kind: \"prop\"; target: Expr; key: string }\n | { kind: \"binary\"; op: BinaryOp; left: Expr; right: Expr }\n | { kind: \"not\"; expr: Expr }\n | { kind: \"isNull\"; expr: Expr; negated: boolean }\n | { kind: \"call\"; fn: string; args: Expr[] }\n | { kind: \"list\"; items: Expr[] }\n | { kind: \"map\"; entries: MapEntry[] }\n | { kind: \"mapProjection\"; variable: string; entries: ProjectionEntry[] }\n | {\n kind: \"comprehension\";\n pattern: Pattern;\n where: Expr | undefined;\n projection: Expr;\n }\n | {\n kind: \"slice\";\n target: Expr;\n from: Expr | undefined;\n to: Expr | undefined;\n }\n | { kind: \"case\"; when: Expr; then: Expr; else: Expr }\n /** `[v IN list WHERE … | projection]` */\n | {\n kind: \"listComprehension\";\n variable: string;\n list: Expr;\n where: Expr | undefined;\n projection: Expr | undefined;\n }\n /** `reduce(acc = init, v IN list | step)` */\n | {\n kind: \"reduce\";\n accumulator: string;\n init: Expr;\n variable: string;\n list: Expr;\n step: Expr;\n }\n /** `v:Label1:Label2` */\n | { kind: \"hasLabels\"; variable: string; labels: string[] };\n\nexport interface MapEntry {\n key: string;\n value: Expr;\n}\n\nexport type ProjectionEntry =\n | { kind: \"property\"; key: string }\n | { kind: \"entry\"; key: string; value: Expr };\n\nexport interface NodePattern {\n variable?: string;\n labels: string[];\n}\n\nexport interface RelPattern {\n variable?: string;\n type: string;\n /** BOTH: an undirected pattern, `-[:T]-`. */\n direction: \"OUT\" | \"IN\" | \"BOTH\";\n}\n\n/** A linear pattern: node (rel node)*. */\nexport interface Pattern {\n start: NodePattern;\n hops: Array<{ rel: RelPattern; node: NodePattern }>;\n}\n\nexport interface SortItem {\n expr: Expr;\n direction: \"ASC\" | \"DESC\";\n}\n\nexport interface ReturnItem {\n expr: Expr;\n alias?: string;\n}\n\nexport type Clause =\n | { kind: \"match\"; pattern: Pattern; where: Expr | undefined }\n | { kind: \"unwind\"; expr: Expr; alias: string }\n /** `CALL proc(args) YIELD item AS alias, … [WHERE …]` */\n | {\n kind: \"procedure\";\n procedure: string;\n args: Expr[];\n yields: Array<{ item: string; alias?: string }>;\n where?: Expr | undefined;\n }\n /** A hand-written statement (`@cypher`), parameters already renamed. */\n | { kind: \"raw\"; text: string }\n | {\n kind: \"with\";\n distinct?: boolean;\n items: ReturnItem[];\n where?: Expr | undefined;\n orderBy?: SortItem[] | undefined;\n limit?: Expr | undefined;\n }\n | { kind: \"call\"; imports: string[]; body: Clause[] }\n | {\n kind: \"return\";\n items: ReturnItem[];\n orderBy?: SortItem[] | undefined;\n limit?: Expr | undefined;\n };\n\n// ---------------------------------------------------------------------------\n// Constructors\n// ---------------------------------------------------------------------------\n\nexport const v = (name: string): Expr => ({ kind: \"var\", name });\nexport const param = (name: string): Expr => ({ kind: \"param\", name });\nexport const lit = (value: null | boolean | number | string): Expr => ({\n kind: \"literal\",\n value,\n});\nexport const prop = (target: Expr, key: string): Expr => ({\n kind: \"prop\",\n target,\n key,\n});\nexport const bin = (op: BinaryOp, left: Expr, right: Expr): Expr => ({\n kind: \"binary\",\n op,\n left,\n right,\n});\nexport const not = (expr: Expr): Expr => ({ kind: \"not\", expr });\nexport const isNull = (expr: Expr, negated = false): Expr => ({\n kind: \"isNull\",\n expr,\n negated,\n});\nexport const fn = (name: string, ...args: Expr[]): Expr => ({\n kind: \"call\",\n fn: name,\n args,\n});\n\n/** AND of every defined operand; undefined when there are none. */\nexport function and(...operands: Array<Expr | undefined>): Expr | undefined {\n return fold(\"AND\", operands);\n}\n\n/** OR of every defined operand; undefined when there are none. */\nexport function or(...operands: Array<Expr | undefined>): Expr | undefined {\n return fold(\"OR\", operands);\n}\n\nfunction fold(\n op: \"AND\" | \"OR\",\n operands: Array<Expr | undefined>,\n): Expr | undefined {\n const present = operands.filter((e): e is Expr => e !== undefined);\n if (present.length === 0) return undefined;\n return present.reduce((acc, e) => bin(op, acc, e));\n}\n\n// ---------------------------------------------------------------------------\n// Printer\n// ---------------------------------------------------------------------------\n\nconst SIMPLE_NAME = /^[A-Za-z_][A-Za-z0-9_]*$/;\n\n// Words that may not appear bare where the grammar expects a name.\nconst RESERVED = new Set(\n [\n \"all\",\n \"and\",\n \"any\",\n \"as\",\n \"asc\",\n \"ascending\",\n \"by\",\n \"call\",\n \"case\",\n \"contains\",\n \"count\",\n \"create\",\n \"delete\",\n \"desc\",\n \"descending\",\n \"detach\",\n \"distinct\",\n \"else\",\n \"end\",\n \"ends\",\n \"exists\",\n \"false\",\n \"in\",\n \"is\",\n \"limit\",\n \"match\",\n \"merge\",\n \"none\",\n \"not\",\n \"null\",\n \"on\",\n \"optional\",\n \"or\",\n \"order\",\n \"remove\",\n \"return\",\n \"set\",\n \"single\",\n \"skip\",\n \"starts\",\n \"then\",\n \"true\",\n \"union\",\n \"unwind\",\n \"when\",\n \"where\",\n \"with\",\n \"xor\",\n \"yield\",\n ].map((w) => w.toLowerCase()),\n);\n\n/** Escape an identifier (variable, label, type, property or map key). */\nexport function name(id: string): string {\n if (SIMPLE_NAME.test(id) && !RESERVED.has(id.toLowerCase())) return id;\n return \"`\" + id.replace(/`/g, \"``\") + \"`\";\n}\n\nexport function printExpr(e: Expr): string {\n switch (e.kind) {\n case \"var\":\n return name(e.name);\n case \"param\":\n return \"$\" + name(e.name);\n case \"literal\":\n if (e.value === null) return \"null\";\n if (typeof e.value === \"string\") return JSON.stringify(e.value);\n return String(e.value);\n case \"prop\":\n return `${printOperand(e.target)}.${name(e.key)}`;\n case \"binary\":\n return `${printOperand(e.left, e.op)} ${e.op} ${printOperand(e.right, e.op)}`;\n case \"not\":\n return `NOT ${precedence(e.expr) <= NOT_PRECEDENCE || e.expr.kind === \"binary\" ? `(${printExpr(e.expr)})` : printExpr(e.expr)}`;\n case \"isNull\":\n return `${printOperand(e.expr)} IS ${e.negated ? \"NOT \" : \"\"}NULL`;\n case \"call\":\n return `${e.fn}(${e.args.map(printExpr).join(\", \")})`;\n case \"list\":\n return `[${e.items.map(printExpr).join(\", \")}]`;\n case \"map\":\n return `{ ${e.entries.map((m) => `${name(m.key)}: ${printExpr(m.value)}`).join(\", \")} }`;\n case \"mapProjection\": {\n const entries = e.entries.map((p) =>\n p.kind === \"property\"\n ? `.${name(p.key)}`\n : `${name(p.key)}: ${printExpr(p.value)}`,\n );\n return entries.length === 0\n ? `${name(e.variable)} {}`\n : `${name(e.variable)} { ${entries.join(\", \")} }`;\n }\n case \"comprehension\": {\n const where = e.where ? ` WHERE ${printExpr(e.where)}` : \"\";\n return `[${printPattern(e.pattern)}${where} | ${printExpr(e.projection)}]`;\n }\n case \"listComprehension\":\n return `[${name(e.variable)} IN ${printExpr(e.list)}${e.where ? ` WHERE ${printExpr(e.where)}` : \"\"}${e.projection ? ` | ${printExpr(e.projection)}` : \"\"}]`;\n case \"reduce\":\n return `reduce(${name(e.accumulator)} = ${printExpr(e.init)}, ${name(e.variable)} IN ${printExpr(e.list)} | ${printExpr(e.step)})`;\n case \"hasLabels\":\n return `${name(e.variable)}${e.labels.map((l) => \":\" + name(l)).join(\"\")}`;\n case \"case\":\n return `CASE WHEN ${printExpr(e.when)} THEN ${printExpr(e.then)} ELSE ${printExpr(e.else)} END`;\n case \"slice\":\n return `${printOperand(e.target)}[${e.from ? printExpr(e.from) : \"\"}..${e.to ? printExpr(e.to) : \"\"}]`;\n }\n}\n\n// Operator precedence, loosest first. An operand is parenthesised only\n// when it binds looser than its parent, or equally loose under a\n// non-associative parent (comparisons).\nconst PRECEDENCE: Record<BinaryOp, number> = {\n OR: 1,\n AND: 2,\n \"=\": 4,\n \"<>\": 4,\n \"<\": 4,\n \"<=\": 4,\n \">\": 4,\n \">=\": 4,\n IN: 4,\n CONTAINS: 4,\n \"STARTS WITH\": 4,\n \"ENDS WITH\": 4,\n \"+\": 5,\n \"-\": 5,\n \"*\": 6,\n \"/\": 6,\n};\nconst NOT_PRECEDENCE = 3;\n\nfunction precedence(e: Expr): number {\n if (e.kind === \"binary\") return PRECEDENCE[e.op];\n if (e.kind === \"not\") return NOT_PRECEDENCE;\n if (e.kind === \"isNull\") return 4;\n return 10;\n}\n\nfunction printOperand(e: Expr, parentOp?: BinaryOp): string {\n const s = printExpr(e);\n const parent = parentOp ? PRECEDENCE[parentOp] : 10;\n const own = precedence(e);\n // Bracket AND under OR anyway: correct either way, easier to read.\n if (parentOp === \"OR\" && e.kind === \"binary\" && e.op === \"AND\") {\n return `(${s})`;\n }\n if (own > parent || own === 10) return s;\n if (own === parent && parentOp && (parentOp === \"AND\" || parentOp === \"OR\")) {\n return s;\n }\n return `(${s})`;\n}\n\nfunction printNode(n: NodePattern): string {\n const labels = n.labels.map((l) => \":\" + name(l)).join(\"\");\n return `(${n.variable ? name(n.variable) : \"\"}${labels})`;\n}\n\nexport function printPattern(p: Pattern): string {\n let s = printNode(p.start);\n for (const { rel, node } of p.hops) {\n const inner = `[${rel.variable ? name(rel.variable) : \"\"}:${name(rel.type)}]`;\n s +=\n rel.direction === \"OUT\"\n ? `-${inner}->`\n : rel.direction === \"IN\"\n ? `<-${inner}-`\n : `-${inner}-`;\n s += printNode(node);\n }\n return s;\n}\n\nfunction printItems(items: ReturnItem[]): string {\n return items\n .map((i) => {\n const expr = printExpr(i.expr);\n if (i.alias === undefined) return expr;\n if (i.expr.kind === \"var\" && i.expr.name === i.alias) return expr;\n return `${expr} AS ${name(i.alias)}`;\n })\n .join(\", \");\n}\n\nfunction printTail(\n orderBy: SortItem[] | undefined,\n limit: Expr | undefined,\n): string {\n let s = \"\";\n if (orderBy && orderBy.length > 0) {\n s +=\n \" ORDER BY \" +\n orderBy.map((o) => `${printExpr(o.expr)} ${o.direction}`).join(\", \");\n }\n if (limit) s += ` LIMIT ${printExpr(limit)}`;\n return s;\n}\n\nexport function printClauses(clauses: Clause[], indent = \"\"): string {\n return clauses.map((c) => indent + printClause(c, indent)).join(\"\\n\");\n}\n\nfunction printClause(c: Clause, indent: string): string {\n switch (c.kind) {\n case \"match\":\n return (\n `MATCH ${printPattern(c.pattern)}` +\n (c.where ? `\\n${indent}WHERE ${printExpr(c.where)}` : \"\")\n );\n case \"unwind\":\n return `UNWIND ${printExpr(c.expr)} AS ${name(c.alias)}`;\n case \"procedure\": {\n const yields = c.yields\n .map((y) =>\n y.alias && y.alias !== y.item\n ? `${name(y.item)} AS ${name(y.alias)}`\n : name(y.item),\n )\n .join(\", \");\n return (\n `CALL ${c.procedure}(${c.args.map(printExpr).join(\", \")}) YIELD ${yields}` +\n (c.where ? `\\n${indent}WHERE ${printExpr(c.where)}` : \"\")\n );\n }\n case \"raw\":\n return c.text\n .trim()\n .split(\"\\n\")\n .map((line, i) => (i === 0 ? line : indent + line.trimEnd()))\n .join(\"\\n\");\n case \"with\":\n return (\n `WITH ${c.distinct ? \"DISTINCT \" : \"\"}${printItems(c.items)}` +\n (c.where ? ` WHERE ${printExpr(c.where)}` : \"\") +\n printTail(c.orderBy, c.limit)\n );\n case \"call\": {\n const inner = indent + \" \";\n const imports =\n c.imports.length > 0\n ? `${inner}WITH ${c.imports.map(name).join(\", \")}\\n`\n : \"\";\n return `CALL {\\n${imports}${printClauses(c.body, inner)}\\n${indent}}`;\n }\n case \"return\":\n return `RETURN ${printItems(c.items)}` + printTail(c.orderBy, c.limit);\n }\n}\n","// Just enough lexing of hand-written Cypher to find `$parameters`\n// (skipping strings, backtick-quoted names and comments), rename them,\n// and spot constructs the translation rules avoid. The engine's own\n// parser checks everything else, through `explain()`.\n\nexport interface ParamRef {\n name: string;\n start: number;\n end: number;\n}\n\nexport function scanParams(text: string): ParamRef[] {\n const out: ParamRef[] = [];\n let i = 0;\n while (i < text.length) {\n const c = text[i]!;\n if (c === \"'\" || c === '\"') {\n i = skipQuoted(text, i, c);\n } else if (c === \"`\") {\n const end = text.indexOf(\"`\", i + 1);\n i = end < 0 ? text.length : end + 1;\n } else if (c === \"/\" && text[i + 1] === \"/\") {\n const end = text.indexOf(\"\\n\", i);\n i = end < 0 ? text.length : end + 1;\n } else if (c === \"/\" && text[i + 1] === \"*\") {\n const end = text.indexOf(\"*/\", i + 2);\n i = end < 0 ? text.length : end + 2;\n } else if (c === \"$\") {\n const start = i;\n i++;\n let name: string;\n if (text[i] === \"`\") {\n const end = text.indexOf(\"`\", i + 1);\n name = text.slice(i + 1, end < 0 ? text.length : end);\n i = end < 0 ? text.length : end + 1;\n } else {\n const m = /^[A-Za-z_][A-Za-z0-9_]*/.exec(text.slice(i));\n name = m ? m[0] : \"\";\n i += name.length;\n }\n if (name) out.push({ name, start, end: i });\n } else {\n i++;\n }\n }\n return out;\n}\n\nfunction skipQuoted(text: string, start: number, quote: string): number {\n let i = start + 1;\n while (i < text.length) {\n if (text[i] === \"\\\\\") i += 2;\n else if (text[i] === quote) return i + 1;\n else i++;\n }\n return i;\n}\n\n/** Replace every `$name` with `$<rename(name)>`. */\nexport function renameParams(\n text: string,\n rename: (name: string) => string,\n): string {\n let out = \"\";\n let last = 0;\n for (const ref of scanParams(text)) {\n out += text.slice(last, ref.start) + \"$\" + rename(ref.name);\n last = ref.end;\n }\n return out + text.slice(last);\n}\n\n/** Code outside strings and comments, uppercased, for construct checks. */\nexport function codeOnly(text: string): string {\n let out = \"\";\n let i = 0;\n while (i < text.length) {\n const c = text[i]!;\n if (c === \"'\" || c === '\"') {\n i = skipQuoted(text, i, c);\n out += \" \";\n } else if (c === \"/\" && text[i + 1] === \"/\") {\n const end = text.indexOf(\"\\n\", i);\n i = end < 0 ? text.length : end + 1;\n out += \" \";\n } else if (c === \"/\" && text[i + 1] === \"*\") {\n const end = text.indexOf(\"*/\", i + 2);\n i = end < 0 ? text.length : end + 2;\n out += \" \";\n } else {\n out += c;\n i++;\n }\n }\n return out.toUpperCase().replace(/\\s+/g, \" \");\n}\n","// S4, online half: every @cypher statement is planned with `explain()`\n// before any request runs it, so a broken statement fails `check()` with\n// its location and the engine's message.\n\nimport { name } from \"../compile/cypher.js\";\nimport type { LoraDriver } from \"../driver.js\";\nimport { renameParams } from \"../model/cypher-lexer.js\";\nimport type { CypherField, GraphModel } from \"../model/types.js\";\n\nexport interface CypherFinding {\n type: string;\n field: string;\n message: string;\n}\n\nexport async function checkCypherFields(\n driver: LoraDriver,\n model: GraphModel,\n): Promise<CypherFinding[]> {\n if (!driver.explain) return [];\n const findings: CypherFinding[] = [];\n const fields: CypherField[] = [\n ...model.queries,\n ...model.mutations,\n ...[...model.nodes.values()].flatMap((n) =>\n [...n.fields.values()].filter(\n (f): f is CypherField => f.kind === \"cypher\",\n ),\n ),\n ];\n for (const field of fields) {\n const params: Record<string, unknown> = {};\n const statement = renameParams(field.statement, (p) => {\n params[`a_${p}`] = null;\n return `a_${p}`;\n });\n const owner = model.nodes.get(field.owner);\n const text = owner\n ? `MATCH (this:${name(owner.labels[0]!)}) WITH this LIMIT 1\\nCALL {\\n WITH this\\n${statement}\\n}\\nRETURN ${name(field.columnName)} AS value`\n : `CALL {\\n${statement}\\n}\\nRETURN ${name(field.columnName)} AS value`;\n const at = (message: string) =>\n findings.push({ type: field.owner, field: field.name, message });\n try {\n const plan = await driver.explain({ text, params: params as never });\n if (plan.shape === \"mutating\" && field.owner !== \"Mutation\") {\n at(\"the statement writes; only Mutation fields may\");\n }\n } catch (err) {\n at(err instanceof Error ? err.message : String(err));\n }\n }\n return findings;\n}\n","// S1: the indexes and constraints an API needs, inferred from how it lets\n// clients query each property. The author declares the API; the library\n// derives the storage it needs to be fast.\n\nimport type {\n FilterOperator,\n GraphModel,\n IndexKind,\n ScalarType,\n} from \"../model/types.js\";\n\nexport type SchemaRequirement =\n | {\n kind: \"constraint\";\n constraint: \"NODE_KEY\" | \"UNIQUE\" | \"NOT_NULL\";\n name: string;\n label: string;\n property: string;\n /** Why the library needs it, e.g. `Festival.key is the @key`. */\n reason: string;\n }\n | {\n kind: \"index\";\n index: IndexKind;\n name: string;\n label: string;\n property: string;\n reason: string;\n }\n | {\n /** Queried by name, so matched by name. */\n kind: \"fulltext\";\n name: string;\n label: string;\n properties: string[];\n analyzer: \"STANDARD\" | \"SIMPLE\";\n reason: string;\n }\n | {\n /** Queried by name, so matched by name. */\n kind: \"vector\";\n name: string;\n label: string;\n property: string;\n dimensions: number;\n similarity: \"COSINE\" | \"EUCLIDEAN\";\n reason: string;\n };\n\nconst RANGE_OPS = new Set<FilterOperator>([\"LT\", \"LTE\", \"GT\", \"GTE\"]);\n\n/**\n * Types a RANGE index must not be inferred for. LoraDB keeps durations out\n * of its sorted index (they have no total order); other temporals are\n * indexed by the instant they denote (E17).\n */\nexport const RANGE_UNINDEXABLE = new Set<ScalarType>([\"Duration\"]);\nconst TEXT_OPS = new Set<FilterOperator>([\n \"CONTAINS\",\n \"STARTS_WITH\",\n \"ENDS_WITH\",\n]);\n\n/**\n * Derive every constraint and index the model's API needs.\n *\n * - `@key` → node key constraint (unique + present); it also serves\n * exact-match, range and ordered scans, so no extra index.\n * - `@unique` → uniqueness constraint (backed by a RANGE index).\n * - `@sortable` on a non-null field → existence constraint: keyset\n * pagination may then bound the scan with `>=` without losing nulls.\n * - `EQ` / `IN` → nothing: LoraDB builds exact-match indexes lazily.\n * - `LT` / `LTE` / `GT` / `GTE` or `@sortable` → RANGE.\n * - `CONTAINS` / `STARTS_WITH` / `ENDS_WITH` → TEXT.\n * - `WITHIN_BBOX` / `DISTANCE` on a Point → POINT.\n * - `@index(kind:)` → that index.\n */\nexport function inferRequirements(model: GraphModel): SchemaRequirement[] {\n const out: SchemaRequirement[] = [];\n for (const node of model.nodes.values()) {\n const label = node.labels[0]!;\n for (const s of node.search) {\n out.push(\n s.kind === \"fulltext\"\n ? {\n kind: \"fulltext\",\n name: s.name,\n label,\n properties: s.fields.map((f) => f.property),\n analyzer: s.analyzer,\n reason: `${node.name} has @fulltext ${s.name} (${s.queryName})`,\n }\n : {\n kind: \"vector\",\n name: s.name,\n label,\n property: s.field.property,\n dimensions: s.dimensions,\n similarity: s.similarity,\n reason: `${node.name}.${s.field.name} is a @vector (${s.queryName})`,\n },\n );\n }\n for (const f of node.fields.values()) {\n if (f.kind !== \"scalar\") continue;\n const at = `${node.name}.${f.name}`;\n if (f.key) {\n out.push({\n kind: \"constraint\",\n constraint: \"NODE_KEY\",\n name: schemaName(label, f.property, \"key\"),\n label,\n property: f.property,\n reason: `${at} is the @key`,\n });\n // A node key is backed by a RANGE index: nothing else to add.\n continue;\n }\n const hasUnique = f.unique;\n if (hasUnique) {\n out.push({\n kind: \"constraint\",\n constraint: \"UNIQUE\",\n name: schemaName(label, f.property, \"unique\"),\n label,\n property: f.property,\n reason: `${at} is @unique`,\n });\n }\n if (f.sortable && f.required && !f.list) {\n out.push({\n kind: \"constraint\",\n constraint: \"NOT_NULL\",\n name: schemaName(label, f.property, \"exists\"),\n label,\n property: f.property,\n reason: `${at} is non-null and @sortable`,\n });\n }\n const kinds = new Map<IndexKind, string>();\n const ops = [...f.filters];\n if (!hasUnique && !RANGE_UNINDEXABLE.has(f.type)) {\n const range = ops.filter((op) => RANGE_OPS.has(op));\n if (range.length > 0) {\n kinds.set(\"RANGE\", `${at} is @filterable by ${range.join(\", \")}`);\n } else if (f.sortable) {\n kinds.set(\"RANGE\", `${at} is @sortable`);\n }\n }\n const spatial = ops.filter(\n (op) => op === \"WITHIN_BBOX\" || op === \"DISTANCE\",\n );\n if (spatial.length > 0) {\n kinds.set(\"POINT\", `${at} is @filterable by ${spatial.join(\", \")}`);\n }\n const text = ops.filter((op) => TEXT_OPS.has(op));\n if (text.length > 0) {\n kinds.set(\"TEXT\", `${at} is @filterable by ${text.join(\", \")}`);\n }\n for (const k of f.indexes) {\n if (!kinds.has(k) && !(k === \"RANGE\" && hasUnique)) {\n kinds.set(k, `${at} has @index(kind: ${k})`);\n }\n }\n for (const [index, reason] of kinds) {\n out.push({\n kind: \"index\",\n index,\n name: schemaName(label, f.property, index.toLowerCase()),\n label,\n property: f.property,\n reason,\n });\n }\n }\n }\n return out;\n}\n\nfunction schemaName(label: string, property: string, suffix: string): string {\n return `${snake(label)}_${snake(property)}_${suffix}`;\n}\n\nfunction snake(s: string): string {\n return s\n .replace(/([a-z0-9])([A-Z])/g, \"$1_$2\")\n .replace(/[^A-Za-z0-9]+/g, \"_\")\n .toLowerCase();\n}\n\n/** A stable identity: equal ids need no change between two models. */\nexport function requirementId(r: SchemaRequirement): string {\n switch (r.kind) {\n case \"index\":\n return `index:${r.index}:${r.label}:${r.property}`;\n case \"constraint\":\n return `constraint:${r.constraint}:${r.label}:${r.property}`;\n case \"fulltext\":\n return `fulltext:${r.name}:${r.label}:${r.properties.join(\",\")}:${r.analyzer}`;\n case \"vector\":\n return `vector:${r.name}:${r.label}:${r.property}:${r.dimensions}:${r.similarity}`;\n }\n}\n\n/** One line for humans, e.g. `RANGE index on :Festival(name)`. */\nexport function describeRequirement(r: SchemaRequirement): string {\n switch (r.kind) {\n case \"index\":\n return `${r.index} index on :${r.label}(${r.property})`;\n case \"constraint\":\n return `${r.constraint} constraint on :${r.label}(${r.property})`;\n case \"fulltext\":\n return `FULLTEXT index ${r.name} on :${r.label}(${r.properties.join(\", \")})`;\n case \"vector\":\n return `VECTOR index ${r.name} on :${r.label}(${r.property}), ${r.dimensions} dimensions, ${r.similarity.toLowerCase()}`;\n }\n}\n\n/** The DDL statement that creates a requirement, idempotently. */\nexport function requirementDdl(r: SchemaRequirement): string {\n const label = quote(r.label);\n const name = quote(r.name);\n if (r.kind === \"fulltext\") {\n const props = r.properties.map((p) => `n.${quote(p)}`).join(\", \");\n const options =\n r.analyzer === \"SIMPLE\"\n ? \" OPTIONS {indexConfig: {`fulltext.analyzer`: 'simple'}}\"\n : \"\";\n return `CREATE FULLTEXT INDEX ${name} IF NOT EXISTS FOR (n:${label}) ON EACH [${props}]${options}`;\n }\n if (r.kind === \"vector\") {\n return `CREATE VECTOR INDEX ${name} IF NOT EXISTS FOR (n:${label}) ON (n.${quote(r.property)}) OPTIONS {indexConfig: {\\`vector.dimensions\\`: ${r.dimensions}, \\`vector.similarity_function\\`: '${r.similarity.toLowerCase()}'}}`;\n }\n const property = quote(r.property);\n if (r.kind === \"constraint\") {\n const kind = {\n NODE_KEY: \"IS NODE KEY\",\n UNIQUE: \"IS UNIQUE\",\n NOT_NULL: \"IS NOT NULL\",\n }[r.constraint];\n return `CREATE CONSTRAINT ${name} IF NOT EXISTS FOR (n:${label}) REQUIRE n.${property} ${kind}`;\n }\n const kind = r.index === \"RANGE\" ? \"\" : `${r.index} `;\n return `CREATE ${kind}INDEX ${name} IF NOT EXISTS FOR (n:${label}) ON (n.${property})`;\n}\n\nfunction quote(id: string): string {\n return \"`\" + id.replace(/`/g, \"``\") + \"`\";\n}\n","// S2: plans are checked, not hoped for. Every compiled read carries the\n// access path it was written for; `explain()` shows the one the engine\n// chose, and a disagreement is a finding.\n\nimport type { LoraDriver, PlanNode, QueryPlan, Statement } from \"../driver.js\";\nimport type { CompiledRead, SeekExpectation } from \"../compile/read.js\";\n\nexport interface PlanFinding {\n rule:\n | \"full-scan\"\n | \"mutating-read\"\n | \"result-columns\"\n | \"scan-expand\"\n | \"row-budget\";\n message: string;\n statement: string;\n}\n\nexport interface PlanReport {\n statement: Statement;\n plan: QueryPlan;\n /** Operator names from root to leaves, depth first. */\n operators: string[];\n /**\n * The engine's largest row estimate among the statement's scans and\n * seeks (from graph statistics), or null when it has none. A scan that\n * streams in index order under a LIMIT reads fewer rows than this.\n */\n estimatedRows: number | null;\n findings: PlanFinding[];\n}\n\nconst SEEK_OPERATORS: Record<SeekExpectation[\"access\"], string[]> = {\n exact: [\"NodeByPropertyScan\"],\n range: [\"NodeByPropertyRangeScan\", \"NodeByPropertyScan\"],\n text: [\"NodeByTextScan\"],\n point: [\"NodeByPointScan\"],\n};\n\nexport async function checkPlans(\n driver: LoraDriver,\n compiled: CompiledRead,\n options: { rowBudget?: number } = {},\n): Promise<PlanReport[]> {\n if (!driver.explain) {\n throw new Error(\n \"the driver has no explain(); plan checks need @loradb/lora-node\",\n );\n }\n const reports: PlanReport[] = [];\n for (const [i, statement] of compiled.statements.entries()) {\n const plan = await driver.explain(statement);\n const nodes = flatten(plan.tree);\n const findings: PlanFinding[] = [];\n if (plan.shape !== \"readOnly\") {\n findings.push({\n rule: \"mutating-read\",\n message: \"a read statement has a mutating plan\",\n statement: statement.text,\n });\n }\n if (i === 0 && !sameColumns(plan.resultColumns, compiled.columns)) {\n findings.push({\n rule: \"result-columns\",\n message: `expected columns [${compiled.columns.join(\", \")}], plan returns [${plan.resultColumns.join(\", \")}]`,\n statement: statement.text,\n });\n }\n for (const e of compiled.expectations.filter((x) => x.statement === i)) {\n const scans = nodes.filter(\n (n) =>\n n.operator === \"NodeByLabelScan\" &&\n n.details[\"labels\"]?.split(/[,:|&\\s]+/).includes(e.label),\n );\n const seeks = nodes.filter(\n (n) =>\n SEEK_OPERATORS[e.access].includes(n.operator) &&\n n.details[\"labels\"]?.split(/[,:|&\\s]+/).includes(e.label),\n );\n if (scans.length > 0 || seeks.length === 0) {\n findings.push({\n rule: \"full-scan\",\n message: `expected an index ${e.access} seek on :${e.label} (${e.reason}), plan uses ${\n scans.length > 0 ? \"NodeByLabelScan\" : \"no seek\"\n }`,\n statement: statement.text,\n });\n }\n }\n const estimates = nodes\n .filter((n) => n.operator.endsWith(\"Scan\") && n.estimatedRows !== null)\n .map((n) => n.estimatedRows!);\n const estimatedRows = estimates.length > 0 ? Math.max(...estimates) : null;\n if (\n options.rowBudget !== undefined &&\n estimatedRows !== null &&\n estimatedRows > options.rowBudget\n ) {\n findings.push({\n rule: \"row-budget\",\n message: `the engine estimates ${estimatedRows} rows scanned; the budget is ${options.rowBudget}`,\n statement: statement.text,\n });\n }\n reports.push({\n statement,\n plan,\n operators: nodes.map((n) => n.operator),\n estimatedRows,\n findings,\n });\n }\n return reports;\n}\n\nconst SEEKS = new Set(Object.values(SEEK_OPERATORS).flat());\nconst BIND_NOTHING = new Set([\"Argument\", \"Unwind\", \"Filter\", \"Projection\"]);\n\n/**\n * Expansions that start from a full scan: an `Expand` whose source is a\n * `NodeByLabelScan`, or a `NodeScan` with nothing below it that binds the\n * node. A key test in the same pattern as the expansion plans this way,\n * and the statement then walks every relationship of the type. Statements\n * that start from keys (every mutation statement) must have none.\n */\nexport function scanExpands(\n statement: Statement,\n plan: QueryPlan,\n): PlanFinding[] {\n return flatten(plan.tree)\n .filter((n) => n.operator === \"Expand\")\n .flatMap((expand) => {\n const source = sourceScan(expand);\n return source\n ? [\n {\n rule: \"scan-expand\" as const,\n message: `Expand ${expand.details[\"types\"] ?? \"\"} starts from ${source.operator}${\n source.details[\"labels\"] ? ` :${source.details[\"labels\"]}` : \"\"\n } instead of a seek`,\n statement: statement.text,\n },\n ]\n : [];\n });\n}\n\n/** The full scan feeding `expand`, if its source is one. */\nfunction sourceScan(expand: PlanNode): PlanNode | undefined {\n for (let n = expand.children[0]; n; n = n.children[0]) {\n if (SEEKS.has(n.operator)) return undefined;\n if (n.operator === \"NodeByLabelScan\") return n;\n // A NodeScan over operators that bind no nodes scans every node;\n // over anything else it re-reads a node bound earlier.\n if (\n n.operator === \"NodeScan\" &&\n flatten(n)\n .slice(1)\n .every((m) => BIND_NOTHING.has(m.operator))\n ) {\n return n;\n }\n }\n return undefined;\n}\n\nfunction flatten(node: PlanNode): PlanNode[] {\n return [node, ...node.children.flatMap(flatten)];\n}\n\nfunction sameColumns(a: string[], b: string[]): boolean {\n return a.length === b.length && a.every((x, i) => x === b[i]);\n}\n","// Schema lint for `check`: choices that are valid but costly or risky.\n// Warnings, not failures: each may be intended.\n\nimport type { GraphModel, ModelWarning } from \"../model/types.js\";\n\nexport interface LintOptions {\n /** Statistics are loaded: relationship degrees are known. */\n statistics?: boolean;\n}\n\nexport function lintModel(\n model: GraphModel,\n options: LintOptions = {},\n): ModelWarning[] {\n const out: ModelWarning[] = [];\n for (const node of model.nodes.values()) {\n const writes = node.mutations.size > 0;\n const guarded =\n node.authentication !== undefined ||\n (node.authorization?.filter.length ?? 0) > 0 ||\n (node.authorization?.validate.length ?? 0) > 0;\n if (writes && !guarded) {\n out.push({\n type: node.name,\n message: `has mutations (${[...node.mutations].join(\", \")}) but no @authentication or @authorization: any caller that reaches the API can write it`,\n });\n }\n for (const f of node.fields.values()) {\n if (f.kind === \"scalar\") {\n if (f.filters.has(\"CASE_INSENSITIVE\")) {\n out.push({\n type: node.name,\n field: f.name,\n message:\n \"CASE_INSENSITIVE compares lowercased values and cannot use an index: every such filter scans the label\",\n });\n }\n if (f.filters.has(\"IS_NULL\")) {\n out.push({\n type: node.name,\n field: f.name,\n message:\n \"IS_NULL cannot use an index: a filter on absence scans the label\",\n });\n }\n }\n if (\n f.kind === \"relationship\" &&\n f.list &&\n f.cardinality === undefined &&\n !options.statistics\n ) {\n out.push({\n type: node.name,\n field: f.name,\n message:\n \"no @cardinality and no statistics: cost estimates assume each parent has a full page of these; run analyze() or declare @cardinality(max:)\",\n });\n }\n }\n }\n return out;\n}\n","// S6: cardinalities sampled from a live database. The compiler uses the\n// degree of each list relationship to estimate how many rows an\n// operation touches; until `analyze()` runs, `@cardinality(max:)` and\n// page limits stand in.\n\nimport type { LoraDriver } from \"../driver.js\";\nimport { name } from \"../compile/cypher.js\";\nimport type { GraphModel } from \"../model/types.js\";\n\nexport interface DegreeStats {\n sampled: number;\n mean: number;\n median: number;\n p99: number;\n max: number;\n}\n\nexport interface Statistics {\n /** Node count per @node type. */\n nodes: Record<string, number>;\n /** Degree per list relationship, keyed `Type.field`. */\n degrees: Record<string, DegreeStats>;\n}\n\nexport async function analyze(\n driver: LoraDriver,\n model: GraphModel,\n options: { sample?: number; timeoutMs?: number } = {},\n): Promise<Statistics> {\n const sample = options.sample ?? 1000;\n const stats: Statistics = { nodes: {}, degrees: {} };\n for (const node of model.nodes.values()) {\n const label = name(node.labels[0]!);\n const statements = [\n { text: `MATCH (n:${label}) RETURN count(n) AS c`, params: {} },\n ];\n const rels = [...node.fields.values()].filter(\n (f) => f.kind === \"relationship\" && f.list,\n );\n for (const f of rels) {\n if (f.kind !== \"relationship\") continue;\n // Any member of an interface or union counts.\n const labels = f.members\n .map((m) => model.nodes.get(m)!.labels[0]!)\n .map((l) => `x:${name(l)}`)\n .join(\" OR \");\n const inner = `[:${name(f.type)}]`;\n const arrow =\n (f.direction === \"OUT\" ? `-${inner}->(x)` : `<-${inner}-(x)`) +\n ` WHERE ${labels}`;\n statements.push({\n text: `MATCH (n:${label}) WITH n LIMIT $sample RETURN size([(n)${arrow} | 1]) AS d`,\n params: { sample } as never,\n });\n }\n const [count, ...degrees] = await driver.run(statements, {\n mode: \"read\",\n timeoutMs: options.timeoutMs,\n });\n stats.nodes[node.name] = Number(count!.rows[0]?.[\"c\"] ?? 0);\n rels.forEach((f, i) => {\n const values = degrees[i]!.rows.map((r) => Number(r[\"d\"])).sort(\n (a, b) => a - b,\n );\n stats.degrees[`${node.name}.${f.name}`] = summarize(values);\n });\n }\n return stats;\n}\n\nfunction summarize(values: number[]): DegreeStats {\n const at = (q: number) =>\n values.length === 0\n ? 0\n : values[Math.min(values.length - 1, Math.floor(q * values.length))]!;\n return {\n sampled: values.length,\n mean:\n values.length === 0\n ? 0\n : values.reduce((a, b) => a + b, 0) / values.length,\n median: at(0.5),\n p99: at(0.99),\n max: values.length === 0 ? 0 : values[values.length - 1]!,\n };\n}\n","import type { GraphModel } from \"../model/types.js\";\nimport { param, type Expr } from \"./cypher.js\";\nimport type { SelectionContext } from \"./selection.js\";\n\n/** State shared while compiling one root field into one statement. */\nexport interface CompileContext extends SelectionContext {\n model: GraphModel;\n params: Record<string, unknown>;\n vars: Set<string>;\n /** Labels and relationship types the statement reads (S5 read-set). */\n reads: { labels: Set<string>; relationships: Set<string> };\n /** The request's claims, or undefined when unauthenticated. */\n jwt: Record<string, unknown> | undefined;\n /** Compiling an authorization rule: nested rules are not applied. */\n inAuth: boolean;\n /** Estimated rows the statement touches (for the cost limit). */\n cost: number;\n /** Degree statistics from `analyze()`, by `Owner.field`. */\n degrees: ReadonlyMap<string, number>;\n /** The GraphQL context, for `\"$context.path\"` values in rules. */\n requestContext: unknown;\n /**\n * Variables holding computed (`@cypher`) field values in the current\n * statement, by `variable + \"\\0\" + field`: set by the root match.\n */\n computed: Map<string, string>;\n /**\n * `$context` paths the compile read, with their values: a cached\n * compile is reused only for a context that agrees on them.\n */\n contextReads: Array<[string, unknown]>;\n}\n\nexport function newContext(\n base: SelectionContext,\n model: GraphModel,\n options: {\n jwt?: Record<string, unknown> | undefined;\n degrees?: ReadonlyMap<string, number>;\n requestContext?: unknown;\n } = {},\n): CompileContext {\n return {\n ...base,\n model,\n params: {},\n vars: new Set([\"this\"]),\n reads: { labels: new Set(), relationships: new Set() },\n jwt: options.jwt,\n inAuth: false,\n cost: 0,\n degrees: options.degrees ?? new Map(),\n requestContext: options.requestContext,\n computed: new Map(),\n contextReads: [],\n };\n}\n\n/** Bind a value as the next positional parameter `$pN`. */\nexport function bind(ctx: CompileContext, value: unknown): Expr {\n const name = `p${Object.keys(ctx.params).length}`;\n ctx.params[name] = value;\n return param(name);\n}\n\n/** A variable name derived from `base`, unique within the statement. */\nexport function freshVar(ctx: CompileContext, base: string): string {\n let candidate = base;\n for (let i = 1; ctx.vars.has(candidate); i++) candidate = `${base}${i}`;\n ctx.vars.add(candidate);\n return candidate;\n}\n","import { GraphQLError } from \"graphql\";\n\nexport interface ModelProblem {\n /** Type the problem is in, when it belongs to one. */\n type?: string;\n /** Field the problem is in, when it belongs to one. */\n field?: string;\n message: string;\n}\n\n/**\n * The annotated SDL is invalid. Carries every problem found, not just the\n * first, each located by type and field.\n */\nexport class ModelError extends Error {\n readonly problems: readonly ModelProblem[];\n\n constructor(problems: ModelProblem[]) {\n super(\n `Invalid LoraGraphQL type definitions (${problems.length} ${problems.length === 1 ? \"problem\" : \"problems\"}):\\n` +\n problems.map((p) => \" - \" + formatProblem(p)).join(\"\\n\"),\n );\n this.name = \"ModelError\";\n this.problems = problems;\n }\n}\n\nexport function formatProblem(p: ModelProblem): string {\n const where =\n p.type && p.field ? `${p.type}.${p.field}` : (p.type ?? p.field);\n return where ? `${where}: ${p.message}` : p.message;\n}\n\nexport type LoraGraphQLErrorCode =\n | \"BAD_USER_INPUT\"\n | \"INVALID_CURSOR\"\n | \"LIMIT_EXCEEDED\"\n | \"COST_EXCEEDED\"\n | \"UNAUTHENTICATED\"\n | \"FORBIDDEN\"\n | \"NOT_FOUND\"\n | \"CONSTRAINT_VIOLATION\"\n | \"DATABASE_ERROR\";\n\n/** A request-time error with a stable `extensions.code`. */\nexport function requestError(\n code: LoraGraphQLErrorCode,\n message: string,\n cause?: unknown,\n extensions: Record<string, unknown> = {},\n): GraphQLError {\n return new GraphQLError(message, {\n extensions: { code, ...extensions },\n originalError: cause instanceof Error ? cause : undefined,\n });\n}\n","// Aggregates over a list expression, e.g. the ages of a node's followers\n// as a pattern comprehension. Written with `reduce` rather than aggregate\n// functions, so they work inside WHERE and map projections, per parent\n// row, without a subquery (and without LoraDB's nested-aggregate bug).\n\nimport { freshVar, type CompileContext } from \"./context.js\";\nimport { bin, fn, isNull, lit, v, type Expr } from \"./cypher.js\";\n\nexport type ListAggregate =\n | \"min\"\n | \"max\"\n | \"sum\"\n | \"avg\"\n | \"count\"\n // Strings: the shortest and longest value, and length statistics.\n | \"shortest\"\n | \"longest\"\n | \"shortestLength\"\n | \"longestLength\"\n | \"averageLength\";\n\nexport interface AggregateOptions {\n /**\n * The values are durations: sums start from the first value rather than\n * 0, and an average divides the sum (LoraDB's own `sum` / `avg` / `max`\n * over durations are wrong, see E25).\n */\n duration?: boolean;\n}\n\nexport function listAggregate(\n ctx: CompileContext,\n kind: ListAggregate,\n list: Expr,\n options: AggregateOptions = {},\n): Expr {\n if (\n kind === \"shortestLength\" ||\n kind === \"longestLength\" ||\n kind === \"averageLength\"\n ) {\n const s = freshVar(ctx, \"agg_s\");\n const lengths: Expr = {\n kind: \"listComprehension\",\n variable: s,\n list,\n where: isNull(v(s), true),\n projection: fn(\"size\", v(s)),\n };\n const of = {\n shortestLength: \"min\",\n longestLength: \"max\",\n averageLength: \"avg\",\n } as const;\n return listAggregate(ctx, of[kind], lengths);\n }\n const x = freshVar(ctx, \"agg_v\");\n // Nulls take no part, as in Cypher's aggregate functions.\n const values: Expr = {\n kind: \"listComprehension\",\n variable: x,\n list,\n where: isNull(v(x), true),\n projection: undefined,\n };\n const acc = freshVar(ctx, \"agg_acc\");\n const item = freshVar(ctx, \"agg_item\");\n const fold = (init: Expr, step: Expr): Expr => ({\n kind: \"reduce\",\n accumulator: acc,\n init,\n variable: item,\n list: values,\n step,\n });\n switch (kind) {\n case \"count\":\n return fn(\"size\", values);\n case \"min\":\n case \"max\":\n return fold(lit(null), {\n kind: \"case\",\n when: {\n kind: \"binary\",\n op: \"OR\",\n left: isNull(v(acc)),\n right: bin(kind === \"min\" ? \"<\" : \">\", v(item), v(acc)),\n },\n then: v(item),\n else: v(acc),\n });\n case \"shortest\":\n case \"longest\":\n return fold(lit(null), {\n kind: \"case\",\n when: {\n kind: \"binary\",\n op: \"OR\",\n left: isNull(v(acc)),\n right: bin(\n kind === \"shortest\" ? \"<\" : \">\",\n fn(\"size\", v(item)),\n fn(\"size\", v(acc)),\n ),\n },\n then: v(item),\n else: v(acc),\n });\n case \"sum\":\n return options.duration\n ? durationSum()\n : fold(lit(0), bin(\"+\", v(acc), v(item)));\n case \"avg\":\n return {\n kind: \"case\",\n when: bin(\"=\", fn(\"size\", values), lit(0)),\n then: lit(null),\n else: bin(\n \"/\",\n options.duration\n ? durationSum()\n : fn(\"toFloat\", fold(lit(0), bin(\"+\", v(acc), v(item)))),\n fn(\"size\", values),\n ),\n };\n }\n\n function durationSum(): Expr {\n return fold(lit(null), {\n kind: \"case\",\n when: isNull(v(acc)),\n then: v(item),\n else: bin(\"+\", v(acc), v(item)),\n });\n }\n}\n\n/**\n * The number of distinct values in a list: related nodes counted once\n * even when several relationships lead to the same node.\n */\nexport function distinctCount(ctx: CompileContext, keys: Expr): Expr {\n const acc = freshVar(ctx, \"seen\");\n const k = freshVar(ctx, \"seen_key\");\n return fn(\"size\", {\n kind: \"reduce\",\n accumulator: acc,\n init: { kind: \"list\", items: [] },\n variable: k,\n list: keys,\n step: {\n kind: \"case\",\n when: bin(\"IN\", v(k), v(acc)),\n then: v(acc),\n else: bin(\"+\", v(acc), { kind: \"list\", items: [v(k)] }),\n },\n });\n}\n","// The directive vocabulary and built-in scalars, as SDL. Prepended to the\n// user's typeDefs so graphql-js validates every directive usage (unknown\n// directives, argument names and types) before the model is built.\n// Exported so editors and codegen can load it next to `schema.graphql`.\n\nexport const directiveTypeDefs = /* GraphQL */ `\n \"A node label set. Defaults to the type name.\"\n directive @node(labels: [String!], plural: String) on OBJECT\n\n \"Natural key: required, unique and immutable; the tie-breaker of every sort and the anchor of cursors, global ids, updates and deletes. With generate: true, creates fill it with a UUID when the input leaves it out.\"\n directive @key(generate: Boolean = false) on FIELD_DEFINITION\n\n \"On an interface field: every implementation declares this relationship (with @relationship, possibly of different types or directions), so clients can select it on the interface.\"\n directive @declareRelationship on FIELD_DEFINITION\n\n \"Offer this field as a grouping key of <plural>Grouped (needs @query(aggregate: true)).\"\n directive @groupBy on FIELD_DEFINITION\n\n \"A field computed in JavaScript by the resolver passed in the resolvers option. requires is a selection on this type (for example name capacity) fetched in the same statement, so the resolver reads it from its source.\"\n directive @customResolver(requires: String) on FIELD_DEFINITION\n\n \"On a custom scalar: how its values are stored. Filters, sorts and indexes follow the storage type; the scalar is passed through unless the scalars option supplies an implementation.\"\n directive @storedAs(type: StorageType!) on SCALAR\n\n enum StorageType {\n STRING\n INT\n FLOAT\n BOOLEAN\n DATETIME\n DATE\n }\n\n \"A uniqueness constraint.\"\n directive @unique on FIELD_DEFINITION\n\n \"An explicit index. Usually unnecessary: inferred from @filterable and @sortable.\"\n directive @index(kind: IndexKind!) on FIELD_DEFINITION\n\n \"An edge. The target type is the field's type.\"\n directive @relationship(\n type: String!\n direction: RelationshipDirection!\n properties: String\n \"UNDIRECTED reads follow the relationship both ways; writes use direction.\"\n queryDirection: QueryDirection = DIRECTED\n \"What deleting this node does to nodes reached through the field.\"\n onDelete: OnDelete = DETACH\n \"Which nested writes mutation inputs offer for the field.\"\n nestedOperations: [NestedOperation!] = [\n CREATE\n CONNECT\n DISCONNECT\n UPDATE\n DELETE\n ]\n \"false: no aggregate on the field's connection and no aggregate filter.\"\n aggregate: Boolean = true\n ) on FIELD_DEFINITION\n\n enum NestedOperation {\n CREATE\n CONNECT\n DISCONNECT\n UPDATE\n DELETE\n }\n\n enum QueryDirection {\n DIRECTED\n UNDIRECTED\n }\n\n \"DETACH removes the relationships; CASCADE deletes the related nodes too; RESTRICT refuses while any exist.\"\n enum OnDelete {\n DETACH\n CASCADE\n RESTRICT\n }\n\n \"Which mutations may set the field. @readonly is onCreate: false, onUpdate: false.\"\n directive @settable(\n onCreate: Boolean = true\n onUpdate: Boolean = true\n ) on FIELD_DEFINITION\n\n \"Whether the field can be read (onRead: false makes it write-only) or aggregated.\"\n directive @selectable(\n onRead: Boolean = true\n onAggregate: Boolean = true\n ) on FIELD_DEFINITION\n\n \"Set by a callback passed to LoraGraphQL({ callbacks }) on these operations; never client-settable.\"\n directive @populatedBy(\n callback: String!\n operations: [TimestampOperation!]! = [CREATE, UPDATE]\n ) on FIELD_DEFINITION\n\n \"The shape of the request's claims. Rules may only test declared claims.\"\n directive @jwt on OBJECT\n\n \"Where a declared claim lives in the token, e.g. app_metadata.roles.\"\n directive @jwtClaim(path: String!) on FIELD_DEFINITION\n\n \"Properties carried by a relationship type.\"\n directive @relationshipProperties on OBJECT\n\n \"API name differs from the stored property.\"\n directive @alias(property: String!) on FIELD_DEFINITION\n\n \"Stored, never exposed.\"\n directive @private on FIELD_DEFINITION\n\n \"Declared upper bound on a relationship's fan-out, used by cost estimates.\"\n directive @cardinality(max: Int!) on FIELD_DEFINITION\n\n \"Generated read operations for a node type. Reads are on by default.\"\n directive @query(\n read: Boolean = true\n aggregate: Boolean = false\n ) on OBJECT | INTERFACE | UNION\n\n \"The plural of an interface or union, for its root field.\"\n directive @plural(value: String!) on INTERFACE | UNION\n\n \"Filter operators for a field. Without arguments: EQ and IN. On a relationship field: enables relationship filters.\"\n directive @filterable(byValue: [FilterOperator!]) on FIELD_DEFINITION\n\n \"Sort and keyset-paginate on this field.\"\n directive @sortable on FIELD_DEFINITION\n\n \"Page size bounds for lists of this type.\"\n directive @limit(\n default: Int\n max: Int\n ) on OBJECT | INTERFACE | UNION | FIELD_DEFINITION\n\n \"Expose an opaque global id derived from this @key field.\"\n directive @relayId on FIELD_DEFINITION\n\n \"Full-text search over String fields: a FULLTEXT index and a search root field per entry.\"\n directive @fulltext(indexes: [FulltextIndex!]!) on OBJECT\n\n \"A vector embedding ([Float!]): a VECTOR index and a similarity root field.\"\n directive @vector(\n dimensions: Int!\n similarity: VectorSimilarity = COSINE\n queryName: String\n ) on FIELD_DEFINITION\n\n input FulltextIndex {\n \"Index name. Default: <label>_search for the first, required after.\"\n name: String\n fields: [String!]!\n analyzer: FulltextAnalyzer = STANDARD\n \"Root field name. Default: search<Plural>, or search<Plural>By<Name>.\"\n queryName: String\n }\n\n enum FulltextAnalyzer {\n STANDARD\n SIMPLE\n }\n\n enum VectorSimilarity {\n COSINE\n EUCLIDEAN\n }\n\n \"Generated subscriptions to changes made through the library. None without this directive.\"\n directive @subscription(\n operations: [MutationOperation!]! = [CREATE, UPDATE, DELETE]\n \"Also send CONNECT and DISCONNECT events for the type's relationships.\"\n relationships: Boolean = false\n \"Send the stored values before an update or delete (one extra read per write).\"\n previousState: Boolean = false\n ) on OBJECT\n\n \"Generated mutations for a node type. None without this directive.\"\n directive @mutation(\n operations: [MutationOperation!]! = [CREATE, UPDATE, DELETE]\n ) on OBJECT\n\n \"Value stored on create when the input leaves the field out.\"\n directive @default(value: DefaultValue!) on FIELD_DEFINITION\n\n \"Set to the current time by the listed operations; never client-settable.\"\n directive @timestamp(\n operations: [TimestampOperation!]! = [CREATE, UPDATE]\n ) on FIELD_DEFINITION\n\n \"Readable but never client-settable.\"\n directive @readonly on FIELD_DEFINITION\n\n \"A field backed by a Cypher statement. \\`this\\` is the parent node; arguments are $parameters, and $jwt holds the request's claims.\"\n directive @cypher(statement: String!, columnName: String) on FIELD_DEFINITION\n\n \"Require an authenticated request (a jwt in the context) for these operations.\"\n directive @authentication(\n operations: [AuthOperation!]! = [\n READ\n CREATE\n UPDATE\n DELETE\n CREATE_RELATIONSHIP\n DELETE_RELATIONSHIP\n SUBSCRIBE\n ]\n \"Claims the request must also satisfy, such as a role in roles.\"\n jwt: AuthorizationWhere\n ) on OBJECT | FIELD_DEFINITION\n\n \"Row-level rules over the node and the request's claims, compiled into the statements.\"\n directive @authorization(\n filter: [AuthorizationFilterRule!]\n validate: [AuthorizationValidateRule!]\n ) on OBJECT | FIELD_DEFINITION\n\n input AuthorizationFilterRule {\n operations: [AuthOperation!]! = [READ, UPDATE, DELETE]\n requireAuthentication: Boolean = true\n where: AuthorizationWhere!\n }\n\n input AuthorizationValidateRule {\n operations: [AuthOperation!]! = [READ, CREATE, UPDATE, DELETE]\n when: [AuthorizationWhen!]! = [BEFORE, AFTER]\n requireAuthentication: Boolean = true\n where: AuthorizationWhere!\n }\n\n enum MutationOperation {\n CREATE\n UPDATE\n DELETE\n }\n\n enum TimestampOperation {\n CREATE\n UPDATE\n }\n\n enum AuthOperation {\n READ\n CREATE\n UPDATE\n DELETE\n CREATE_RELATIONSHIP\n DELETE_RELATIONSHIP\n SUBSCRIBE\n }\n\n enum AuthorizationWhen {\n BEFORE\n AFTER\n }\n\n \"Any literal.\"\n scalar DefaultValue\n\n \"{ node: <Type>Where-shaped filter, jwt: claim filter, AND, OR, NOT }. String values starting with $jwt. are replaced by claims.\"\n scalar AuthorizationWhere\n\n enum IndexKind {\n RANGE\n TEXT\n POINT\n }\n\n enum RelationshipDirection {\n IN\n OUT\n }\n\n enum FilterOperator {\n EQ\n IN\n LT\n LTE\n GT\n GTE\n CONTAINS\n STARTS_WITH\n ENDS_WITH\n WITHIN_BBOX\n DISTANCE\n INCLUDES\n IS_NULL\n CASE_INSENSITIVE\n }\n\n scalar BigInt\n scalar Date\n scalar Time\n scalar LocalTime\n scalar DateTime\n scalar LocalDateTime\n scalar Duration\n\n type Point {\n longitude: Float!\n latitude: Float!\n height: Float\n srid: Int!\n crs: String!\n }\n\n type CartesianPoint {\n x: Float!\n y: Float!\n z: Float\n srid: Int!\n crs: String!\n }\n`;\n\n/** Names defined by the prelude; never treated as user types. */\nexport const PRELUDE_TYPES = new Set([\n \"QueryDirection\",\n \"OnDelete\",\n \"FulltextIndex\",\n \"FulltextAnalyzer\",\n \"VectorSimilarity\",\n \"MutationOperation\",\n \"TimestampOperation\",\n \"AuthOperation\",\n \"AuthorizationWhen\",\n \"AuthorizationFilterRule\",\n \"AuthorizationValidateRule\",\n \"DefaultValue\",\n \"AuthorizationWhere\",\n \"IndexKind\",\n \"RelationshipDirection\",\n \"FilterOperator\",\n \"BigInt\",\n \"Date\",\n \"Time\",\n \"LocalTime\",\n \"DateTime\",\n \"LocalDateTime\",\n \"Duration\",\n \"Point\",\n \"CartesianPoint\",\n]);\n","import {\n buildASTSchema,\n concatAST,\n getDirectiveValues,\n getNamedType,\n isEnumType,\n isInterfaceType,\n isListType,\n isNonNullType,\n isObjectType,\n isScalarType,\n isUnionType,\n Kind,\n parse,\n type DocumentNode,\n type GraphQLNamedType,\n type GraphQLDirective,\n type GraphQLField,\n type GraphQLInputType,\n type GraphQLInterfaceType,\n type GraphQLUnionType,\n type GraphQLObjectType,\n type GraphQLOutputType,\n type GraphQLSchema,\n} from \"graphql\";\nimport { RANGE_UNINDEXABLE } from \"../analyze/indexes.js\";\nimport { ModelError, type ModelProblem } from \"../errors.js\";\nimport { directiveTypeDefs, PRELUDE_TYPES } from \"./directives.js\";\nimport { codeOnly, scanParams } from \"./cypher-lexer.js\";\nimport type {\n AbstractType,\n SearchIndex,\n AuthOperation,\n Authorization,\n AuthorizationWhere,\n CypherArgument,\n CypherField,\n EnumType,\n Field,\n ModelWarning,\n MutationOperation,\n TypeShape,\n FilterOperator,\n GraphModel,\n IndexKind,\n DeclaredRelationship,\n NestedOperation,\n NodeType,\n PlainObjectType,\n PageLimit,\n RelationshipField,\n RelationshipPropertiesType,\n ScalarField,\n ScalarType,\n} from \"./types.js\";\n\nexport interface ModelOptions {\n /** Page size used when a list or connection gets no `limit` / `first`. */\n defaultLimit?: number;\n /** Hard cap on any page size; `@limit(max:)` may only lower it. */\n maxLimit?: number;\n /**\n * Sign cursors with HMAC-SHA-256 under this secret, and reject cursors\n * whose signature does not match. Without it cursors are only tagged\n * with their sort. Changing the secret invalidates every cursor.\n */\n cursorSecret?: string;\n}\n\nexport const DEFAULT_LIMIT = 25;\nexport const MAX_LIMIT = 100;\n\nconst BUILTIN_SCALARS: Record<string, ScalarType> = {\n String: \"String\",\n ID: \"ID\",\n Int: \"Int\",\n Float: \"Float\",\n Boolean: \"Boolean\",\n BigInt: \"BigInt\",\n Date: \"Date\",\n Time: \"Time\",\n LocalTime: \"LocalTime\",\n DateTime: \"DateTime\",\n LocalDateTime: \"LocalDateTime\",\n Duration: \"Duration\",\n Point: \"Point\",\n CartesianPoint: \"CartesianPoint\",\n};\n\nconst TEXT_OPS: FilterOperator[] = [\"CONTAINS\", \"STARTS_WITH\", \"ENDS_WITH\"];\nconst RANGE_OPS: FilterOperator[] = [\"LT\", \"LTE\", \"GT\", \"GTE\"];\n\n/** Which filter operators each stored type supports. */\nconst ALLOWED_OPS: Record<ScalarType, readonly FilterOperator[]> = {\n String: [\"EQ\", \"IN\", ...RANGE_OPS, ...TEXT_OPS],\n ID: [\"EQ\", \"IN\", ...RANGE_OPS, ...TEXT_OPS],\n Int: [\"EQ\", \"IN\", ...RANGE_OPS],\n Float: [\"EQ\", \"IN\", ...RANGE_OPS],\n BigInt: [\"EQ\", \"IN\", ...RANGE_OPS],\n Boolean: [\"EQ\"],\n Date: [\"EQ\", \"IN\", ...RANGE_OPS],\n Time: [\"EQ\", \"IN\", ...RANGE_OPS],\n LocalTime: [\"EQ\", \"IN\", ...RANGE_OPS],\n DateTime: [\"EQ\", \"IN\", ...RANGE_OPS],\n LocalDateTime: [\"EQ\", \"IN\", ...RANGE_OPS],\n Duration: [\"EQ\", \"IN\"],\n Enum: [\"EQ\", \"IN\"],\n Point: [\"WITHIN_BBOX\", \"DISTANCE\"],\n CartesianPoint: [\"WITHIN_BBOX\", \"DISTANCE\"],\n};\n\nconst KEY_TYPES = new Set<ScalarType>([\"String\", \"ID\", \"Int\", \"BigInt\"]);\nconst UNSORTABLE = new Set<ScalarType>([\"Point\", \"CartesianPoint\", \"Duration\"]);\nconst RELATIONSHIP_TYPE = /^[A-Z][A-Z0-9_]*$/;\nconst ROOT_TYPES = new Set([\"Query\", \"Mutation\", \"Subscription\"]);\n\n/**\n * Parse and validate annotated type definitions into a `GraphModel`.\n * Throws a `ModelError` listing every problem found.\n */\nexport function buildModel(\n typeDefs: string | DocumentNode,\n options: ModelOptions = {},\n): GraphModel {\n const globalLimit = resolveGlobalLimit(options);\n let schema: GraphQLSchema;\n try {\n const user = typeof typeDefs === \"string\" ? parse(typeDefs) : typeDefs;\n schema = buildASTSchema(concatAST([parse(directiveTypeDefs), user]));\n } catch (err) {\n throw new ModelError(\n String(err instanceof Error ? err.message : err)\n .split(\"\\n\\n\")\n .map((message) => ({ message })),\n );\n }\n\n const problems: ModelProblem[] = [];\n const d = (n: string) => schema.getDirective(n)!;\n const atType = (type: string) => (message: string) =>\n problems.push({ type, message });\n\n const userTypes = Object.values(schema.getTypeMap()).filter(\n (t) => !t.name.startsWith(\"__\") && !PRELUDE_TYPES.has(t.name),\n );\n\n const enums = new Map<string, EnumType>();\n const scalars = new Map<string, ScalarType>();\n const nodeTypes: GraphQLObjectType[] = [];\n const propsTypes: GraphQLObjectType[] = [];\n const plainTypes: GraphQLObjectType[] = [];\n const rootTypes: GraphQLObjectType[] = [];\n const interfaceTypes: GraphQLInterfaceType[] = [];\n const unionTypes: GraphQLUnionType[] = [];\n let jwtShape: Map<string, string> | undefined;\n const warnings: ModelWarning[] = [];\n for (const t of userTypes) {\n if (isScalarType(t)) {\n const stored = storageOf(t);\n if (stored && !(t.name in BUILTIN_SCALARS)) scalars.set(t.name, stored);\n if (!(t.name in BUILTIN_SCALARS) && !stored) {\n problems.push({\n type: t.name,\n message:\n \"a custom scalar needs @storedAs(type:) to say how its values are stored\",\n });\n }\n continue;\n }\n if (isEnumType(t)) {\n enums.set(t.name, {\n name: t.name,\n values: t.getValues().map((val) => ({\n name: val.name,\n description: val.description ?? undefined,\n })),\n description: t.description ?? undefined,\n });\n continue;\n }\n if (isInterfaceType(t)) {\n interfaceTypes.push(t);\n continue;\n }\n if (isUnionType(t)) {\n unionTypes.push(t);\n continue;\n }\n if (!isObjectType(t)) {\n problems.push({\n type: t.name,\n message:\n \"only object types, interfaces, unions, enums and scalars are supported\",\n });\n continue;\n }\n if (ROOT_TYPES.has(t.name)) {\n if (t.name === \"Subscription\") {\n problems.push({\n type: t.name,\n message:\n \"custom subscriptions are not supported; use LoraGraphQL.onWrite / changes()\",\n });\n } else {\n rootTypes.push(t);\n }\n continue;\n }\n if (directive(d(\"jwt\"), t, atType(t.name)) !== undefined) {\n if (jwtShape) {\n problems.push({\n type: t.name,\n message: \"only one @jwt type is allowed\",\n });\n }\n jwtShape = new Map();\n for (const f of Object.values(t.getFields())) {\n const claim = directive(d(\"jwtClaim\"), f, atType(t.name));\n jwtShape.set(f.name, (claim?.[\"path\"] as string | undefined) ?? f.name);\n }\n continue;\n }\n const isNode = directive(d(\"node\"), t, atType(t.name)) !== undefined;\n const isProps =\n directive(d(\"relationshipProperties\"), t, atType(t.name)) !== undefined;\n if (isNode && isProps) {\n problems.push({\n type: t.name,\n message: \"@node and @relationshipProperties are mutually exclusive\",\n });\n } else if (isNode) {\n nodeTypes.push(t);\n } else if (isProps) {\n propsTypes.push(t);\n } else {\n // A plain object type: valid when a @cypher field returns it.\n plainTypes.push(t);\n }\n }\n\n const nodeNames = new Set(nodeTypes.map((t) => t.name));\n const plainNames = new Set(plainTypes.map((t) => t.name));\n const objects = new Map<string, PlainObjectType>();\n for (const t of plainTypes) {\n const fields = new Map<string, { name: string; type: TypeShape }>();\n for (const f of Object.values(t.getFields())) {\n const named = getNamedType(f.type).name;\n if (!isScalarLike(named, schema)) {\n problems.push({\n type: t.name,\n field: f.name,\n message:\n \"fields of an object type without @node are scalars or enums\",\n });\n continue;\n }\n fields.set(f.name, {\n name: f.name,\n type: { named, ...shapeOf(unwrap(f.type)) },\n });\n }\n objects.set(t.name, {\n name: t.name,\n fields,\n description: t.description ?? undefined,\n });\n }\n // Relationships may target an interface or union over @node types.\n const targetNames = new Set([\n ...nodeNames,\n ...interfaceTypes.map((t) => t.name),\n ...unionTypes.map((t) => t.name),\n ]);\n const propsNames = new Set(propsTypes.map((t) => t.name));\n\n const relationshipProperties = new Map<string, RelationshipPropertiesType>();\n for (const t of propsTypes) {\n const fields = new Map<string, ScalarField>();\n for (const f of Object.values(t.getFields())) {\n const field = buildScalarField(t, f, d, problems, {\n allowKey: false,\n });\n if (field) fields.set(field.name, field);\n else if (!isScalarLike(getNamedType(f.type).name, schema)) {\n problems.push({\n type: t.name,\n field: f.name,\n message: \"relationship properties must be scalars\",\n });\n }\n }\n checkPropertyCollisions(t.name, [...fields.values()], problems);\n relationshipProperties.set(t.name, {\n name: t.name,\n fields,\n description: t.description ?? undefined,\n });\n }\n\n const at0 = (type: string, field: string) => (message: string) =>\n problems.push({ type, field, message });\n const nodes = new Map<string, NodeType>();\n const primaryLabels = new Map<string, string>();\n const rootFieldOwners = new Map<string, string>();\n for (const t of nodeTypes) {\n const nodeArgs = directive(d(\"node\"), t, atType(t.name))!;\n const labels = (nodeArgs[\"labels\"] as string[] | undefined) ?? [t.name];\n if (labels.length === 0) {\n problems.push({ type: t.name, message: \"@node(labels:) is empty\" });\n continue;\n }\n const primary = labels[0]!;\n const owner = primaryLabels.get(primary);\n if (owner) {\n problems.push({\n type: t.name,\n message: `primary label \\`${primary}\\` is already used by ${owner}`,\n });\n }\n primaryLabels.set(primary, t.name);\n\n const fields = new Map<string, Field>();\n for (const f of Object.values(t.getFields())) {\n const named = getNamedType(f.type);\n if (f.name.startsWith(\"__\")) {\n problems.push({\n type: t.name,\n field: f.name,\n message: \"names starting with `__` are reserved\",\n });\n continue;\n }\n const custom = directive(d(\"customResolver\"), f, (message) =>\n problems.push({ type: t.name, field: f.name, message }),\n );\n if (custom !== undefined) {\n for (const other of [\n \"cypher\",\n \"relationship\",\n \"key\",\n \"filterable\",\n \"sortable\",\n \"groupBy\",\n ]) {\n if (f.astNode?.directives?.some((x) => x.name.value === other)) {\n problems.push({\n type: t.name,\n field: f.name,\n message: `@${other} cannot be combined with @customResolver`,\n });\n }\n }\n fields.set(f.name, {\n kind: \"custom\",\n authentication: authOps(\n directive(d(\"authentication\"), f, at0(t.name, f.name)),\n ),\n name: f.name,\n owner: t.name,\n requires: custom[\"requires\"] as string | undefined,\n type: { named: named.name, ...shapeOf(unwrap(f.type)) },\n description: f.description ?? undefined,\n });\n continue;\n }\n if (f.astNode?.directives?.some((x) => x.name.value === \"cypher\")) {\n const cypher = buildCypherField(t.name, f, d, problems, warnings, {\n nodeNames,\n plainNames,\n schema,\n root: undefined,\n });\n if (cypher) fields.set(cypher.name, cypher);\n continue;\n }\n if (targetNames.has(named.name)) {\n const rel = buildRelationshipField(\n t,\n f,\n d,\n problems,\n propsNames,\n globalLimit,\n );\n if (rel) fields.set(rel.name, rel);\n continue;\n }\n if (propsNames.has(named.name)) {\n problems.push({\n type: t.name,\n field: f.name,\n message: `${named.name} is a @relationshipProperties type; reference it from @relationship(properties:)`,\n });\n continue;\n }\n if (directive(d(\"relationship\"), f, atType(t.name)) !== undefined) {\n problems.push({\n type: t.name,\n field: f.name,\n message: \"@relationship target must be a @node type\",\n });\n continue;\n }\n const field = buildScalarField(t, f, d, problems, { allowKey: true });\n if (field) fields.set(field.name, field);\n }\n\n const scalars = [...fields.values()].filter(\n (f): f is ScalarField => f.kind === \"scalar\",\n );\n checkPropertyCollisions(t.name, scalars, problems);\n\n const keys = scalars.filter((f) => f.key);\n if (keys.length !== 1) {\n problems.push({\n type: t.name,\n message:\n keys.length === 0\n ? \"a @node type needs exactly one @key field\"\n : `only one @key field is allowed (found ${keys.map((k) => k.name).join(\", \")})`,\n });\n continue;\n }\n const key = keys[0]!;\n if (scalars.some((f) => f.relayId) && fields.has(\"id\")) {\n problems.push({\n type: t.name,\n field: \"id\",\n message:\n \"@relayId adds a global `id` field; rename this field or map it with @alias\",\n });\n }\n\n const search = readSearch(\n t.name,\n labels[0]!,\n defaultPlural(t.name),\n nodeArgs[\"plural\"] as string | undefined,\n scalars,\n directive(d(\"fulltext\"), t, atType(t.name)),\n problems,\n );\n const query = directive(d(\"query\"), t, atType(t.name)) ?? {};\n const mutation = directive(d(\"mutation\"), t, atType(t.name));\n const mutations = new Set<MutationOperation>(\n (mutation?.[\"operations\"] as MutationOperation[] | undefined) ?? [],\n );\n const subscription = directive(d(\"subscription\"), t, atType(t.name));\n const authentication = directive(d(\"authentication\"), t, atType(t.name));\n const authorization = readAuthorization(\n directive(d(\"authorization\"), t, atType(t.name)),\n );\n if (mutations.has(\"CREATE\")) {\n for (const f of scalars) {\n if (\n f.required &&\n f.readonly &&\n !f.defaultValue &&\n !f.timestamp?.has(\"CREATE\") &&\n !(f.key && f.generate)\n ) {\n problems.push({\n type: t.name,\n field: f.name,\n message:\n \"is required but cannot be set on create; add @default, @timestamp or @key(generate: true), or drop @mutation(operations: CREATE)\",\n });\n }\n }\n }\n const plural =\n (nodeArgs[\"plural\"] as string | undefined) ?? defaultPlural(t.name);\n for (const root of [\n plural,\n `${plural}Connection`,\n `${plural}Aggregate`,\n lowerFirst(t.name),\n ...search.map((x) => x.queryName),\n `${lowerFirst(t.name)}Changed`,\n ]) {\n const other = rootFieldOwners.get(root);\n if (other) {\n problems.push({\n type: t.name,\n message: `root field \\`${root}\\` collides with ${other}; set @node(plural:)`,\n });\n }\n rootFieldOwners.set(root, t.name);\n }\n\n nodes.set(t.name, {\n name: t.name,\n labels,\n plural,\n fields,\n key,\n read: (query[\"read\"] as boolean | undefined) ?? true,\n aggregate: (query[\"aggregate\"] as boolean | undefined) ?? false,\n mutations,\n authentication: authentication\n ? new Set(authentication[\"operations\"] as AuthOperation[])\n : undefined,\n authenticationJwt: authentication?.[\"jwt\"] as\n | AuthorizationWhere\n | undefined,\n authorization,\n search,\n interfaces: t.getInterfaces().map((i) => i.name),\n subscriptions: new Set<MutationOperation>(\n (subscription?.[\"operations\"] as MutationOperation[] | undefined) ?? [],\n ),\n subscriptionOptions: {\n relationships: subscription?.[\"relationships\"] === true,\n previousState: subscription?.[\"previousState\"] === true,\n },\n limit: resolveLimit(\n directive(d(\"limit\"), t, atType(t.name)),\n globalLimit,\n t.name,\n undefined,\n problems,\n ),\n description: t.description ?? undefined,\n });\n }\n\n // --- Interfaces and unions ----------------------------------------------\n const abstracts = new Map<string, AbstractType>();\n for (const t of [...interfaceTypes, ...unionTypes]) {\n const at = atType(t.name);\n const members = (\n isInterfaceType(t) ? schema.getPossibleTypes(t) : t.getTypes()\n ).map((m) => m.name);\n for (const m of members) {\n if (!nodes.has(m)) {\n at(\n `${m} is not a @node type; interfaces and unions range over @node types`,\n );\n }\n }\n if (members.length === 0) at(\"has no @node implementations\");\n const fields = new Map<string, ScalarField>();\n const relationships = new Map<string, DeclaredRelationship>();\n if (isInterfaceType(t)) {\n for (const f of Object.values(t.getFields())) {\n if (directive(d(\"declareRelationship\"), f, at) !== undefined) {\n const declaredRel = declareRelationship(t.name, f, members, nodes);\n if (typeof declaredRel === \"string\") {\n problems.push({\n type: t.name,\n field: f.name,\n message: declaredRel,\n });\n } else {\n relationships.set(f.name, declaredRel);\n }\n continue;\n }\n const field = buildScalarField(\n t as unknown as GraphQLObjectType,\n f as GraphQLField<unknown, unknown>,\n d,\n problems,\n { allowKey: false },\n );\n if (!field) continue;\n fields.set(field.name, field);\n // What the interface lets clients filter and sort by, every\n // implementation supports (and indexes).\n for (const m of members) {\n const mf = nodes.get(m)?.fields.get(f.name);\n if (mf?.kind !== \"scalar\") continue;\n (mf as unknown as { filters: ReadonlySet<FilterOperator> }).filters =\n new Set([...mf.filters, ...field.filters]);\n if (field.sortable && !mf.list)\n (mf as { sortable: boolean }).sortable = true;\n }\n }\n }\n const query = directive(d(\"query\"), t, at) ?? {};\n const plural =\n (directive(d(\"plural\"), t, at)?.[\"value\"] as string | undefined) ??\n defaultPlural(t.name);\n const other = rootFieldOwners.get(plural);\n if (other)\n at(`root field \\`${plural}\\` collides with ${other}; set @plural`);\n rootFieldOwners.set(plural, t.name);\n abstracts.set(t.name, {\n kind: isInterfaceType(t) ? \"interface\" : \"union\",\n name: t.name,\n members,\n fields,\n relationships,\n plural,\n read: (query[\"read\"] as boolean | undefined) ?? true,\n limit: resolveLimit(\n directive(d(\"limit\"), t, at),\n globalLimit,\n t.name,\n undefined,\n problems,\n ),\n description: t.description ?? undefined,\n });\n }\n for (const node of nodes.values()) {\n for (const f of node.fields.values()) {\n if (f.kind === \"scalar\" && f.groupBy && !node.aggregate) {\n problems.push({\n type: node.name,\n field: f.name,\n message: \"@groupBy needs @query(aggregate: true) on the type\",\n });\n }\n if (f.kind !== \"relationship\") continue;\n (f as { members: readonly string[] }).members = abstracts.get(f.target)\n ?.members ?? [f.target];\n if (\n node.mutations.has(\"CREATE\") &&\n f.required &&\n !f.list &&\n !f.nestedOperations.has(\"CONNECT\") &&\n !f.nestedOperations.has(\"CREATE\")\n ) {\n problems.push({\n type: node.name,\n field: f.name,\n message:\n \"a required relationship needs CONNECT or CREATE in nestedOperations, or creates could never set it\",\n });\n }\n }\n }\n\n const queries: CypherField[] = [];\n const mutationFields: CypherField[] = [];\n for (const t of rootTypes) {\n for (const f of Object.values(t.getFields())) {\n if (!f.astNode?.directives?.some((x) => x.name.value === \"cypher\")) {\n problems.push({\n type: t.name,\n field: f.name,\n message: `${t.name} fields are generated; a custom one needs @cypher`,\n });\n continue;\n }\n const field = buildCypherField(t.name, f, d, problems, warnings, {\n nodeNames,\n plainNames,\n schema,\n root: t.name as \"Query\" | \"Mutation\",\n });\n if (!field) continue;\n const other = rootFieldOwners.get(field.name);\n if (t.name === \"Query\" && other) {\n problems.push({\n type: t.name,\n field: field.name,\n message: `collides with a generated field of ${other}`,\n });\n }\n (t.name === \"Query\" ? queries : mutationFields).push(field);\n }\n }\n\n for (const node of nodes.values()) {\n const rules = [\n ...(node.authorization?.filter ?? []),\n ...(node.authorization?.validate ?? []),\n ];\n for (const f of node.fields.values()) {\n if (!f.authorization) continue;\n if (f.authorization.filter.length > 0) {\n problems.push({\n type: node.name,\n field: f.name,\n message:\n \"field-level @authorization takes validate rules; filter rules belong on the type\",\n });\n }\n rules.push(...f.authorization.validate);\n }\n for (const rule of rules) {\n checkAuthorizationWhere(nodes, node, rule.where, problems, jwtShape);\n }\n for (const where of [\n node.authenticationJwt,\n ...[...node.fields.values()].map((f) => f.authenticationJwt),\n ]) {\n if (where) {\n checkAuthorizationWhere(\n nodes,\n node,\n { jwt: where },\n problems,\n jwtShape,\n );\n }\n }\n }\n\n // A plain object type exists to shape @cypher results.\n const returned = new Set(\n [\n ...[...nodes.values()].flatMap((n) => [...n.fields.values()]),\n ...queries,\n ...mutationFields,\n ].flatMap((f) => (f.kind === \"cypher\" && f.object ? [f.object] : [])),\n );\n for (const name of objects.keys()) {\n if (!returned.has(name)) {\n problems.push({\n type: name,\n message:\n \"object types need @node or @relationshipProperties, unless a @cypher field returns them\",\n });\n }\n }\n\n if (problems.length > 0) throw new ModelError(dedupeProblems(problems));\n return {\n nodes,\n abstracts,\n enums,\n relationshipProperties,\n queries,\n mutations: mutationFields,\n warnings,\n objects,\n scalars,\n jwt: jwtShape,\n cursorSecret: options.cursorSecret,\n };\n}\n\n/**\n * An interface field under `@declareRelationship`: every implementation\n * must declare a relationship field of that name with the same target and\n * shape (the relationship type and direction may differ). Returns the\n * problem when one does not.\n */\nfunction declareRelationship(\n iface: string,\n f: GraphQLField<unknown, unknown>,\n members: readonly string[],\n nodes: ReadonlyMap<string, NodeType>,\n): DeclaredRelationship | string {\n let first: RelationshipField | undefined;\n for (const m of members) {\n const mf = nodes.get(m)?.fields.get(f.name);\n if (mf?.kind !== \"relationship\") {\n return `${m} implements ${iface} but ${f.name} on it is not a @relationship field`;\n }\n if (!first) first = mf;\n else if (\n mf.target !== first.target ||\n mf.list !== first.list ||\n mf.properties !== first.properties\n ) {\n return `every implementation must declare ${f.name} with the same target, list shape and properties (${first.owner} and ${m} differ)`;\n }\n }\n if (!first) return \"has no @node implementations\";\n return {\n name: f.name,\n target: first.target,\n list: first.list,\n description: f.description ?? undefined,\n };\n}\n\nfunction buildScalarField(\n t: GraphQLObjectType,\n f: GraphQLField<unknown, unknown>,\n d: (n: string) => GraphQLDirective,\n problems: ModelProblem[],\n opts: { allowKey: boolean },\n): ScalarField | undefined {\n const at = (message: string) =>\n problems.push({ type: t.name, field: f.name, message });\n const shape = unwrap(f.type);\n const named = getNamedType(f.type);\n let type: ScalarType;\n let enumName: string | undefined;\n if (isEnumType(named)) {\n type = \"Enum\";\n enumName = named.name;\n } else if (named.name in BUILTIN_SCALARS) {\n type = BUILTIN_SCALARS[named.name]!;\n } else if (storageOf(named)) {\n type = storageOf(named)!;\n } else {\n return undefined;\n }\n const customScalar =\n isScalarType(named) && !(named.name in BUILTIN_SCALARS)\n ? named.name\n : undefined;\n if (shape.list && !shape.itemRequired) {\n at(\"list items must be non-null, e.g. [String!]\");\n }\n if (shape.depth > 1) at(\"nested lists are not supported\");\n\n const key = directive(d(\"key\"), f, at) !== undefined;\n const unique = directive(d(\"unique\"), f, at) !== undefined;\n const isPrivate = directive(d(\"private\"), f, at) !== undefined;\n const relayId = directive(d(\"relayId\"), f, at) !== undefined;\n const sortable = directive(d(\"sortable\"), f, at) !== undefined;\n const groupBy = directive(d(\"groupBy\"), f, at) !== undefined;\n const filterable = directive(d(\"filterable\"), f, at);\n const alias = directive(d(\"alias\"), f, at);\n const index = directive(d(\"index\"), f, at);\n const defaultArgs = directive(d(\"default\"), f, at);\n const timestampArgs = directive(d(\"timestamp\"), f, at);\n const readonlyFlag = directive(d(\"readonly\"), f, at) !== undefined;\n const authentication = directive(d(\"authentication\"), f, at);\n const settableArgs = directive(d(\"settable\"), f, at);\n const selectableArgs = directive(d(\"selectable\"), f, at);\n const populatedArgs = directive(d(\"populatedBy\"), f, at);\n const fieldAuthorization = readAuthorization(\n directive(d(\"authorization\"), f, at),\n );\n if (key && (settableArgs || selectableArgs || populatedArgs)) {\n at(\"@key cannot take @settable, @selectable or @populatedBy\");\n }\n const vectorArgs = directive(d(\"vector\"), f, at);\n let vector: ScalarField[\"vector\"];\n if (vectorArgs) {\n const dimensions = vectorArgs[\"dimensions\"] as number;\n if (type !== \"Float\" || !shape.list) at(\"@vector needs a [Float!] field\");\n if (!opts.allowKey) at(\"@vector is not allowed on relationship properties\");\n if (!(dimensions >= 1 && dimensions <= 4096)) {\n at(\"@vector(dimensions:) must be between 1 and 4096\");\n }\n vector = {\n dimensions,\n similarity: vectorArgs[\"similarity\"] as \"COSINE\" | \"EUCLIDEAN\",\n };\n }\n const vectorQuery = vectorArgs?.[\"queryName\"] as string | undefined;\n const generate = key && (keyArgs(d, f, at)?.[\"generate\"] as boolean) === true;\n if (generate && type !== \"ID\" && type !== \"String\") {\n at(\"@key(generate: true) needs an ID or String field\");\n }\n const timestamp = timestampArgs\n ? new Set(timestampArgs[\"operations\"] as Array<\"CREATE\" | \"UPDATE\">)\n : undefined;\n if (\n timestamp &&\n (shape.list ||\n (type !== \"DateTime\" && type !== \"LocalDateTime\" && type !== \"Date\"))\n ) {\n at(\"@timestamp needs a DateTime, LocalDateTime or Date field\");\n }\n if (timestamp && defaultArgs) at(\"@timestamp and @default are exclusive\");\n let defaultValue: { value: unknown } | undefined;\n if (defaultArgs) {\n const value = defaultArgs[\"value\"];\n if (!defaultMatches(type, shape.list, value)) {\n at(`@default(value:) does not fit ${shape.list ? `[${type}]` : type}`);\n }\n if (key) at(\"@key cannot have a @default; use @key(generate: true)\");\n if (type === \"Point\" || type === \"CartesianPoint\") {\n at(\"Point fields cannot have a @default\");\n }\n defaultValue = { value };\n }\n\n if (!opts.allowKey && (key || unique || relayId || index)) {\n at(\"@key, @unique, @relayId and @index are not allowed here\");\n }\n if (key) {\n if (!KEY_TYPES.has(type)) at(\"@key must be String, ID, Int or BigInt\");\n if (!shape.required) at(\"@key fields must be non-null\");\n if (shape.list) at(\"@key cannot be a list\");\n if (isPrivate) at(\"@key cannot be @private\");\n }\n if (relayId && !key) at(\"@relayId belongs on the @key field\");\n if (unique && shape.list) at(\"@unique cannot be a list\");\n\n let filters = new Set<FilterOperator>();\n if (filterable) {\n // Lists: membership and presence. Scalars: the type's operators, plus\n // IS_NULL when nullable and CASE_INSENSITIVE on strings.\n const allowed: FilterOperator[] = shape.list\n ? type === \"Point\" || type === \"CartesianPoint\" || vectorArgs\n ? []\n : [\"INCLUDES\", ...(shape.required ? [] : ([\"IS_NULL\"] as const))]\n : [\n ...ALLOWED_OPS[type],\n ...(shape.required ? [] : ([\"IS_NULL\"] as const)),\n ...(type === \"String\" || type === \"ID\"\n ? ([\"CASE_INSENSITIVE\"] as const)\n : []),\n ];\n // Without byValue: equality, and membership where the type has it.\n const requested =\n (filterable[\"byValue\"] as FilterOperator[] | undefined) ??\n (shape.list\n ? ([\"INCLUDES\"] as FilterOperator[])\n : ([\"EQ\", \"IN\"] as FilterOperator[])\n ).filter((op) => allowed.includes(op));\n const bad = requested.filter((op) => !allowed.includes(op));\n if (bad.length > 0) {\n at(\n `${type} does not support ${bad.join(\", \")}` +\n (allowed.length > 0 ? ` (allowed: ${allowed.join(\", \")})` : \"\"),\n );\n }\n filters = new Set(requested.filter((op) => allowed.includes(op)));\n }\n // A key is always addressable by value.\n if (key) {\n filters.add(\"EQ\");\n filters.add(\"IN\");\n }\n if (isPrivate && (filterable || sortable)) {\n at(\"@private fields cannot be @filterable or @sortable\");\n }\n if (sortable && (shape.list || UNSORTABLE.has(type))) {\n at(`${shape.list ? \"lists\" : type} cannot be @sortable`);\n }\n if (\n groupBy &&\n (shape.list ||\n type === \"Point\" ||\n type === \"CartesianPoint\" ||\n isPrivate ||\n !opts.allowKey)\n ) {\n at(\"@groupBy needs a readable, non-list, non-Point field of a @node type\");\n }\n\n const property = (alias?.[\"property\"] as string | undefined) ?? f.name;\n if (property.length === 0) at(\"@alias(property:) is empty\");\n\n const indexes: IndexKind[] = [];\n if (index) {\n const kind = index[\"kind\"] as IndexKind;\n if (kind === \"TEXT\" && type !== \"String\" && type !== \"ID\") {\n at(\"a TEXT index needs a String or ID field\");\n } else if (\n kind === \"POINT\" &&\n type !== \"Point\" &&\n type !== \"CartesianPoint\"\n ) {\n at(\"a POINT index needs a Point field\");\n } else if (\n kind === \"RANGE\" &&\n (type === \"Point\" || type === \"CartesianPoint\")\n ) {\n at(\"use a POINT index for Point fields\");\n } else if (kind === \"RANGE\" && RANGE_UNINDEXABLE.has(type)) {\n at(`${type} values have no order a RANGE index can use`);\n } else {\n indexes.push(kind);\n }\n }\n\n const field: ScalarField = {\n kind: \"scalar\",\n name: f.name,\n property,\n type,\n enumName,\n customScalar,\n list: shape.list,\n required: shape.required,\n key,\n unique,\n private: isPrivate,\n relayId,\n filters,\n sortable: sortable && !isPrivate,\n groupBy,\n indexes,\n generate,\n defaultValue,\n timestamp,\n readonly:\n readonlyFlag || isPrivate || timestamp !== undefined || !!populatedArgs,\n settableOn: {\n create:\n !(readonlyFlag || isPrivate || timestamp || populatedArgs) &&\n ((settableArgs?.[\"onCreate\"] as boolean | undefined) ?? true),\n update:\n !key &&\n !(readonlyFlag || isPrivate || timestamp || populatedArgs) &&\n ((settableArgs?.[\"onUpdate\"] as boolean | undefined) ?? true),\n },\n selectableOn: {\n read:\n !isPrivate &&\n ((selectableArgs?.[\"onRead\"] as boolean | undefined) ?? true),\n aggregate:\n (selectableArgs?.[\"onAggregate\"] as boolean | undefined) ?? true,\n },\n populatedBy: populatedArgs\n ? {\n callback: populatedArgs[\"callback\"] as string,\n operations: new Set(\n populatedArgs[\"operations\"] as Array<\"CREATE\" | \"UPDATE\">,\n ),\n }\n : undefined,\n vector,\n authentication: authentication\n ? new Set(authentication[\"operations\"] as AuthOperation[])\n : undefined,\n authenticationJwt: authentication?.[\"jwt\"] as\n | AuthorizationWhere\n | undefined,\n authorization: fieldAuthorization,\n description: f.description ?? undefined,\n };\n if (populatedArgs && (timestamp || defaultArgs)) {\n at(\"@populatedBy cannot be combined with @timestamp or @default\");\n }\n if (\n !isPrivate &&\n !field.selectableOn.read &&\n (field.filters.size > 0 || field.sortable)\n ) {\n at(\n \"a field with @selectable(onRead: false) cannot be @filterable or @sortable\",\n );\n }\n if (vectorQuery) vectorQueryNames.set(field, vectorQuery);\n return field;\n}\n\nfunction keyArgs(\n d: (n: string) => GraphQLDirective,\n f: GraphQLField<unknown, unknown>,\n at: (message: string) => void,\n): Record<string, unknown> | undefined {\n return directive(d(\"key\"), f, at);\n}\n\nfunction defaultMatches(\n type: ScalarType,\n list: boolean,\n value: unknown,\n): boolean {\n if (list) {\n return (\n Array.isArray(value) && value.every((v) => defaultMatches(type, false, v))\n );\n }\n switch (type) {\n case \"Int\":\n case \"BigInt\":\n return Number.isInteger(value);\n case \"Float\":\n return typeof value === \"number\";\n case \"Boolean\":\n return typeof value === \"boolean\";\n case \"Point\":\n case \"CartesianPoint\":\n return false;\n default:\n return typeof value === \"string\";\n }\n}\n\nfunction buildRelationshipField(\n t: GraphQLObjectType,\n f: GraphQLField<unknown, unknown>,\n d: (n: string) => GraphQLDirective,\n problems: ModelProblem[],\n propsNames: Set<string>,\n globalLimit: PageLimit,\n): RelationshipField | undefined {\n const at = (message: string) =>\n problems.push({ type: t.name, field: f.name, message });\n const authorization = readOnlyRules(directive(d(\"authorization\"), f, at), at);\n const rel = directive(d(\"relationship\"), f, at);\n if (!rel) {\n at(\n `${getNamedType(f.type).name} is a @node type; add @relationship(type:, direction:)`,\n );\n return undefined;\n }\n const shape = unwrap(f.type);\n if (shape.list && (!shape.itemRequired || !shape.required)) {\n at(\"relationship lists must be written [T!]!\");\n }\n if (shape.depth > 1) at(\"nested lists are not supported\");\n\n const type = rel[\"type\"] as string;\n if (!RELATIONSHIP_TYPE.test(type)) {\n at(`relationship type \\`${type}\\` must be SCREAMING_SNAKE_CASE`);\n }\n const properties = rel[\"properties\"] as string | undefined;\n if (properties !== undefined && !propsNames.has(properties)) {\n at(`${properties} is not a @relationshipProperties type`);\n }\n for (const forbidden of [\"key\", \"unique\", \"sortable\", \"alias\", \"index\"]) {\n if (directive(d(forbidden), f, at)) {\n at(`@${forbidden} is not allowed on a relationship field`);\n }\n }\n const filterable = directive(d(\"filterable\"), f, at);\n if (filterable?.[\"byValue\"] !== undefined) {\n at(\"@filterable on a relationship takes no byValue\");\n }\n const cardinality = directive(d(\"cardinality\"), f, at)?.[\"max\"] as\n | number\n | undefined;\n if (cardinality !== undefined && cardinality < 1) {\n at(\"@cardinality(max:) must be at least 1\");\n }\n if (cardinality !== undefined && !shape.list) {\n at(\"@cardinality only applies to list relationships\");\n }\n const limitArgs = directive(d(\"limit\"), f, at);\n if (limitArgs && !shape.list) at(\"@limit only applies to lists\");\n\n return {\n kind: \"relationship\",\n authorization,\n name: f.name,\n owner: t.name,\n type,\n direction: rel[\"direction\"] as \"IN\" | \"OUT\",\n target: getNamedType(f.type).name,\n list: shape.list,\n required: shape.required,\n properties,\n // Filled in once interfaces and unions are known.\n members: [],\n filterable: filterable !== undefined,\n queryDirection: rel[\"queryDirection\"] as \"DIRECTED\" | \"UNDIRECTED\",\n onDelete: rel[\"onDelete\"] as \"DETACH\" | \"CASCADE\" | \"RESTRICT\",\n nestedOperations: new Set(rel[\"nestedOperations\"] as NestedOperation[]),\n aggregate: rel[\"aggregate\"] as boolean,\n cardinality,\n limit: limitArgs\n ? resolveLimit(limitArgs, globalLimit, t.name, f.name, problems)\n : undefined,\n authentication: authOps(directive(d(\"authentication\"), f, at)),\n authenticationJwt: directive(d(\"authentication\"), f, at)?.[\"jwt\"] as\n | AuthorizationWhere\n | undefined,\n description: f.description ?? undefined,\n };\n}\n\nfunction dedupeProblems(problems: ModelProblem[]): ModelProblem[] {\n const seen = new Set<string>();\n return problems.filter((p) => {\n const k = `${p.type}\\0${p.field}\\0${p.message}`;\n if (seen.has(k)) return false;\n seen.add(k);\n return true;\n });\n}\n\nfunction checkPropertyCollisions(\n typeName: string,\n fields: ScalarField[],\n problems: ModelProblem[],\n) {\n const seen = new Map<string, string>();\n for (const f of fields) {\n const other = seen.get(f.property);\n if (other) {\n problems.push({\n type: typeName,\n field: f.name,\n message: `stores property \\`${f.property}\\`, already stored by ${other}`,\n });\n }\n seen.set(f.property, f.name);\n }\n}\n\nfunction resolveGlobalLimit(options: ModelOptions): PageLimit {\n const max = options.maxLimit ?? MAX_LIMIT;\n const def = Math.min(options.defaultLimit ?? DEFAULT_LIMIT, max);\n if (!(max >= 1) || !(def >= 1)) {\n throw new ModelError([\n { message: \"defaultLimit and maxLimit must be at least 1\" },\n ]);\n }\n return { default: def, max };\n}\n\nfunction resolveLimit(\n args: Record<string, unknown> | undefined,\n global: PageLimit,\n type: string,\n field: string | undefined,\n problems: ModelProblem[],\n): PageLimit {\n if (!args) return global;\n const max = (args[\"max\"] as number | undefined) ?? global.max;\n const def =\n (args[\"default\"] as number | undefined) ?? Math.min(global.default, max);\n const at = (message: string) =>\n problems.push(field ? { type, field, message } : { type, message });\n if (max < 1 || def < 1) at(\"@limit values must be at least 1\");\n if (max > global.max)\n at(`@limit(max: ${max}) exceeds the global maximum ${global.max}`);\n if (def > max) at(`@limit(default: ${def}) exceeds max ${max}`);\n return {\n default: Math.min(def, max, global.max),\n max: Math.min(max, global.max),\n };\n}\n\nfunction directive(\n def: GraphQLDirective,\n node: { astNode?: unknown },\n at: (message: string) => void,\n): Record<string, unknown> | undefined {\n const ast = node.astNode as Parameters<typeof getDirectiveValues>[1] | null;\n if (!ast) return undefined;\n try {\n return getDirectiveValues(def, ast);\n } catch (err) {\n at(`@${def.name}: ${err instanceof Error ? err.message : String(err)}`);\n return undefined;\n }\n}\n\nfunction unwrap(type: GraphQLOutputType): {\n required: boolean;\n list: boolean;\n itemRequired: boolean;\n depth: number;\n} {\n let required = false;\n let t: GraphQLOutputType = type;\n if (isNonNullType(t)) {\n required = true;\n t = t.ofType;\n }\n let depth = 0;\n let itemRequired = false;\n while (isListType(t)) {\n depth++;\n t = t.ofType as GraphQLOutputType;\n if (isNonNullType(t)) {\n itemRequired = true;\n t = t.ofType;\n } else {\n itemRequired = false;\n }\n }\n return { required, list: depth > 0, itemRequired, depth };\n}\n\nfunction isScalarLike(name: string, schema: GraphQLSchema): boolean {\n const t = schema.getType(name);\n return (\n name in BUILTIN_SCALARS ||\n (t !== undefined && (isEnumType(t) || storageOf(t) !== undefined))\n );\n}\n\nconst STORAGE_TYPES: Record<string, ScalarType> = {\n STRING: \"String\",\n INT: \"Int\",\n FLOAT: \"Float\",\n BOOLEAN: \"Boolean\",\n DATETIME: \"DateTime\",\n DATE: \"Date\",\n};\n\n/** A custom scalar's storage type, from its `@storedAs(type:)`. */\nexport function storageOf(t: GraphQLNamedType): ScalarType | undefined {\n if (!isScalarType(t)) return undefined;\n const d = t.astNode?.directives?.find((x) => x.name.value === \"storedAs\");\n const arg = d?.arguments?.find((a) => a.name.value === \"type\")?.value;\n return arg && arg.kind === Kind.ENUM ? STORAGE_TYPES[arg.value] : undefined;\n}\n\nexport function lowerFirst(s: string): string {\n return s.charAt(0).toLowerCase() + s.slice(1);\n}\n\nexport function defaultPlural(typeName: string): string {\n const base = lowerFirst(typeName);\n if (/[^aeiou]y$/i.test(base)) return base.slice(0, -1) + \"ies\";\n if (/(s|x|z|ch|sh)$/i.test(base)) return base + \"es\";\n return base + \"s\";\n}\n\n// ---------------------------------------------------------------------------\n// @cypher\n// ---------------------------------------------------------------------------\n\nconst WRITE_CLAUSES = /\\b(CREATE|MERGE|SET|DELETE|REMOVE|DETACH)\\b/;\n\nfunction buildCypherField(\n owner: string,\n f: GraphQLField<unknown, unknown>,\n d: (n: string) => GraphQLDirective,\n problems: ModelProblem[],\n warnings: ModelWarning[],\n ctx: {\n nodeNames: Set<string>;\n plainNames: Set<string>;\n schema: GraphQLSchema;\n root: \"Query\" | \"Mutation\" | undefined;\n },\n): CypherField | undefined {\n const at = (message: string) =>\n problems.push({ type: owner, field: f.name, message });\n const warn = (message: string) =>\n warnings.push({ type: owner, field: f.name, message });\n const args = directive(d(\"cypher\"), f, at);\n if (!args) return undefined;\n const authorization = readOnlyRules(directive(d(\"authorization\"), f, at), at);\n const statement = args[\"statement\"] as string;\n for (const other of [\n \"relationship\",\n \"key\",\n \"unique\",\n \"alias\",\n \"index\",\n \"default\",\n \"timestamp\",\n \"groupBy\",\n ]) {\n if (directive(d(other), f, at))\n at(`@${other} cannot be combined with @cypher`);\n }\n\n const shape = unwrap(f.type);\n const named = getNamedType(f.type).name;\n const node = ctx.nodeNames.has(named) ? named : undefined;\n const namedType = ctx.schema.getType(named);\n const abstract =\n namedType && (isInterfaceType(namedType) || isUnionType(namedType))\n ? named\n : undefined;\n const object = ctx.plainNames.has(named) ? named : undefined;\n if (!node && !abstract && !object && !isScalarLike(named, ctx.schema)) {\n at(\n \"@cypher fields return scalars, enums, @node types, interfaces or unions over them, or object types without @node\",\n );\n return undefined;\n }\n if (shape.depth > 1) at(\"nested lists are not supported\");\n if (shape.list && !shape.itemRequired) {\n at(\"list items must be non-null, e.g. [Festival!]\");\n }\n\n const columnName =\n (args[\"columnName\"] as string | undefined) ?? inferColumn(statement);\n if (!columnName) {\n at(\"cannot tell which column holds the value; set @cypher(columnName:)\");\n return undefined;\n }\n\n const cypherArgs: CypherArgument[] = [];\n for (const a of f.args) {\n const argNamed = getNamedType(a.type).name;\n if (!isScalarLike(argNamed, ctx.schema)) {\n at(`argument ${a.name}: @cypher arguments must be scalars or enums`);\n continue;\n }\n if (a.name === \"jwt\")\n at(\"argument `jwt` is reserved for the request's claims\");\n const argShape = unwrapInput(a.type);\n cypherArgs.push({\n name: a.name,\n type: { named: argNamed, ...argShape },\n defaultValue: a.defaultValue,\n description: a.description ?? undefined,\n });\n }\n\n const params = [...new Set(scanParams(statement).map((p) => p.name))];\n const known = new Set([...cypherArgs.map((a) => a.name), \"jwt\"]);\n for (const p of params) {\n if (!known.has(p)) {\n at(`the statement uses $${p}, which is neither an argument nor $jwt`);\n }\n }\n for (const a of cypherArgs) {\n if (!params.includes(a.name))\n warn(`argument ${a.name} is never used by the statement`);\n }\n\n const code = codeOnly(statement);\n if (ctx.root !== \"Mutation\" && WRITE_CLAUSES.test(code)) {\n at(\n ctx.root === \"Query\"\n ? \"a Query field must not write; declare it on Mutation\"\n : \"an object field must not write\",\n );\n }\n if (ctx.root === undefined && !/\\bTHIS\\b/.test(code)) {\n warn(\n \"the statement never uses `this`, so it returns the same value for every parent\",\n );\n }\n if (code.includes(\"OPTIONAL MATCH\")) {\n warn(\n \"OPTIONAL MATCH is slow on LoraDB; a pattern comprehension is usually 17-130x faster\",\n );\n }\n\n // Opt-in filters and sorts: computed per row, so never through an index.\n let computed: ScalarField | undefined;\n if (\n directive(d(\"filterable\"), f, at) !== undefined ||\n directive(d(\"sortable\"), f, at) !== undefined\n ) {\n if (ctx.root !== undefined) {\n at(\"@filterable and @sortable on @cypher apply to @node type fields\");\n } else if (node || abstract || object || shape.list) {\n at(\n \"only scalar, non-list @cypher fields can be @filterable or @sortable\",\n );\n } else if (cypherArgs.some((a) => a.defaultValue === undefined)) {\n at(\n \"a @filterable or @sortable @cypher field needs a default for every argument\",\n );\n } else {\n computed = buildScalarField(\n { name: owner } as GraphQLObjectType,\n f,\n d,\n problems,\n { allowKey: false },\n );\n warn(\n `filtering or sorting by ${f.name} runs its statement for every ${owner} considered: no index applies`,\n );\n }\n }\n\n const field: CypherField = {\n kind: \"cypher\",\n authorization,\n name: f.name,\n owner,\n statement,\n columnName,\n type: { named, ...shapeOf(shape) },\n node,\n abstract,\n object,\n args: cypherArgs,\n params,\n computed,\n authentication: authOps(directive(d(\"authentication\"), f, at)),\n authenticationJwt: directive(d(\"authentication\"), f, at)?.[\"jwt\"] as\n | AuthorizationWhere\n | undefined,\n description: f.description ?? undefined,\n };\n if (computed) computed.computedBy = field;\n return field;\n}\n\n/** The column of a statement ending in `RETURN x` or `RETURN … AS x`. */\nfunction inferColumn(statement: string): string | undefined {\n const matches = [...statement.matchAll(/\\bRETURN\\b/gi)];\n const last = matches[matches.length - 1];\n if (!last) return undefined;\n const tail = statement\n .slice(last.index! + last[0].length)\n .replace(/\\s+(ORDER\\s+BY|SKIP|LIMIT)\\b[\\s\\S]*$/i, \"\")\n .replace(/^\\s*DISTINCT\\b/i, \"\")\n .trim();\n if (tail.includes(\",\")) return undefined;\n const alias = /\\bAS\\s+`?([A-Za-z_][A-Za-z0-9_]*)`?\\s*$/i.exec(tail);\n if (alias) return alias[1];\n return /^[A-Za-z_][A-Za-z0-9_]*$/.test(tail) ? tail : undefined;\n}\n\nfunction shapeOf(shape: ReturnType<typeof unwrap>): Omit<TypeShape, \"named\"> {\n return {\n list: shape.list,\n required: shape.required,\n itemRequired: shape.itemRequired,\n };\n}\n\nfunction unwrapInput(type: GraphQLInputType): Omit<TypeShape, \"named\"> {\n let required = false;\n let t: GraphQLInputType = type;\n if (isNonNullType(t)) {\n required = true;\n t = t.ofType;\n }\n let list = false;\n let itemRequired = false;\n if (isListType(t)) {\n list = true;\n itemRequired = isNonNullType(t.ofType);\n }\n return { list, required, itemRequired };\n}\n\n// ---------------------------------------------------------------------------\n// @authentication / @authorization\n// ---------------------------------------------------------------------------\n\nfunction authOps(\n args: Record<string, unknown> | undefined,\n): Set<AuthOperation> | undefined {\n return args ? new Set(args[\"operations\"] as AuthOperation[]) : undefined;\n}\n\n/**\n * Field-level rules on a relationship or @cypher field: READ validate rules\n * only, checked for each row that reads (or filters on) the field.\n */\nfunction readOnlyRules(\n args: Record<string, unknown> | undefined,\n at: (message: string) => void,\n): Authorization | undefined {\n const rules = readAuthorization(args);\n if (!rules) return undefined;\n if (\n rules.validate.some((r) => [...r.operations].some((op) => op !== \"READ\"))\n ) {\n at(\n \"field-level @authorization on a relationship or @cypher field takes READ rules only; write rules belong on the types\",\n );\n }\n return rules;\n}\n\nfunction readAuthorization(\n args: Record<string, unknown> | undefined,\n): Authorization | undefined {\n if (!args) return undefined;\n type Raw = {\n operations: AuthOperation[];\n requireAuthentication?: boolean;\n when?: Array<\"BEFORE\" | \"AFTER\">;\n where: AuthorizationWhere;\n };\n const filter = ((args[\"filter\"] as Raw[] | undefined) ?? []).map((r) => ({\n operations: new Set(r.operations),\n requireAuthentication: r.requireAuthentication ?? true,\n where: r.where,\n }));\n const validate = ((args[\"validate\"] as Raw[] | undefined) ?? []).map((r) => ({\n operations: new Set(r.operations),\n when: new Set<\"BEFORE\" | \"AFTER\">(r.when ?? [\"BEFORE\", \"AFTER\"]),\n requireAuthentication: r.requireAuthentication ?? true,\n where: r.where,\n }));\n return { filter, validate };\n}\n\nconst SCALAR_WHERE_OPS = new Set([\n \"withinBBox\",\n \"distance\",\n \"eq\",\n \"in\",\n \"lt\",\n \"lte\",\n \"gt\",\n \"gte\",\n \"contains\",\n \"startsWith\",\n \"endsWith\",\n]);\nconst JWT_OPS = new Set([...SCALAR_WHERE_OPS, \"includes\", \"exists\"]);\nconst COUNT_WHERE_OPS = new Set([\"eq\", \"lt\", \"lte\", \"gt\", \"gte\"]);\n\nconst isRecord = (x: unknown): x is Record<string, unknown> =>\n typeof x === \"object\" && x !== null && !Array.isArray(x);\n\n/** Check an `@authorization` where against the model, at startup. */\nfunction checkAuthorizationWhere(\n nodes: ReadonlyMap<string, NodeType>,\n node: NodeType,\n where: unknown,\n problems: ModelProblem[],\n jwtShape?: ReadonlyMap<string, string>,\n) {\n const at = (message: string) =>\n problems.push({ type: node.name, message: `@authorization: ${message}` });\n const visit = (w: unknown, path: string) => {\n if (!isRecord(w)) return at(`${path || \"where\"} must be an object`);\n for (const [k, value] of Object.entries(w)) {\n const here = path ? `${path}.${k}` : k;\n if (k === \"AND\" || k === \"OR\") {\n if (!Array.isArray(value)) at(`${here} must be a list`);\n else value.forEach((x, i) => visit(x, `${here}[${i}]`));\n } else if (k === \"NOT\") {\n visit(value, here);\n } else if (k === \"node\") {\n checkNodeWhere(nodes, node, value, here, at);\n if (jwtShape) {\n for (const ref of claimRefs(value)) {\n if (!jwtShape.has(ref))\n at(`${here}: $jwt.${ref} is not a claim of the @jwt type`);\n }\n }\n } else if (k === \"jwt\") {\n if (!isRecord(value)) at(`${here} must be an object`);\n else {\n for (const [claim, ops] of Object.entries(value)) {\n if (jwtShape && !jwtShape.has(claim)) {\n at(`${here}.${claim}: not a claim of the @jwt type`);\n }\n if (!isRecord(ops))\n at(`${here}.${claim} must be an operator object`);\n else {\n for (const op of Object.keys(ops)) {\n if (!JWT_OPS.has(op))\n at(`${here}.${claim}: unknown operator ${op}`);\n }\n }\n }\n }\n } else {\n at(`${here}: expected node, jwt, AND, OR or NOT`);\n }\n }\n };\n visit(where, \"\");\n}\n\nfunction checkNodeWhere(\n nodes: ReadonlyMap<string, NodeType>,\n node: NodeType,\n where: unknown,\n path: string,\n at: (message: string) => void,\n) {\n if (!isRecord(where)) return at(`${path} must be an object`);\n // An empty or null test would compile to nothing and grant everyone.\n if (Object.keys(where).length === 0) {\n return at(`${path} is empty: a rule must test something`);\n }\n for (const [k, value] of Object.entries(where)) {\n const here = `${path}.${k}`;\n if (value === null) {\n at(`${here} is null: a rule must test something`);\n continue;\n }\n if (k === \"AND\" || k === \"OR\") {\n if (!Array.isArray(value)) at(`${here} must be a list`);\n else\n value.forEach((x, i) =>\n checkNodeWhere(nodes, node, x, `${here}[${i}]`, at),\n );\n continue;\n }\n if (k === \"NOT\") {\n checkNodeWhere(nodes, node, value, here, at);\n continue;\n }\n const field = node.fields.get(k);\n if (!field) {\n at(`${here}: ${node.name} has no field ${k}`);\n } else if (field.kind === \"cypher\" || field.kind === \"custom\") {\n at(\n `${here}: ${field.kind === \"cypher\" ? \"@cypher\" : \"@customResolver\"} fields cannot be used in rules`,\n );\n } else if (field.kind === \"scalar\") {\n if (!isRecord(value) || Object.keys(value).length === 0) {\n at(`${here} must be a non-empty operator object`);\n } else {\n for (const [op, operand] of Object.entries(value)) {\n if (!SCALAR_WHERE_OPS.has(op)) at(`${here}: unknown operator ${op}`);\n else if (operand === null) at(`${here}.${op} is null`);\n }\n }\n } else {\n const target = nodes.get(field.target);\n if (!target) continue;\n if (!field.list) {\n checkNodeWhere(nodes, target, value, here, at);\n continue;\n }\n if (!isRecord(value)) {\n at(`${here} must be an object`);\n continue;\n }\n for (const [q, inner] of Object.entries(value)) {\n if (q === \"count\") {\n if (!isRecord(inner)) at(`${here}.count must be an operator object`);\n else {\n for (const op of Object.keys(inner)) {\n if (!COUNT_WHERE_OPS.has(op))\n at(`${here}.count: unknown operator ${op}`);\n }\n }\n } else if ([\"some\", \"all\", \"none\", \"single\"].includes(q)) {\n checkNodeWhere(nodes, target, inner, `${here}.${q}`, at);\n } else {\n at(`${here}: expected some, all, none, single or count`);\n }\n }\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// @fulltext / @vector\n// ---------------------------------------------------------------------------\n\nconst vectorQueryNames = new WeakMap<ScalarField, string>();\n\nfunction readSearch(\n typeName: string,\n label: string,\n defaultName: string,\n plural: string | undefined,\n scalars: ScalarField[],\n fulltext: Record<string, unknown> | undefined,\n problems: ModelProblem[],\n): SearchIndex[] {\n const at = (message: string) => problems.push({ type: typeName, message });\n const Plural = upperFirst(plural ?? defaultName);\n const out: SearchIndex[] = [];\n type Raw = {\n name?: string;\n fields: string[];\n analyzer: \"STANDARD\" | \"SIMPLE\";\n queryName?: string;\n };\n const raws = (fulltext?.[\"indexes\"] as Raw[] | undefined) ?? [];\n raws.forEach((raw, i) => {\n if (i > 0 && !raw.name) {\n at(\"@fulltext: every index after the first needs a name\");\n }\n const name = raw.name ?? `${snakeCase(label)}_search`;\n const fields: ScalarField[] = [];\n for (const f of raw.fields) {\n const field = scalars.find((x) => x.name === f);\n if (!field) at(`@fulltext: ${typeName} has no field ${f}`);\n else if ((field.type !== \"String\" && field.type !== \"ID\") || field.list) {\n at(`@fulltext: ${f} is not a String field`);\n } else fields.push(field);\n }\n if (raw.fields.length === 0) at(\"@fulltext: an index needs fields\");\n out.push({\n kind: \"fulltext\",\n name,\n fields,\n analyzer: raw.analyzer,\n queryName:\n raw.queryName ??\n (i === 0 ? `search${Plural}` : `search${Plural}By${upperFirst(name)}`),\n });\n });\n const vectors = scalars.filter((f) => f.vector);\n for (const f of vectors) {\n out.push({\n kind: \"vector\",\n name: `${snakeCase(label)}_${snakeCase(f.property)}_vector`,\n field: f,\n dimensions: f.vector!.dimensions,\n similarity: f.vector!.similarity,\n queryName:\n vectorQueryNames.get(f) ??\n (vectors.length === 1\n ? `similar${Plural}`\n : `similar${Plural}By${upperFirst(f.name)}`),\n });\n }\n const names = new Set<string>();\n for (const x of out) {\n if (names.has(x.name)) at(`search index name ${x.name} is used twice`);\n names.add(x.name);\n }\n return out;\n}\n\nfunction upperFirst(s: string): string {\n return s.charAt(0).toUpperCase() + s.slice(1);\n}\n\nfunction snakeCase(s: string): string {\n return s\n .replace(/([a-z0-9])([A-Z])/g, \"$1_$2\")\n .replace(/[^A-Za-z0-9]+/g, \"_\")\n .toLowerCase();\n}\n\n/** Claim names referenced as \"$jwt.name…\" strings anywhere in a value. */\nfunction claimRefs(value: unknown): string[] {\n if (typeof value === \"string\") {\n return value.startsWith(\"$jwt.\") ? [value.slice(5).split(\".\")[0]!] : [];\n }\n if (Array.isArray(value)) return value.flatMap(claimRefs);\n if (value !== null && typeof value === \"object\") {\n return Object.values(value).flatMap(claimRefs);\n }\n return [];\n}\n","// Generated type and field names, in one place so the schema builder\n// and the compiler agree.\n\nimport { lowerFirst } from \"../model/build.js\";\nimport type { NodeType, RelationshipField } from \"../model/types.js\";\n\nexport const upperFirst = (s: string) => s.charAt(0).toUpperCase() + s.slice(1);\n\nexport const names = {\n where: (type: string) => `${type}Where`,\n fieldFilter: (type: string, field: string) =>\n `${type}${upperFirst(field)}Filter`,\n sort: (type: string) => `${type}Sort`,\n connection: (type: string) => `${type}Connection`,\n edge: (type: string) => `${type}Edge`,\n aggregate: (type: string) => `${type}Aggregate`,\n match: (type: string) => `${type}Match`,\n searchConnection: (type: string) => `${type}SearchConnection`,\n searchEdge: (type: string) => `${type}SearchEdge`,\n relationFilter: (type: string, field: string) =>\n `${type}${upperFirst(field)}Filter`,\n relConnection: (type: string, field: string) =>\n `${type}${upperFirst(field)}Connection`,\n relEdge: (type: string, field: string) => `${type}${upperFirst(field)}Edge`,\n relConnectionWhere: (type: string, field: string) =>\n `${type}${upperFirst(field)}ConnectionWhere`,\n connectionField: (field: string) => `${field}Connection`,\n\n listRoot: (t: NodeType) => t.plural,\n connectionRoot: (t: NodeType) => `${t.plural}Connection`,\n aggregateRoot: (t: NodeType) => `${t.plural}Aggregate`,\n groupedRoot: (t: NodeType) => `${t.plural}Grouped`,\n singleRoot: (t: NodeType) => lowerFirst(t.name),\n};\n\n/**\n * Whether a list relationship gets its own connection/edge types (and a\n * `{ node, edge }` where): it has relationship properties.\n */\nexport function hasOwnConnection(rel: RelationshipField): boolean {\n return rel.list && rel.properties !== undefined;\n}\n\n/**\n * The connection and edge type names of a list relationship's connection:\n * its own when it has properties or aggregates (whose count covers\n * relationships too) or opts out of them, the target's otherwise.\n */\nexport function connectionTypeNames(\n rel: RelationshipField,\n target: NodeType,\n): {\n connection: string;\n edge: string;\n} {\n return hasOwnConnection(rel) || !rel.aggregate || target.aggregate\n ? {\n connection: names.relConnection(rel.owner, rel.name),\n edge: names.relEdge(rel.owner, rel.name),\n }\n : {\n connection: names.connection(rel.target),\n edge: names.edge(rel.target),\n };\n}\n","import { requestError } from \"../errors.js\";\n\n// GraphQL point inputs → the tagged point values LoraDB takes as\n// parameters. WGS-84 inputs carry longitude/latitude (height for 3D);\n// cartesian inputs carry x/y (z for 3D).\n\ntype PointInput = {\n longitude?: number;\n latitude?: number;\n height?: number | null;\n x?: number;\n y?: number;\n z?: number | null;\n};\n\nexport function toLoraPoint(input: unknown): unknown {\n if (input === null || typeof input !== \"object\") return input;\n const p = input as PointInput;\n if (typeof p.longitude === \"number\" && typeof p.latitude === \"number\") {\n const base = {\n x: p.longitude,\n y: p.latitude,\n longitude: p.longitude,\n latitude: p.latitude,\n };\n return typeof p.height === \"number\"\n ? {\n kind: \"point\",\n srid: 4979,\n crs: \"WGS-84-3D\",\n ...base,\n z: p.height,\n height: p.height,\n }\n : { kind: \"point\", srid: 4326, crs: \"WGS-84-2D\", ...base };\n }\n if (typeof p.x === \"number\" && typeof p.y === \"number\") {\n return typeof p.z === \"number\"\n ? {\n kind: \"point\",\n srid: 9157,\n crs: \"cartesian-3D\",\n x: p.x,\n y: p.y,\n z: p.z,\n }\n : { kind: \"point\", srid: 7203, crs: \"cartesian\", x: p.x, y: p.y };\n }\n return input;\n}\n\n/**\n * A stored value as the engine takes it: points converted, lists mapped,\n * `@vector` fields tagged as VECTORs (a vector index skips plain lists).\n */\nexport function toStored(\n field: {\n name: string;\n type: string;\n vector?: { dimensions: number } | undefined;\n },\n value: unknown,\n): unknown {\n if (field.vector && Array.isArray(value)) {\n if (value.length !== field.vector.dimensions) {\n throw requestError(\n \"BAD_USER_INPUT\",\n `${field.name} has ${value.length} dimensions; it needs ${field.vector.dimensions}`,\n );\n }\n return {\n kind: \"vector\",\n dimension: value.length,\n coordinateType: \"FLOAT32\",\n values: value,\n };\n }\n if (field.type !== \"Point\" && field.type !== \"CartesianPoint\") return value;\n return Array.isArray(value) ? value.map(toLoraPoint) : toLoraPoint(value);\n}\n","// Relationships to interfaces and unions. A polymorphic field is handled\n// as one concrete copy per member type, so filters, projections and\n// mutations reuse the single-target machinery; `via` points back to the\n// declared field.\n\nimport type { AbstractType, GraphModel, RelationshipField } from \"./types.js\";\n\nconst copies = new WeakMap<RelationshipField, RelationshipField[]>();\n\nexport function isPolymorphic(\n model: GraphModel,\n rel: RelationshipField,\n): boolean {\n return model.abstracts.has(rel.target);\n}\n\n/** The field itself, or one concrete copy per member of its target. */\nexport function memberFields(\n model: GraphModel,\n rel: RelationshipField,\n): RelationshipField[] {\n if (!isPolymorphic(model, rel)) return [rel];\n let list = copies.get(rel);\n if (!list) {\n list = rel.members.map((member) => ({\n ...rel,\n target: member,\n members: [member],\n via: rel,\n }));\n copies.set(rel, list);\n }\n return list;\n}\n\n/** The declared field a member copy came from (or the field itself). */\nexport function declared(rel: RelationshipField): RelationshipField {\n return rel.via ?? rel;\n}\n\nexport function abstractOf(\n model: GraphModel,\n rel: RelationshipField,\n): AbstractType | undefined {\n return model.abstracts.get(rel.target);\n}\n","// `where` inputs → predicates. Specialised to the input actually supplied:\n// an absent or null operator adds nothing to the statement (rule 7), so\n// each variant keeps its predicates visible to the planner.\n\nimport { requestError } from \"../errors.js\";\nimport { toLoraPoint } from \"../model/points.js\";\nimport { abstractOf, memberFields } from \"../model/relations.js\";\nimport type {\n AbstractType,\n NodeType,\n RelationshipField,\n RelationshipPropertiesType,\n ScalarField,\n} from \"../model/types.js\";\nimport {\n distinctCount,\n listAggregate,\n type ListAggregate,\n} from \"./aggregate.js\";\nimport {\n authFilter,\n checkAuthentication,\n checkFieldAuthentication,\n fieldValidate,\n} from \"./auth.js\";\nimport { bind, freshVar, type CompileContext } from \"./context.js\";\nimport {\n and,\n bin,\n fn,\n isNull,\n lit,\n not,\n or,\n prop,\n v,\n type BinaryOp,\n type Expr,\n type Pattern,\n} from \"./cypher.js\";\n\ntype Where = Record<string, unknown>;\n\nconst SCALAR_OPS: Record<string, BinaryOp> = {\n eq: \"=\",\n in: \"IN\",\n lt: \"<\",\n lte: \"<=\",\n gt: \">\",\n gte: \">=\",\n contains: \"CONTAINS\",\n startsWith: \"STARTS WITH\",\n endsWith: \"ENDS WITH\",\n};\n\nconst COUNT_OPS: Record<string, BinaryOp> = {\n eq: \"=\",\n lt: \"<\",\n lte: \"<=\",\n gt: \">\",\n gte: \">=\",\n};\n\n/** Compiles one `where` key's value; undefined when it adds nothing. */\ntype KeyCompiler = (value: unknown) => Expr | undefined;\n\nexport function compileNodeWhere(\n ctx: CompileContext,\n node: NodeType,\n variable: string,\n where: Where | null | undefined,\n): Expr | undefined {\n return compileWhere(ctx, where, nodeKeys(ctx, node, variable));\n}\n\nfunction nodeKeys(\n ctx: CompileContext,\n node: NodeType,\n variable: string,\n): (key: string) => KeyCompiler | undefined {\n return (key) => {\n const f = node.fields.get(key);\n if (f?.kind === \"scalar\") {\n // Filtering on a field reveals it: the same rules as reading it.\n checkFieldAuthentication(ctx, node.name, f);\n const rule = fieldValidate(ctx, node, f, variable, \"READ\");\n return (value) => {\n const pred = scalarPredicate(\n ctx,\n prop(v(variable), f.property),\n value as Where,\n );\n return pred && and(rule, pred);\n };\n }\n if (f?.kind === \"relationship\") {\n checkFieldAuthentication(ctx, node.name, f);\n // Filtering through the field reveals it, as reading it does.\n const rule = fieldValidate(ctx, node, f, variable, \"READ\");\n return (value) => {\n const pred = relationshipPredicate(ctx, variable, f, value as Where);\n return pred && and(rule, pred);\n };\n }\n if (f?.kind === \"cypher\" && f.computed) {\n checkFieldAuthentication(ctx, node.name, f);\n const bound = ctx.computed.get(`${variable}\\0${f.name}`);\n if (!bound) {\n throw requestError(\n \"BAD_USER_INPUT\",\n `${node.name}.${f.name} is computed by @cypher: filter by it in a root field's where, not through a relationship or search`,\n );\n }\n const rule = fieldValidate(ctx, node, f, variable, \"READ\");\n return (value) => {\n const pred = scalarPredicate(ctx, v(bound), value as Where);\n return pred && and(rule, pred);\n };\n }\n // `<field>Connection`: quantifiers over { node, edge } of a list\n // relationship with properties.\n if (key.endsWith(\"Connection\")) {\n const rel = node.fields.get(key.slice(0, -\"Connection\".length));\n if (rel?.kind === \"relationship\" && rel.list && rel.properties) {\n checkFieldAuthentication(ctx, node.name, rel);\n const rule = fieldValidate(ctx, node, rel, variable, \"READ\");\n return (value) => {\n const pred = connectionPredicate(ctx, variable, rel, value as Where);\n return pred && and(rule, pred);\n };\n }\n }\n return undefined;\n };\n}\n\nexport function compilePropsWhere(\n ctx: CompileContext,\n props: RelationshipPropertiesType,\n variable: string,\n where: Where | null | undefined,\n): Expr | undefined {\n return compileWhere(ctx, where, (key) => {\n const f = props.fields.get(key);\n return f\n ? (value) =>\n scalarPredicate(ctx, prop(v(variable), f.property), value as Where)\n : undefined;\n });\n}\n\nfunction compileWhere(\n ctx: CompileContext,\n where: Where | null | undefined,\n lookup: (key: string) => KeyCompiler | undefined,\n): Expr | undefined {\n if (!where) return undefined;\n const parts: Array<Expr | undefined> = [];\n for (const [key, value] of Object.entries(where)) {\n if (value === null || value === undefined) continue;\n if (key === \"AND\") {\n for (const w of value as Where[]) {\n parts.push(compileWhere(ctx, w, lookup));\n }\n } else if (key === \"OR\") {\n const branches = (value as Where[]).map((w) =>\n compileWhere(ctx, w, lookup),\n );\n // An empty branch matches everything, so the OR is vacuous; no\n // branches at all match nothing.\n if (branches.length === 0) parts.push(lit(false));\n else if (branches.every((b) => b !== undefined)) {\n parts.push(or(...branches));\n }\n } else if (key === \"NOT\") {\n // NOT of a filter that matches everything matches nothing.\n const inner = compileWhere(ctx, value as Where, lookup);\n parts.push(inner ? not(inner) : lit(false));\n } else {\n parts.push(lookup(key)?.(value));\n }\n }\n return and(...parts);\n}\n\nfunction scalarPredicate(\n ctx: CompileContext,\n target: Expr,\n ops: Where,\n): Expr | undefined {\n const parts: Expr[] = [];\n for (const [op, value] of Object.entries(ops)) {\n if (value === null || value === undefined) continue;\n switch (op) {\n case \"withinBBox\": {\n const box = value as { lowerLeft: unknown; upperRight: unknown };\n parts.push(\n fn(\n \"geo.within_bbox\",\n target,\n bind(ctx, toLoraPoint(box.lowerLeft)),\n bind(ctx, toLoraPoint(box.upperRight)),\n ),\n );\n continue;\n }\n case \"distance\": {\n const d = value as { from: unknown; lte: number };\n parts.push(\n bin(\n \"<=\",\n fn(\"geo.distance\", target, bind(ctx, toLoraPoint(d.from))),\n bind(ctx, d.lte),\n ),\n );\n continue;\n }\n case \"includes\":\n parts.push(bin(\"IN\", bind(ctx, value), target));\n continue;\n case \"isNull\":\n parts.push(isNull(target, value === false));\n continue;\n case \"caseInsensitive\": {\n const lowered = fn(\"toLower\", target);\n for (const [ciOp, ciValue] of Object.entries(value as Where)) {\n if (ciValue === null || ciValue === undefined) continue;\n const cypherOp = SCALAR_OPS[ciOp];\n if (!cypherOp) continue;\n const lower = Array.isArray(ciValue)\n ? ciValue.map((s) => String(s).toLowerCase())\n : String(ciValue).toLowerCase();\n parts.push(bin(cypherOp, lowered, bind(ctx, lower)));\n }\n continue;\n }\n }\n const cypherOp = SCALAR_OPS[op];\n if (!cypherOp) continue;\n parts.push(bin(cypherOp, target, bind(ctx, value)));\n }\n return and(...parts);\n}\n\n/**\n * `(from)-[:TYPE]->(to:Target)` for a relationship field. Reads follow an\n * UNDIRECTED relationship both ways.\n */\nexport function relationshipPattern(\n from: string,\n rel: RelationshipField,\n targetLabel: string,\n to: string,\n relVariable?: string,\n): Pattern {\n return {\n start: { variable: from, labels: [] },\n hops: [\n {\n rel: {\n ...(relVariable !== undefined ? { variable: relVariable } : {}),\n type: rel.type,\n direction:\n rel.queryDirection === \"UNDIRECTED\" ? \"BOTH\" : rel.direction,\n },\n node: { variable: to, labels: [targetLabel] },\n },\n ],\n };\n}\n\n/**\n * Related nodes as a pattern comprehension:\n * `[(from)-[r:T]->(x:Target) WHERE <visible> AND <where> | <projection>]`.\n */\nfunction related(\n ctx: CompileContext,\n from: string,\n rel: RelationshipField,\n where: (x: string, r: string) => Expr | undefined,\n projection: (x: string, r: string) => Expr,\n): Expr {\n const target = ctx.model.nodes.get(rel.target)!;\n const x = freshVar(ctx, `${from}_${rel.name}`);\n const r = freshVar(ctx, `${x}_rel`);\n return {\n kind: \"comprehension\",\n pattern: relationshipPattern(from, rel, target.labels[0]!, x, r),\n // Related nodes the reader may not see do not count, in any quantifier.\n where: and(authFilter(ctx, target, x, \"READ\"), where(x, r)),\n projection: projection(x, r),\n };\n}\n\n/**\n * The `where` of an interface or union, for one member type: an\n * interface's filters apply to every implementation (and `typename` picks\n * implementations); a union's where names members and leaves out the\n * ones it does not name. False when `where` excludes the member.\n */\nexport function compileMemberWhere(\n ctx: CompileContext,\n abstract: AbstractType | undefined,\n member: NodeType,\n variable: string,\n where: Where | null | undefined,\n): Expr | undefined | false {\n if (!abstract) return compileNodeWhere(ctx, member, variable, where);\n if (!where) return undefined;\n if (abstract.kind === \"union\") {\n const named = Object.entries(where).filter(([, w]) => w != null);\n if (named.length === 0) return undefined;\n const mine = where[member.name] as Where | null | undefined;\n if (mine == null) return false;\n return compileNodeWhere(ctx, member, variable, mine);\n }\n const { typename, ...rest } = where;\n if (Array.isArray(typename) && !typename.includes(member.name)) return false;\n // `typename` may also sit inside AND / OR / NOT: there it is a constant\n // per member, true or false (not absent: NOT must flip it).\n const keys = nodeKeys(ctx, member, variable);\n return compileWhere(ctx, rest, (key) =>\n key === \"typename\"\n ? (value) =>\n Array.isArray(value) ? lit(value.includes(member.name)) : undefined\n : keys(key),\n );\n}\n\nfunction relationshipPredicate(\n ctx: CompileContext,\n variable: string,\n rel: RelationshipField,\n value: Where,\n): Expr | undefined {\n const abstract = abstractOf(ctx.model, rel);\n const members = memberFields(ctx.model, rel).map((field) => {\n const node = ctx.model.nodes.get(field.target)!;\n checkAuthentication(ctx, node, \"READ\");\n ctx.reads.labels.add(node.labels[0]!);\n return { field, node };\n });\n ctx.reads.relationships.add(rel.type);\n const memberWhere = (node: NodeType, x: string, where: Where | undefined) =>\n compileMemberWhere(ctx, abstract, node, x, where);\n const sum = (parts: Expr[]): Expr =>\n parts.length === 0 ? lit(0) : parts.reduce((a, b) => bin(\"+\", a, b));\n\n // size([(this)-[:T]->(x:Target) WHERE pred | 1]): LoraDB has no\n // EXISTS { } subquery, and a pattern comprehension beats OPTIONAL MATCH.\n // Over an interface or union, the members' counts add up.\n const count = (where: Where | undefined) =>\n sum(\n members.flatMap(({ field, node }) => {\n const probe = memberWhere(node, \"probe\", where);\n if (probe === false) return [];\n return [\n fn(\n \"size\",\n related(\n ctx,\n variable,\n field,\n (x) => memberWhere(node, x, where) || undefined,\n () => lit(1),\n ),\n ),\n ];\n }),\n );\n // Exact counts count related nodes, once each, however many\n // relationships lead to them.\n const distinct = (where: Where | undefined) => {\n const lists = members.flatMap(({ field, node }) => {\n if (memberWhere(node, \"probe\", where) === false) return [];\n return [\n related(\n ctx,\n variable,\n field,\n (x) => memberWhere(node, x, where) || undefined,\n (x) => ({\n kind: \"list\",\n items: [lit(node.name), prop(v(x), node.key.property)],\n }),\n ),\n ];\n });\n if (lists.length === 0) return lit(0);\n return distinctCount(\n ctx,\n lists.reduce((a, b) => bin(\"+\", a, b)),\n );\n };\n // A quantifier over an empty (or all-null) filter is left out, like any\n // absent filter; `count: { gt: 0 }` asks for \"has any\".\n const nonEmpty = (where: Where): boolean =>\n members.some(({ node }) => {\n const probe = { ...ctx, params: {}, vars: new Set(ctx.vars) };\n const w = compileMemberWhere(probe, abstract, node, \"probe\", where);\n return w !== undefined;\n });\n\n if (!rel.list) {\n // A single relationship filters by its target directly.\n return nonEmpty(value) ? bin(\">\", count(value), lit(0)) : undefined;\n }\n\n const parts: Array<Expr | undefined> = [];\n for (const [quantifier, inner] of Object.entries(value)) {\n if (inner === null || inner === undefined) continue;\n const w = inner as Where;\n switch (quantifier) {\n case \"some\":\n if (nonEmpty(w)) parts.push(bin(\">\", count(w), lit(0)));\n break;\n case \"none\":\n if (nonEmpty(w)) parts.push(bin(\"=\", count(w), lit(0)));\n break;\n case \"single\":\n if (nonEmpty(w)) parts.push(bin(\"=\", distinct(w), lit(1)));\n break;\n case \"all\": {\n // Every related node matches: none fails. Unknown (null) counts\n // as failing, so `all` never holds on missing properties. An\n // empty set satisfies `all`, as in logic and Cypher's all(). A\n // member a union's where leaves out fails.\n if (!nonEmpty(w)) break;\n const failing = sum(\n members.map(({ field, node }) =>\n fn(\n \"size\",\n related(\n ctx,\n variable,\n field,\n (x) => {\n const pred = memberWhere(node, x, w);\n if (pred === false) return undefined;\n return pred\n ? not(fn(\"coalesce\", pred, lit(false)))\n : lit(false);\n },\n () => lit(1),\n ),\n ),\n ),\n );\n parts.push(bin(\"=\", failing, lit(0)));\n break;\n }\n case \"count\":\n parts.push(compareCount(ctx, rel, distinct(undefined), w));\n break;\n case \"aggregate\":\n if (!abstract) parts.push(aggregatePredicate(ctx, variable, rel, w));\n break;\n }\n }\n return and(...parts);\n}\n\nfunction compareCount(\n ctx: CompileContext,\n rel: RelationshipField,\n total: Expr,\n ops: Where,\n): Expr | undefined {\n const parts: Expr[] = [];\n for (const [op, n] of Object.entries(ops)) {\n if (n === null || n === undefined) continue;\n const cypherOp = COUNT_OPS[op];\n if (!cypherOp) continue;\n if (!Number.isInteger(n) || (n as number) < 0) {\n throw requestError(\n \"BAD_USER_INPUT\",\n `${rel.name}.count.${op} must be a non-negative integer`,\n );\n }\n parts.push(bin(cypherOp, total, bind(ctx, n)));\n }\n return and(...parts);\n}\n\n/**\n * `followersConnection: { some: { node: {...}, edge: {...} } }`: the\n * quantifiers, over pairs of related node and relationship.\n */\nfunction connectionPredicate(\n ctx: CompileContext,\n variable: string,\n rel: RelationshipField,\n value: Where,\n): Expr | undefined {\n const target = ctx.model.nodes.get(rel.target)!;\n const props = ctx.model.relationshipProperties.get(rel.properties!)!;\n checkAuthentication(ctx, target, \"READ\");\n ctx.reads.labels.add(target.labels[0]!);\n ctx.reads.relationships.add(rel.type);\n const pairWhere = (w: Where) => (x: string, r: string) =>\n and(\n compileNodeWhere(ctx, target, x, w[\"node\"] as Where | undefined),\n compilePropsWhere(ctx, props, r, w[\"edge\"] as Where | undefined),\n );\n const count = (w: Where, negate: boolean) =>\n fn(\n \"size\",\n related(\n ctx,\n variable,\n rel,\n (x, r) => {\n const p = pairWhere(w)(x, r)!;\n return negate ? not(fn(\"coalesce\", p, lit(false))) : p;\n },\n () => lit(1),\n ),\n );\n const parts: Expr[] = [];\n for (const [quantifier, inner] of Object.entries(value)) {\n if (inner === null || inner === undefined) continue;\n const w = inner as Where;\n if (!nonEmptyPair(ctx, target, props, w)) continue;\n switch (quantifier) {\n case \"some\":\n parts.push(bin(\">\", count(w, false), lit(0)));\n break;\n case \"none\":\n parts.push(bin(\"=\", count(w, false), lit(0)));\n break;\n case \"single\":\n parts.push(bin(\"=\", count(w, false), lit(1)));\n break;\n case \"all\":\n parts.push(bin(\"=\", count(w, true), lit(0)));\n break;\n }\n }\n return and(...parts);\n}\n\nfunction nonEmptyPair(\n ctx: CompileContext,\n target: NodeType,\n props: RelationshipPropertiesType,\n w: Where,\n): boolean {\n const probe = { ...ctx, params: {}, vars: new Set(ctx.vars) };\n return (\n and(\n compileNodeWhere(probe, target, \"x\", w[\"node\"] as Where | undefined),\n compilePropsWhere(probe, props, \"r\", w[\"edge\"] as Where | undefined),\n ) !== undefined\n );\n}\n\nconst AGGREGATE_KEYS = new Set<ListAggregate>([\n \"min\",\n \"max\",\n \"avg\",\n \"sum\",\n \"shortestLength\",\n \"longestLength\",\n \"averageLength\",\n]);\n\n/**\n * `followers: { aggregate: { node: { age: { avg: { gt: 30 } } }, edge: … } }`:\n * aggregates of related values per parent, compared to bounds.\n */\nfunction aggregatePredicate(\n ctx: CompileContext,\n variable: string,\n rel: RelationshipField,\n value: Where,\n): Expr | undefined {\n const target = ctx.model.nodes.get(rel.target)!;\n const props = rel.properties\n ? ctx.model.relationshipProperties.get(rel.properties)\n : undefined;\n const parts: Array<Expr | undefined> = [];\n const side = (\n where: Where | undefined,\n lookup: (name: string) => ScalarField | undefined,\n onEdge: boolean,\n ) => {\n for (const [fieldName, aggs] of Object.entries(where ?? {})) {\n const field = lookup(fieldName);\n if (!field || aggs === null || aggs === undefined) continue;\n if (!onEdge) {\n checkFieldAuthentication(ctx, target.name, field);\n // An aggregate over values some rows may not read would reveal\n // them: refused unless the claims alone settle the rules.\n const probe = { ...ctx, params: {}, vars: new Set(ctx.vars) };\n if (fieldValidate(probe, target, field, \"probe\", \"READ\")) {\n throw requestError(\n \"FORBIDDEN\",\n `cannot aggregate ${target.name}.${field.name}: it has row-level read rules`,\n );\n }\n }\n for (const [agg, bounds] of Object.entries(aggs as Where)) {\n if (bounds === null || bounds === undefined) continue;\n if (!AGGREGATE_KEYS.has(agg as ListAggregate)) continue;\n const values = related(\n ctx,\n variable,\n rel,\n () => undefined,\n (x, r) => prop(v(onEdge ? r : x), field.property),\n );\n const aggregate = listAggregate(ctx, agg as ListAggregate, values, {\n duration: field.type === \"Duration\",\n });\n parts.push(scalarPredicate(ctx, aggregate, bounds as Where));\n }\n }\n };\n side(\n value[\"node\"] as Where | undefined,\n (n) => {\n const f = target.fields.get(n);\n return f?.kind === \"scalar\" ? f : undefined;\n },\n false,\n );\n if (props) {\n side(value[\"edge\"] as Where | undefined, (n) => props.fields.get(n), true);\n }\n if (value[\"count\"]) {\n const total = distinctCount(\n ctx,\n related(\n ctx,\n variable,\n rel,\n () => undefined,\n (x) => prop(v(x), target.key.property),\n ),\n );\n parts.push(compareCount(ctx, rel, total, value[\"count\"] as Where));\n }\n return and(...parts);\n}\n","// @authentication and @authorization, compiled into the statements.\n//\n// A rule is `{ node, jwt, AND, OR, NOT }`. The `jwt` half only reads the\n// request's claims, so it is evaluated here, in JavaScript: role checks\n// fold to true or false and never reach Cypher. The `node` half becomes a\n// predicate, with `\"$jwt.path\"` strings bound as parameters. A claim a rule\n// needs but the request lacks makes that rule deny.\n\nimport { requestError } from \"../errors.js\";\nimport type {\n AuthOperation,\n Authorization,\n AuthorizationValidateRule,\n AuthorizationWhere,\n NodeType,\n} from \"../model/types.js\";\nimport { and, lit, not, or, type Expr } from \"./cypher.js\";\nimport type { CompileContext } from \"./context.js\";\nimport { compileNodeWhere } from \"./filter.js\";\n\ntype Where = Record<string, unknown>;\ntype Folded = Expr | boolean;\n\n/** Throws UNAUTHENTICATED when reading `field` needs a jwt the request lacks. */\nexport function checkFieldAuthentication(\n ctx: CompileContext,\n owner: string,\n field: {\n name: string;\n authentication: ReadonlySet<AuthOperation> | undefined;\n authenticationJwt?: AuthorizationWhere | undefined;\n },\n op: AuthOperation = \"READ\",\n): void {\n if (ctx.inAuth || !field.authentication?.has(op)) return;\n if (!ctx.jwt || !claimsSatisfy(ctx, field.authenticationJwt)) {\n throw requestError(\n \"UNAUTHENTICATED\",\n `${owner}.${field.name} needs an authenticated request`,\n );\n }\n}\n\n/** Claims `@authentication(jwt:)` demands; true when there is none. */\nfunction claimsSatisfy(\n ctx: CompileContext,\n where: AuthorizationWhere | undefined,\n): boolean {\n if (!where) return true;\n try {\n return compileRulePart(ctx, undefined, \"\", { jwt: where }) === true;\n } catch (err) {\n if (err instanceof MissingClaim) return false;\n throw err;\n }\n}\n\n/** Throws UNAUTHENTICATED when `op` on `node` needs a jwt the request lacks. */\nexport function checkAuthentication(\n ctx: CompileContext,\n node: NodeType,\n op: AuthOperation,\n): void {\n if (\n !ctx.inAuth &&\n node.authentication?.has(op) &&\n (!ctx.jwt || !claimsSatisfy(ctx, node.authenticationJwt))\n ) {\n throw requestError(\n \"UNAUTHENTICATED\",\n `${op.toLowerCase()} on ${node.name} needs an authenticated request`,\n );\n }\n}\n\n/**\n * The filter `op` applies to `variable` (a `node` of that type): nodes\n * failing it are invisible. Rules grant: any passing rule admits the node.\n * Undefined when the type has no filter rule for `op`.\n */\nexport function authFilter(\n ctx: CompileContext,\n node: NodeType,\n variable: string,\n op: AuthOperation,\n): Expr | undefined {\n if (ctx.inAuth) return undefined;\n const rules = (node.authorization?.filter ?? []).filter((r) =>\n r.operations.has(op),\n );\n if (rules.length === 0) return undefined;\n const folded = rules.map((r) =>\n r.requireAuthentication && !ctx.jwt\n ? false\n : compileRule(ctx, node, variable, r.where),\n );\n return toExpr(foldOr(folded));\n}\n\n/**\n * The condition `op` must satisfy at `when`, or the request fails with\n * FORBIDDEN. Undefined when no rule applies; throws right away when the\n * claims alone already decide against the request.\n */\nexport function authValidate(\n ctx: CompileContext,\n node: NodeType,\n variable: string,\n op: AuthOperation,\n when: \"BEFORE\" | \"AFTER\",\n): Expr | undefined {\n return validateRules(\n ctx,\n node,\n variable,\n op,\n (node.authorization?.validate ?? []).filter(\n (r) => r.operations.has(op) && r.when.has(when),\n ),\n );\n}\n\n/**\n * Field-level validate rules for `op` on `field` of `variable`: the\n * condition reading (or writing) the field needs. Undefined when none.\n */\nexport function fieldValidate(\n ctx: CompileContext,\n node: NodeType,\n field: { authorization?: Authorization | undefined },\n variable: string,\n op: AuthOperation,\n when: \"BEFORE\" | \"AFTER\" = \"BEFORE\",\n): Expr | undefined {\n return validateRules(\n ctx,\n node,\n variable,\n op,\n (field.authorization?.validate ?? []).filter(\n (r) => r.operations.has(op) && r.when.has(when),\n ),\n );\n}\n\nfunction validateRules(\n ctx: CompileContext,\n node: NodeType,\n variable: string,\n op: AuthOperation,\n rules: readonly AuthorizationValidateRule[],\n): Expr | undefined {\n if (ctx.inAuth || rules.length === 0) return undefined;\n if (rules.every((r) => r.requireAuthentication) && !ctx.jwt) {\n throw requestError(\n \"UNAUTHENTICATED\",\n `${op.toLowerCase()} on ${node.name} needs an authenticated request`,\n );\n }\n const folded = foldOr(\n rules.map((r) =>\n r.requireAuthentication && !ctx.jwt\n ? false\n : compileRule(ctx, node, variable, r.where),\n ),\n );\n if (folded === false) throw forbidden(node, op);\n return toExpr(folded);\n}\n\nexport function forbidden(node: NodeType, op: AuthOperation) {\n return requestError(\n \"FORBIDDEN\",\n `not allowed to ${op.toLowerCase()} this ${node.name}`,\n );\n}\n\n/** A rule needs a claim the request lacks: the whole rule denies. */\nclass MissingClaim extends Error {}\n\nfunction compileRule(\n ctx: CompileContext,\n node: NodeType,\n variable: string,\n where: AuthorizationWhere,\n): Folded {\n try {\n return compileRulePart(ctx, node, variable, where);\n } catch (err) {\n // Caught at the rule, not inside it: a NOT cannot turn a missing\n // claim into a grant.\n if (err instanceof MissingClaim) return false;\n throw err;\n }\n}\n\n/**\n * A test that needs a claim (or context value) the request lacks is\n * unknown. Unknown is false where it stands, but a NOT cannot turn it into\n * true: under a NOT, it makes the whole negated branch false, up to the\n * nearest AND / OR outside every NOT (or the rule itself).\n */\nfunction compileRulePart(\n ctx: CompileContext,\n node: NodeType | undefined,\n variable: string,\n where: AuthorizationWhere,\n underNot = false,\n): Folded {\n const child = (w: Where, negated = underNot): Folded => {\n if (negated) return compileRulePart(ctx, node, variable, w, true);\n try {\n return compileRulePart(ctx, node, variable, w, false);\n } catch (err) {\n if (err instanceof MissingClaim) return false;\n throw err;\n }\n };\n const parts: Folded[] = [];\n for (const [key, value] of Object.entries(where)) {\n if (value === null || value === undefined) continue;\n if (key === \"AND\") {\n parts.push(foldAnd((value as Where[]).map((w) => child(w))));\n } else if (key === \"OR\") {\n parts.push(foldOr((value as Where[]).map((w) => child(w))));\n } else if (key === \"NOT\") {\n const inner = compileRulePart(ctx, node, variable, value as Where, true);\n parts.push(typeof inner === \"boolean\" ? !inner : not(inner));\n } else if (key === \"jwt\") {\n parts.push(matchClaims(ctx, value as Where));\n } else if (key === \"node\" && node) {\n const bound = substitute(value, ctx);\n if (!bound.ok) throw new MissingClaim();\n const wasInAuth = ctx.inAuth;\n ctx.inAuth = true;\n try {\n const pred = compileNodeWhere(\n ctx,\n node,\n variable,\n bound.value as Where,\n );\n // Rules are checked non-empty at startup; if one still compiles\n // to nothing, deny rather than grant.\n parts.push(pred ?? false);\n } finally {\n ctx.inAuth = wasInAuth;\n }\n }\n }\n return foldAnd(parts);\n}\n\nfunction foldAnd(parts: Folded[]): Folded {\n if (parts.some((p) => p === false)) return false;\n const exprs = parts.filter((p): p is Expr => typeof p !== \"boolean\");\n return and(...exprs) ?? true;\n}\n\nfunction foldOr(parts: Folded[]): Folded {\n if (parts.some((p) => p === true)) return true;\n const exprs = parts.filter((p): p is Expr => typeof p !== \"boolean\");\n return or(...exprs) ?? false;\n}\n\nfunction toExpr(f: Folded): Expr | undefined {\n if (f === true) return undefined;\n if (f === false) return lit(false);\n return f;\n}\n\n// ---------------------------------------------------------------------------\n// Claims\n// ---------------------------------------------------------------------------\n\n/**\n * A claim by name. With a `@jwt` type, the name's first segment maps to its\n * `@jwtClaim(path:)`, whether the token arrived decoded or not.\n */\nexport function claim(ctx: CompileContext, path: string): unknown {\n const [head, ...rest] = path.split(\".\");\n const mapped = ctx.model.jwt?.get(head!) ?? head!;\n return lookupPath(ctx.jwt, [mapped, ...rest].join(\".\"));\n}\n\n/**\n * A value by dotted path, through own properties only: `$context.x` must\n * not reach `constructor`, `__proto__` or anything else inherited.\n */\nexport function lookupPath(root: unknown, path: string): unknown {\n let cur: unknown = root;\n for (const part of path.split(\".\")) {\n if (cur === null || typeof cur !== \"object\" || !Object.hasOwn(cur, part)) {\n return undefined;\n }\n cur = (cur as Record<string, unknown>)[part];\n }\n return cur;\n}\n\n/**\n * Structural equality for claim values: arrays in order, objects by own\n * keys in any order, bigints and numbers by value.\n */\nexport function sameValue(a: unknown, b: unknown): boolean {\n if (typeof a === \"bigint\" || typeof b === \"bigint\") {\n return (\n (typeof a === \"bigint\" || typeof a === \"number\") &&\n (typeof b === \"bigint\" || typeof b === \"number\") &&\n a == b\n );\n }\n if (a === b) return true;\n if (\n a === null ||\n b === null ||\n typeof a !== \"object\" ||\n typeof b !== \"object\"\n ) {\n return false;\n }\n if (Array.isArray(a) || Array.isArray(b)) {\n return (\n Array.isArray(a) &&\n Array.isArray(b) &&\n a.length === b.length &&\n a.every((x, i) => sameValue(x, b[i]))\n );\n }\n const ka = Object.keys(a);\n const kb = Object.keys(b);\n return (\n ka.length === kb.length &&\n ka.every(\n (k) =>\n Object.hasOwn(b, k) &&\n sameValue(\n (a as Record<string, unknown>)[k],\n (b as Record<string, unknown>)[k],\n ),\n )\n );\n}\n\n/**\n * Replace `\"$jwt.path\"` and `\"$context.path\"` strings; not ok when a\n * referenced value is absent.\n */\nfunction substitute(\n value: unknown,\n ctx: CompileContext,\n): { ok: boolean; value: unknown } {\n if (\n typeof value === \"string\" &&\n (value.startsWith(\"$jwt.\") || value.startsWith(\"$context.\"))\n ) {\n let v: unknown;\n if (value.startsWith(\"$jwt.\")) v = claim(ctx, value.slice(5));\n else {\n v = lookupPath(ctx.requestContext, value.slice(9));\n ctx.contextReads.push([value.slice(9), v]);\n }\n return v === undefined || v === null\n ? { ok: false, value: undefined }\n : { ok: true, value: v };\n }\n if (Array.isArray(value)) {\n const items = value.map((x) => substitute(x, ctx));\n return {\n ok: items.every((i) => i.ok),\n value: items.map((i) => i.value),\n };\n }\n if (value !== null && typeof value === \"object\") {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value)) {\n const r = substitute(v, ctx);\n if (!r.ok) return { ok: false, value: undefined };\n out[k] = r.value;\n }\n return { ok: true, value: out };\n }\n return { ok: true, value };\n}\n\nfunction matchClaims(ctx: CompileContext, where: Where): boolean {\n if (!ctx.jwt) throw new MissingClaim();\n return Object.entries(where).every(([path, ops]) => {\n const v = claim(ctx, path);\n return Object.entries(ops as Where).every(([op, expected]) => {\n // A test of a claim the token lacks cannot pass or fail: the whole\n // rule denies, even under NOT. Only `exists` asks about absence.\n if (op !== \"exists\" && (v === undefined || v === null)) {\n throw new MissingClaim();\n }\n return claimOp(v, op, expected);\n });\n });\n}\n\nfunction claimOp(v: unknown, op: string, expected: unknown): boolean {\n switch (op) {\n case \"exists\":\n return (v !== undefined && v !== null) === expected;\n case \"eq\":\n return v !== undefined && sameValue(v, expected);\n case \"in\":\n return Array.isArray(expected) && expected.some((e) => sameValue(e, v));\n case \"includes\":\n return Array.isArray(v) && v.some((x) => sameValue(x, expected));\n case \"contains\":\n return typeof v === \"string\" && v.includes(String(expected));\n case \"startsWith\":\n return typeof v === \"string\" && v.startsWith(String(expected));\n case \"endsWith\":\n return typeof v === \"string\" && v.endsWith(String(expected));\n case \"lt\":\n return typeof v === \"number\" && v < (expected as number);\n case \"lte\":\n return typeof v === \"number\" && v <= (expected as number);\n case \"gt\":\n return typeof v === \"number\" && v > (expected as number);\n case \"gte\":\n return typeof v === \"number\" && v >= (expected as number);\n default:\n return false;\n }\n}\n","// HMAC-SHA-256, synchronous and dependency-free: cursors are signed and\n// checked inside resolvers and the compiler, which run in Node and in\n// browsers (the WASM binding), where WebCrypto is async only.\n\nconst K = new Uint32Array([\n 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1,\n 0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,\n 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, 0xe49b69c1, 0xefbe4786,\n 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,\n 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147,\n 0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,\n 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, 0xa2bfe8a1, 0xa81a664b,\n 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,\n 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a,\n 0x5b9cca4f, 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,\n 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2,\n]);\n\nexport function sha256(data: Uint8Array): Uint8Array {\n const h = new Uint32Array([\n 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c,\n 0x1f83d9ab, 0x5be0cd19,\n ]);\n // Message, a 1 bit, zeros, and the bit length: a multiple of 64 bytes.\n const padded = new Uint8Array(Math.ceil((data.length + 9) / 64) * 64);\n padded.set(data);\n padded[data.length] = 0x80;\n const view = new DataView(padded.buffer);\n const bits = data.length * 8;\n view.setUint32(padded.length - 8, Math.floor(bits / 2 ** 32));\n view.setUint32(padded.length - 4, bits >>> 0);\n const w = new Uint32Array(64);\n for (let off = 0; off < padded.length; off += 64) {\n for (let i = 0; i < 16; i++) w[i] = view.getUint32(off + i * 4);\n for (let i = 16; i < 64; i++) {\n const a = w[i - 15]!;\n const b = w[i - 2]!;\n const s0 = rotr(a, 7) ^ rotr(a, 18) ^ (a >>> 3);\n const s1 = rotr(b, 17) ^ rotr(b, 19) ^ (b >>> 10);\n w[i] = (w[i - 16]! + s0 + w[i - 7]! + s1) >>> 0;\n }\n let [a, b, c, d, e, f, g, hh] = h as unknown as number[];\n for (let i = 0; i < 64; i++) {\n const t1 =\n (hh! +\n (rotr(e!, 6) ^ rotr(e!, 11) ^ rotr(e!, 25)) +\n ((e! & f!) ^ (~e! & g!)) +\n K[i]! +\n w[i]!) >>>\n 0;\n const t2 =\n ((rotr(a!, 2) ^ rotr(a!, 13) ^ rotr(a!, 22)) +\n ((a! & b!) ^ (a! & c!) ^ (b! & c!))) >>>\n 0;\n hh = g;\n g = f;\n f = e;\n e = (d! + t1) >>> 0;\n d = c;\n c = b;\n b = a;\n a = (t1 + t2) >>> 0;\n }\n h[0] = h[0]! + a!;\n h[1] = h[1]! + b!;\n h[2] = h[2]! + c!;\n h[3] = h[3]! + d!;\n h[4] = h[4]! + e!;\n h[5] = h[5]! + f!;\n h[6] = h[6]! + g!;\n h[7] = h[7]! + hh!;\n }\n const out = new Uint8Array(32);\n const outView = new DataView(out.buffer);\n for (let i = 0; i < 8; i++) outView.setUint32(i * 4, h[i]!);\n return out;\n}\n\nexport function hmacSha256(key: Uint8Array, message: Uint8Array): Uint8Array {\n const block = new Uint8Array(64);\n block.set(key.length > 64 ? sha256(key) : key);\n const inner = new Uint8Array(64 + message.length);\n const outer = new Uint8Array(64 + 32);\n for (let i = 0; i < 64; i++) {\n inner[i] = block[i]! ^ 0x36;\n outer[i] = block[i]! ^ 0x5c;\n }\n inner.set(message, 64);\n outer.set(sha256(inner), 64);\n return sha256(outer);\n}\n\n/** Equality that takes the same time wherever the inputs differ. */\nexport function constantTimeEqual(a: Uint8Array, b: Uint8Array): boolean {\n if (a.length !== b.length) return false;\n let diff = 0;\n for (let i = 0; i < a.length; i++) diff |= a[i]! ^ b[i]!;\n return diff === 0;\n}\n\nfunction rotr(x: number, n: number): number {\n return (x >>> n) | (x << (32 - n));\n}\n","// Keyset cursors: the sort values of the last row plus the @key, tagged\n// with the sort they were produced under, so a cursor replayed against a\n// different sort is rejected instead of silently skipping rows. With a\n// `cursorSecret` they are also signed (HMAC-SHA-256), so a client cannot\n// forge one; without it they are only tagged.\n\nimport { requestError } from \"../errors.js\";\nimport { constantTimeEqual, hmacSha256 } from \"./hmac.js\";\n\ninterface CursorPayload {\n s: string;\n v: unknown[];\n}\n\n/** Bytes of the signature kept in a signed cursor. */\nconst SIGNATURE_BYTES = 16;\n\nexport function encodeCursor(\n sort: string,\n values: unknown[],\n secret?: string,\n): string {\n const json = JSON.stringify(\n { s: sort, v: values } satisfies CursorPayload,\n (_k, val) => (typeof val === \"bigint\" ? { $bigint: val.toString() } : val),\n );\n const payload = toBase64Url(json);\n return secret === undefined\n ? payload\n : `${payload}.${bytesToBase64Url(sign(secret, payload))}`;\n}\n\nexport function decodeCursor(\n cursor: string,\n sort: string,\n arity: number,\n secret?: string,\n): unknown[] {\n let encoded = cursor;\n if (secret !== undefined) {\n const dot = cursor.indexOf(\".\");\n let given: Uint8Array | undefined;\n try {\n given = dot > 0 ? base64UrlToBytes(cursor.slice(dot + 1)) : undefined;\n } catch {\n given = undefined;\n }\n encoded = cursor.slice(0, Math.max(dot, 0));\n if (!given || !constantTimeEqual(given, sign(secret, encoded))) {\n throw requestError(\"INVALID_CURSOR\", \"`after` is not a valid cursor\");\n }\n }\n let payload: CursorPayload;\n try {\n payload = JSON.parse(fromBase64Url(encoded), (_k, val) =>\n val !== null &&\n typeof val === \"object\" &&\n typeof (val as { $bigint?: unknown }).$bigint === \"string\"\n ? BigInt((val as { $bigint: string }).$bigint)\n : val,\n ) as CursorPayload;\n } catch {\n throw requestError(\"INVALID_CURSOR\", \"`after` is not a valid cursor\");\n }\n if (\n typeof payload !== \"object\" ||\n payload === null ||\n !Array.isArray(payload.v) ||\n payload.v.length !== arity\n ) {\n throw requestError(\"INVALID_CURSOR\", \"`after` is not a valid cursor\");\n }\n if (payload.s !== sort) {\n throw requestError(\n \"INVALID_CURSOR\",\n \"`after` was produced under a different sort; request the first page again\",\n );\n }\n return payload.v;\n}\n\nfunction sign(secret: string, payload: string): Uint8Array {\n const encoder = new TextEncoder();\n return hmacSha256(encoder.encode(secret), encoder.encode(payload)).slice(\n 0,\n SIGNATURE_BYTES,\n );\n}\n\n// Portable base64url (Node and browsers; the WASM binding runs in both).\nexport function toBase64Url(text: string): string {\n return bytesToBase64Url(new TextEncoder().encode(text));\n}\n\nexport function fromBase64Url(encoded: string): string {\n return new TextDecoder(\"utf-8\", { fatal: true }).decode(\n base64UrlToBytes(encoded),\n );\n}\n\nfunction bytesToBase64Url(bytes: Uint8Array): string {\n let bin = \"\";\n for (const b of bytes) bin += String.fromCharCode(b);\n return btoa(bin).replace(/\\+/g, \"-\").replace(/\\//g, \"_\").replace(/=+$/, \"\");\n}\n\nfunction base64UrlToBytes(encoded: string): Uint8Array {\n const b64 = encoded.replace(/-/g, \"+\").replace(/_/g, \"/\");\n const bin = atob(b64 + \"=\".repeat((4 - (b64.length % 4)) % 4));\n return Uint8Array.from(bin, (c) => c.charCodeAt(0));\n}\n","import {\n getArgumentValues,\n getDirectiveValues,\n GraphQLIncludeDirective,\n GraphQLSkipDirective,\n isAbstractType,\n isObjectType,\n Kind,\n type FieldNode,\n type FragmentDefinitionNode,\n type GraphQLField,\n type GraphQLObjectType,\n type GraphQLSchema,\n type SelectionSetNode,\n} from \"graphql\";\n\nexport interface SelectionContext {\n schema: GraphQLSchema;\n fragments: Record<string, FragmentDefinitionNode>;\n variables: Record<string, unknown>;\n}\n\n/** The fields selected on an object type, grouped by response key. */\nexport type FieldsByKey = Map<string, FieldNode[]>;\n\n/**\n * Collect the fields that apply to `type` from one or more selection\n * sets: follows fragment spreads and inline fragments whose condition\n * matches, honours `@skip` / `@include`, groups by response key.\n */\nexport function collectFields(\n ctx: SelectionContext,\n type: GraphQLObjectType,\n selectionSets: ReadonlyArray<SelectionSetNode | undefined>,\n): FieldsByKey {\n const out: FieldsByKey = new Map();\n const visited = new Set<string>();\n const visit = (set: SelectionSetNode | undefined) => {\n if (!set) return;\n for (const sel of set.selections) {\n if (!included(ctx, sel)) continue;\n if (sel.kind === Kind.FIELD) {\n const key = sel.alias?.value ?? sel.name.value;\n const list = out.get(key);\n if (list) list.push(sel);\n else out.set(key, [sel]);\n } else if (sel.kind === Kind.INLINE_FRAGMENT) {\n if (applies(ctx, type, sel.typeCondition?.name.value)) {\n visit(sel.selectionSet);\n }\n } else {\n const name = sel.name.value;\n if (visited.has(name)) continue;\n visited.add(name);\n const frag = ctx.fragments[name];\n if (frag && applies(ctx, type, frag.typeCondition.name.value)) {\n visit(frag.selectionSet);\n }\n }\n }\n };\n for (const set of selectionSets) visit(set);\n return out;\n}\n\n/** The merged sub-selections of every field node under one response key. */\nexport function subSelections(nodes: readonly FieldNode[]): SelectionSetNode[] {\n return nodes.flatMap((n) => (n.selectionSet ? [n.selectionSet] : []));\n}\n\n/** Coerced argument values of a field, variables substituted. */\nexport function fieldArgs(\n ctx: SelectionContext,\n def: GraphQLField<unknown, unknown>,\n node: FieldNode,\n): Record<string, unknown> {\n return getArgumentValues(def, node, ctx.variables) as Record<string, unknown>;\n}\n\nfunction included(\n ctx: SelectionContext,\n node: Parameters<typeof getDirectiveValues>[1],\n): boolean {\n const skip = getDirectiveValues(GraphQLSkipDirective, node, ctx.variables);\n if (skip?.[\"if\"] === true) return false;\n const include = getDirectiveValues(\n GraphQLIncludeDirective,\n node,\n ctx.variables,\n );\n return include?.[\"if\"] !== false;\n}\n\nfunction applies(\n ctx: SelectionContext,\n type: GraphQLObjectType,\n condition: string | undefined,\n): boolean {\n if (condition === undefined || condition === type.name) return true;\n const cond = ctx.schema.getType(condition);\n if (cond && isAbstractType(cond)) {\n return ctx.schema.isSubType(cond, type);\n }\n return cond !== undefined && isObjectType(cond) && cond.name === type.name;\n}\n","// Read operations → one parameterised statement each (plus a count\n// statement in the same read transaction when a connection asks for\n// `totalCount`). See the Translation Rules in\n// docs/design/graphql-implementation-plan.md.\n\nimport {\n getNamedType,\n parse,\n type FieldNode,\n type GraphQLObjectType,\n type OperationDefinitionNode,\n type SelectionSetNode,\n} from \"graphql\";\nimport { RANGE_UNINDEXABLE } from \"../analyze/indexes.js\";\nimport type { QueryResult, Statement } from \"../driver.js\";\nimport { requestError } from \"../errors.js\";\nimport { renameParams } from \"../model/cypher-lexer.js\";\nimport {\n distinctCount,\n listAggregate,\n type ListAggregate,\n} from \"./aggregate.js\";\nimport type {\n AbstractType,\n CypherField,\n NodeType,\n RelationshipPropertiesType,\n SearchIndex,\n PageLimit,\n RelationshipField,\n ScalarField,\n} from \"../model/types.js\";\nimport {\n connectionTypeNames,\n hasOwnConnection,\n names,\n} from \"../schema/names.js\";\nimport {\n authFilter,\n authValidate,\n checkAuthentication,\n checkFieldAuthentication,\n fieldValidate,\n} from \"./auth.js\";\nimport { bind, freshVar, type CompileContext } from \"./context.js\";\nimport { decodeCursor } from \"./cursor.js\";\nimport {\n and,\n bin,\n fn,\n isNull,\n lit,\n not,\n or,\n printClauses,\n prop,\n v,\n type Clause,\n type Expr,\n type ProjectionEntry,\n type SortItem,\n} from \"./cypher.js\";\nimport {\n compileMemberWhere,\n compileNodeWhere,\n compilePropsWhere,\n relationshipPattern,\n} from \"./filter.js\";\nimport { memberFields } from \"../model/relations.js\";\nimport { collectFields, fieldArgs, subSelections } from \"./selection.js\";\n\nexport type RootKind =\n | \"list\"\n | \"single\"\n | \"connection\"\n | \"aggregate\"\n | \"grouped\";\n\n/** How the plan of a statement is expected to find its first rows (S2). */\nexport interface SeekExpectation {\n statement: number;\n label: string;\n access: \"exact\" | \"range\" | \"text\" | \"point\";\n reason: string;\n}\n\nexport interface ReadSet {\n labels: string[];\n relationships: string[];\n}\n\nexport interface CompiledRead {\n statements: Statement[];\n /** Turns the statements' results into the root field's value. */\n shape: (results: QueryResult[]) => unknown;\n /** Result columns the first statement must produce. */\n columns: string[];\n reads: ReadSet;\n expectations: SeekExpectation[];\n /** Estimated rows touched: the bound the cost limit checks. */\n cost: number;\n /** `read` for queries; `write` for @cypher mutations. */\n mode: \"read\" | \"write\";\n}\n\ntype Args = Record<string, unknown>;\ntype Where = Record<string, unknown>;\n\ninterface SortKey {\n field: ScalarField;\n direction: \"ASC\" | \"DESC\";\n /** A relationship property (`sort: [{ edge: { ... } }]`), not a node field. */\n edge?: boolean;\n /** For a computed (`@cypher`) field: the variable holding its value. */\n computed?: string;\n}\n\n/** The value a sort key orders by: `node.prop`, or `rel.prop` for edge keys. */\nfunction keyExpr(k: SortKey, variable: string, edge?: string): Expr {\n if (k.field.computedBy) {\n if (!k.computed) {\n throw requestError(\n \"BAD_USER_INPUT\",\n `${k.field.computedBy.owner}.${k.field.name} is computed by @cypher: sort by it in a root field only`,\n );\n }\n return v(k.computed);\n }\n return prop(v(k.edge ? edge! : variable), k.field.property);\n}\n\n/** A connection value before its resolvers turn it into edges/pageInfo. */\nexport interface RawConnection {\n __rows: RawEdge[];\n __first: number;\n /** A cursor (`after` or `before`) was given. */\n __after: boolean;\n /** `last` / `before`: rows arrive in reverse and are flipped back. */\n __backward: boolean;\n __sort: string;\n __totalCount?: number;\n}\n\nexport interface RawEdge {\n node: unknown;\n properties?: unknown;\n __cursor: unknown[];\n}\n\nexport function compileRoot(\n ctx: CompileContext,\n kind: RootKind,\n node: NodeType,\n args: Args,\n fieldNodes: readonly FieldNode[],\n): CompiledRead {\n const sets = subSelections(fieldNodes);\n switch (kind) {\n case \"list\":\n return compileList(ctx, node, args, sets);\n case \"single\":\n return compileSingle(ctx, node, args, sets);\n case \"connection\":\n return compileConnection(ctx, node, args, sets);\n case \"aggregate\":\n return compileAggregate(ctx, node, args, sets);\n case \"grouped\":\n return compileGrouped(ctx, node, args, sets);\n }\n}\n\nexport function finish(\n ctx: CompileContext,\n clauses: Clause[],\n columns: string[],\n shape: CompiledRead[\"shape\"],\n expectation: Omit<SeekExpectation, \"statement\"> | undefined,\n extra: Statement[] = [],\n mode: \"read\" | \"write\" = \"read\",\n): CompiledRead {\n return {\n statements: [{ text: printClauses(clauses), params: ctx.params }, ...extra],\n shape,\n columns,\n reads: readSet(ctx),\n expectations: expectation ? [{ statement: 0, ...expectation }] : [],\n cost: ctx.cost,\n mode,\n };\n}\n\nexport function readSet(ctx: CompileContext): ReadSet {\n return {\n labels: [...ctx.reads.labels].sort(),\n relationships: [...ctx.reads.relationships].sort(),\n };\n}\n\n// ---------------------------------------------------------------------------\n// Root fields\n// ---------------------------------------------------------------------------\n\nfunction compileList(\n ctx: CompileContext,\n node: NodeType,\n args: Args,\n sets: SelectionSetNode[],\n): CompiledRead {\n const limit = resolveLimit(args[\"limit\"], node.limit, \"limit\");\n const sort = resolveSort(ctx, node, args[\"sort\"], false);\n const root = rootMatch(ctx, node, args[\"where\"] as Where | undefined, sort);\n const projection = projectNode(ctx, node, \"this\", sets, limit);\n const clauses: Clause[] = [\n ...root.clauses,\n {\n kind: \"with\",\n items: [{ expr: v(\"this\") }, ...root.carry.map((c) => ({ expr: v(c) }))],\n orderBy: sortItems(\"this\", sort),\n limit: bind(ctx, limit),\n },\n ...projection.pre,\n {\n kind: \"return\",\n items: [{ expr: projection.expr, alias: \"this\" }],\n },\n ];\n return finish(\n ctx,\n clauses,\n [\"this\"],\n ([r]) => r!.rows.map((row) => row[\"this\"]),\n root.expectation,\n );\n}\n\nfunction compileSingle(\n ctx: CompileContext,\n node: NodeType,\n args: Args,\n sets: SelectionSetNode[],\n): CompiledRead {\n checkAuthentication(ctx, node, \"READ\");\n const label = node.labels[0]!;\n ctx.reads.labels.add(label);\n const where = and(\n bin(\n \"=\",\n prop(v(\"this\"), node.key.property),\n bind(ctx, args[node.key.name]),\n ),\n authFilter(ctx, node, \"this\", \"READ\"),\n );\n const projection = projectNode(ctx, node, \"this\", sets, 1);\n const clauses: Clause[] = [\n {\n kind: \"match\",\n pattern: { start: { variable: \"this\", labels: [label] }, hops: [] },\n where,\n },\n ...projection.pre,\n { kind: \"return\", items: [{ expr: projection.expr, alias: \"this\" }] },\n ];\n return finish(ctx, clauses, [\"this\"], ([r]) => r!.rows[0]?.[\"this\"] ?? null, {\n label,\n access: \"exact\",\n reason: `lookup by @key ${node.key.name}`,\n });\n}\n\nfunction compileConnection(\n ctx: CompileContext,\n node: NodeType,\n args: Args,\n sets: SelectionSetNode[],\n): CompiledRead {\n const { first, sort, signature, cursor, backward } = resolvePage(\n ctx,\n node,\n args,\n node.limit,\n );\n\n const where = args[\"where\"] as Where | undefined;\n const connType = ctx.schema.getType(\n names.connection(node.name),\n ) as GraphQLObjectType;\n const edgeType = ctx.schema.getType(\n names.edge(node.name),\n ) as GraphQLObjectType;\n const sel = connectionSelections(\n ctx,\n connType,\n edgeType,\n sets,\n node,\n undefined,\n );\n\n const statements: Statement[] = [];\n let expectation: Omit<SeekExpectation, \"statement\"> | undefined;\n let columns: string[] = [];\n // The page, unless only counts or aggregates were asked for.\n if (sel.page) {\n const root = rootMatch(ctx, node, where, sort, cursor);\n expectation = root.expectation;\n const projection = projectNode(ctx, node, \"this\", sel.node, first + 1);\n statements.push({\n text: printClauses([\n ...root.clauses,\n {\n kind: \"with\",\n items: [\n { expr: v(\"this\") },\n ...root.carry.map((c) => ({ expr: v(c) })),\n ],\n orderBy: sortItems(\"this\", sort),\n limit: bind(ctx, first + 1),\n },\n ...projection.pre,\n {\n kind: \"return\",\n items: [\n { expr: projection.expr, alias: \"node\" },\n { expr: cursorValues(\"this\", sort), alias: \"__cursor\" },\n ],\n },\n ]),\n params: ctx.params,\n });\n columns = [\"node\", \"__cursor\"];\n }\n\n // totalCount and aggregates: one pass over every match, in the same\n // read transaction.\n const stats = sel.totalCount || sel.aggregate !== undefined;\n let statsColumns: Array<{ column: string; path: string[] }> = [];\n if (stats) {\n const statsCtx: CompileContext = {\n ...ctx,\n params: {},\n vars: new Set([\"this\"]),\n computed: new Map(),\n };\n const statsRoot = rootMatch(statsCtx, node, where, []);\n expectation ??= statsRoot.expectation;\n const items: Array<{ expr: Expr; alias: string }> = [\n { expr: fn(\"count\", v(\"this\")), alias: \"totalCount\" },\n ...deniedItem(statsCtx, node, \"this\"),\n ];\n const wanted: WantedAggregate[] = [];\n for (const { field, fns } of sel.aggregate?.node ?? []) {\n for (const agg of fns) {\n const column = `node_${field.name}_${agg}`;\n wanted.push({ field, agg, column });\n statsColumns.push({ column, path: [\"node\", field.name, agg] });\n }\n }\n statements.push({\n text: printClauses([\n ...statsRoot.clauses,\n ...aggregateReturn(statsCtx, \"this\", items, wanted),\n ]),\n params: statsCtx.params,\n });\n }\n statsColumns = statsColumns.slice();\n\n return {\n statements,\n columns,\n reads: readSet(ctx),\n expectations: expectation ? [{ statement: 0, ...expectation }] : [],\n cost: ctx.cost + (stats ? 1 : 0),\n mode: \"read\",\n shape: (results): RawConnection => {\n const page = sel.page ? results[0] : undefined;\n const count = stats ? results[sel.page ? 1 : 0] : undefined;\n const row = count?.rows[0];\n if (count) assertNoneDenied(row);\n let aggregate: Record<string, unknown> | undefined;\n if (sel.aggregate) {\n aggregate = { count: row?.[\"totalCount\"] ?? 0 };\n for (const { column, path } of statsColumns) {\n setPath(aggregate, path, row?.[column] ?? null);\n }\n }\n return {\n __rows: (page?.rows ?? []).map((r) => ({\n node: r[\"node\"],\n __cursor: r[\"__cursor\"] as unknown[],\n })),\n __first: first,\n __after: cursor !== undefined,\n __backward: backward,\n __sort: signature,\n ...(count ? { __totalCount: row?.[\"totalCount\"] as number } : {}),\n ...(aggregate ? { __aggregate: aggregate } : {}),\n };\n },\n };\n}\n\n/**\n * Sorting or aggregating over a field with row-level READ rules would\n * reveal values of rows the rules hide: refused unless the claims alone\n * already settle the rules.\n */\nfunction refuseRowRules(\n ctx: CompileContext,\n node: NodeType,\n field: ScalarField,\n what: string,\n): void {\n const probe = { ...ctx, params: {}, vars: new Set(ctx.vars) };\n if (fieldValidate(probe, node, field, \"probe\", \"READ\")) {\n throw requestError(\n \"FORBIDDEN\",\n `cannot ${what} ${node.name}.${field.name}: it has row-level read rules`,\n );\n }\n}\n\nfunction setPath(\n target: Record<string, unknown>,\n path: string[],\n value: unknown,\n) {\n let cur = target;\n for (const part of path.slice(0, -1)) {\n cur = (cur[part] ??= {}) as Record<string, unknown>;\n }\n cur[path[path.length - 1]!] = value;\n}\n\nconst AGGREGATES = new Set([\"min\", \"max\", \"avg\", \"sum\", \"shortest\", \"longest\"]);\n\ninterface WantedAggregate {\n field: ScalarField;\n agg: string;\n column: string;\n}\n\n/**\n * Whether an aggregate function computes this correctly. Shortest and\n * longest have none; LoraDB's `max`, `sum` and `avg` over durations are\n * wrong (E25). Those are folded from a `collect()` instead.\n */\nfunction nativeAggregate(w: WantedAggregate): boolean {\n return (\n w.field.type !== \"Duration\" && w.agg !== \"shortest\" && w.agg !== \"longest\"\n );\n}\n\n/**\n * The RETURN of an aggregate statement over `variable`: `base` items\n * (already aggregate expressions) and one column per wanted aggregate.\n * Folded aggregates need their values collected first, in a WITH: an\n * aggregate nested in another call is not aggregated (E16).\n */\nfunction aggregateReturn(\n ctx: CompileContext,\n variable: string,\n base: Array<{ expr: Expr; alias: string }>,\n wanted: WantedAggregate[],\n group?: { keys: Array<{ expr: Expr; alias: string }>; limit: Expr },\n): Clause[] {\n const native = wanted.filter(nativeAggregate).map((w) => ({\n expr: fn(w.agg, prop(v(variable), w.field.property)),\n alias: w.column,\n }));\n const folded = wanted.filter((w) => !nativeAggregate(w));\n const keys = group?.keys ?? [];\n const order = group\n ? {\n orderBy: keys.map((k) => ({\n expr: v(k.alias),\n direction: \"ASC\" as const,\n })),\n limit: group.limit,\n }\n : {};\n if (folded.length === 0) {\n return [{ kind: \"return\", items: [...keys, ...base, ...native], ...order }];\n }\n const lists = new Map<ScalarField, string>();\n for (const w of folded) {\n if (!lists.has(w.field)) {\n lists.set(w.field, freshVar(ctx, `${w.field.name}_values`));\n }\n }\n const carried = [...base, ...native];\n return [\n {\n kind: \"with\",\n items: [\n ...keys,\n ...carried,\n ...[...lists].map(([f, alias]) => ({\n expr: fn(\"collect\", prop(v(variable), f.property)),\n alias,\n })),\n ],\n },\n {\n kind: \"return\",\n ...order,\n items: [\n ...[...keys, ...carried].map((i) => ({\n expr: v(i.alias),\n alias: i.alias,\n })),\n ...folded.map((w) => ({\n expr: listAggregate(\n ctx,\n w.agg as ListAggregate,\n v(lists.get(w.field)!),\n { duration: w.field.type === \"Duration\" },\n ),\n alias: w.column,\n })),\n ],\n },\n ];\n}\n\nfunction compileAggregate(\n ctx: CompileContext,\n node: NodeType,\n args: Args,\n sets: SelectionSetNode[],\n): CompiledRead {\n const aggType = ctx.schema.getType(\n names.aggregate(node.name),\n ) as GraphQLObjectType;\n const root = rootMatch(ctx, node, args[\"where\"] as Where | undefined, []);\n const items: Array<{ expr: Expr; alias: string }> = [\n { expr: fn(\"count\", v(\"this\")), alias: \"count\" },\n ...deniedItem(ctx, node, \"this\"),\n ];\n const wanted = aggregateWanted(ctx, node, aggType, sets);\n const clauses: Clause[] = [\n ...root.clauses,\n ...aggregateReturn(ctx, \"this\", items, wanted),\n ];\n return finish(\n ctx,\n clauses,\n [...items.map((i) => i.alias), ...wanted.map((w) => w.column)],\n ([r]) => {\n assertNoneDenied(r!.rows[0]);\n return aggregateRow(r!.rows[0] ?? { count: 0 }, wanted);\n },\n root.expectation,\n );\n}\n\n/**\n * `<plural>Grouped(by: [...])`: one row per group of values, ordered by\n * them, at most `limit` groups. The values are collected per group and\n * folded (an aggregate nested in another call is not aggregated, E16).\n */\nfunction compileGrouped(\n ctx: CompileContext,\n node: NodeType,\n args: Args,\n sets: SelectionSetNode[],\n): CompiledRead {\n const by = [...new Set((args[\"by\"] as string[] | null) ?? [])];\n if (by.length === 0) {\n throw requestError(\"BAD_USER_INPUT\", \"`by` names at least one field\");\n }\n const fields = by.map((name) => {\n const f = node.fields.get(name) as ScalarField;\n checkFieldAuthentication(ctx, node.name, f);\n refuseRowRules(ctx, node, f, \"group by\");\n return f;\n });\n const limit = resolveLimit(args[\"limit\"], node.limit, \"limit\");\n const groupType = ctx.schema.getType(\n `${node.name}Group`,\n ) as GraphQLObjectType;\n const aggType = ctx.schema.getType(\n names.aggregate(node.name),\n ) as GraphQLObjectType;\n const aggSets: SelectionSetNode[] = [];\n for (const [, nodes] of collectFields(ctx, groupType, sets)) {\n if (nodes[0]!.name.value === \"aggregate\") {\n aggSets.push(...subSelections(nodes));\n }\n }\n const wanted = aggregateWanted(ctx, node, aggType, aggSets);\n const root = rootMatch(ctx, node, args[\"where\"] as Where | undefined, []);\n const keys = fields.map((f, i) => ({\n expr: prop(v(\"this\"), f.property),\n alias: `by_${i}`,\n }));\n const items: Array<{ expr: Expr; alias: string }> = [\n { expr: fn(\"count\", v(\"this\")), alias: \"count\" },\n ...deniedItem(ctx, node, \"this\"),\n ];\n ctx.cost += limit;\n const clauses: Clause[] = [\n ...root.clauses,\n ...aggregateReturn(ctx, \"this\", items, wanted, {\n keys,\n limit: bind(ctx, limit),\n }),\n ];\n return finish(\n ctx,\n clauses,\n [\n ...keys.map((k) => k.alias),\n ...items.map((i) => i.alias),\n ...wanted.map((w) => w.column),\n ],\n ([r]) =>\n r!.rows.map((row) => {\n assertNoneDenied(row);\n return {\n by: Object.fromEntries(\n fields.map((f, i) => [f.name, row[`by_${i}`] ?? null]),\n ),\n aggregate: aggregateRow(row, wanted),\n };\n }),\n root.expectation,\n );\n}\n\n/** The field aggregates an aggregate selection asks for. */\nfunction aggregateWanted(\n ctx: CompileContext,\n node: NodeType,\n aggType: GraphQLObjectType,\n sets: SelectionSetNode[],\n): WantedAggregate[] {\n const wanted: WantedAggregate[] = [];\n for (const [, nodes] of collectFields(ctx, aggType, sets)) {\n const fieldName = nodes[0]!.name.value;\n const field = node.fields.get(fieldName);\n if (!field || field.kind !== \"scalar\") continue;\n checkFieldAuthentication(ctx, node.name, field);\n refuseRowRules(ctx, node, field, \"aggregate\");\n const fieldType = getNamedType(\n aggType.getFields()[fieldName]!.type,\n ) as GraphQLObjectType;\n for (const [, sub] of collectFields(ctx, fieldType, subSelections(nodes))) {\n const agg = sub[0]!.name.value;\n if (!AGGREGATES.has(agg)) continue;\n const column = `${fieldName}_${agg}`;\n if (wanted.some((w) => w.column === column)) continue;\n wanted.push({ field, agg, column });\n }\n }\n return wanted;\n}\n\n/** `{ count, <field>: { <fn>: value } }` from an aggregate row. */\nfunction aggregateRow(\n row: Record<string, unknown>,\n wanted: WantedAggregate[],\n): Record<string, unknown> {\n const out: Record<string, unknown> = { count: row[\"count\"] ?? 0 };\n for (const w of wanted) {\n const bucket = (out[w.field.name] ??= {}) as Record<string, unknown>;\n bucket[w.agg] = row[w.column] ?? null;\n }\n return out;\n}\n\n/**\n * A root `@cypher` field on Query or Mutation: the statement runs in a\n * `CALL { }`, and returned nodes are projected like any other read.\n */\nexport function compileCypherRoot(\n ctx: CompileContext,\n field: CypherField,\n args: Args,\n fieldNodes: readonly FieldNode[],\n): CompiledRead {\n const call: Clause = {\n kind: \"call\",\n imports: [],\n body: [{ kind: \"raw\", text: bindStatement(ctx, field, args) }],\n };\n const column = field.columnName;\n const clauses: Clause[] = [call];\n if (field.node) {\n const node = ctx.model.nodes.get(field.node)!;\n checkAuthentication(ctx, node, \"READ\");\n ctx.reads.labels.add(node.labels[0]!);\n const rows = field.type.list ? node.limit.max : 1;\n const projection = projectNode(\n ctx,\n node,\n \"this\",\n subSelections(fieldNodes),\n rows,\n );\n clauses.push(\n {\n kind: \"with\",\n items: [{ expr: v(column), alias: \"this\" }],\n where: authFilter(ctx, node, \"this\", \"READ\"),\n },\n ...projection.pre,\n { kind: \"return\", items: [{ expr: projection.expr, alias: \"this\" }] },\n );\n } else if (field.abstract) {\n const abstract = ctx.model.abstracts.get(field.abstract)!;\n const rows = field.type.list ? abstract.limit.max : 1;\n const projection = projectAbstract(\n ctx,\n abstract,\n \"this\",\n subSelections(fieldNodes),\n rows,\n );\n clauses.push(\n {\n kind: \"with\",\n items: [{ expr: v(column), alias: \"this\" }],\n where: projection.where,\n },\n ...projection.pre,\n { kind: \"return\", items: [{ expr: projection.expr, alias: \"this\" }] },\n );\n } else {\n clauses.push({\n kind: \"return\",\n items: [{ expr: v(column), alias: \"this\" }],\n });\n }\n const list = field.type.list;\n return finish(\n ctx,\n clauses,\n [\"this\"],\n ([r]) => {\n const values = r!.rows.map((row) => row[\"this\"]);\n return list ? values : (values[0] ?? null);\n },\n undefined,\n [],\n field.owner === \"Mutation\" ? \"write\" : \"read\",\n );\n}\n\n// ---------------------------------------------------------------------------\n// Interfaces and unions\n// ---------------------------------------------------------------------------\n\ninterface MemberSort {\n name: string;\n direction: \"ASC\" | \"DESC\";\n}\n\nfunction resolveAbstractSort(\n ctx: CompileContext,\n abstract: AbstractType,\n value: unknown,\n): MemberSort[] {\n const keys: MemberSort[] = [];\n for (const item of (value as Array<Record<string, unknown>> | null) ?? []) {\n const entries = Object.entries(item).filter(([, d]) => d != null);\n if (entries.length !== 1) {\n throw requestError(\n \"BAD_USER_INPUT\",\n \"each `sort` item names exactly one field\",\n );\n }\n const [name, direction] = entries[0]!;\n for (const member of abstract.members) {\n const f = ctx.model.nodes.get(member)!.fields.get(name);\n if (f?.kind === \"scalar\") {\n checkFieldAuthentication(ctx, member, f);\n refuseRowRules(ctx, ctx.model.nodes.get(member)!, f, \"sort by\");\n }\n }\n keys.push({ name, direction: direction as \"ASC\" | \"DESC\" });\n }\n return keys;\n}\n\n/**\n * One member's slice of an interface or union list: its nodes filtered,\n * sorted and limited on their own (so each can use its indexes), projected\n * with `__typename` and the sort values the merge orders by.\n */\nfunction memberList(\n ctx: CompileContext,\n abstract: AbstractType,\n member: NodeType,\n source: (x: string) => {\n pattern: import(\"./cypher.js\").Pattern;\n where: Expr | undefined;\n },\n where: Record<string, unknown> | null | undefined,\n sort: MemberSort[],\n limit: Expr,\n sets: SelectionSetNode[],\n rows: number,\n): { body: Clause[]; list: string } | undefined {\n const x = freshVar(ctx, `this_${member.name}`);\n const filter = compileMemberWhere(ctx, abstract, member, x, where);\n if (filter === false) return undefined;\n checkAuthentication(ctx, member, \"READ\");\n ctx.reads.labels.add(member.labels[0]!);\n const from = source(x);\n const sortExprs: SortItem[] = [\n ...sort.map((k) => {\n const f = member.fields.get(k.name) as ScalarField;\n return { expr: prop(v(x), f.property), direction: k.direction };\n }),\n { expr: prop(v(x), member.key.property), direction: \"ASC\" as const },\n ];\n const projection = projectNode(ctx, member, x, sets, rows);\n const expr = projection.expr as Extract<Expr, { kind: \"mapProjection\" }>;\n const list = freshVar(ctx, `${x}_list`);\n const tagged: Expr = {\n ...expr,\n entries: [\n ...expr.entries,\n { kind: \"entry\", key: \"__typename\", value: lit(member.name) },\n { kind: \"entry\", key: \"__key\", value: prop(v(x), member.key.property) },\n ...sort.map((k, i) => ({\n kind: \"entry\" as const,\n key: `__s${i}`,\n value: sortExprs[i]!.expr,\n })),\n ],\n };\n return {\n list,\n body: [\n {\n kind: \"match\",\n pattern: from.pattern,\n where: and(from.where, filter, authFilter(ctx, member, x, \"READ\")),\n },\n { kind: \"with\", items: [{ expr: v(x) }], orderBy: sortExprs, limit },\n ...projection.pre,\n { kind: \"return\", items: [{ expr: fn(\"collect\", tagged), alias: list }] },\n ],\n };\n}\n\n/** The merged order: requested fields, then type name, then key. */\nfunction mergedOrder(item: string, sort: MemberSort[]): SortItem[] {\n return [\n ...sort.map((k, i) => ({\n expr: prop(v(item), `__s${i}`),\n direction: k.direction,\n })),\n { expr: prop(v(item), \"__typename\"), direction: \"ASC\" as const },\n { expr: prop(v(item), \"__key\"), direction: \"ASC\" as const },\n ];\n}\n\n/** `events(where, sort, limit)` over an interface's implementations or a union's members. */\nexport function compileAbstractRoot(\n ctx: CompileContext,\n abstract: AbstractType,\n args: Args,\n fieldNodes: readonly FieldNode[],\n): CompiledRead {\n const limitValue = resolveLimit(args[\"limit\"], abstract.limit, \"limit\");\n const sort = resolveAbstractSort(ctx, abstract, args[\"sort\"]);\n const limit = bind(ctx, limitValue);\n const sets = subSelections(fieldNodes);\n const calls: Clause[] = [];\n const lists: string[] = [];\n for (const name of abstract.members) {\n const member = ctx.model.nodes.get(name)!;\n const slice = memberList(\n ctx,\n abstract,\n member,\n (x) => ({\n pattern: {\n start: { variable: x, labels: [member.labels[0]!] },\n hops: [],\n },\n where: undefined,\n }),\n args[\"where\"] as Record<string, unknown> | undefined,\n sort,\n limit,\n sets,\n limitValue,\n );\n if (!slice) continue;\n calls.push({ kind: \"call\", imports: [], body: slice.body });\n lists.push(slice.list);\n }\n const clauses: Clause[] = [\n ...calls,\n {\n kind: \"unwind\",\n expr:\n lists.length === 0\n ? { kind: \"list\", items: [] }\n : lists.map((l) => v(l)).reduce((a, b) => bin(\"+\", a, b)),\n alias: \"this\",\n },\n {\n kind: \"with\",\n items: [{ expr: v(\"this\") }],\n orderBy: mergedOrder(\"this\", sort),\n limit,\n },\n { kind: \"return\", items: [{ expr: v(\"this\"), alias: \"this\" }] },\n ];\n return finish(\n ctx,\n clauses,\n [\"this\"],\n ([r]) => r!.rows.map((row) => row[\"this\"]),\n undefined,\n );\n}\n\n/** A relationship field whose target is an interface or union. */\nfunction projectPolymorphic(\n ctx: CompileContext,\n parent: string,\n rel: RelationshipField,\n key: string,\n args: Args,\n sets: SelectionSetNode[],\n rows: number,\n): Projection {\n const abstract = ctx.model.abstracts.get(rel.target)!;\n ctx.reads.relationships.add(rel.type);\n const limitValue = rel.list\n ? resolveLimit(args[\"limit\"], rel.limit ?? abstract.limit, \"limit\")\n : 1;\n const sort = rel.list ? resolveAbstractSort(ctx, abstract, args[\"sort\"]) : [];\n const limit = bind(ctx, limitValue);\n const body: Clause[] = [];\n const lists: string[] = [];\n for (const field of memberFields(ctx.model, rel)) {\n const member = ctx.model.nodes.get(field.target)!;\n const slice = memberList(\n ctx,\n abstract,\n member,\n (x) => ({\n pattern: relationshipPattern(parent, field, member.labels[0]!, x),\n where: undefined,\n }),\n args[\"where\"] as Record<string, unknown> | undefined,\n sort,\n limit,\n sets,\n rows * limitValue,\n );\n if (!slice) continue;\n body.push({ kind: \"call\", imports: [parent], body: slice.body });\n lists.push(slice.list);\n }\n if (lists.length === 0) {\n return {\n pre: [],\n expr: rel.list ? { kind: \"list\", items: [] } : lit(null),\n };\n }\n const item = freshVar(ctx, `${parent}_${key}_item`);\n const out = freshVar(ctx, `${parent}_${key}`);\n body.push(\n {\n kind: \"unwind\",\n expr: lists.map((l) => v(l)).reduce((a, b) => bin(\"+\", a, b)),\n alias: item,\n },\n {\n kind: \"with\",\n items: [{ expr: v(item) }],\n orderBy: mergedOrder(item, sort),\n limit,\n },\n ...(rel.list\n ? [\n {\n kind: \"return\" as const,\n items: [{ expr: fn(\"collect\", v(item)), alias: out }],\n },\n ]\n : collectOne(v(item), out)),\n );\n return { pre: [{ kind: \"call\", imports: [parent], body }], expr: v(out) };\n}\n\n/** A search root field's value: nodes with their scores. */\nexport interface SearchResult {\n node: unknown;\n score: number;\n}\n\n/**\n * A full-text or vector search root field:\n *\n * CALL db.index.fulltext.queryNodes($index, $query) YIELD node AS this, score\n * WHERE <where> AND <read filter>\n * WITH this, score ORDER BY score DESC, this.key ASC LIMIT $limit\n *\n * Vector search asks the index for more candidates than the page when a\n * filter may drop some, because the index returns the top k before WHERE.\n */\n/** The order search results come in, as a cursor signature. */\nconst SEARCH_SORT = \"score:DESC,key:ASC\";\n\n/**\n * A search as a connection (`connection: true`): pages forward by keyset\n * on (score DESC, key ASC). A vector index returns its top candidates\n * before any filter, so vector connections page within a fixed pool of\n * `4 × @limit(max:)` candidates.\n */\nexport function compileSearch(\n ctx: CompileContext,\n node: NodeType,\n index: SearchIndex,\n args: Args,\n fieldNodes: readonly FieldNode[],\n connection = false,\n): CompiledRead {\n checkAuthentication(ctx, node, \"READ\");\n const label = node.labels[0]!;\n ctx.reads.labels.add(label);\n const limit = connection\n ? resolveLimit(args[\"first\"], node.limit, \"first\")\n : resolveLimit(args[\"limit\"], node.limit, \"limit\");\n const after = connection\n ? (args[\"after\"] as string | null | undefined)\n : null;\n const cursor =\n after != null\n ? decodeCursor(after, SEARCH_SORT, 2, ctx.model.cursorSecret)\n : undefined;\n const keyset = cursor\n ? or(\n bin(\"<\", v(\"score\"), bind(ctx, cursor[0])),\n and(\n bin(\"=\", v(\"score\"), bind(ctx, cursor[0])),\n bin(\">\", prop(v(\"this\"), node.key.property), bind(ctx, cursor[1])),\n ),\n )\n : undefined;\n const where = and(\n compileNodeWhere(ctx, node, \"this\", args[\"where\"] as Where | undefined),\n authFilter(ctx, node, \"this\", \"READ\"),\n keyset,\n );\n const clauses: Clause[] = [];\n if (index.kind === \"fulltext\") {\n const query = args[\"query\"] as string;\n clauses.push({\n kind: \"procedure\",\n procedure: \"db.index.fulltext.queryNodes\",\n args: [bind(ctx, index.name), bind(ctx, query)],\n yields: [{ item: \"node\", alias: \"this\" }, { item: \"score\" }],\n where,\n });\n } else {\n const vector = args[\"vector\"] as number[] | null | undefined;\n const to = args[\"to\"];\n if ((vector == null) === (to == null)) {\n throw requestError(\n \"BAD_USER_INPUT\",\n `${index.queryName} takes exactly one of \\`vector\\` and \\`to\\``,\n );\n }\n if (vector && vector.length !== index.dimensions) {\n throw requestError(\n \"BAD_USER_INPUT\",\n `\\`vector\\` has ${vector.length} dimensions; ${node.name}.${index.field.name} has ${index.dimensions}`,\n );\n }\n const pool = Math.max(node.limit.max * 4, 1);\n const candidates = connection\n ? pool\n : Math.min((limit + (to != null ? 1 : 0)) * (where ? 4 : 1), pool);\n let source: Expr;\n let exclude: Expr | undefined;\n if (to != null) {\n checkFieldAuthentication(ctx, node.name, index.field);\n clauses.push({\n kind: \"match\",\n pattern: { start: { variable: \"anchor\", labels: [label] }, hops: [] },\n // The anchor's vector is read to rank the others: it must be\n // readable, or an unreadable node's vector would leak through them.\n where: and(\n bin(\"=\", prop(v(\"anchor\"), node.key.property), bind(ctx, to)),\n authFilter(ctx, node, \"anchor\", \"READ\"),\n coalesceFalse(authValidate(ctx, node, \"anchor\", \"READ\", \"BEFORE\")),\n coalesceFalse(\n fieldValidate(ctx, node, index.field, \"anchor\", \"READ\"),\n ),\n ),\n });\n source = prop(v(\"anchor\"), index.field.property);\n exclude = bin(\n \"<>\",\n prop(v(\"this\"), node.key.property),\n prop(v(\"anchor\"), node.key.property),\n );\n } else {\n source = bind(ctx, vector);\n }\n clauses.push({\n kind: \"procedure\",\n procedure: \"db.index.vector.queryNodes\",\n args: [bind(ctx, index.name), bind(ctx, candidates), source],\n yields: [{ item: \"node\", alias: \"this\" }, { item: \"score\" }],\n where: and(exclude, where),\n });\n }\n const selections = connection\n ? searchConnectionSelections(ctx, node, fieldNodes)\n : searchNodeSelections(ctx, node, fieldNodes);\n const projection = projectNode(ctx, node, \"this\", selections, limit);\n clauses.push(\n {\n kind: \"with\",\n items: [{ expr: v(\"this\") }, { expr: v(\"score\") }],\n orderBy: [\n { expr: v(\"score\"), direction: \"DESC\" },\n { expr: prop(v(\"this\"), node.key.property), direction: \"ASC\" },\n ],\n // One more than the page, to tell whether another follows.\n limit: bind(ctx, connection ? limit + 1 : limit),\n },\n ...projection.pre,\n {\n kind: \"return\",\n items: [\n { expr: projection.expr, alias: \"node\" },\n { expr: v(\"score\"), alias: \"score\" },\n ...(connection\n ? [\n {\n expr: {\n kind: \"list\" as const,\n items: [v(\"score\"), prop(v(\"this\"), node.key.property)],\n },\n alias: \"__cursor\",\n },\n ]\n : []),\n ],\n },\n );\n if (connection) {\n return finish(\n ctx,\n clauses,\n [\"node\", \"score\", \"__cursor\"],\n ([r]): RawConnection => ({\n __rows: r!.rows.map((row) => ({\n node: row[\"node\"],\n score: row[\"score\"],\n __cursor: row[\"__cursor\"] as unknown[],\n })),\n __first: limit,\n __after: cursor !== undefined,\n __backward: false,\n __sort: SEARCH_SORT,\n }),\n undefined,\n );\n }\n return finish(\n ctx,\n clauses,\n [\"node\", \"score\"],\n ([r]): SearchResult[] =>\n r!.rows.map((row) => ({\n node: row[\"node\"],\n score: row[\"score\"] as number,\n })),\n undefined,\n );\n}\n\n/** The `edges { node }` selections of a search connection. */\nfunction searchConnectionSelections(\n ctx: CompileContext,\n node: NodeType,\n fieldNodes: readonly FieldNode[],\n): SelectionSetNode[] {\n const connType = ctx.schema.getType(\n names.searchConnection(node.name),\n ) as GraphQLObjectType;\n const edgeType = ctx.schema.getType(\n names.searchEdge(node.name),\n ) as GraphQLObjectType;\n return connectionSelections(\n ctx,\n connType,\n edgeType,\n subSelections(fieldNodes),\n node,\n undefined,\n ).node;\n}\n\n/** The `node` selections of a `<Type>Match` list, merged across aliases. */\nfunction searchNodeSelections(\n ctx: CompileContext,\n node: NodeType,\n fieldNodes: readonly FieldNode[],\n): SelectionSetNode[] {\n const matchType = ctx.schema.getType(\n names.match(node.name),\n ) as GraphQLObjectType;\n const out: SelectionSetNode[] = [];\n for (const [, nodes] of collectFields(\n ctx,\n matchType,\n subSelections(fieldNodes),\n )) {\n if (nodes[0]!.name.value === \"node\") out.push(...subSelections(nodes));\n }\n return out;\n}\n\n/**\n * Nodes by @key, in one statement, for mutation payloads: the read runs\n * inside the mutation's transaction and sees its writes.\n */\nexport function compileByKeys(\n ctx: CompileContext,\n node: NodeType,\n keys: unknown[],\n sets: SelectionSetNode[],\n): CompiledRead {\n checkAuthentication(ctx, node, \"READ\");\n const label = node.labels[0]!;\n ctx.reads.labels.add(label);\n const k = freshVar(ctx, \"this_key\");\n const projection = projectNode(ctx, node, \"this\", sets, keys.length);\n const clauses: Clause[] = [\n { kind: \"unwind\", expr: bind(ctx, keys), alias: k },\n {\n kind: \"match\",\n pattern: { start: { variable: \"this\", labels: [label] }, hops: [] },\n where: and(\n bin(\"=\", prop(v(\"this\"), node.key.property), v(k)),\n authFilter(ctx, node, \"this\", \"READ\"),\n ),\n },\n ...projection.pre,\n {\n kind: \"return\",\n items: [\n { expr: projection.expr, alias: \"this\" },\n { expr: prop(v(\"this\"), node.key.property), alias: \"__key\" },\n ],\n },\n ];\n return finish(\n ctx,\n clauses,\n [\"this\", \"__key\"],\n ([r]) => {\n const byKey = new Map(\n r!.rows.map((row) => [keyOf(row[\"__key\"]), row[\"this\"]]),\n );\n return keys.map((key) => byKey.get(keyOf(key)) ?? null);\n },\n { label, access: \"exact\", reason: \"mutation payload by @key\" },\n );\n}\n\nexport function keyOf(value: unknown): string {\n return typeof value === \"bigint\" ? `n${value}` : JSON.stringify(value);\n}\n\n/** The statement text with its parameters renamed to bound `$pN`s. */\nexport function bindStatement(\n ctx: CompileContext,\n field: CypherField,\n args: Args,\n): string {\n const names = new Map<string, string>();\n for (const p of field.params) {\n const value = p === \"jwt\" ? (ctx.jwt ?? null) : (args[p] ?? null);\n names.set(p, (bind(ctx, value) as { name: string }).name);\n }\n return renameParams(field.statement, (p) => names.get(p) ?? p);\n}\n\n// ---------------------------------------------------------------------------\n// The root MATCH: anchoring, filters, keyset\n// ---------------------------------------------------------------------------\n\nconst EXACT_OPS = new Set([\"eq\", \"in\"]);\nconst RANGE_OPS = new Set([\"lt\", \"lte\", \"gt\", \"gte\"]);\nconst TEXT_OPS = new Set([\"contains\", \"startsWith\", \"endsWith\"]);\nconst POINT_OPS = new Set([\"withinBBox\", \"distance\"]);\n\nfunction rootMatch(\n ctx: CompileContext,\n node: NodeType,\n where: Where | null | undefined,\n sort: SortKey[],\n cursor?: unknown[],\n): {\n clauses: Clause[];\n expectation: Omit<SeekExpectation, \"statement\"> | undefined;\n /** Computed values the following clauses must carry. */\n carry: string[];\n} {\n checkAuthentication(ctx, node, \"READ\");\n const label = node.labels[0]!;\n ctx.reads.labels.add(label);\n const clauses: Clause[] = [];\n let anchor: Expr | undefined;\n let expectation: Omit<SeekExpectation, \"statement\"> | undefined;\n const rest = where ?? undefined;\n\n // Computed (@cypher) fields the filter or sort uses: each runs once per\n // node, in a CALL after the MATCH, and the filter moves after them.\n const computed = computedFields(node, rest, sort);\n const carry: string[] = [];\n const computedClauses: Clause[] = [];\n for (const field of computed) {\n const projection = projectCypher(ctx, \"this\", field, field.name, {}, [], 1);\n const out = (projection.expr as { name: string }).name;\n ctx.computed.set(`this\\0${field.name}`, out);\n for (const k of sort) if (k.field.computedBy === field) k.computed = out;\n computedClauses.push(...projection.pre);\n carry.push(out);\n }\n\n const predicate = compileNodeWhere(ctx, node, \"this\", rest);\n if (computed.length === 0) {\n expectation ??= rest ? seekFromWhere(node, rest) : undefined;\n }\n\n // Nothing to seek on, but a relationship filter names a related node by\n // key: start from that node and expand, instead of scanning the label.\n // The filter itself stays in the WHERE, so the result is unchanged.\n let related: RelatedAnchor | undefined;\n if (!expectation && !anchor && rest && computed.length === 0) {\n related = findRelatedAnchor(ctx, node, rest);\n if (related) {\n clauses.push(...related.clauses);\n expectation = related.expectation;\n }\n }\n\n let keyset: Expr | undefined;\n if (cursor) {\n keyset = keysetPredicate(ctx, \"this\", sort, cursor);\n if (\n computed.length === 0 &&\n !expectation &&\n leadBound(sort[0]!) &&\n !RANGE_UNINDEXABLE.has(sort[0]!.field.type)\n ) {\n expectation = {\n label,\n access: \"range\",\n reason: `keyset on ${node.name}.${sort[0]!.field.name}`,\n };\n }\n }\n\n // Ordered ascending by a string that is always present (the key, or a\n // non-null @sortable field with its existence constraint) and nothing\n // else to seek on: `>= \"\"` excludes no row, and lets the planner walk the\n // index in order and stop after `limit` rows instead of sorting the label.\n let bound: Expr | undefined;\n const lead = sort[0];\n if (\n !predicate &&\n !anchor &&\n !keyset &&\n !related &&\n computed.length === 0 &&\n lead &&\n lead.direction === \"ASC\" &&\n leadBound(lead) &&\n (lead.field.type === \"String\" || lead.field.type === \"ID\")\n ) {\n bound = bin(\">=\", prop(v(\"this\"), lead.field.property), lit(\"\"));\n expectation = {\n label,\n access: \"range\",\n reason: `ordered by ${node.name}.${lead.field.name}`,\n };\n }\n\n clauses.push({\n kind: \"match\",\n pattern: related\n ? related.pattern\n : { start: { variable: \"this\", labels: [label] }, hops: [] },\n where: and(\n anchor,\n computed.length === 0 ? predicate : undefined,\n computed.length === 0 ? keyset : undefined,\n bound,\n authFilter(ctx, node, \"this\", \"READ\"),\n ),\n });\n if (related) {\n // Several relationships may lead to the same node.\n clauses.push({\n kind: \"with\",\n distinct: true,\n items: [{ expr: v(\"this\") }],\n });\n }\n if (computed.length > 0) {\n clauses.push(...computedClauses, {\n kind: \"with\",\n items: [{ expr: v(\"this\") }, ...carry.map((c) => ({ expr: v(c) }))],\n where: and(predicate, keyset),\n });\n }\n return { clauses, expectation, carry };\n}\n\n/** The computed (`@cypher`) fields a root filter or sort refers to. */\nfunction computedFields(\n node: NodeType,\n where: Where | undefined,\n sort: SortKey[],\n): CypherField[] {\n const out = new Set<CypherField>();\n const walk = (w: Where | undefined) => {\n for (const [key, value] of Object.entries(w ?? {})) {\n if (value === null || value === undefined) continue;\n if (key === \"AND\" || key === \"OR\") {\n for (const item of value as Where[]) walk(item);\n } else if (key === \"NOT\") {\n walk(value as Where);\n } else {\n const f = node.fields.get(key);\n if (f?.kind === \"cypher\" && f.computed) out.add(f);\n }\n }\n };\n walk(where);\n for (const k of sort) if (k.field.computedBy) out.add(k.field.computedBy);\n return [...out];\n}\n\ninterface RelatedAnchor {\n clauses: Clause[];\n pattern: import(\"./cypher.js\").Pattern;\n expectation: Omit<SeekExpectation, \"statement\">;\n}\n\nfunction findRelatedAnchor(\n ctx: CompileContext,\n node: NodeType,\n where: Where,\n): RelatedAnchor | undefined {\n for (const [key, value] of Object.entries(where)) {\n const rel = node.fields.get(key);\n if (rel?.kind !== \"relationship\" || value == null) continue;\n // Through an interface or union there is no single key to seek on.\n if (ctx.model.abstracts.has(rel.target)) continue;\n const target = ctx.model.nodes.get(rel.target)!;\n const inner = rel.list\n ? ((value as Where)[\"some\"] ?? (value as Where)[\"single\"])\n : value;\n if (!inner || typeof inner !== \"object\") continue;\n const ops = (inner as Where)[target.key.name] as Where | undefined;\n const eq = ops?.[\"eq\"];\n const inList = ops?.[\"in\"];\n if (eq == null && !Array.isArray(inList)) continue;\n\n const a = freshVar(ctx, `this_${rel.name}_anchor`);\n const clauses: Clause[] = [];\n let seek: Expr;\n if (eq != null) {\n seek = bin(\"=\", prop(v(a), target.key.property), bind(ctx, eq));\n } else {\n // `IN` seeks once per distinct value (E18).\n seek = bin(\n \"IN\",\n prop(v(a), target.key.property),\n bind(ctx, dedupe(inList as unknown[])),\n );\n }\n clauses.push({\n kind: \"match\",\n pattern: {\n start: { variable: a, labels: [target.labels[0]!] },\n hops: [],\n },\n where: seek,\n });\n return {\n clauses,\n // (anchor)<-[:T]-(this:Label): the field's direction, reversed.\n pattern: {\n start: { variable: a, labels: [] },\n hops: [\n {\n rel: {\n type: rel.type,\n direction: rel.direction === \"OUT\" ? \"IN\" : \"OUT\",\n },\n node: { variable: \"this\", labels: [node.labels[0]!] },\n },\n ],\n },\n expectation: {\n label: target.labels[0]!,\n access: \"exact\",\n reason: `anchored on ${target.name}.${target.key.name} through ${node.name}.${rel.name}`,\n },\n };\n }\n return undefined;\n}\n\nfunction seekFromWhere(\n node: NodeType,\n where: Where,\n): Omit<SeekExpectation, \"statement\"> | undefined {\n const label = node.labels[0]!;\n for (const access of [\"exact\", \"range\", \"text\", \"point\"] as const) {\n for (const [key, value] of Object.entries(where)) {\n const field = node.fields.get(key);\n if (field?.kind !== \"scalar\" || value == null) continue;\n const ops = Object.entries(value as Where)\n .filter(([, x]) => x != null)\n .map(([op]) => op);\n const family = {\n exact: EXACT_OPS,\n range: RANGE_OPS,\n text: TEXT_OPS,\n point: POINT_OPS,\n }[access];\n if (access === \"range\" && RANGE_UNINDEXABLE.has(field.type)) continue;\n const op = ops.find((o) => family.has(o));\n if (op) {\n return {\n label,\n access,\n reason: `${node.name}.${field.name} ${op}`,\n };\n }\n }\n }\n return undefined;\n}\n\nfunction dedupe(values: unknown[]): unknown[] {\n const seen = new Set<string>();\n return values.filter((x) => {\n const k = keyOf(x);\n if (seen.has(k)) return false;\n seen.add(k);\n return true;\n });\n}\n\n// ---------------------------------------------------------------------------\n// Sorting, limits, keyset\n// ---------------------------------------------------------------------------\n\nexport function resolveLimit(\n value: unknown,\n limit: PageLimit,\n argument: string,\n): number {\n if (value === null || value === undefined) return limit.default;\n const n = value as number;\n if (!Number.isInteger(n) || n < 0) {\n throw requestError(\n \"BAD_USER_INPUT\",\n `\\`${argument}\\` must be a non-negative integer`,\n );\n }\n if (n > limit.max) {\n throw requestError(\n \"LIMIT_EXCEEDED\",\n `\\`${argument}\\` is ${n}; the maximum is ${limit.max}`,\n );\n }\n return n;\n}\n\n/**\n * The sort keys for `value`. Connections (`tieBreak`) always end on a\n * unique field so cursors are stable; plain lists do not, because LoraDB\n * 0.15 streams an index in order only for a single sort key, and a\n * tie-breaker would turn a `LIMIT` into a sort of the whole label.\n */\nfunction resolveSort(\n ctx: CompileContext,\n node: NodeType,\n value: unknown,\n tieBreak: boolean,\n props?: RelationshipPropertiesType,\n): SortKey[] {\n const keys: SortKey[] = [];\n const one = (item: Record<string, unknown>): [string, unknown] => {\n const entries = Object.entries(item).filter(([, d]) => d != null);\n if (entries.length !== 1) {\n throw requestError(\n \"BAD_USER_INPUT\",\n \"each `sort` item names exactly one field\",\n );\n }\n return entries[0]!;\n };\n for (const item of (value as Array<Record<string, unknown>> | null) ?? []) {\n const [fieldName, direction] = one(item);\n if (fieldName === \"edge\" && props) {\n const [propName, dir] = one(direction as Record<string, unknown>);\n const field = props.fields.get(propName)!;\n if (keys.some((k) => k.edge && k.field === field)) {\n throw requestError(\n \"BAD_USER_INPUT\",\n `\\`sort\\` names edge.${propName} more than once`,\n );\n }\n keys.push({ field, direction: dir as \"ASC\" | \"DESC\", edge: true });\n continue;\n }\n const declared = node.fields.get(fieldName)!;\n const field =\n declared.kind === \"cypher\"\n ? declared.computed!\n : (declared as ScalarField);\n // Ordering by a field reveals it, and cursors carry its values.\n checkFieldAuthentication(ctx, node.name, declared);\n refuseRowRules(ctx, node, field, \"sort by\");\n if (keys.some((k) => !k.edge && k.field === field)) {\n throw requestError(\n \"BAD_USER_INPUT\",\n `\\`sort\\` names ${fieldName} more than once`,\n );\n }\n keys.push({ field, direction: direction as \"ASC\" | \"DESC\" });\n // A unique, always-present field orders totally: later items could\n // never break a tie. (Unique fields may repeat null, so a nullable\n // one still needs the key.)\n if (field.key || (field.unique && field.required)) return keys;\n }\n if (tieBreak || keys.length === 0) {\n keys.push({ field: node.key, direction: \"ASC\" });\n }\n return keys;\n}\n\n/**\n * `first` / `after`, or `last` / `before`. A backward page runs the sort\n * reversed from the cursor and is flipped back by the resolvers; cursors\n * carry the requested sort's signature, so they work in both directions.\n */\nfunction resolvePage(\n ctx: CompileContext,\n node: NodeType,\n args: Args,\n limit: PageLimit,\n props?: RelationshipPropertiesType,\n): {\n first: number;\n sort: SortKey[];\n signature: string;\n cursor: unknown[] | undefined;\n backward: boolean;\n} {\n const backward = args[\"last\"] != null || args[\"before\"] != null;\n if (backward && (args[\"first\"] != null || args[\"after\"] != null)) {\n throw requestError(\n \"BAD_USER_INPUT\",\n \"page forward with first/after or backward with last/before, not both\",\n );\n }\n const first = resolveLimit(\n backward ? args[\"last\"] : args[\"first\"],\n limit,\n backward ? \"last\" : \"first\",\n );\n const requested = resolveSort(ctx, node, args[\"sort\"], true, props);\n const signature = sortSignature(requested);\n const raw = (backward ? args[\"before\"] : args[\"after\"]) as\n | string\n | null\n | undefined;\n const cursor =\n raw != null\n ? decodeCursor(raw, signature, requested.length, ctx.model.cursorSecret)\n : undefined;\n const sort = backward\n ? requested.map((k) => ({\n ...k,\n direction: k.direction === \"ASC\" ? (\"DESC\" as const) : (\"ASC\" as const),\n }))\n : requested;\n return { first, sort, signature, cursor, backward };\n}\n\nfunction sortSignature(sort: SortKey[]): string {\n return sort\n .map((k) => `${k.edge ? \"edge.\" : \"\"}${k.field.name}:${k.direction}`)\n .join(\",\");\n}\n\nfunction sortItems(\n variable: string,\n sort: SortKey[],\n edge?: string,\n): SortItem[] {\n return sort.map((k) => ({\n expr: keyExpr(k, variable, edge),\n direction: k.direction,\n }));\n}\n\nfunction cursorValues(variable: string, sort: SortKey[], edge?: string): Expr {\n return {\n kind: \"list\",\n items: sort.map((k) => keyExpr(k, variable, edge)),\n };\n}\n\n/** Whether a sort key is guaranteed present, so a `>=` bound loses no rows. */\nfunction leadBound(k: SortKey): boolean {\n return k.field.key || (k.field.required && k.field.sortable);\n}\n\n/**\n * Rows strictly after `values` in `sort` order, written out term by term\n * (`[a, b] > $list` silently matches nothing in LoraDB). Null ordering\n * follows Cypher: nulls last ascending, first descending.\n */\nfunction keysetPredicate(\n ctx: CompileContext,\n variable: string,\n sort: SortKey[],\n values: unknown[],\n edge?: string,\n): Expr | undefined {\n const branches: Expr[] = [];\n const equal: Expr[] = [];\n let lead: Expr | undefined;\n sort.forEach((k, i) => {\n const target = keyExpr(k, variable, edge);\n const value = values[i];\n const p = value === null ? undefined : bind(ctx, value);\n const present = leadBound(k);\n let after: Expr | undefined;\n if (p === undefined) {\n // Past a null: ascending, nothing but more nulls; descending, every\n // non-null value.\n after = k.direction === \"ASC\" ? undefined : isNull(target, true);\n } else if (k.direction === \"ASC\") {\n after = present\n ? bin(\">\", target, p)\n : or(bin(\">\", target, p), isNull(target));\n } else {\n after = bin(\"<\", target, p);\n }\n if (after) branches.push(and(...equal, after)!);\n equal.push(p === undefined ? isNull(target) : bin(\"=\", target, p));\n if (i === 0 && p !== undefined && present) {\n lead = bin(k.direction === \"ASC\" ? \">=\" : \"<=\", target, p);\n }\n });\n const disjunction = or(...branches) ?? lit(false);\n return and(lead, disjunction);\n}\n\n// ---------------------------------------------------------------------------\n// Projection\n// ---------------------------------------------------------------------------\n\nconst requiresCache = new Map<string, SelectionSetNode>();\n\n/** A `requires` string as a selection set, parsed once. */\nfunction requiresSelection(requires: string): SelectionSetNode {\n const cached = requiresCache.get(requires);\n if (cached) return cached;\n const op = parse(`{ ${requires} }`).definitions[0] as OperationDefinitionNode;\n requiresCache.set(requires, op.selectionSet);\n return op.selectionSet;\n}\n\nexport interface Projection {\n /** Subqueries that must run before the projection is evaluated. */\n pre: Clause[];\n expr: Expr;\n}\n\n/**\n * Project `variable` (a `node`) with the selection sets. `rows` is how\n * many parents this projection runs for, for the cost estimate.\n */\nexport function projectNode(\n ctx: CompileContext,\n node: NodeType,\n variable: string,\n sets: SelectionSetNode[],\n rows: number,\n): Projection {\n ctx.cost += rows;\n const objType = ctx.schema.getType(node.name) as GraphQLObjectType;\n const defs = objType.getFields();\n const entries: ProjectionEntry[] = [];\n const pre: Clause[] = [];\n // A @customResolver field is computed in JavaScript from its `requires`\n // selection, which is read here with the node's other fields.\n const selected = collectFields(ctx, objType, sets);\n const required: SelectionSetNode[] = [];\n for (const [, nodes] of selected) {\n const f = node.fields.get(nodes[0]!.name.value);\n if (f?.kind === \"custom\" && f.requires) {\n required.push(requiresSelection(f.requires));\n }\n }\n const all =\n required.length > 0\n ? collectFields(ctx, objType, [...sets, ...required])\n : selected;\n for (const [key, nodes] of all) {\n const fieldName = nodes[0]!.name.value;\n if (fieldName === \"__typename\") continue;\n if (node.fields.get(fieldName)?.kind === \"custom\") continue;\n if (fieldName === \"id\" && node.key.relayId) {\n entries.push({\n kind: \"entry\",\n key,\n value: prop(v(variable), node.key.property),\n });\n continue;\n }\n const def = defs[fieldName];\n const field = node.fields.get(fieldName);\n const rel = field ?? connectionOf(node, fieldName);\n if (rel) checkFieldAuthentication(ctx, node.name, rel);\n if (field?.kind === \"scalar\") {\n const rule = fieldValidate(ctx, node, field, variable, \"READ\");\n if (rule) {\n // Field-level READ rule: a row failing it reads as FORBIDDEN.\n entries.push({\n kind: \"entry\",\n key,\n value: {\n kind: \"case\",\n when: fn(\"coalesce\", rule, lit(false)),\n then: prop(v(variable), field.property),\n else: {\n kind: \"map\",\n entries: [{ key: \"__forbidden\", value: lit(true) }],\n },\n },\n });\n } else {\n entries.push(\n key === field.property\n ? { kind: \"property\", key }\n : { kind: \"entry\", key, value: prop(v(variable), field.property) },\n );\n }\n continue;\n }\n const args = def ? fieldArgs(ctx, def, nodes[0]!) : {};\n const nested = subSelections(nodes);\n let result: Projection;\n if (\n field?.kind === \"relationship\" &&\n ctx.model.abstracts.has(field.target)\n ) {\n result = projectPolymorphic(\n ctx,\n variable,\n field,\n key,\n args,\n nested,\n rows,\n );\n } else if (field?.kind === \"relationship\") {\n result = projectRelationship(\n ctx,\n variable,\n field,\n key,\n args,\n nested,\n rows,\n );\n } else if (field?.kind === \"cypher\") {\n result = projectCypher(ctx, variable, field, key, args, nested, rows);\n } else {\n const connected = connectionOf(node, fieldName);\n if (!connected) continue;\n result = projectRelationshipConnection(\n ctx,\n variable,\n connected,\n key,\n args,\n nested,\n rows,\n );\n }\n pre.push(...result.pre);\n // A field-level READ rule on a relationship or @cypher field: a row\n // failing it reads as FORBIDDEN, like a scalar field's.\n const guarded = field ?? connectionOf(node, fieldName);\n const rule = guarded\n ? fieldValidate(ctx, node, guarded, variable, \"READ\")\n : undefined;\n entries.push({\n kind: \"entry\",\n key,\n value: rule\n ? {\n kind: \"case\",\n when: fn(\"coalesce\", rule, lit(false)),\n then: result.expr,\n else: {\n kind: \"map\",\n entries: [{ key: \"__forbidden\", value: lit(true) }],\n },\n }\n : result.expr,\n });\n }\n // Read validation: the resolvers turn `false` into a FORBIDDEN error.\n const validate = authValidate(ctx, node, variable, \"READ\", \"BEFORE\");\n if (validate)\n entries.push({ kind: \"entry\", key: \"__authorized\", value: validate });\n return { pre, expr: { kind: \"mapProjection\", variable, entries } };\n}\n\nfunction connectionOf(\n node: NodeType,\n fieldName: string,\n): RelationshipField | undefined {\n if (!fieldName.endsWith(\"Connection\")) return undefined;\n const rel = node.fields.get(fieldName.slice(0, -\"Connection\".length));\n return rel?.kind === \"relationship\" && rel.list ? rel : undefined;\n}\n\n/** Rows a list relationship yields per parent, for the cost estimate. */\nfunction fanOut(\n ctx: CompileContext,\n rel: RelationshipField,\n limit: number,\n): number {\n const degree = ctx.degrees.get(`${rel.owner}.${rel.name}`) ?? rel.cardinality;\n return degree === undefined ? limit : Math.min(limit, Math.max(degree, 1));\n}\n\nfunction projectRelationship(\n ctx: CompileContext,\n parent: string,\n rel: RelationshipField,\n key: string,\n args: Args,\n sets: SelectionSetNode[],\n rows: number,\n): Projection {\n const target = ctx.model.nodes.get(rel.target)!;\n checkAuthentication(ctx, target, \"READ\");\n const label = target.labels[0]!;\n ctx.reads.labels.add(label);\n ctx.reads.relationships.add(rel.type);\n const x = freshVar(ctx, `${parent}_${key}`);\n const pattern = relationshipPattern(parent, rel, label, x);\n const where = and(\n compileNodeWhere(ctx, target, x, args[\"where\"] as Where),\n authFilter(ctx, target, x, \"READ\"),\n );\n\n if (!rel.list) {\n const nested = projectNode(ctx, target, x, sets, rows);\n if (nested.pre.length === 0) {\n // head([(this)-[:T]->(x:Target) | x { ... }])\n return {\n pre: [],\n expr: fn(\"head\", {\n kind: \"comprehension\",\n pattern,\n where,\n projection: nested.expr,\n }),\n };\n }\n const out = freshVar(ctx, `${x}_one`);\n return {\n pre: [\n {\n kind: \"call\",\n imports: [parent],\n body: [\n { kind: \"match\", pattern, where },\n { kind: \"with\", items: [{ expr: v(x) }], limit: lit(1) },\n ...nested.pre,\n ...collectOne(nested.expr, out),\n ],\n },\n ],\n expr: v(out),\n };\n }\n\n const limit = resolveLimit(args[\"limit\"], rel.limit ?? target.limit, \"limit\");\n const userSort = args[\"sort\"] as unknown[] | null | undefined;\n const limitParam = bind(ctx, limit);\n const nested = projectNode(\n ctx,\n target,\n x,\n sets,\n rows * fanOut(ctx, rel, limit),\n );\n // Without a sort, related nodes come back in @key order: deterministic,\n // and limited before they are projected.\n const sort = resolveSort(ctx, target, userSort, false);\n const out = freshVar(ctx, `${x}_list`);\n return {\n pre: [\n {\n kind: \"call\",\n imports: [parent],\n body: [\n { kind: \"match\", pattern, where },\n {\n kind: \"with\",\n items: [{ expr: v(x) }],\n orderBy: sortItems(x, sort),\n limit: limitParam,\n },\n ...nested.pre,\n {\n kind: \"return\",\n items: [{ expr: fn(\"collect\", nested.expr), alias: out }],\n },\n ],\n },\n ],\n expr: v(out),\n };\n}\n\nfunction projectRelationshipConnection(\n ctx: CompileContext,\n parent: string,\n rel: RelationshipField,\n key: string,\n args: Args,\n sets: SelectionSetNode[],\n rows: number,\n): Projection {\n const target = ctx.model.nodes.get(rel.target)!;\n checkAuthentication(ctx, target, \"READ\");\n const label = target.labels[0]!;\n ctx.reads.labels.add(label);\n ctx.reads.relationships.add(rel.type);\n const props = rel.properties\n ? ctx.model.relationshipProperties.get(rel.properties)\n : undefined;\n\n const { first, sort, signature, cursor, backward } = resolvePage(\n ctx,\n target,\n args,\n rel.limit ?? target.limit,\n hasOwnConnection(rel) ? props : undefined,\n );\n\n const own = hasOwnConnection(rel);\n const typeNames = connectionTypeNames(rel, target);\n const connType = ctx.schema.getType(\n typeNames.connection,\n ) as GraphQLObjectType;\n const edgeType = ctx.schema.getType(typeNames.edge) as GraphQLObjectType;\n const sel = connectionSelections(\n ctx,\n connType,\n edgeType,\n sets,\n target,\n props,\n );\n\n const x = freshVar(ctx, `${parent}_${key}`);\n const r = freshVar(ctx, `${x}_rel`);\n const pattern = relationshipPattern(parent, rel, label, x, r);\n\n const whereArg = args[\"where\"] as Where | null | undefined;\n const nodeWhere = own ? (whereArg?.[\"node\"] as Where | undefined) : whereArg;\n const edgeWhere = own ? (whereArg?.[\"edge\"] as Where | undefined) : undefined;\n const filterFor = (nv: string, rv: string) =>\n and(\n compileNodeWhere(ctx, target, nv, nodeWhere),\n props ? compilePropsWhere(ctx, props, rv, edgeWhere) : undefined,\n authFilter(ctx, target, nv, \"READ\"),\n );\n const filter = filterFor(x, r);\n const keyset = cursor ? keysetPredicate(ctx, x, sort, cursor, r) : undefined;\n\n const nested = projectNode(\n ctx,\n target,\n x,\n sel.node,\n rows * fanOut(ctx, rel, first + 1),\n );\n const edgeEntries = [\n { key: \"node\", value: nested.expr },\n { key: \"__cursor\", value: cursorValues(x, sort, r) },\n ];\n if (props && sel.properties.length > 0) {\n edgeEntries.push({\n key: \"properties\",\n value: projectProperties(ctx, props.name, r, sel.properties),\n });\n }\n\n const rowsVar = freshVar(ctx, `${x}_rows`);\n const connection: Array<{ key: string; value: Expr }> = [\n { key: \"__rows\", value: v(rowsVar) },\n { key: \"__first\", value: bind(ctx, first) },\n { key: \"__after\", value: bind(ctx, cursor !== undefined) },\n { key: \"__backward\", value: bind(ctx, backward) },\n { key: \"__sort\", value: bind(ctx, signature) },\n ];\n // All matching pairs, for totalCount and aggregates.\n const matching = (projection: (nv: string, rv: string) => Expr): Expr => {\n const cx = freshVar(ctx, `${x}_all`);\n const cr = freshVar(ctx, `${cx}_rel`);\n return {\n kind: \"comprehension\",\n pattern: relationshipPattern(parent, rel, label, cx, cr),\n where: filterFor(cx, cr),\n projection: projection(cx, cr),\n };\n };\n if (sel.aggregate) {\n const sides: Array<{ key: string; value: Expr }> = [];\n for (const side of [\"node\", \"edge\"] as const) {\n const fields = sel.aggregate[side];\n if (fields.length === 0) continue;\n sides.push({\n key: side,\n value: {\n kind: \"map\",\n entries: fields.map(({ field, fns }) => ({\n key: field.name,\n value: {\n kind: \"map\",\n entries: fns.map((agg) => ({\n key: agg,\n value: listAggregate(\n ctx,\n agg as ListAggregate,\n matching((nv, rv) =>\n prop(v(side === \"node\" ? nv : rv), field.property),\n ),\n { duration: field.type === \"Duration\" },\n ),\n })),\n },\n })),\n },\n });\n }\n connection.push({\n key: \"__aggregate\",\n value: {\n kind: \"map\",\n entries: [\n {\n // Related nodes, and relationships: they differ when several\n // relationships lead to the same node.\n key: \"count\",\n value: {\n kind: \"map\",\n entries: [\n {\n key: \"nodes\",\n value: distinctCount(\n ctx,\n matching((nv) => prop(v(nv), target.key.property)),\n ),\n },\n {\n key: \"edges\",\n value: fn(\n \"size\",\n matching(() => lit(1)),\n ),\n },\n ],\n },\n },\n ...sides,\n ],\n },\n });\n }\n if (sel.totalCount || sel.aggregate) {\n const cx = freshVar(ctx, `${x}_count`);\n const cr = freshVar(ctx, `${cx}_rel`);\n connection.push({\n key: \"__totalCount\",\n value: fn(\"size\", {\n kind: \"comprehension\",\n pattern: relationshipPattern(parent, rel, label, cx, cr),\n where: filterFor(cx, cr),\n projection: lit(1),\n }),\n });\n const rule = authValidate(ctx, target, cx, \"READ\", \"BEFORE\");\n if (rule) {\n connection.push({\n key: \"__denied\",\n value: fn(\"size\", {\n kind: \"comprehension\",\n pattern: relationshipPattern(parent, rel, label, cx, cr),\n where: and(filterFor(cx, cr), not(fn(\"coalesce\", rule, lit(false)))),\n projection: lit(1),\n }),\n });\n }\n }\n\n if (!sel.page) {\n // Only counts or aggregates: no page to read.\n connection[0] = { key: \"__rows\", value: { kind: \"list\", items: [] } };\n return { pre: [], expr: { kind: \"map\", entries: connection } };\n }\n return {\n pre: [\n {\n kind: \"call\",\n imports: [parent],\n body: [\n { kind: \"match\", pattern, where: and(filter, keyset) },\n {\n kind: \"with\",\n items: [{ expr: v(r) }, { expr: v(x) }],\n orderBy: sortItems(x, sort, r),\n limit: bind(ctx, first + 1),\n },\n ...nested.pre,\n {\n kind: \"return\",\n items: [\n {\n expr: fn(\"collect\", { kind: \"map\", entries: edgeEntries }),\n alias: rowsVar,\n },\n ],\n },\n ],\n },\n ],\n expr: { kind: \"map\", entries: connection },\n };\n}\n\n/**\n * A node `variable` of an interface or union, projected as the member its\n * label says, with `__typename`. `where` keeps the nodes of some member\n * the caller may read; others (and non-members) are dropped.\n */\nfunction projectAbstract(\n ctx: CompileContext,\n abstract: AbstractType,\n variable: string,\n sets: SelectionSetNode[],\n rows: number,\n): { pre: Clause[]; where: Expr; expr: Expr } {\n const pre: Clause[] = [];\n const branches: Array<{ when: Expr; then: Expr }> = [];\n for (const name of abstract.members) {\n const member = ctx.model.nodes.get(name)!;\n checkAuthentication(ctx, member, \"READ\");\n ctx.reads.labels.add(member.labels[0]!);\n const projection = projectNode(ctx, member, variable, sets, rows);\n pre.push(...projection.pre);\n const expr = projection.expr as Extract<Expr, { kind: \"mapProjection\" }>;\n branches.push({\n when:\n and(\n { kind: \"hasLabels\", variable, labels: [member.labels[0]!] },\n coalesceFalse(authFilter(ctx, member, variable, \"READ\")),\n ) ?? lit(true),\n then: {\n ...expr,\n entries: [\n ...expr.entries,\n { kind: \"entry\", key: \"__typename\", value: lit(member.name) },\n ],\n },\n });\n }\n const chain = branches.reduceRight<Expr>(\n (otherwise, b) => ({\n kind: \"case\",\n when: b.when,\n then: b.then,\n else: otherwise,\n }),\n lit(null),\n );\n return {\n pre,\n where: or(...branches.map((b) => b.when)) ?? lit(false),\n expr: chain,\n };\n}\n\n/**\n * An object `@cypher` field, run once per parent:\n *\n * CALL { WITH parent WITH parent AS this\n * CALL { WITH this <statement> }\n * RETURN collect(<column>) AS out }\n */\nfunction projectCypher(\n ctx: CompileContext,\n parent: string,\n field: CypherField,\n key: string,\n args: Args,\n sets: SelectionSetNode[],\n rows: number,\n): Projection {\n const out = freshVar(ctx, `${parent}_${key}`);\n const body: Clause[] = [];\n if (parent !== \"this\") {\n body.push({ kind: \"with\", items: [{ expr: v(parent), alias: \"this\" }] });\n }\n body.push({\n kind: \"call\",\n imports: [\"this\"],\n body: [{ kind: \"raw\", text: bindStatement(ctx, field, args) }],\n });\n const column = field.columnName;\n const gather = (value: Expr): Clause[] =>\n field.type.list\n ? [\n {\n kind: \"return\",\n items: [{ expr: fn(\"collect\", value), alias: out }],\n },\n ]\n : collectOne(value, out);\n if (field.node) {\n const target = ctx.model.nodes.get(field.node)!;\n checkAuthentication(ctx, target, \"READ\");\n ctx.reads.labels.add(target.labels[0]!);\n const x = freshVar(ctx, `${out}_node`);\n const per = field.type.list ? target.limit.default : 1;\n const nested = projectNode(ctx, target, x, sets, rows * per);\n body.push(\n {\n kind: \"with\",\n items: [{ expr: v(column), alias: x }],\n where: authFilter(ctx, target, x, \"READ\"),\n },\n ...nested.pre,\n ...gather(nested.expr),\n );\n } else if (field.abstract) {\n const x = freshVar(ctx, `${out}_node`);\n const abstract = ctx.model.abstracts.get(field.abstract)!;\n const per = field.type.list ? abstract.limit.default : 1;\n const nested = projectAbstract(ctx, abstract, x, sets, rows * per);\n body.push(\n {\n kind: \"with\",\n items: [{ expr: v(column), alias: x }],\n where: nested.where,\n },\n ...nested.pre,\n ...gather(nested.expr),\n );\n } else {\n ctx.cost += rows;\n body.push(...gather(v(column)));\n }\n return {\n pre: [{ kind: \"call\", imports: [parent], body }],\n expr: v(out),\n };\n}\n\n/**\n * `sum(CASE WHEN <READ validate rule> THEN 0 ELSE 1 END) AS __denied`:\n * aggregates and counts cover nodes a READ validate rule rejects, so they\n * fail like reading those nodes would.\n */\nfunction deniedItem(\n ctx: CompileContext,\n node: NodeType,\n variable: string,\n): Array<{ expr: Expr; alias: string }> {\n const rule = authValidate(ctx, node, variable, \"READ\", \"BEFORE\");\n if (!rule) return [];\n return [\n {\n expr: fn(\"sum\", {\n kind: \"case\",\n when: fn(\"coalesce\", rule, lit(false)),\n then: lit(0),\n else: lit(1),\n }),\n alias: \"__denied\",\n },\n ];\n}\n\nfunction assertNoneDenied(row: Record<string, unknown> | undefined): void {\n if (Number(row?.[\"__denied\"] ?? 0) > 0) {\n throw requestError(\"FORBIDDEN\", \"not allowed to read some of these nodes\");\n }\n}\n\n/**\n * `RETURN head(collect(x)) AS out`, written as two clauses: LoraDB 0.15\n * does not treat an aggregate nested inside another call as aggregating.\n */\nfunction collectOne(value: Expr, out: string): Clause[] {\n return [\n { kind: \"with\", items: [{ expr: fn(\"collect\", value), alias: out }] },\n { kind: \"return\", items: [{ expr: fn(\"head\", v(out)), alias: out }] },\n ];\n}\n\nfunction projectProperties(\n ctx: CompileContext,\n propsType: string,\n variable: string,\n sets: SelectionSetNode[],\n): Expr {\n const props = ctx.model.relationshipProperties.get(propsType)!;\n const objType = ctx.schema.getType(propsType) as GraphQLObjectType;\n const entries: ProjectionEntry[] = [];\n for (const [key, nodes] of collectFields(ctx, objType, sets)) {\n const field = props.fields.get(nodes[0]!.name.value);\n if (!field) continue;\n entries.push(\n key === field.property\n ? { kind: \"property\", key }\n : { kind: \"entry\", key, value: prop(v(variable), field.property) },\n );\n }\n return { kind: \"mapProjection\", variable, entries };\n}\n\n/** Aggregates a connection's `aggregate { … }` asks for. */\ninterface AggregateSpec {\n node: Array<{ field: ScalarField; fns: string[] }>;\n edge: Array<{ field: ScalarField; fns: string[] }>;\n}\n\n/** What a connection selection asks for, merged across aliases. */\nfunction connectionSelections(\n ctx: CompileContext,\n connType: GraphQLObjectType,\n edgeType: GraphQLObjectType,\n sets: SelectionSetNode[],\n target: NodeType,\n props: RelationshipPropertiesType | undefined,\n): {\n node: SelectionSetNode[];\n properties: SelectionSetNode[];\n totalCount: boolean;\n /** `edges` or `pageInfo` selected: the page must be read. */\n page: boolean;\n aggregate: AggregateSpec | undefined;\n} {\n const node: SelectionSetNode[] = [];\n const properties: SelectionSetNode[] = [];\n let totalCount = false;\n let page = false;\n let aggregate: AggregateSpec | undefined;\n for (const [, nodes] of collectFields(ctx, connType, sets)) {\n const name = nodes[0]!.name.value;\n if (name === \"totalCount\") totalCount = true;\n if (name === \"pageInfo\") page = true;\n if (name === \"aggregate\") {\n aggregate ??= { node: [], edge: [] };\n const aggType = getNamedType(\n connType.getFields()[\"aggregate\"]!.type,\n ) as GraphQLObjectType;\n for (const [, side] of collectFields(\n ctx,\n aggType,\n subSelections(nodes),\n )) {\n const sideName = side[0]!.name.value;\n if (sideName !== \"node\" && sideName !== \"edge\") continue;\n const sideType = getNamedType(\n aggType.getFields()[sideName]!.type,\n ) as GraphQLObjectType;\n for (const [, fieldNodes] of collectFields(\n ctx,\n sideType,\n subSelections(side),\n )) {\n const fieldName = fieldNodes[0]!.name.value;\n const field =\n sideName === \"node\"\n ? target.fields.get(fieldName)\n : props?.fields.get(fieldName);\n if (field?.kind !== \"scalar\") continue;\n if (sideName === \"node\") {\n checkFieldAuthentication(ctx, target.name, field);\n refuseRowRules(ctx, target, field, \"aggregate\");\n }\n const fieldType = getNamedType(\n sideType.getFields()[fieldName]!.type,\n ) as GraphQLObjectType;\n const fns = [\n ...collectFields(\n ctx,\n fieldType,\n subSelections(fieldNodes),\n ).values(),\n ]\n .map((n) => n[0]!.name.value)\n .filter((f) => AGGREGATES.has(f));\n const list = aggregate[sideName];\n const existing = list.find((e) => e.field === field);\n if (existing) existing.fns = [...new Set([...existing.fns, ...fns])];\n else list.push({ field, fns });\n }\n }\n }\n if (name !== \"edges\") continue;\n page = true;\n for (const [, edgeNodes] of collectFields(\n ctx,\n edgeType,\n subSelections(nodes),\n )) {\n const edgeField = edgeNodes[0]!.name.value;\n if (edgeField === \"node\") node.push(...subSelections(edgeNodes));\n if (edgeField === \"properties\")\n properties.push(...subSelections(edgeNodes));\n }\n }\n return { node, properties, totalCount, page, aggregate };\n}\n\n/** A rule condition as a WHERE predicate: an unknown result excludes. */\nfunction coalesceFalse(e: Expr | undefined): Expr | undefined {\n return e && fn(\"coalesce\", e, lit(false));\n}\n","// S5: what a write changed, and whether a read could have seen it.\n\nimport type { MutationOperation } from \"../model/types.js\";\n\nexport interface EntityRef {\n /** Node type name. */\n type: string;\n /** Its @key value. */\n key: unknown;\n}\n\nexport interface RelationshipRef {\n /** Relationship type, e.g. `FOLLOWS`. */\n type: string;\n /** `Owner.field` that declares it. */\n field: string;\n from: EntityRef;\n to: EntityRef;\n}\n\nexport interface WriteChange {\n /** `EXTERNAL`: from the engine's change feed (`changeFeed: true`). */\n operation: MutationOperation | \"UPSERT\" | \"CYPHER\" | \"EXTERNAL\";\n /** When the change was committed (ISO-8601), set when it is emitted. */\n timestamp?: string;\n /**\n * Stored properties before the write, for updated and deleted nodes of\n * types with `@subscription(previousState: true)`.\n */\n before?: Array<{\n type: string;\n key: unknown;\n properties: Record<string, unknown>;\n }>;\n /** The Mutation field that made the change. */\n field: string;\n created: EntityRef[];\n updated: EntityRef[];\n deleted: EntityRef[];\n connected: RelationshipRef[];\n disconnected: RelationshipRef[];\n /**\n * Every node whose observable state changed: created, updated and\n * deleted nodes, and both ends of every relationship written. A\n * response cache should invalidate by `types` too: lists, counts and\n * connections change without naming an entity (see the Yoga example).\n */\n entities: EntityRef[];\n /** Node types in `entities`: lists of these types may have changed. */\n types: string[];\n relationshipTypes: string[];\n /**\n * The write-set is unknown (a `@cypher` mutation): treat everything as\n * changed.\n */\n broad: boolean;\n}\n\nexport interface ReadSetLike {\n labels: readonly string[];\n relationships: readonly string[];\n}\n\n/**\n * Whether a read with this read-set may observe the change. Label-level:\n * a read of `:Festival` nodes is affected by any Festival write.\n */\nexport function affects(\n reads: ReadSetLike,\n change: WriteChange,\n labelsOf: (type: string) => readonly string[],\n): boolean {\n if (change.broad) return true;\n const labels = new Set(change.types.flatMap(labelsOf));\n return (\n reads.labels.some((l) => labels.has(l)) ||\n reads.relationships.some((r) => change.relationshipTypes.includes(r))\n );\n}\n","import { requestError } from \"../errors.js\";\n\n/**\n * Nodes carrying `__authorized: false` failed an `@authorization`\n * validate rule for READ: reading them is an error, not an empty result.\n */\nexport function assertReadable<T>(value: T): T {\n if (Array.isArray(value)) {\n for (const item of value) assertReadable(item);\n } else if (\n value !== null &&\n typeof value === \"object\" &&\n (value as { __authorized?: unknown }).__authorized === false\n ) {\n throw requestError(\"FORBIDDEN\", \"not allowed to read this node\");\n }\n return value;\n}\n","// The generated Mutation surface: only for types with @mutation, keyed\n// by @key (so every write-set is exact), with nested connect / create /\n// update / disconnect on relationships, math and list operators, and bulk\n// updates and deletes that resolve their keys first.\n\nimport {\n GraphQLBoolean,\n GraphQLFloat,\n GraphQLInputObjectType,\n GraphQLInt,\n GraphQLList,\n GraphQLNonNull,\n GraphQLObjectType,\n type GraphQLFieldConfigMap,\n type GraphQLInputFieldConfigMap,\n type GraphQLInputType,\n type GraphQLResolveInfo,\n type GraphQLScalarType,\n} from \"graphql\";\nimport type {\n GraphModel,\n MutationOperation,\n NodeType,\n NestedOperation,\n RelationshipField,\n RelationshipPropertiesType,\n ScalarField,\n} from \"../model/types.js\";\nimport { memberFields } from \"../model/relations.js\";\nimport { upperFirst } from \"./names.js\";\n\n/** A generated mutation: the single-node ones, and the bulk ones by where. */\nexport type MutationKind =\n | MutationOperation\n | \"UPSERT\"\n | \"UPDATE_MANY\"\n | \"DELETE_MANY\";\n\nexport type MutationResolver = (\n operation: MutationKind,\n node: NodeType,\n info: GraphQLResolveInfo,\n context: unknown,\n) => Promise<unknown>;\n\nexport const mutationNames = {\n create: (t: NodeType) => `create${upperFirst(t.plural)}`,\n update: (t: NodeType) => `update${t.name}`,\n delete: (t: NodeType) => `delete${t.name}`,\n upsert: (t: NodeType) => `upsert${upperFirst(t.plural)}`,\n updateMany: (t: NodeType) => `update${upperFirst(t.plural)}`,\n deleteMany: (t: NodeType) => `delete${upperFirst(t.plural)}`,\n upsertInput: (t: string) => `${t}UpsertInput`,\n upsertPayload: (t: NodeType) => `Upsert${upperFirst(t.plural)}Payload`,\n createInput: (t: string) => `${t}CreateInput`,\n updateInput: (t: string) => `${t}UpdateInput`,\n adjustInput: (t: string) => `${t}AdjustInput`,\n createPayload: (t: NodeType) => `Create${upperFirst(t.plural)}Payload`,\n updatePayload: (t: NodeType) => `Update${t.name}Payload`,\n updateManyPayload: (t: NodeType) => `Update${upperFirst(t.plural)}Payload`,\n relationCreate: (t: string, f: string) =>\n `${t}${upperFirst(f)}CreateRelationInput`,\n relationUpdate: (t: string, f: string) =>\n `${t}${upperFirst(f)}UpdateRelationInput`,\n connect: (t: string, f: string) => `${t}${upperFirst(f)}ConnectInput`,\n nestedCreate: (t: string, f: string) => `${t}${upperFirst(f)}CreateNodeInput`,\n nestedUpdate: (t: string, f: string) =>\n `${t}${upperFirst(f)}UpdateConnectedInput`,\n /** Payload field holding the created nodes / the updated node. */\n createdField: (t: NodeType) => t.plural,\n updatedField: (t: NodeType) =>\n t.name.charAt(0).toLowerCase() + t.name.slice(1),\n};\n\nconst nonNull = <T extends GraphQLInputType>(t: T) => new GraphQLNonNull(t);\nconst listOf = <T extends GraphQLInputType>(t: T) => new GraphQLList(t);\n\nexport interface MutationSchemaContext {\n model: GraphModel;\n object: (typeName: string) => GraphQLObjectType;\n inputType: (f: ScalarField) => GraphQLInputType;\n where: (typeName: string) => GraphQLInputType;\n}\n\n/** Whether clients may set a field on `op` (`@settable`, `@readonly`, …). */\nexport function settable(f: ScalarField, op: \"CREATE\" | \"UPDATE\"): boolean {\n return op === \"CREATE\" ? f.settableOn.create : f.settableOn.update;\n}\n\n/** Whether the create input must carry the field. */\nexport function requiredOnCreate(f: ScalarField): boolean {\n return (\n f.required &&\n !f.defaultValue &&\n !f.timestamp?.has(\"CREATE\") &&\n !f.populatedBy?.operations.has(\"CREATE\") &&\n !(f.key && f.generate)\n );\n}\n\n/** A type with nothing settable after create has no update. */\nexport function isUpdatable(node: NodeType): boolean {\n return [...node.fields.values()].some(\n (f) =>\n f.kind === \"relationship\" ||\n (f.kind === \"scalar\" && settable(f, \"UPDATE\")),\n );\n}\n\n/** Numeric and list fields take operators in `adjust`. */\nexport function adjustable(f: ScalarField): boolean {\n if (!settable(f, \"UPDATE\") || f.vector) return false;\n if (f.list) return f.type !== \"Point\" && f.type !== \"CartesianPoint\";\n return f.type === \"Int\" || f.type === \"Float\" || f.type === \"BigInt\";\n}\n\nexport function buildMutations(\n ctx: MutationSchemaContext,\n resolve: MutationResolver,\n): GraphQLFieldConfigMap<unknown, unknown> {\n const { model } = ctx;\n const inputs = new Map<string, GraphQLInputObjectType>();\n const once = (\n name: string,\n fields: () => GraphQLInputFieldConfigMap,\n description?: string,\n ) => {\n let t = inputs.get(name);\n if (!t) {\n t = new GraphQLInputObjectType({ name, fields, description });\n inputs.set(name, t);\n }\n return t;\n };\n\n const scalarInputs = (\n fields: Iterable<ScalarField>,\n op: \"CREATE\" | \"UPDATE\",\n ): GraphQLInputFieldConfigMap => {\n const out: GraphQLInputFieldConfigMap = {};\n for (const f of fields) {\n if (!settable(f, op)) continue;\n const base = ctx.inputType(f);\n const t: GraphQLInputType = f.list ? listOf(nonNull(base)) : base;\n out[f.name] = {\n type: op === \"CREATE\" && requiredOnCreate(f) ? nonNull(t) : t,\n description:\n op === \"UPDATE\" && !f.required\n ? `${f.description ? f.description + \" \" : \"\"}null removes the value.`\n : f.description,\n };\n }\n return out;\n };\n\n const propsCreate = (props: RelationshipPropertiesType) =>\n once(`${props.name}CreateInput`, () =>\n scalarInputs(props.fields.values(), \"CREATE\"),\n );\n const propsUpdate = (props: RelationshipPropertiesType) => {\n const fields = scalarInputs(props.fields.values(), \"UPDATE\");\n return Object.keys(fields).length > 0\n ? once(`${props.name}UpdateInput`, () => fields)\n : undefined;\n };\n const propsRequired = (props: RelationshipPropertiesType) =>\n [...props.fields.values()].some(\n (f) => settable(f, \"CREATE\") && requiredOnCreate(f),\n );\n\n const edgeField = (rel: RelationshipField): GraphQLInputFieldConfigMap => {\n if (!rel.properties) return {};\n const props = model.relationshipProperties.get(rel.properties)!;\n const t = propsCreate(props);\n return { edge: { type: propsRequired(props) ? nonNull(t) : t } };\n };\n\n const connectInput = (owner: NodeType, rel: RelationshipField) => {\n const target = model.nodes.get(rel.target)!;\n return once(\n mutationNames.connect(owner.name, rel.name),\n () => ({\n [target.key.name]: { type: nonNull(ctx.inputType(target.key)) },\n ...edgeField(rel),\n }),\n `Connect an existing ${target.name} by ${target.key.name}. Connecting a connected pair updates the relationship's properties.`,\n );\n };\n\n const nestedCreateInput = (owner: NodeType, rel: RelationshipField) =>\n once(mutationNames.nestedCreate(owner.name, rel.name), () => ({\n node: { type: nonNull(createInput(model.nodes.get(rel.target)!)) },\n ...edgeField(rel),\n }));\n\n // `update: [{ key, edge, node }]`: change a connected pair in place.\n const nestedUpdateInput = (owner: NodeType, rel: RelationshipField) => {\n const target = model.nodes.get(rel.target)!;\n const props = rel.properties\n ? model.relationshipProperties.get(rel.properties)\n : undefined;\n const edge = props ? propsUpdate(props) : undefined;\n const node =\n target.mutations.has(\"UPDATE\") && isUpdatable(target)\n ? updateInput(target)\n : undefined;\n if (!edge && !node) return undefined;\n return once(mutationNames.nestedUpdate(owner.name, rel.name), () => ({\n ...(rel.list\n ? { [target.key.name]: { type: nonNull(ctx.inputType(target.key)) } }\n : {}),\n ...(edge ? { edge: { type: edge } } : {}),\n ...(node ? { node: { type: node } } : {}),\n }));\n };\n\n const canCreate = (rel: RelationshipField) =>\n model.nodes.get(rel.target)!.mutations.has(\"CREATE\");\n\n // Over an interface or union: the same inputs, one field per member.\n const polymorphicFields = (\n owner: NodeType,\n rel: RelationshipField,\n update: boolean,\n ): GraphQLInputFieldConfigMap => {\n const members = memberFields(model, rel).map((m) => ({\n member: m.target,\n // A naming copy, so each member's inputs get their own type names.\n rel: { ...m, name: `${rel.name}${m.target}` },\n }));\n const byMember = (\n suffix: string,\n type: (m: (typeof members)[number]) => GraphQLInputType | undefined,\n ) => {\n const fields: GraphQLInputFieldConfigMap = {};\n for (const m of members) {\n const t = type(m);\n if (t) fields[m.member] = { type: t };\n }\n return Object.keys(fields).length > 0\n ? once(`${owner.name}${upperFirst(rel.name)}${suffix}`, () => fields)\n : undefined;\n };\n const out: GraphQLInputFieldConfigMap = {};\n const allows = (op: NestedOperation) => rel.nestedOperations.has(op);\n const connect = allows(\"CONNECT\")\n ? byMember(\"ConnectMembers\", (m) => {\n const t = connectInput(owner, m.rel);\n return rel.list ? listOf(nonNull(t)) : t;\n })\n : undefined;\n if (connect) out[\"connect\"] = { type: connect };\n const create = allows(\"CREATE\")\n ? byMember(\"CreateMembers\", (m) => {\n if (!model.nodes.get(m.member)!.mutations.has(\"CREATE\"))\n return undefined;\n const t = nestedCreateInput(owner, m.rel);\n return rel.list ? listOf(nonNull(t)) : t;\n })\n : undefined;\n if (create) out[\"create\"] = { type: create };\n if (update && allows(\"DISCONNECT\")) {\n out[\"disconnect\"] = rel.list\n ? {\n type: byMember(\"DisconnectMembers\", (m) =>\n listOf(nonNull(ctx.inputType(model.nodes.get(m.member)!.key))),\n )!,\n }\n : {\n type: GraphQLBoolean,\n description: `true removes the current ${rel.target}.`,\n };\n }\n return out;\n };\n\n const relationFields = (\n owner: NodeType,\n rel: RelationshipField,\n update: boolean,\n ): GraphQLInputFieldConfigMap => {\n if (model.abstracts.has(rel.target))\n return polymorphicFields(owner, rel, update);\n const target = model.nodes.get(rel.target)!;\n const allows = (op: NestedOperation) => rel.nestedOperations.has(op);\n const fields: GraphQLInputFieldConfigMap = {};\n if (allows(\"CONNECT\")) {\n const connect = connectInput(owner, rel);\n fields[\"connect\"] = {\n type: rel.list ? listOf(nonNull(connect)) : connect,\n };\n }\n if (allows(\"CREATE\") && canCreate(rel)) {\n const create = nestedCreateInput(owner, rel);\n fields[\"create\"] = { type: rel.list ? listOf(nonNull(create)) : create };\n }\n if (update && allows(\"DISCONNECT\")) {\n fields[\"disconnect\"] = rel.list\n ? {\n type: listOf(nonNull(ctx.inputType(target.key))),\n description: `${target.key.name}s of the ${target.name} nodes to disconnect.`,\n }\n : {\n type: GraphQLBoolean,\n description: `true removes the current ${target.name}.`,\n };\n }\n if (update && allows(\"DELETE\") && target.mutations.has(\"DELETE\")) {\n fields[\"delete\"] = rel.list\n ? {\n type: once(\n `${owner.name}${upperFirst(rel.name)}NestedDeleteInput`,\n () => ({\n where: {\n type: ctx.where(target.name),\n description: `Which connected ${target.name} nodes; all of them when absent.`,\n },\n limit: {\n type: GraphQLInt,\n description:\n \"At most this many (default: maxBatch); more matching is an error.\",\n },\n }),\n `Delete connected ${target.name} nodes, following their onDelete rules.`,\n ),\n }\n : {\n type: GraphQLBoolean,\n description: `true deletes the connected ${target.name}.`,\n };\n }\n if (update && allows(\"UPDATE\")) {\n const nested = nestedUpdateInput(owner, rel);\n if (nested) {\n fields[\"update\"] = {\n type: rel.list ? listOf(nonNull(nested)) : nested,\n description: `Update connected ${target.name} nodes or their relationship properties in place.`,\n };\n }\n }\n return fields;\n };\n\n const scalarsOf = (node: NodeType) =>\n [...node.fields.values()].filter(\n (f): f is ScalarField => f.kind === \"scalar\",\n );\n\n const createInput = (node: NodeType): GraphQLInputObjectType =>\n once(mutationNames.createInput(node.name), () => {\n const fields = scalarInputs(scalarsOf(node), \"CREATE\");\n for (const rel of node.fields.values()) {\n if (rel.kind !== \"relationship\") continue;\n const inputs = relationFields(node, rel, false);\n if (Object.keys(inputs).length === 0) continue;\n const t = once(\n mutationNames.relationCreate(node.name, rel.name),\n () => inputs,\n );\n // Required single relationships are checked when the mutation\n // runs: a nested create's parent link can satisfy them.\n fields[rel.name] = {\n type: t,\n description:\n rel.required && !rel.list\n ? `Required: connect or create one, unless this ${node.name} is created under it.`\n : undefined,\n };\n }\n return fields;\n });\n\n // Like the create input, but the key is always given and nothing else\n // is required up front: required fields are checked for new nodes only.\n const upsertInput = (node: NodeType): GraphQLInputObjectType =>\n once(mutationNames.upsertInput(node.name), () => {\n const fields: GraphQLInputFieldConfigMap = {};\n for (const f of node.fields.values()) {\n if (f.kind === \"scalar\") {\n if (!settable(f, \"CREATE\")) continue;\n const base = ctx.inputType(f);\n const t: GraphQLInputType = f.list ? listOf(nonNull(base)) : base;\n fields[f.name] = {\n type: f.key ? nonNull(t) : t,\n description: f.description,\n };\n } else if (f.kind === \"relationship\") {\n const inputs = relationFields(node, f, false);\n if (Object.keys(inputs).length === 0) continue;\n fields[f.name] = {\n type: once(\n mutationNames.relationCreate(node.name, f.name),\n () => inputs,\n ),\n };\n }\n }\n return fields;\n });\n\n function updateInput(node: NodeType): GraphQLInputObjectType {\n return once(mutationNames.updateInput(node.name), () => {\n const fields = scalarInputs(scalarsOf(node), \"UPDATE\");\n for (const rel of node.fields.values()) {\n if (rel.kind !== \"relationship\") continue;\n const inputs = relationFields(node, rel, true);\n if (Object.keys(inputs).length === 0) continue;\n fields[rel.name] = {\n type: once(\n mutationNames.relationUpdate(node.name, rel.name),\n () => inputs,\n ),\n };\n }\n return fields;\n });\n }\n\n // --- adjust: math and list operators ---------------------------------------\n\n const numericAdjust = new Map<string, GraphQLInputObjectType>();\n const adjustType = (f: ScalarField): GraphQLInputObjectType => {\n const base = ctx.inputType(f) as GraphQLScalarType;\n if (f.list) {\n const name = `${base.name}ListAdjust`;\n let t = numericAdjust.get(name);\n if (!t) {\n t = new GraphQLInputObjectType({\n name,\n fields: {\n push: {\n type: listOf(nonNull(base)),\n description: \"Append these values (a missing list starts empty).\",\n },\n pop: {\n type: GraphQLInt,\n description: \"Remove this many values from the end.\",\n },\n remove: {\n type: listOf(nonNull(base)),\n description: \"Remove every occurrence of these values.\",\n },\n },\n });\n numericAdjust.set(name, t);\n }\n return t;\n }\n const name = `${base.name}Adjust`;\n let t = numericAdjust.get(name);\n if (!t) {\n const operand = f.type === \"Float\" ? GraphQLFloat : base;\n t = new GraphQLInputObjectType({\n name,\n description:\n \"One operation, applied to the stored value atomically; a missing value counts as 0.\",\n fields: {\n add: { type: operand },\n subtract: { type: operand },\n ...(f.type === \"BigInt\"\n ? {}\n : { multiply: { type: operand }, divide: { type: operand } }),\n },\n });\n numericAdjust.set(name, t);\n }\n return t;\n };\n\n const adjustInput = (node: NodeType): GraphQLInputObjectType | undefined => {\n const fields = scalarsOf(node).filter(adjustable);\n if (fields.length === 0) return undefined;\n return once(mutationNames.adjustInput(node.name), () =>\n Object.fromEntries(fields.map((f) => [f.name, { type: adjustType(f) }])),\n );\n };\n\n const info = new GraphQLObjectType({\n name: \"MutationInfo\",\n description: \"What a mutation wrote.\",\n fields: {\n nodesCreated: { type: new GraphQLNonNull(GraphQLInt) },\n nodesUpdated: { type: new GraphQLNonNull(GraphQLInt) },\n nodesDeleted: { type: new GraphQLNonNull(GraphQLInt) },\n relationshipsCreated: { type: new GraphQLNonNull(GraphQLInt) },\n relationshipsDeleted: { type: new GraphQLNonNull(GraphQLInt) },\n },\n });\n\n const listPayload = (name: string, node: NodeType) =>\n new GraphQLNonNull(\n new GraphQLObjectType({\n name,\n fields: {\n [mutationNames.createdField(node)]: {\n type: new GraphQLNonNull(\n new GraphQLList(new GraphQLNonNull(ctx.object(node.name))),\n ),\n },\n info: { type: new GraphQLNonNull(info) },\n },\n }),\n );\n\n const out: GraphQLFieldConfigMap<unknown, unknown> = {};\n for (const node of model.nodes.values()) {\n const obj = ctx.object(node.name);\n const key = { type: nonNull(ctx.inputType(node.key)) };\n const run =\n (op: MutationKind) =>\n (\n _src: unknown,\n _args: unknown,\n context: unknown,\n i: GraphQLResolveInfo,\n ) =>\n resolve(op, node, i, context);\n const updatable = isUpdatable(node);\n const adjust = adjustInput(node);\n const updateArgs = {\n ...(updatable ? { update: { type: updateInput(node) } } : {}),\n ...(adjust\n ? { adjust: { type: adjust, description: \"Math and list operators.\" } }\n : {}),\n };\n\n if (node.mutations.has(\"CREATE\")) {\n out[mutationNames.create(node)] = {\n description: `Create ${node.name} nodes, with their relationships, atomically.`,\n type: listPayload(mutationNames.createPayload(node), node),\n args: { input: { type: nonNull(listOf(nonNull(createInput(node)))) } },\n resolve: run(\"CREATE\"),\n };\n }\n if (node.mutations.has(\"UPDATE\") && updatable) {\n out[mutationNames.update(node)] = {\n description: `Update the ${node.name} with this ${node.key.name}. The payload's ${mutationNames.updatedField(node)} is null when there is none.`,\n type: new GraphQLNonNull(\n new GraphQLObjectType({\n name: mutationNames.updatePayload(node),\n fields: {\n [mutationNames.updatedField(node)]: { type: obj },\n info: { type: new GraphQLNonNull(info) },\n },\n }),\n ),\n args: { [node.key.name]: key, ...updateArgs },\n resolve: run(\"UPDATE\"),\n };\n out[mutationNames.updateMany(node)] = {\n description: `Update every ${node.name} matching \\`where\\`, atomically. Fails, writing nothing, when more than \\`limit\\` match (default: the mutation batch limit). Relationships are updated one node at a time, with update${node.name}.`,\n type: listPayload(mutationNames.updateManyPayload(node), node),\n args: {\n where: { type: nonNull(ctx.where(node.name)) },\n ...updateArgs,\n limit: { type: GraphQLInt },\n },\n resolve: run(\"UPDATE_MANY\"),\n };\n }\n if (node.mutations.has(\"CREATE\") && node.mutations.has(\"UPDATE\")) {\n out[mutationNames.upsert(node)] = {\n description: `Create the ${node.name} nodes whose ${node.key.name} is new and update the others, atomically. Fields required on create are required only for new nodes.`,\n type: listPayload(mutationNames.upsertPayload(node), node),\n args: {\n input: { type: nonNull(listOf(nonNull(upsertInput(node)))) },\n },\n resolve: run(\"UPSERT\"),\n };\n }\n if (node.mutations.has(\"DELETE\")) {\n out[mutationNames.delete(node)] = {\n description: `Delete the ${node.name} with this ${node.key.name}, its relationships, and what @relationship(onDelete: CASCADE) reaches.`,\n type: new GraphQLNonNull(info),\n args: { [node.key.name]: key },\n resolve: run(\"DELETE\"),\n };\n out[mutationNames.deleteMany(node)] = {\n description: `Delete every ${node.name} matching \\`where\\`, atomically. Fails, deleting nothing, when more than \\`limit\\` match (default: the mutation batch limit).`,\n type: new GraphQLNonNull(info),\n args: {\n where: { type: nonNull(ctx.where(node.name)) },\n limit: { type: GraphQLInt },\n },\n resolve: run(\"DELETE_MANY\"),\n };\n }\n }\n return out;\n}\n","// Generated mutations: plan the writes from the input, then run them in one\n// interactive transaction, checking what the engine cannot (connect targets\n// exist, single and required relationships hold, authorization) before\n// commit. Every write is addressed by @key, so the write-set is exact.\n\nimport type { FieldNode, GraphQLObjectType, SelectionSetNode } from \"graphql\";\nimport {\n authFilter,\n authValidate,\n checkAuthentication,\n checkFieldAuthentication,\n fieldValidate,\n forbidden,\n} from \"../compile/auth.js\";\nimport { bind, newContext, type CompileContext } from \"../compile/context.js\";\nimport {\n and,\n bin,\n fn,\n lit,\n name,\n printExpr,\n prop,\n v,\n type Expr,\n} from \"../compile/cypher.js\";\nimport { compileNodeWhere } from \"../compile/filter.js\";\nimport { compileByKeys, keyOf } from \"../compile/read.js\";\nimport {\n collectFields,\n subSelections,\n type SelectionContext,\n} from \"../compile/selection.js\";\nimport type {\n DriverTransaction,\n LoraDriver,\n QueryResult,\n Statement,\n} from \"../driver.js\";\nimport { requestError } from \"../errors.js\";\nimport { toStored } from \"../model/points.js\";\nimport type {\n GraphModel,\n NodeType,\n RelationshipField,\n ScalarField,\n} from \"../model/types.js\";\nimport { assertReadable } from \"../schema/guard.js\";\nimport {\n mutationNames,\n requiredOnCreate,\n settable,\n type MutationKind,\n} from \"../schema/mutations.js\";\nimport { declared, memberFields } from \"../model/relations.js\";\nimport type { EntityRef, RelationshipRef, WriteChange } from \"./changes.js\";\n\n/** Computes a `@populatedBy` field. */\nexport type PopulatedByCallback = (args: {\n operation: \"CREATE\" | \"UPDATE\";\n /** Node type and field being populated. */\n type: string;\n field: string;\n key: unknown;\n /** The node's input in this mutation. */\n input: Record<string, unknown>;\n /** The GraphQL context. */\n context: unknown;\n}) => unknown;\n\nexport interface MutationEnv {\n model: GraphModel;\n driver: LoraDriver;\n selection: SelectionContext;\n jwt: Record<string, unknown> | undefined;\n /** The GraphQL context, for `$context` in rules and for callbacks. */\n requestContext: unknown;\n timeoutMs: number;\n signal: AbortSignal | undefined;\n degrees: ReadonlyMap<string, number>;\n /** Most nodes one mutation may create or delete, nested ones included. */\n maxBatch: number;\n callbacks: Readonly<Record<string, PopulatedByCallback>>;\n /**\n * A caller-owned transaction: run inside it and leave the commit to the\n * caller. A failed mutation rolls it back, so it is never half-applied.\n */\n transaction?: DriverTransaction | undefined;\n /** Observes every statement, for logging and tests. */\n onStatement?: ((statement: Statement) => void) | undefined;\n /** Runs a statement under timing, tracing and metrics, when configured. */\n observe?:\n | ((\n statement: Statement,\n run: () => Promise<QueryResult>,\n ) => Promise<QueryResult>)\n | undefined;\n}\n\n/** Run `statement` in `tx`, reporting it before and observing it during. */\nexport function runStatement(\n env: MutationEnv,\n tx: DriverTransaction,\n statement: Statement,\n): Promise<QueryResult> {\n env.onStatement?.(statement);\n return env.observe\n ? env.observe(statement, () => tx.execute(statement))\n : tx.execute(statement);\n}\n\nexport interface MutationInfo {\n nodesCreated: number;\n nodesUpdated: number;\n nodesDeleted: number;\n relationshipsCreated: number;\n relationshipsDeleted: number;\n}\n\ntype Input = Record<string, unknown>;\n\ninterface Link {\n rel: RelationshipField;\n /** @key of the node declaring the field. */\n from: unknown;\n /** @key of the target node. */\n to: unknown;\n props: Record<string, unknown>;\n}\n\ninterface CreateRow {\n key: unknown;\n props: Input;\n}\n\ninterface EdgeUpdate {\n rel: RelationshipField;\n from: unknown;\n /** Target key; undefined for a single relationship's current target. */\n to: unknown;\n set: Input;\n remove: string[];\n}\n\ninterface NodeUpdate {\n rel: RelationshipField;\n from: unknown;\n to: unknown;\n input: Input;\n}\n\nconst asList = <T>(x: unknown): T[] =>\n x === null || x === undefined ? [] : Array.isArray(x) ? (x as T[]) : [x as T];\n\n/** Writes planned from one mutation's input. */\nclass WritePlan {\n creates = new Map<NodeType, CreateRow[]>();\n links: Link[] = [];\n disconnects: Array<{\n rel: RelationshipField;\n from: unknown;\n /** Keys to disconnect; undefined: every current target (single fields). */\n to: unknown[] | undefined;\n }> = [];\n edgeUpdates: EdgeUpdate[] = [];\n nodeUpdates: NodeUpdate[] = [];\n /** `update: { rel: { delete } }`: connected nodes to delete. */\n nestedDeletes: Array<{\n rel: RelationshipField;\n from: unknown;\n where: Input | undefined;\n limit: number | undefined;\n }> = [];\n /** `@populatedBy` callbacks for planned creates. */\n pending: Array<() => Promise<void>> = [];\n\n constructor(\n readonly env: MutationEnv,\n readonly ctx: CompileContext,\n ) {}\n\n get model(): GraphModel {\n return this.env.model;\n }\n\n /**\n * Whether this plan creates the `type` node with `key`. Creates run\n * before links, so such a node has only the relationships this plan\n * gives it.\n */\n isFresh(type: string, key: unknown): boolean {\n for (const [node, rows] of this.creates) {\n if (node.name !== type) continue;\n const k = keyOf(key);\n if (rows.some((r) => keyOf(r.key) === k)) return true;\n }\n return false;\n }\n\n /**\n * Plan a node creation (and its nested writes); returns its key.\n * `parent` is the relationship a nested create hangs from: it satisfies\n * the new node's required field pointing back.\n */\n create(node: NodeType, input: Input, parent?: RelationshipField): unknown {\n checkAuthentication(this.ctx, node, \"CREATE\");\n let key = input[node.key.name];\n if (key === undefined || key === null) {\n if (!node.key.generate) {\n throw requestError(\n \"BAD_USER_INPUT\",\n `${node.name}.${node.key.name} is required`,\n );\n }\n key = globalThis.crypto.randomUUID();\n }\n const props: Input = {};\n for (const f of node.fields.values()) {\n if (f.kind !== \"scalar\" || f.key) continue;\n const value = input[f.name];\n if (value !== undefined && value !== null) {\n if (!settable(f, \"CREATE\")) {\n throw requestError(\n \"BAD_USER_INPUT\",\n `${node.name}.${f.name} cannot be set on create`,\n );\n }\n checkFieldAuthentication(this.ctx, node.name, f, \"CREATE\");\n props[f.property] = toStored(f, value);\n } else if (f.populatedBy?.operations.has(\"CREATE\")) {\n this.pending.push(async () => {\n props[f.property] = toStored(\n f,\n await this.callback(f, \"CREATE\", node, key, input),\n );\n });\n } else if (f.defaultValue) {\n props[f.property] = storedDefault(f);\n } else if (requiredOnCreate(f) && settable(f, \"CREATE\")) {\n throw requestError(\n \"BAD_USER_INPUT\",\n `${node.name}.${f.name} is required`,\n );\n }\n }\n const list = this.creates.get(node) ?? [];\n list.push({ key, props });\n this.creates.set(node, list);\n for (const f of node.fields.values()) {\n if (f.kind !== \"relationship\") continue;\n const value = input[f.name] as Input | null | undefined;\n const satisfied =\n parent !== undefined && inverseFields(this.model, parent).includes(f);\n const given = (op: string) => {\n const part = value?.[op];\n if (part == null) return false;\n // Member-keyed for interfaces and unions.\n return this.model.abstracts.has(f.target)\n ? Object.values(part as Input).some((x) => x != null)\n : true;\n };\n if (\n f.required &&\n !f.list &&\n !satisfied &&\n !given(\"connect\") &&\n !given(\"create\")\n ) {\n throw requestError(\n \"BAD_USER_INPUT\",\n `${node.name}.${f.name} is required: connect or create one`,\n );\n }\n if (value) this.relate(node, key, f, value, false);\n }\n return key;\n }\n\n async callback(\n f: ScalarField,\n operation: \"CREATE\" | \"UPDATE\",\n node: NodeType,\n key: unknown,\n input: Input,\n ): Promise<unknown> {\n const cb = this.env.callbacks[f.populatedBy!.callback]!;\n return cb({\n operation,\n type: node.name,\n field: f.name,\n key,\n input,\n context: this.env.requestContext,\n });\n }\n\n /** Plan connect / create / update / disconnect under one relationship field. */\n relate(\n owner: NodeType,\n ownerKey: unknown,\n rel: RelationshipField,\n value: Input,\n update: boolean,\n ): void {\n if (this.model.abstracts.has(rel.target)) {\n // Member-keyed input: each member's part goes to its concrete copy.\n const members = memberFields(this.model, rel);\n const pick = (op: string, member: string) =>\n (value[op] as Input | null | undefined)?.[member];\n const adding = members.reduce(\n (n, m) =>\n n +\n asList(pick(\"connect\", m.target)).length +\n asList(pick(\"create\", m.target)).length,\n 0,\n );\n if (!rel.list && adding > 1) {\n throw requestError(\n \"BAD_USER_INPUT\",\n `${owner.name}.${rel.name} holds one ${rel.target}: connect or create one`,\n );\n }\n // Replacing a single relationship clears every member's edge.\n const replace =\n !rel.list && update && (adding > 0 || value[\"disconnect\"] === true);\n for (const m of members) {\n this.relate(\n owner,\n ownerKey,\n m,\n {\n connect: pick(\"connect\", m.target),\n create: pick(\"create\", m.target),\n disconnect: rel.list\n ? pick(\"disconnect\", m.target)\n : replace\n ? true\n : undefined,\n },\n update,\n );\n }\n return;\n }\n const target = this.model.nodes.get(rel.target)!;\n const connect = asList<Input>(value[\"connect\"]);\n const create = asList<Input>(value[\"create\"]);\n const updates = asList<Input>(value[\"update\"]);\n const disconnect = value[\"disconnect\"];\n const nestedDelete = value[\"delete\"] as Input | boolean | null | undefined;\n if (update && nestedDelete != null && nestedDelete !== false) {\n checkAuthentication(this.ctx, target, \"DELETE\");\n const spec = nestedDelete === true ? {} : nestedDelete;\n this.nestedDeletes.push({\n rel,\n from: ownerKey,\n where: (spec[\"where\"] as Input | null | undefined) ?? undefined,\n limit: (spec[\"limit\"] as number | null | undefined) ?? undefined,\n });\n }\n if (!rel.list && connect.length + create.length > 1) {\n throw requestError(\n \"BAD_USER_INPUT\",\n `${owner.name}.${rel.name} holds one ${target.name}: give connect or create, not both`,\n );\n }\n if (connect.length + create.length > 0) {\n checkAuthentication(this.ctx, owner, \"CREATE_RELATIONSHIP\");\n checkAuthentication(this.ctx, target, \"CREATE_RELATIONSHIP\");\n }\n if (update) {\n if (rel.list) {\n const keys = asList<unknown>(disconnect);\n if (keys.length > 0) {\n checkAuthentication(this.ctx, owner, \"DELETE_RELATIONSHIP\");\n this.disconnects.push({ rel, from: ownerKey, to: keys });\n }\n } else if (disconnect === true || connect.length + create.length > 0) {\n if (\n disconnect === true &&\n rel.required &&\n !rel.via &&\n connect.length + create.length === 0\n ) {\n throw requestError(\n \"BAD_USER_INPUT\",\n `${owner.name}.${rel.name} is required: replace it with connect or create instead`,\n );\n }\n checkAuthentication(this.ctx, owner, \"DELETE_RELATIONSHIP\");\n // A single relationship is replaced, never doubled.\n this.disconnects.push({ rel, from: ownerKey, to: undefined });\n }\n }\n for (const c of connect) {\n this.links.push({\n rel,\n from: ownerKey,\n to: c[target.key.name],\n props: edgeProps(this.model, rel, c[\"edge\"] as Input | undefined),\n });\n }\n for (const c of create) {\n const key = this.create(target, c[\"node\"] as Input, rel);\n this.links.push({\n rel,\n from: ownerKey,\n to: key,\n props: edgeProps(this.model, rel, c[\"edge\"] as Input | undefined),\n });\n }\n for (const u of updates) {\n const to = rel.list ? u[target.key.name] : undefined;\n const edge = u[\"edge\"] as Input | null | undefined;\n if (edge && rel.properties) {\n const props = this.model.relationshipProperties.get(rel.properties)!;\n const set: Input = {};\n const remove: string[] = [];\n for (const f of props.fields.values()) {\n if (!(f.name in edge) || !settable(f, \"UPDATE\")) continue;\n if (edge[f.name] === null) {\n if (f.required) {\n throw requestError(\n \"BAD_USER_INPUT\",\n `${props.name}.${f.name} is required and cannot be null`,\n );\n }\n remove.push(f.property);\n } else {\n set[f.property] = toStored(f, edge[f.name]);\n }\n }\n this.edgeUpdates.push({ rel, from: ownerKey, to, set, remove });\n }\n const node = u[\"node\"] as Input | null | undefined;\n if (node) this.nodeUpdates.push({ rel, from: ownerKey, to, input: node });\n }\n }\n}\n\nfunction edgeProps(\n model: GraphModel,\n rel: RelationshipField,\n edge: Input | undefined,\n): Record<string, unknown> {\n if (!rel.properties) return {};\n const props = model.relationshipProperties.get(rel.properties)!;\n const out: Record<string, unknown> = {};\n for (const f of props.fields.values()) {\n const value = edge?.[f.name];\n if (value !== undefined && value !== null && settable(f, \"CREATE\")) {\n out[f.property] = toStored(f, value);\n } else if (f.defaultValue) {\n out[f.property] = storedDefault(f);\n }\n }\n return out;\n}\n\nconst TEMPORAL_KIND: Partial<Record<string, string>> = {\n Date: \"date\",\n Time: \"time\",\n LocalTime: \"localtime\",\n DateTime: \"datetime\",\n LocalDateTime: \"localdatetime\",\n Duration: \"duration\",\n};\n\n/** A @default value as the engine stores it (temporals are tagged). */\nfunction storedDefault(f: ScalarField): unknown {\n const value = f.defaultValue!.value;\n const kind = TEMPORAL_KIND[f.type];\n if (!kind) return value;\n const tag = (x: unknown) => ({ kind, iso: x });\n return Array.isArray(value) ? value.map(tag) : tag(value);\n}\n\nconst NOW: Partial<Record<string, string>> = {\n DateTime: \"datetime()\",\n LocalDateTime: \"localdatetime()\",\n Date: \"date()\",\n};\n\n/** `@timestamp` fields for `op`: [property, now-expression]. */\nfunction timestamps(\n node: NodeType,\n op: \"CREATE\" | \"UPDATE\",\n): Array<[string, string]> {\n return [...node.fields.values()]\n .filter(\n (f): f is ScalarField => f.kind === \"scalar\" && !!f.timestamp?.has(op),\n )\n .map((f) => [f.property, NOW[f.type]!]);\n}\n\n/** `-[r:T]->(b:Target)` in the direction the owner's field declares. */\nfunction arrow(\n rel: RelationshipField,\n r: string,\n b: string,\n target: NodeType | undefined,\n): string {\n const inner = `[${r ? name(r) : \"\"}:${name(rel.type)}]`;\n const node = target\n ? `(${name(b)}:${name(target.labels[0]!)})`\n : `(${name(b)})`;\n return rel.direction === \"OUT\" ? `-${inner}->${node}` : `<-${inner}-${node}`;\n}\n\n/**\n * `b:Label`: LoraDB 0.15 ignores the labels of every node after the first\n * in a MATCH pattern, so expansions test them explicitly.\n */\nfunction labelTest(variable: string, node: NodeType): string {\n return `${name(variable)}:${name(node.labels[0]!)}`;\n}\n\n/**\n * `MATCH (a:Owner) WHERE a.key = <key>` then `MATCH (a)-[r:T]->(b:Target)\n * WHERE b:Target`, for callers to extend with ` AND ...`. The key test gets\n * its own MATCH so it becomes an index seek: LoraDB 0.15 only seeks when\n * the test sits directly on a node scan, and one pattern with the test in\n * its WHERE expands every relationship of the type first.\n */\nfunction seekThenExpand(\n a: string,\n owner: NodeType,\n key: string,\n rel: RelationshipField,\n r: string,\n b: string,\n target: NodeType,\n): string {\n return (\n `MATCH (${name(a)}:${name(owner.labels[0]!)}) WHERE ${name(a)}.${name(owner.key.property)} = ${key}\\n` +\n `MATCH (${name(a)})${arrow(rel, r, b, target)}\\n` +\n `WHERE ${labelTest(b, target)}`\n );\n}\n\n/** `AND (<expr>)`, or nothing. */\nconst andText = (e: Expr | undefined) => (e ? ` AND (${printExpr(e)})` : \"\");\n\n// ---------------------------------------------------------------------------\n// Execution\n// ---------------------------------------------------------------------------\n\nclass Runner {\n info: MutationInfo = {\n nodesCreated: 0,\n nodesUpdated: 0,\n nodesDeleted: 0,\n relationshipsCreated: 0,\n relationshipsDeleted: 0,\n };\n connected: RelationshipRef[] = [];\n disconnected: RelationshipRef[] = [];\n /** Nodes updated per type, for AFTER validation. */\n updated = new Map<NodeType, { keys: unknown[]; fields: Set<string> }>();\n\n constructor(\n readonly env: MutationEnv,\n readonly tx: DriverTransaction,\n readonly change: WriteChange,\n ) {}\n\n ctx(): CompileContext {\n return newContext(this.env.selection, this.env.model, {\n jwt: this.env.jwt,\n degrees: this.env.degrees,\n requestContext: this.env.requestContext,\n });\n }\n\n async run(\n text: string,\n ctx: CompileContext,\n ): Promise<Array<Record<string, unknown>>> {\n const statement = { text, params: ctx.params };\n const result = await runStatement(this.env, this.tx, statement);\n return result.rows;\n }\n\n plan(): WritePlan {\n return new WritePlan(this.env, this.ctx());\n }\n\n /** Every planned write, in order, with the checks that follow them. */\n async apply(plan: WritePlan): Promise<void> {\n for (const task of plan.pending) await task();\n assertBatch(plan, this.env.maxBatch);\n assertUniqueKeys(plan);\n await this.applyCreates(plan);\n await this.applyDisconnects(plan);\n await this.applyLinks(plan);\n await this.applyEdgeUpdates(plan);\n await this.applyNodeUpdates(plan);\n await this.applyNestedDeletes(plan);\n await this.checkCardinality(plan);\n await this.checkRequired();\n await this.validateCreated(plan);\n }\n\n async applyCreates(plan: WritePlan): Promise<void> {\n for (const [node, rows] of plan.creates) {\n // Every property goes into the CREATE itself (timestamps included):\n // existence constraints are checked there, before any SET. Rows are\n // grouped by the properties they set, so absent ones are never\n // written as null.\n const groups = new Map<string, CreateRow[]>();\n for (const row of rows) {\n const shape = Object.keys(row.props).sort().join(\"\\0\");\n const group = groups.get(shape) ?? [];\n group.push(row);\n groups.set(shape, group);\n }\n const labels = node.labels.map(name).join(\":\");\n const stamped = timestamps(node, \"CREATE\");\n for (const [shape, group] of groups) {\n const ctx = this.ctx();\n const p = printExpr(bind(ctx, group));\n const props = [\n `${name(node.key.property)}: row.key`,\n ...(shape ? shape.split(\"\\0\") : []).map(\n (prop) => `${name(prop)}: row.props.${name(prop)}`,\n ),\n ...stamped.map(([prop, now]) => `${name(prop)}: ${now}`),\n ];\n await this.run(\n `UNWIND ${p} AS row\\nCREATE (n:${labels} { ${props.join(\", \")} })`,\n ctx,\n );\n }\n this.info.nodesCreated += rows.length;\n for (const r of rows) {\n this.change.created.push({ type: node.name, key: r.key });\n }\n }\n }\n\n async applyDisconnects(plan: WritePlan): Promise<void> {\n for (const d of plan.disconnects) {\n const owner = this.env.model.nodes.get(d.rel.owner)!;\n const target = this.env.model.nodes.get(d.rel.target)!;\n const ctx = this.ctx();\n const from = printExpr(bind(ctx, d.from));\n // Nodes the caller cannot see keep their relationships, and both\n // ends must allow DELETE_RELATIONSHIP when their rules say so.\n const guard =\n andText(authFilter(ctx, target, \"b\", \"READ\")) +\n andText(authFilter(ctx, target, \"b\", \"DELETE_RELATIONSHIP\")) +\n andText(authFilter(ctx, owner, \"a\", \"DELETE_RELATIONSHIP\"));\n const matchText =\n (d.to ? `UNWIND ${printExpr(bind(ctx, d.to))} AS k\\n` : \"\") +\n seekThenExpand(\"a\", owner, from, d.rel, \"r\", \"b\", target) +\n (d.to ? ` AND b.${name(target.key.property)} = k` : \"\") +\n `${guard}\\n`;\n const returned = `b.${name(target.key.property)} AS key`;\n const pairs = (rows: Array<Record<string, unknown>>) =>\n rows.map((r) => ({ from: d.from, to: r[\"key\"] }));\n if (this.endRules(owner, target, \"DELETE_RELATIONSHIP\", \"BEFORE\")) {\n const doomed = await this.run(`${matchText}RETURN ${returned}`, ctx);\n await this.checkEnds(\n \"DELETE_RELATIONSHIP\",\n owner,\n target,\n pairs(doomed),\n \"BEFORE\",\n );\n }\n const rows = await this.run(\n `${matchText}DELETE r RETURN ${returned}`,\n ctx,\n );\n await this.checkEnds(\n \"DELETE_RELATIONSHIP\",\n owner,\n target,\n pairs(rows),\n \"AFTER\",\n );\n this.info.relationshipsDeleted += rows.length;\n for (const row of rows) {\n this.disconnected.push(relRef(d.rel, d.from, row[\"key\"]));\n }\n }\n }\n\n async applyLinks(plan: WritePlan): Promise<void> {\n // Connecting a pair twice in one input is one relationship: the\n // last mention's properties win.\n const unique = new Map<string, Link>();\n for (const link of plan.links) {\n unique.set(\n `${link.rel.owner}.${link.rel.name}\\0${keyOf(link.from)}\\0${keyOf(link.to)}`,\n link,\n );\n }\n const groups = new Map<RelationshipField, Link[]>();\n for (const link of unique.values()) {\n const list = groups.get(link.rel) ?? [];\n list.push(link);\n groups.set(link.rel, list);\n }\n for (const [rel, links] of groups) {\n const owner = this.env.model.nodes.get(rel.owner)!;\n const target = this.env.model.nodes.get(rel.target)!;\n const pairs = links.map((l) => ({ from: l.from, to: l.to }));\n await this.checkEnds(\n \"CREATE_RELATIONSHIP\",\n owner,\n target,\n pairs,\n \"BEFORE\",\n );\n // Connecting an already-connected pair keeps one relationship and\n // updates its properties: MERGE on both bound ends (E14 is fixed).\n // `existed` tells a new relationship from an updated one.\n const lctx = this.ctx();\n const rows = printExpr(\n bind(\n lctx,\n links.map((l) => ({ from: l.from, to: l.to, props: l.props })),\n ),\n );\n const text =\n `UNWIND ${rows} AS row\\n` +\n `MATCH (a:${name(owner.labels[0]!)}) WHERE a.${name(owner.key.property)} = row.from` +\n andText(authFilter(lctx, owner, \"a\", \"CREATE_RELATIONSHIP\")) +\n `\\nMATCH (b:${name(target.labels[0]!)}) WHERE b.${name(target.key.property)} = row.to` +\n andText(authFilter(lctx, target, \"b\", \"READ\")) +\n andText(authFilter(lctx, target, \"b\", \"CREATE_RELATIONSHIP\")) +\n `\\nWITH a, b, row, size([(a)${arrow(rel, \"\", \"b\", undefined)} | 1]) > 0 AS existed` +\n `\\nMERGE (a)${arrow(rel, \"r\", \"b\", undefined)}\\n` +\n `SET r += row.props\\nRETURN row.to AS key, existed`;\n const linked = await this.run(text, lctx);\n if (linked.length < links.length) {\n const found = new Set(linked.map((r) => keyOf(r[\"key\"])));\n const missing = links\n .map((l) => l.to)\n .filter((k) => !found.has(keyOf(k)));\n throw requestError(\n \"NOT_FOUND\",\n `${owner.name}.${rel.name}: no ${target.name} with ${target.key.name} ${missing\n .map((k) => JSON.stringify(k))\n .join(\", \")}`,\n undefined,\n { type: target.name, keys: missing },\n );\n }\n await this.checkEnds(\n \"CREATE_RELATIONSHIP\",\n owner,\n target,\n pairs,\n \"AFTER\",\n );\n this.info.relationshipsCreated += linked.filter(\n (r) => r[\"existed\"] !== true,\n ).length;\n for (const l of links) this.connected.push(relRef(rel, l.from, l.to));\n }\n }\n\n /** Whether either end has validate rules for `op` at `when`. */\n endRules(\n owner: NodeType,\n target: NodeType,\n op: \"CREATE_RELATIONSHIP\" | \"DELETE_RELATIONSHIP\",\n when: \"BEFORE\" | \"AFTER\",\n ): boolean {\n return [owner, target].some((n) =>\n n.authorization?.validate.some(\n (r) => r.operations.has(op) && r.when.has(when),\n ),\n );\n }\n\n /**\n * Validate rules for connecting or disconnecting, on both ends of each\n * pair: FORBIDDEN when either end fails them.\n */\n async checkEnds(\n op: \"CREATE_RELATIONSHIP\" | \"DELETE_RELATIONSHIP\",\n owner: NodeType,\n target: NodeType,\n pairs: Array<{ from: unknown; to: unknown }>,\n when: \"BEFORE\" | \"AFTER\",\n ): Promise<void> {\n if (pairs.length === 0) return;\n const ctx = this.ctx();\n const a = authValidate(ctx, owner, \"a\", op, when);\n const b = authValidate(ctx, target, \"b\", op, when);\n if (!a && !b) return;\n const rows = await this.run(\n `UNWIND ${printExpr(bind(ctx, pairs))} AS row\\n` +\n `MATCH (a:${name(owner.labels[0]!)}) WHERE a.${name(owner.key.property)} = row.from\\n` +\n `MATCH (b:${name(target.labels[0]!)}) WHERE b.${name(target.key.property)} = row.to\\n` +\n `RETURN ${a ? printExpr(a) : \"true\"} AS a, ${b ? printExpr(b) : \"true\"} AS b`,\n ctx,\n );\n for (const row of rows) {\n if (row[\"a\"] !== true) throw forbidden(owner, op);\n if (row[\"b\"] !== true) throw forbidden(target, op);\n }\n }\n\n /** `update: [{ key, edge }]`: properties of connected pairs, in place. */\n async applyEdgeUpdates(plan: WritePlan): Promise<void> {\n for (const u of plan.edgeUpdates) {\n const owner = this.env.model.nodes.get(u.rel.owner)!;\n const target = this.env.model.nodes.get(u.rel.target)!;\n const ctx = this.ctx();\n const text =\n seekThenExpand(\n \"a\",\n owner,\n printExpr(bind(ctx, u.from)),\n u.rel,\n \"r\",\n \"b\",\n target,\n ) +\n (u.to !== undefined\n ? ` AND b.${name(target.key.property)} = ${printExpr(bind(ctx, u.to))}`\n : \"\") +\n andText(authFilter(ctx, target, \"b\", \"READ\")) +\n `\\nSET r += ${printExpr(bind(ctx, u.set))}` +\n (u.remove.length > 0\n ? `\\nREMOVE ${u.remove.map((p) => `r.${name(p)}`).join(\", \")}`\n : \"\") +\n `\\nRETURN b.${name(target.key.property)} AS key`;\n const rows = await this.run(text, ctx);\n if (rows.length === 0) throw notConnected(owner, u.rel, target, u.to);\n for (const row of rows) {\n this.connected.push(relRef(u.rel, u.from, row[\"key\"]));\n }\n }\n }\n\n /**\n * `delete: { where, limit }`: the connected nodes `where` matches, under\n * their DELETE rules, deleted like a bulk delete (onDelete followed). More\n * than `limit` (default `maxBatch`) is an error, not a truncation.\n */\n async applyNestedDeletes(plan: WritePlan): Promise<void> {\n for (const d of plan.nestedDeletes) {\n const owner = this.env.model.nodes.get(d.rel.owner)!;\n const target = this.env.model.nodes.get(d.rel.target)!;\n const limit = d.limit ?? this.env.maxBatch;\n if (!Number.isInteger(limit) || limit < 1) {\n throw requestError(\n \"BAD_USER_INPUT\",\n \"`limit` must be a positive integer\",\n );\n }\n const ctx = this.ctx();\n const rows = await this.run(\n seekThenExpand(\n \"a\",\n owner,\n printExpr(bind(ctx, d.from)),\n d.rel,\n \"\",\n \"b\",\n target,\n ) +\n andText(compileNodeWhere(ctx, target, \"b\", d.where)) +\n andText(authFilter(ctx, target, \"b\", \"READ\")) +\n andText(authFilter(ctx, target, \"b\", \"DELETE\")) +\n `\\nRETURN DISTINCT b.${name(target.key.property)} AS key ORDER BY key LIMIT ${printExpr(bind(ctx, limit + 1))}`,\n ctx,\n );\n if (rows.length > limit) {\n throw requestError(\n \"LIMIT_EXCEEDED\",\n `more than ${limit} connected ${target.name} nodes match; narrow \\`where\\` or raise \\`limit\\``,\n );\n }\n if (rows.length > 0) {\n await this.delete(\n target,\n rows.map((r) => r[\"key\"]),\n );\n }\n }\n }\n\n /** `update: [{ key, node }]`: connected nodes, through the update path. */\n async applyNodeUpdates(plan: WritePlan): Promise<void> {\n for (const u of plan.nodeUpdates) {\n const owner = this.env.model.nodes.get(u.rel.owner)!;\n const target = this.env.model.nodes.get(u.rel.target)!;\n const ctx = this.ctx();\n const rows = await this.run(\n seekThenExpand(\n \"a\",\n owner,\n printExpr(bind(ctx, u.from)),\n u.rel,\n \"\",\n \"b\",\n target,\n ) +\n (u.to !== undefined\n ? ` AND b.${name(target.key.property)} = ${printExpr(bind(ctx, u.to))}`\n : \"\") +\n `\\nRETURN DISTINCT b.${name(target.key.property)} AS key`,\n ctx,\n );\n if (rows.length === 0) throw notConnected(owner, u.rel, target, u.to);\n const sub = this.plan();\n const done = await this.update(\n sub,\n target,\n rows.map((r) => ({ key: r[\"key\"], input: u.input })),\n );\n if (done.length < rows.length) {\n throw notConnected(owner, u.rel, target, u.to);\n }\n await this.apply(sub);\n }\n }\n\n /**\n * Update nodes by key: visibility (filter rules) and BEFORE rules, then\n * one SET per shape of input. Returns the keys it updated; keys the\n * caller cannot see are skipped. Relationship inputs go into `plan`.\n */\n async update(\n plan: WritePlan,\n node: NodeType,\n rows: Array<{ key: unknown; input: Input }>,\n adjust?: Input,\n ): Promise<unknown[]> {\n if (rows.length === 0) return [];\n const ctx0 = this.ctx();\n checkAuthentication(ctx0, node, \"UPDATE\");\n const fields = new Set<string>();\n for (const { input } of rows) {\n for (const name of Object.keys(input)) fields.add(name);\n }\n for (const name of Object.keys(adjust ?? {})) fields.add(name);\n const written = [...fields]\n .map((n) => node.fields.get(n))\n .filter((f): f is ScalarField => f?.kind === \"scalar\" && !f.key);\n for (const f of written) {\n checkFieldAuthentication(ctx0, node.name, f, \"UPDATE\");\n }\n\n // Visible to the updater (filter rules) and allowed before the write?\n const ctx = this.ctx();\n const before = and(\n authValidate(ctx, node, \"n\", \"UPDATE\", \"BEFORE\"),\n ...written.map((f) =>\n fieldValidate(ctx, node, f, \"n\", \"UPDATE\", \"BEFORE\"),\n ),\n );\n const found = await this.run(\n `UNWIND ${printExpr(\n bind(\n ctx,\n rows.map((r) => r.key),\n ),\n )} AS k\\n` +\n `MATCH (n:${name(node.labels[0]!)}) WHERE n.${name(node.key.property)} = k` +\n andText(authFilter(ctx, node, \"n\", \"UPDATE\")) +\n `\\nRETURN n.${name(node.key.property)} AS key, ${before ? printExpr(before) : \"true\"} AS ok` +\n (node.subscriptionOptions.previousState\n ? \", properties(n) AS props\"\n : \"\"),\n ctx,\n );\n if (found.some((r) => r[\"ok\"] !== true)) throw forbidden(node, \"UPDATE\");\n if (node.subscriptionOptions.previousState) {\n for (const r of found) {\n (this.change.before ??= []).push({\n type: node.name,\n key: r[\"key\"],\n properties: (r[\"props\"] as Record<string, unknown>) ?? {},\n });\n }\n }\n const visible = new Set(found.map((r) => keyOf(r[\"key\"])));\n const todo = rows.filter((r) => visible.has(keyOf(r.key)));\n if (todo.length === 0) return [];\n\n // Per row: properties to set (with @populatedBy) and to remove.\n const prepared: Array<{ key: unknown; set: Input; remove: string[] }> = [];\n for (const { key, input } of todo) {\n const set: Input = {};\n const remove: string[] = [];\n for (const f of node.fields.values()) {\n if (f.kind === \"relationship\") {\n const value = input[f.name];\n if (value) plan.relate(node, key, f, value as Input, true);\n continue;\n }\n if (f.kind !== \"scalar\" || f.key) continue;\n if (f.name in input) {\n if (!settable(f, \"UPDATE\")) {\n throw requestError(\n \"BAD_USER_INPUT\",\n `${node.name}.${f.name} cannot be changed after create`,\n );\n }\n if (adjust?.[f.name] != null) {\n throw requestError(\n \"BAD_USER_INPUT\",\n `${node.name}.${f.name} is both set and adjusted`,\n );\n }\n const value = input[f.name];\n if (value === null) {\n if (f.required) {\n throw requestError(\n \"BAD_USER_INPUT\",\n `${node.name}.${f.name} is required and cannot be null`,\n );\n }\n remove.push(f.property);\n } else {\n set[f.property] = toStored(f, value);\n }\n } else if (f.populatedBy?.operations.has(\"UPDATE\")) {\n set[f.property] = toStored(\n f,\n await plan.callback(f, \"UPDATE\", node, key, input),\n );\n }\n }\n prepared.push({ key, set, remove });\n }\n\n const actx = this.ctx();\n const adjustments = compileAdjust(actx, node, adjust);\n const stamped = timestamps(node, \"UPDATE\");\n // One statement per shape: which properties are removed.\n const shapes = new Map<string, typeof prepared>();\n for (const p of prepared) {\n const shape = p.remove.slice().sort().join(\"\\0\");\n const group = shapes.get(shape) ?? [];\n group.push(p);\n shapes.set(shape, group);\n }\n for (const [shape, group] of shapes) {\n const sctx = { ...actx, params: { ...actx.params } };\n const rowsParam = printExpr(\n bind(\n sctx,\n group.map((g) => ({ key: g.key, set: g.set })),\n ),\n );\n const sets = [\n \"n += row.set\",\n ...adjustments,\n ...stamped.map(([p, now]) => `n.${name(p)} = ${now}`),\n ];\n const removes = shape ? shape.split(\"\\0\") : [];\n await this.run(\n `UNWIND ${rowsParam} AS row\\n` +\n `MATCH (n:${name(node.labels[0]!)}) WHERE n.${name(node.key.property)} = row.key\\n` +\n `SET ${sets.join(\", \")}` +\n (removes.length > 0\n ? `\\nREMOVE ${removes.map((p) => `n.${name(p)}`).join(\", \")}`\n : \"\"),\n sctx,\n );\n }\n const keys = todo.map((r) => r.key);\n this.info.nodesUpdated += keys.length;\n for (const key of keys) this.change.updated.push({ type: node.name, key });\n const entry = this.updated.get(node) ?? { keys: [], fields: new Set() };\n entry.keys.push(...keys);\n for (const f of written) entry.fields.add(f.name);\n this.updated.set(node, entry);\n return keys;\n }\n\n /**\n * A single relationship field allows one related node, whichever side\n * the relationship was created from. Check every node that gained one.\n */\n async checkCardinality(plan: WritePlan): Promise<void> {\n const model = this.env.model;\n interface Touched {\n field: RelationshipField;\n keys: unknown[];\n /** Links per key, for keys of nodes this plan creates. */\n fresh: Map<string, number>;\n }\n const touched = new Map<string, Touched>();\n // `type` is the node's concrete type: a node this plan creates that\n // gains exactly one link on the field cannot hold more than one.\n const add = (field: RelationshipField, key: unknown, type: string) => {\n const id = `${field.owner}.${field.name}`;\n const entry: Touched = touched.get(id) ?? {\n field,\n keys: [],\n fresh: new Map(),\n };\n entry.keys.push(key);\n if (plan.isFresh(type, key)) {\n const k = keyOf(key);\n entry.fresh.set(k, (entry.fresh.get(k) ?? 0) + 1);\n }\n touched.set(id, entry);\n };\n for (const link of plan.links) {\n if (!link.rel.list) add(declared(link.rel), link.from, link.rel.owner);\n for (const f of inverseFields(model, link.rel)) {\n if (!f.list) add(f, link.to, link.rel.target);\n }\n }\n for (const { field, keys: all, fresh } of touched.values()) {\n const keys = all.filter((k) => fresh.get(keyOf(k)) !== 1);\n if (keys.length === 0) continue;\n const owner = model.nodes.get(field.owner)!;\n const ctx = this.ctx();\n const text =\n `UNWIND ${printExpr(bind(ctx, dedupe(keys)))} AS k\\n` +\n `MATCH (a:${name(owner.labels[0]!)}) WHERE a.${name(owner.key.property)} = k\\n` +\n `WITH a, size([(a)${arrow(field, \"\", \"x\", undefined)} WHERE ${memberTest(model, \"x\", field)} | 1]) AS c WHERE c > 1\\n` +\n `RETURN a.${name(owner.key.property)} AS key, c AS count`;\n const target = { name: field.target } as NodeType;\n const rows = await this.run(text, ctx);\n if (rows.length > 0) {\n const row = rows[0]!;\n throw requestError(\n \"CONSTRAINT_VIOLATION\",\n `${owner.name}.${field.name} holds one ${target.name}, but ${owner.name} ${JSON.stringify(row[\"key\"])} would have ${String(row[\"count\"])}`,\n undefined,\n { type: owner.name, field: field.name },\n );\n }\n }\n }\n\n /**\n * A required single relationship stays set: disconnecting from the other\n * side must not leave the owner without one.\n */\n async checkRequired(): Promise<void> {\n const model = this.env.model;\n const byField = new Map<RelationshipField, unknown[]>();\n for (const ref of this.disconnected) {\n const [ownerName, fieldName] = ref.field.split(\".\") as [string, string];\n const field = model.nodes\n .get(ownerName)!\n .fields.get(fieldName) as RelationshipField;\n // The concrete copy for the node that was disconnected.\n const rel =\n memberFields(model, field).find((m) => m.target === ref.to.type) ??\n field;\n if (!field.list && field.required) {\n byField.set(field, [...(byField.get(field) ?? []), ref.from.key]);\n }\n for (const f of inverseFields(model, rel)) {\n if (!f.list && f.required) {\n byField.set(f, [...(byField.get(f) ?? []), ref.to.key]);\n }\n }\n }\n for (const [field, keys] of byField) {\n const owner = model.nodes.get(field.owner)!;\n const ctx = this.ctx();\n const rows = await this.run(\n `UNWIND ${printExpr(bind(ctx, dedupe(keys)))} AS k\\n` +\n `MATCH (a:${name(owner.labels[0]!)}) WHERE a.${name(owner.key.property)} = k\\n` +\n `WITH a WHERE size([(a)${arrow(field, \"\", \"x\", undefined)} WHERE ${memberTest(model, \"x\", field)} | 1]) = 0\\n` +\n `RETURN a.${name(owner.key.property)} AS key`,\n ctx,\n );\n if (rows.length > 0) {\n throw requiredMissing(owner, field, field.target, rows[0]![\"key\"]);\n }\n }\n }\n\n /** AFTER rules on created nodes, and on nodes this mutation updated. */\n async validateCreated(plan: WritePlan): Promise<void> {\n for (const [node, rows] of plan.creates) {\n const fields = new Set<string>();\n for (const f of node.fields.values()) {\n if (f.kind === \"scalar\" && f.authorization) fields.add(f.name);\n }\n await this.validateAfter(\n node,\n rows.map((r) => r.key),\n \"CREATE\",\n fields,\n );\n }\n }\n\n async validateUpdated(): Promise<void> {\n for (const [node, { keys, fields }] of this.updated) {\n await this.validateAfter(node, keys, \"UPDATE\", fields);\n }\n }\n\n /** AFTER rules for `op` on the nodes with `keys` (and written fields). */\n async validateAfter(\n node: NodeType,\n keys: unknown[],\n op: \"CREATE\" | \"UPDATE\",\n fields: Set<string>,\n ): Promise<void> {\n if (keys.length === 0) return;\n const ctx = this.ctx();\n const rule = and(\n authValidate(ctx, node, \"n\", op, \"AFTER\"),\n ...[...fields].map((f) => {\n const field = node.fields.get(f);\n return field\n ? fieldValidate(ctx, node, field, \"n\", op, \"AFTER\")\n : undefined;\n }),\n );\n if (!rule) return;\n const text =\n `UNWIND ${printExpr(bind(ctx, dedupe(keys)))} AS k\\n` +\n `MATCH (n:${name(node.labels[0]!)}) WHERE n.${name(node.key.property)} = k\\n` +\n `RETURN n.${name(node.key.property)} AS key, ${printExpr(rule)} AS ok`;\n const rows = await this.run(text, ctx);\n if (rows.some((r) => r[\"ok\"] !== true)) throw forbidden(node, op);\n }\n\n /** Nodes by key, projected for the payload, inside the transaction. */\n async payload(\n node: NodeType,\n keys: unknown[],\n sets: SelectionSetNode[],\n ): Promise<unknown[]> {\n if (sets.length === 0) return keys.map(() => ({}));\n const ctx = this.ctx();\n const compiled = compileByKeys(ctx, node, keys, sets);\n const statement = compiled.statements[0]!;\n const result = await runStatement(this.env, this.tx, statement);\n return assertReadable(compiled.shape([result]) as unknown[]);\n }\n\n /**\n * Keys of the nodes `where` matches, under the filter rules for `op`.\n * More than `limit` is an error: bulk writes are bounded, not truncated.\n */\n async resolveKeys(\n node: NodeType,\n where: Input,\n op: \"UPDATE\" | \"DELETE\",\n limit: number,\n ): Promise<unknown[]> {\n const ctx = this.ctx();\n const pred = compileNodeWhere(ctx, node, \"this\", where);\n if (!pred) {\n throw requestError(\n \"BAD_USER_INPUT\",\n `\\`where\\` must filter something: bulk ${op.toLowerCase()}s never apply to every ${node.name} by accident`,\n );\n }\n const rows = await this.run(\n `MATCH (this:${name(node.labels[0]!)}) WHERE ${printExpr(pred)}` +\n andText(authFilter(ctx, node, \"this\", op)) +\n `\\nRETURN this.${name(node.key.property)} AS key ORDER BY key LIMIT ${printExpr(bind(ctx, limit + 1))}`,\n ctx,\n );\n if (rows.length > limit) {\n throw requestError(\n \"LIMIT_EXCEEDED\",\n `more than ${limit} ${node.name} nodes match; narrow \\`where\\` or raise \\`limit\\``,\n );\n }\n return rows.map((r) => r[\"key\"]);\n }\n\n /**\n * Delete nodes by key, with what `onDelete: CASCADE` reaches. Checks\n * BEFORE rules, RESTRICT, and required relationships of the survivors.\n */\n async delete(root: NodeType, keys: unknown[]): Promise<void> {\n const model = this.env.model;\n const doomed = new Map<NodeType, Map<string, unknown>>();\n let total = 0;\n let queue: Array<[NodeType, unknown[]]> = [[root, keys]];\n while (queue.length > 0) {\n const next: Array<[NodeType, unknown[]]> = [];\n for (const [node, batch] of queue) {\n const seen = doomed.get(node) ?? new Map<string, unknown>();\n const fresh = batch.filter((k) => !seen.has(keyOf(k)));\n if (fresh.length === 0) continue;\n checkAuthentication(this.ctx(), node, \"DELETE\");\n const ctx = this.ctx();\n const before = authValidate(ctx, node, \"n\", \"DELETE\", \"BEFORE\");\n const rows = await this.run(\n `UNWIND ${printExpr(bind(ctx, fresh))} AS k\\n` +\n `MATCH (n:${name(node.labels[0]!)}) WHERE n.${name(node.key.property)} = k\\n` +\n `RETURN n.${name(node.key.property)} AS key, ${before ? printExpr(before) : \"true\"} AS ok` +\n `, ${printExpr(authFilter(ctx, node, \"n\", \"DELETE\") ?? lit(true))} AS visible`,\n ctx,\n );\n for (const r of rows) {\n // Cascading into a node the caller may not delete is refused.\n if (r[\"ok\"] !== true || r[\"visible\"] !== true) {\n throw forbidden(node, \"DELETE\");\n }\n seen.set(keyOf(r[\"key\"]), r[\"key\"]);\n }\n doomed.set(node, seen);\n total += rows.length;\n if (total > this.env.maxBatch) {\n throw requestError(\n \"LIMIT_EXCEEDED\",\n `the delete reaches more than ${this.env.maxBatch} nodes through onDelete: CASCADE`,\n );\n }\n const found = rows.map((r) => r[\"key\"]);\n for (const declaredField of node.fields.values()) {\n if (\n declaredField.kind !== \"relationship\" ||\n declaredField.onDelete !== \"CASCADE\"\n )\n continue;\n for (const f of memberFields(model, declaredField)) {\n const target = model.nodes.get(f.target)!;\n const c = this.ctx();\n const related = await this.run(\n `UNWIND ${printExpr(bind(c, found))} AS k\\n` +\n seekThenExpand(\"n\", node, \"k\", f, \"\", \"m\", target) +\n \"\\n\" +\n `RETURN DISTINCT m.${name(target.key.property)} AS key`,\n c,\n );\n if (related.length > 0)\n next.push([target, related.map((r) => r[\"key\"])]);\n }\n }\n }\n queue = next;\n }\n if (total === 0) return;\n\n const isDoomed = (type: string, key: unknown) =>\n !!model.nodes.get(type) &&\n doomed.get(model.nodes.get(type)!)?.has(keyOf(key)) === true;\n\n for (const [node, keysByNode] of doomed) {\n const nodeKeys = [...keysByNode.values()];\n // RESTRICT: related nodes must be gone first (or go in this delete).\n const restricting = [...node.fields.values()].flatMap((f) =>\n f.kind === \"relationship\" && f.onDelete === \"RESTRICT\"\n ? memberFields(model, f)\n : [],\n );\n for (const f of restricting) {\n const target = model.nodes.get(f.target)!;\n const ctx = this.ctx();\n const rows = await this.run(\n `UNWIND ${printExpr(bind(ctx, nodeKeys))} AS k\\n` +\n seekThenExpand(\"n\", node, \"k\", f, \"\", \"m\", target) +\n \"\\n\" +\n `RETURN n.${name(node.key.property)} AS key, m.${name(target.key.property)} AS related`,\n ctx,\n );\n const blocking = rows.find((r) => !isDoomed(target.name, r[\"related\"]));\n if (blocking) {\n throw requestError(\n \"CONSTRAINT_VIOLATION\",\n `${node.name} ${JSON.stringify(blocking[\"key\"])} still has ${f.name} (onDelete: RESTRICT); remove them first`,\n undefined,\n { type: node.name, field: f.name },\n );\n }\n }\n // Required single relationships of surviving nodes that point here.\n for (const owner of model.nodes.values()) {\n for (const f of owner.fields.values()) {\n if (f.kind !== \"relationship\" || f.list || !f.required) continue;\n if (!f.members.includes(node.name)) continue;\n const ctx = this.ctx();\n const back = {\n ...f,\n direction: f.direction === \"OUT\" ? \"IN\" : \"OUT\",\n } as const;\n const rows = await this.run(\n `UNWIND ${printExpr(bind(ctx, nodeKeys))} AS k\\n` +\n seekThenExpand(\"n\", node, \"k\", back, \"\", \"o\", owner) +\n \"\\n\" +\n `RETURN DISTINCT o.${name(owner.key.property)} AS key`,\n ctx,\n );\n const orphan = rows.find((r) => !isDoomed(owner.name, r[\"key\"]));\n if (orphan) throw requiredMissing(owner, f, f.target, orphan[\"key\"]);\n }\n }\n }\n\n const relIds = new Set<number>();\n for (const [node, keysByNode] of doomed) {\n const nodeKeys = [...keysByNode.values()];\n for (const key of nodeKeys) {\n this.disconnected.push(...(await this.neighbours(node, key)));\n }\n const ctx = this.ctx();\n const rows = await this.run(\n `UNWIND ${printExpr(bind(ctx, nodeKeys))} AS k\\n` +\n `MATCH (n:${name(node.labels[0]!)}) WHERE n.${name(node.key.property)} = k\\n` +\n `RETURN [(n)-[r]-() | id(r)] AS ids`,\n ctx,\n );\n for (const r of rows)\n for (const id of r[\"ids\"] as number[]) relIds.add(id);\n }\n for (const [node, keysByNode] of doomed) {\n const nodeKeys = [...keysByNode.values()];\n if (node.subscriptionOptions.previousState) {\n const pctx = this.ctx();\n const rows = await this.run(\n `UNWIND ${printExpr(bind(pctx, nodeKeys))} AS k\\n` +\n `MATCH (n:${name(node.labels[0]!)}) WHERE n.${name(node.key.property)} = k\\n` +\n `RETURN n.${name(node.key.property)} AS key, properties(n) AS props`,\n pctx,\n );\n for (const r of rows) {\n (this.change.before ??= []).push({\n type: node.name,\n key: r[\"key\"],\n properties: (r[\"props\"] as Record<string, unknown>) ?? {},\n });\n }\n }\n const ctx = this.ctx();\n await this.run(\n `UNWIND ${printExpr(bind(ctx, nodeKeys))} AS k\\n` +\n `MATCH (n:${name(node.labels[0]!)}) WHERE n.${name(node.key.property)} = k\\n` +\n `DETACH DELETE n`,\n ctx,\n );\n this.info.nodesDeleted += nodeKeys.length;\n for (const key of nodeKeys) {\n this.change.deleted.push({ type: node.name, key });\n }\n }\n this.info.relationshipsDeleted += relIds.size;\n }\n\n /** The node's current relationships in the model, for the write-set. */\n async neighbours(node: NodeType, key: unknown): Promise<RelationshipRef[]> {\n // Relationship fields declared on this type, and those on other types\n // that point here: a relationship may be declared on either side.\n const model = this.env.model;\n const own = [...node.fields.values()].flatMap((f) =>\n f.kind === \"relationship\" ? memberFields(model, f) : [],\n );\n const inverse = [...model.nodes.values()].flatMap((n) =>\n [...n.fields.values()].filter(\n (f): f is RelationshipField =>\n f.kind === \"relationship\" && f.members.includes(node.name),\n ),\n );\n if (own.length + inverse.length === 0) return [];\n const ctx = this.ctx();\n const k = printExpr(bind(ctx, key));\n const entries = [\n ...own.map((f, i) => {\n const target = model.nodes.get(f.target)!;\n return `r${i}: [(n)${arrow(f, \"\", \"m\", target)} | m.${name(target.key.property)}]`;\n }),\n ...inverse.map((f, i) => {\n const owner = model.nodes.get(f.owner)!;\n // Seen from this node, the declared direction is reversed.\n const back = {\n ...f,\n direction: f.direction === \"OUT\" ? \"IN\" : \"OUT\",\n } as const;\n return `i${i}: [(n)${arrow(back, \"\", \"m\", owner)} | m.${name(owner.key.property)}]`;\n }),\n ];\n const rows = await this.run(\n `MATCH (n:${name(node.labels[0]!)}) WHERE n.${name(node.key.property)} = ${k}\\nRETURN { ${entries.join(\", \")} } AS related`,\n ctx,\n );\n const related = rows[0]?.[\"related\"] as\n | Record<string, unknown[]>\n | undefined;\n if (!related) return [];\n const refs = [\n ...own.flatMap((f, i) =>\n (related[`r${i}`] ?? []).map((to) => relRef(f, key, to)),\n ),\n ...inverse.flatMap((f, i) =>\n (related[`i${i}`] ?? []).map((from) => relRef(f, from, key)),\n ),\n ];\n // A relationship declared on both sides is reported once.\n const seen = new Set<string>();\n return refs.filter((r) => {\n const ends = [\n `${r.from.type}:${keyOf(r.from.key)}`,\n `${r.to.type}:${keyOf(r.to.key)}`,\n ].sort();\n const id = `${r.type}\\0${ends.join(\"\\0\")}`;\n if (seen.has(id)) return false;\n seen.add(id);\n return true;\n });\n }\n}\n\n/** Fields on the other side of `rel`'s relationship type, pointing back. */\nfunction inverseFields(\n model: GraphModel,\n rel: RelationshipField,\n): RelationshipField[] {\n const target = model.nodes.get(rel.target)!;\n return [...target.fields.values()].filter(\n (f): f is RelationshipField =>\n f.kind === \"relationship\" &&\n f.type === rel.type &&\n f.members.includes(rel.owner) &&\n f.direction !== rel.direction,\n );\n}\n\n/** `x:A OR x:B`: the field's target types (one, or an abstract's members). */\nfunction memberTest(\n model: GraphModel,\n variable: string,\n field: RelationshipField,\n): string {\n return field.members\n .map((m) => labelTest(variable, model.nodes.get(m)!))\n .join(\" OR \");\n}\n\n/** `n.p = <expr>` assignments for an `adjust` input. */\nfunction compileAdjust(\n ctx: CompileContext,\n node: NodeType,\n adjust: Input | undefined,\n): string[] {\n const out: string[] = [];\n for (const [fieldName, ops] of Object.entries(adjust ?? {})) {\n if (ops === null || ops === undefined) continue;\n const f = node.fields.get(fieldName);\n if (f?.kind !== \"scalar\") continue;\n const entries = Object.entries(ops as Input).filter(\n ([, x]) => x !== null && x !== undefined,\n );\n if (entries.length !== 1) {\n throw requestError(\n \"BAD_USER_INPUT\",\n `adjust.${fieldName} takes exactly one operation`,\n );\n }\n const [op, value] = entries[0]!;\n const target = prop(v(\"n\"), f.property);\n let expr: Expr;\n if (f.list) {\n const current = fn(\"coalesce\", target, { kind: \"list\", items: [] });\n if (op === \"push\") {\n expr = bin(\"+\", current, bind(ctx, value));\n } else if (op === \"pop\") {\n if (!Number.isInteger(value) || (value as number) < 0) {\n throw requestError(\n \"BAD_USER_INPUT\",\n `adjust.${fieldName}.pop must be a non-negative integer`,\n );\n }\n // `l[..-n]` is broken in LoraDB 0.15; size arithmetic is not.\n expr = {\n kind: \"slice\",\n target: current,\n from: undefined,\n to: bin(\"-\", fn(\"size\", current), bind(ctx, value)),\n };\n } else {\n const x = \"adjust_item\";\n expr = {\n kind: \"listComprehension\",\n variable: x,\n list: current,\n where: { kind: \"not\", expr: bin(\"IN\", v(x), bind(ctx, value)) },\n projection: undefined,\n };\n }\n } else {\n const current = fn(\"coalesce\", target, lit(0));\n const operand = bind(ctx, value);\n if (op === \"divide\" && Number(value) === 0) {\n throw requestError(\n \"BAD_USER_INPUT\",\n `adjust.${fieldName}.divide by zero`,\n );\n }\n const opMap: Record<string, \"+\" | \"-\" | \"*\" | \"/\"> = {\n add: \"+\",\n subtract: \"-\",\n multiply: \"*\",\n divide: \"/\",\n };\n expr = bin(opMap[op]!, current, operand);\n // LoraDB divides integers as floats; keep Int fields integral.\n if (op === \"divide\" && f.type === \"Int\") expr = fn(\"toInteger\", expr);\n }\n out.push(`n.${name(f.property)} = ${printExpr(expr)}`);\n }\n return out;\n}\n\nfunction notConnected(\n owner: NodeType,\n rel: RelationshipField,\n target: NodeType,\n to: unknown,\n) {\n return requestError(\n \"NOT_FOUND\",\n `${owner.name}.${rel.name}: ${to === undefined ? `no ${target.name} is connected` : `${target.name} ${JSON.stringify(to)} is not connected`}`,\n undefined,\n { type: target.name },\n );\n}\n\nfunction requiredMissing(\n owner: NodeType,\n field: RelationshipField,\n target: string,\n key: unknown,\n) {\n return requestError(\n \"CONSTRAINT_VIOLATION\",\n `${owner.name} ${JSON.stringify(key)} requires a ${target} (${owner.name}.${field.name})`,\n undefined,\n { type: owner.name, field: field.name },\n );\n}\n\nfunction dedupe(keys: unknown[]): unknown[] {\n return [...new Map(keys.map((k) => [keyOf(k), k])).values()];\n}\n\nfunction relRef(\n rel: RelationshipField,\n from: unknown,\n to: unknown,\n): RelationshipRef {\n return {\n type: rel.type,\n field: `${rel.owner}.${rel.name}`,\n from: { type: rel.owner, key: from },\n to: { type: rel.target, key: to },\n };\n}\n\n/** The payload's node selection, merged across aliases. */\nfunction payloadSelections(\n env: MutationEnv,\n payloadType: GraphQLObjectType,\n fieldNodes: readonly FieldNode[],\n field: string,\n): SelectionSetNode[] {\n const sets: SelectionSetNode[] = [];\n for (const [, nodes] of collectFields(\n env.selection,\n payloadType,\n subSelections(fieldNodes),\n )) {\n if (nodes[0]!.name.value === field) sets.push(...subSelections(nodes));\n }\n return sets;\n}\n\nexport interface MutationResult {\n payload: unknown;\n change: WriteChange;\n}\n\nexport async function executeMutation(\n env: MutationEnv,\n op: MutationKind,\n node: NodeType,\n args: Record<string, unknown>,\n fieldNodes: readonly FieldNode[],\n fieldName: string,\n): Promise<MutationResult> {\n const owned = env.transaction;\n if (!owned && !env.driver.begin) {\n throw requestError(\n \"DATABASE_ERROR\",\n \"mutations need a driver with interactive transactions (@loradb/lora-node)\",\n );\n }\n const planCtx = newContext(env.selection, env.model, {\n jwt: env.jwt,\n degrees: env.degrees,\n requestContext: env.requestContext,\n });\n const authOp =\n op === \"UPSERT\"\n ? \"CREATE\"\n : op === \"UPDATE_MANY\"\n ? \"UPDATE\"\n : op === \"DELETE_MANY\"\n ? \"DELETE\"\n : op;\n checkAuthentication(planCtx, node, authOp);\n\n const tx =\n owned ??\n (await env.driver.begin!({\n mode: \"write\",\n timeoutMs: env.timeoutMs,\n signal: env.signal,\n }));\n const change = emptyChange(op, fieldName);\n const runner = new Runner(env, tx, change);\n const schema = env.selection.schema;\n const payloadFor = async (\n payloadTypeName: string,\n field: string,\n keys: unknown[],\n ) => {\n const payloadType = schema.getType(payloadTypeName) as GraphQLObjectType;\n return runner.payload(\n node,\n keys,\n payloadSelections(env, payloadType, fieldNodes, field),\n );\n };\n try {\n let payload: unknown;\n const plan = runner.plan();\n switch (op) {\n case \"CREATE\": {\n const keys = (args[\"input\"] as Input[]).map((input) =>\n plan.create(node, input),\n );\n await runner.apply(plan);\n payload = {\n [mutationNames.createdField(node)]: await payloadFor(\n mutationNames.createPayload(node),\n mutationNames.createdField(node),\n keys,\n ),\n info: runner.info,\n };\n break;\n }\n case \"UPDATE\": {\n const key = args[node.key.name];\n const field = mutationNames.updatedField(node);\n const done = await runner.update(\n plan,\n node,\n [{ key, input: (args[\"update\"] as Input | undefined) ?? {} }],\n args[\"adjust\"] as Input | undefined,\n );\n await runner.apply(plan);\n await runner.validateUpdated();\n const [value] =\n done.length > 0\n ? await payloadFor(mutationNames.updatePayload(node), field, [key])\n : [null];\n payload = { [field]: value ?? null, info: runner.info };\n break;\n }\n case \"UPDATE_MANY\": {\n const input = (args[\"update\"] as Input | undefined) ?? {};\n if (\n [...node.fields.values()].some(\n (f) => f.kind === \"relationship\" && input[f.name] != null,\n )\n ) {\n throw requestError(\n \"BAD_USER_INPUT\",\n `update${node.name} changes relationships; ${mutationNames.updateMany(node)} changes properties`,\n );\n }\n const keys = await runner.resolveKeys(\n node,\n args[\"where\"] as Input,\n \"UPDATE\",\n bulkLimit(args[\"limit\"], env.maxBatch),\n );\n const done = await runner.update(\n plan,\n node,\n keys.map((key) => ({ key, input })),\n args[\"adjust\"] as Input | undefined,\n );\n await runner.apply(plan);\n await runner.validateUpdated();\n payload = {\n [mutationNames.createdField(node)]: await payloadFor(\n mutationNames.updateManyPayload(node),\n mutationNames.createdField(node),\n done,\n ),\n info: runner.info,\n };\n break;\n }\n case \"UPSERT\":\n payload = await upsert(runner, plan, node, args, payloadFor);\n break;\n case \"DELETE\": {\n // A node the caller cannot see is not there: nothing to delete.\n const ctx = runner.ctx();\n const visible = await runner.run(\n `MATCH (n:${name(node.labels[0]!)}) WHERE n.${name(node.key.property)} = ${printExpr(bind(ctx, args[node.key.name]))}` +\n andText(authFilter(ctx, node, \"n\", \"DELETE\")) +\n `\\nRETURN n.${name(node.key.property)} AS key`,\n ctx,\n );\n await runner.delete(\n node,\n visible.map((r) => r[\"key\"]),\n );\n payload = runner.info;\n break;\n }\n case \"DELETE_MANY\": {\n const keys = await runner.resolveKeys(\n node,\n args[\"where\"] as Input,\n \"DELETE\",\n bulkLimit(args[\"limit\"], env.maxBatch),\n );\n await runner.delete(node, keys);\n payload = runner.info;\n break;\n }\n }\n if (!owned) await tx.commit();\n fillChange(change, runner);\n return { payload, change };\n } catch (err) {\n if (tx.isOpen) await tx.rollback();\n throw err;\n }\n}\n\n/** Create the inputs whose key is new, update the others. */\nasync function upsert(\n runner: Runner,\n plan: WritePlan,\n node: NodeType,\n args: Record<string, unknown>,\n payloadFor: (\n type: string,\n field: string,\n keys: unknown[],\n ) => Promise<unknown[]>,\n): Promise<unknown> {\n const inputs = args[\"input\"] as Input[];\n const keys = inputs.map((i) => i[node.key.name]);\n if (new Set(keys.map(keyOf)).size < keys.length) {\n throw requestError(\n \"CONSTRAINT_VIOLATION\",\n `the input names a ${node.name} ${node.key.name} twice`,\n undefined,\n { type: node.name, field: node.key.name },\n );\n }\n // Existing nodes the caller may update. A hidden one looks new, and its\n // create then fails on the key constraint like any taken key would.\n const ctx = runner.ctx();\n const existing = new Set(\n (\n await runner.run(\n `UNWIND ${printExpr(bind(ctx, keys))} AS k\\n` +\n `MATCH (n:${name(node.labels[0]!)}) WHERE n.${name(node.key.property)} = k` +\n andText(authFilter(ctx, node, \"n\", \"UPDATE\")) +\n `\\nRETURN n.${name(node.key.property)} AS key`,\n ctx,\n )\n ).map((r) => keyOf(r[\"key\"])),\n );\n const updates: Array<{ key: unknown; input: Input }> = [];\n for (const [i, input] of inputs.entries()) {\n if (existing.has(keyOf(keys[i]))) {\n // Fields set only on create keep the value they were created with.\n const kept = Object.fromEntries(\n Object.entries(input).filter(([k]) => {\n const f = node.fields.get(k);\n return f?.kind !== \"scalar\" || settable(f, \"UPDATE\");\n }),\n );\n updates.push({ key: keys[i], input: kept });\n } else plan.create(node, input);\n }\n await runner.update(plan, node, updates);\n await runner.apply(plan);\n await runner.validateUpdated();\n const field = mutationNames.createdField(node);\n return {\n [field]: await payloadFor(mutationNames.upsertPayload(node), field, keys),\n info: runner.info,\n };\n}\n\n/** A bulk mutation's `limit`: at most `maxBatch`, which is the default. */\nfunction bulkLimit(value: unknown, max: number): number {\n if (value === null || value === undefined) return max;\n if (!Number.isInteger(value) || (value as number) < 0) {\n throw requestError(\n \"BAD_USER_INPUT\",\n \"`limit` must be a non-negative integer\",\n );\n }\n if ((value as number) > max) {\n throw requestError(\n \"LIMIT_EXCEEDED\",\n `\\`limit\\` is ${value as number}; a bulk mutation reaches at most ${max} nodes`,\n );\n }\n return value as number;\n}\n\nfunction assertBatch(plan: WritePlan, max: number): void {\n let nodes = 0;\n for (const rows of plan.creates.values()) nodes += rows.length;\n if (nodes > max || plan.links.length > max * 10) {\n throw requestError(\n \"LIMIT_EXCEEDED\",\n `the mutation creates ${nodes} nodes and ${plan.links.length} relationships; the limit is ${max} nodes (and ${max * 10} relationships) per mutation`,\n );\n }\n}\n\nfunction assertUniqueKeys(plan: WritePlan): void {\n for (const [node, rows] of plan.creates) {\n const seen = new Set<string>();\n for (const r of rows) {\n const k = keyOf(r.key);\n if (seen.has(k)) {\n throw requestError(\n \"CONSTRAINT_VIOLATION\",\n `the input creates ${node.name} ${JSON.stringify(r.key)} twice`,\n undefined,\n { type: node.name, field: node.key.name },\n );\n }\n seen.add(k);\n }\n }\n}\n\nfunction emptyChange(op: MutationKind, field: string): WriteChange {\n const operation =\n op === \"UPDATE_MANY\" ? \"UPDATE\" : op === \"DELETE_MANY\" ? \"DELETE\" : op;\n return {\n operation,\n field,\n created: [],\n updated: [],\n deleted: [],\n connected: [],\n disconnected: [],\n entities: [],\n types: [],\n relationshipTypes: [],\n broad: false,\n };\n}\n\nfunction fillChange(change: WriteChange, runner: Runner): void {\n change.connected.push(...runner.connected);\n change.disconnected.push(...runner.disconnected);\n const entities = new Map<string, EntityRef>();\n const addEntity = (e: EntityRef) =>\n entities.set(`${e.type}\\0${keyOf(e.key)}`, e);\n for (const e of [...change.created, ...change.updated, ...change.deleted])\n addEntity(e);\n for (const r of [...change.connected, ...change.disconnected]) {\n addEntity(r.from);\n addEntity(r.to);\n }\n change.entities = [...entities.values()];\n change.types = [...new Set(change.entities.map((e) => e.type))].sort();\n change.relationshipTypes = [\n ...new Set(\n [...change.connected, ...change.disconnected].map((r) => r.type),\n ),\n ].sort();\n}\n\n/** Turn engine constraint errors into CONSTRAINT_VIOLATION naming the field. */\nexport function mapWriteError(model: GraphModel, err: unknown): unknown {\n const code = (err as { code?: string }).code;\n const message = err instanceof Error ? err.message : String(err);\n if (\n code !== \"LORA_UNIQUE_CONSTRAINT\" &&\n code !== \"LORA_NOT_NULL_CONSTRAINT\"\n ) {\n return err;\n }\n const label = /label `([^`]+)`/.exec(message)?.[1];\n const property = /property `([^`]+)`/.exec(message)?.[1];\n const node = [...model.nodes.values()].find((n) => n.labels[0] === label);\n const field = node\n ? [...node.fields.values()].find(\n (f): f is ScalarField => f.kind === \"scalar\" && f.property === property,\n )\n : undefined;\n const what =\n node && field ? `${node.name}.${field.name}` : `${label}.${property}`;\n return requestError(\n \"CONSTRAINT_VIOLATION\",\n code === \"LORA_UNIQUE_CONSTRAINT\"\n ? `${what} must be unique; the value is taken`\n : `${what} is required`,\n err,\n { type: node?.name ?? label, field: field?.name ?? property },\n );\n}\n","// A `@cypher` field on Mutation. The statement runs as written, not inside\n// a `CALL { }`: LoraDB 0.15 rejects writes in subqueries as read-only.\n// Returned nodes are then projected by @key in the same transaction.\n\nimport type { FieldNode } from \"graphql\";\nimport { newContext } from \"../compile/context.js\";\nimport { bindStatement, compileByKeys } from \"../compile/read.js\";\nimport { subSelections } from \"../compile/selection.js\";\nimport { requestError } from \"../errors.js\";\nimport { assertReadable } from \"../schema/guard.js\";\nimport type { CypherField } from \"../model/types.js\";\nimport { runStatement, type MutationEnv } from \"./mutate.js\";\n\nexport async function executeCypherMutation(\n env: MutationEnv,\n field: CypherField,\n args: Record<string, unknown>,\n fieldNodes: readonly FieldNode[],\n): Promise<unknown> {\n if (!env.driver.begin) {\n throw requestError(\n \"DATABASE_ERROR\",\n \"mutations need a driver with interactive transactions (@loradb/lora-node)\",\n );\n }\n const options = { jwt: env.jwt, degrees: env.degrees };\n const ctx = newContext(env.selection, env.model, options);\n const statement = {\n text: bindStatement(ctx, field, args),\n params: ctx.params,\n };\n const tx = await env.driver.begin({\n mode: \"write\",\n timeoutMs: env.timeoutMs,\n signal: env.signal,\n });\n try {\n const result = await runStatement(env, tx, statement);\n const values = result.rows.map((row) => row[field.columnName]);\n let value: unknown[] = values;\n if (field.node) {\n const node = env.model.nodes.get(field.node)!;\n const keys = values\n .filter((v) => v !== null && v !== undefined)\n .map((v) => {\n const props = (v as { properties?: Record<string, unknown> })\n .properties;\n const key = props?.[node.key.property];\n if (key === undefined) {\n throw requestError(\n \"DATABASE_ERROR\",\n `${field.name} must return ${node.name} nodes (column ${field.columnName})`,\n );\n }\n return key;\n });\n const read = compileByKeys(\n newContext(env.selection, env.model, options),\n node,\n keys,\n subSelections(fieldNodes),\n );\n value = assertReadable(\n read.shape([\n await runStatement(env, tx, read.statements[0]!),\n ]) as unknown[],\n );\n }\n await tx.commit();\n return field.type.list ? value : (value[0] ?? null);\n } catch (err) {\n if (tx.isOpen) await tx.rollback();\n throw err;\n }\n}\n","// A transaction the caller owns: GraphQL operations and the application's\n// own Cypher commit or roll back together. Change events are held until\n// the commit, so listeners never see a write that was rolled back.\n\nimport type { DriverTransaction, QueryResult } from \"../driver.js\";\nimport type { WriteChange } from \"./changes.js\";\n\nexport class LoraTransaction {\n readonly #tx: DriverTransaction;\n readonly #emit: (change: WriteChange) => void;\n readonly #pending: WriteChange[] = [];\n\n /** @internal Created by `LoraGraphQL.begin()`. */\n constructor(tx: DriverTransaction, emit: (change: WriteChange) => void) {\n this.#tx = tx;\n this.#emit = emit;\n }\n\n /** @internal The driver transaction statements run in. */\n get driverTransaction(): DriverTransaction {\n return this.#tx;\n }\n\n /** False once committed, rolled back, or failed. */\n get isOpen(): boolean {\n return this.#tx.isOpen;\n }\n\n /** Run the application's own Cypher in the transaction. */\n execute(\n query: string,\n params: Record<string, unknown> = {},\n ): Promise<QueryResult> {\n return this.#tx.execute({ text: query, params });\n }\n\n /** @internal A mutation's write-set, reported when the transaction commits. */\n record(change: WriteChange): void {\n this.#pending.push(change);\n }\n\n async commit(): Promise<void> {\n await this.#tx.commit();\n for (const change of this.#pending.splice(0)) this.#emit(change);\n }\n\n async rollback(): Promise<void> {\n this.#pending.length = 0;\n if (this.#tx.isOpen) await this.#tx.rollback();\n }\n}\n","// The engine's committed change feed as write-sets. With `changeFeed:\n// true`, subscriptions and `changes()` are fed from here: every committed\n// write, whichever path or process made it (hand-written Cypher and\n// `@cypher` mutations included), in commit order.\n\nimport type { DriverChange, DriverChangeBatch, LoraDriver } from \"../driver.js\";\nimport { keyOf } from \"../compile/read.js\";\nimport type {\n GraphModel,\n NodeType,\n RelationshipField,\n} from \"../model/types.js\";\nimport type { EntityRef, RelationshipRef, WriteChange } from \"./changes.js\";\n\n/** Node ids seen, for relationship ends and deletions. */\nconst ID_CACHE = 50_000;\n\nexport class EngineFeed {\n readonly #driver: LoraDriver;\n readonly #model: GraphModel;\n readonly #emit: (change: WriteChange) => void;\n readonly #byLabel = new Map<string, NodeType>();\n readonly #ids = new Map<number, EntityRef>();\n #controller: AbortController | undefined;\n #lastLsn: number | undefined;\n\n constructor(\n driver: LoraDriver,\n model: GraphModel,\n emit: (change: WriteChange) => void,\n ) {\n this.#driver = driver;\n this.#model = model;\n this.#emit = emit;\n for (const node of model.nodes.values()) {\n this.#byLabel.set(node.labels[0]!, node);\n }\n }\n\n /** Subscribe; resolves once every later commit will be delivered. */\n async start(): Promise<void> {\n if (this.#controller) return;\n this.#controller = new AbortController();\n await this.#open();\n }\n\n stop(): void {\n this.#controller?.abort();\n this.#controller = undefined;\n }\n\n async #open(): Promise<void> {\n const signal = this.#controller!.signal;\n const feed = this.#driver.changes!({\n ...(this.#lastLsn !== undefined ? { fromLsn: this.#lastLsn } : {}),\n signal,\n });\n await feed.ready;\n void this.#pump(feed, signal);\n }\n\n async #pump(\n feed: AsyncIterable<DriverChangeBatch>,\n signal: AbortSignal,\n ): Promise<void> {\n try {\n for await (const batch of feed) {\n this.#lastLsn = batch.lsn;\n const change = await this.#toChange(batch);\n if (change) this.#emit(change);\n }\n } catch (err) {\n if (signal.aborted) return;\n // A consumer that fell behind resumes where it stopped.\n if ((err as { code?: string }).code === \"LORA_CHANGES_LAGGED\") {\n await this.#open();\n return;\n }\n throw err;\n }\n }\n\n async #toChange(batch: DriverChangeBatch): Promise<WriteChange | undefined> {\n const change: WriteChange = {\n operation: \"EXTERNAL\",\n field: \"\",\n created: [],\n updated: [],\n deleted: [],\n connected: [],\n disconnected: [],\n entities: [],\n types: [],\n relationshipTypes: [],\n broad: false,\n };\n const relationships: DriverChange[] = [];\n for (const c of batch.changes) {\n if (c.kind === \"reset\") {\n this.#ids.clear();\n change.broad = true;\n continue;\n }\n if (c.kind.startsWith(\"relationship\")) {\n relationships.push(c);\n continue;\n }\n const ref = this.#entity(c.labels ?? [], c.properties ?? {});\n if (!ref) continue;\n this.#remember(c.id!, ref);\n if (c.kind === \"nodeCreated\") change.created.push(ref);\n else if (c.kind === \"nodeDeleted\") change.deleted.push(ref);\n else change.updated.push(ref);\n }\n await this.#resolveEnds(relationships);\n for (const r of relationships) {\n const from = this.#ids.get(r.startId!);\n const to = this.#ids.get(r.endId!);\n if (!from || !to) continue;\n const ref = this.#relationship(r.type!, from, to);\n if (r.kind === \"relationshipDeleted\") change.disconnected.push(ref);\n else if (r.kind === \"relationshipCreated\") change.connected.push(ref);\n else {\n // Properties changed: both ends' connections changed.\n change.updated.push(from, to);\n }\n }\n fill(change);\n return change.entities.length > 0 || change.broad ? change : undefined;\n }\n\n /** The @node type and key of a node, from its labels and properties. */\n #entity(\n labels: string[],\n properties: Record<string, unknown>,\n ): EntityRef | undefined {\n for (const label of labels) {\n const node = this.#byLabel.get(label);\n if (!node) continue;\n const key = properties[node.key.property];\n return key === undefined ? undefined : { type: node.name, key };\n }\n return undefined;\n }\n\n #remember(id: number, ref: EntityRef): void {\n this.#ids.delete(id);\n this.#ids.set(id, ref);\n if (this.#ids.size > ID_CACHE) {\n this.#ids.delete(this.#ids.keys().next().value!);\n }\n }\n\n /** Look up relationship ends the feed has not shown yet. */\n async #resolveEnds(relationships: DriverChange[]): Promise<void> {\n const missing = [\n ...new Set(\n relationships\n .flatMap((r) => [r.startId!, r.endId!])\n .filter((id) => !this.#ids.has(id)),\n ),\n ];\n if (missing.length === 0) return;\n const [result] = await this.#driver.run(\n [\n {\n text: \"UNWIND $ids AS i MATCH (n) WHERE id(n) = i RETURN id(n) AS id, labels(n) AS labels, properties(n) AS props\",\n params: { ids: missing },\n },\n ],\n { mode: \"read\" },\n );\n for (const row of result!.rows) {\n const ref = this.#entity(\n row[\"labels\"] as string[],\n row[\"props\"] as Record<string, unknown>,\n );\n if (ref) this.#remember(row[\"id\"] as number, ref);\n }\n }\n\n /** The declaring field of a relationship between these types, if any. */\n #relationship(type: string, from: EntityRef, to: EntityRef): RelationshipRef {\n const owners: Array<[EntityRef, EntityRef, \"OUT\" | \"IN\"]> = [\n [from, to, \"OUT\"],\n [to, from, \"IN\"],\n ];\n for (const [owner, target, direction] of owners) {\n const node = this.#model.nodes.get(owner.type);\n const field = [...(node?.fields.values() ?? [])].find(\n (f): f is RelationshipField =>\n f.kind === \"relationship\" &&\n f.type === type &&\n f.direction === direction &&\n f.members.includes(target.type),\n );\n if (field) {\n return {\n type,\n field: `${node!.name}.${field.name}`,\n from: owner,\n to: target,\n };\n }\n }\n return { type, field: \"\", from, to };\n }\n}\n\nfunction fill(change: WriteChange): void {\n const entities = new Map<string, EntityRef>();\n const add = (e: EntityRef) => entities.set(`${e.type}\\0${keyOf(e.key)}`, e);\n for (const e of [...change.created, ...change.updated, ...change.deleted]) {\n add(e);\n }\n for (const r of [...change.connected, ...change.disconnected]) {\n add(r.from);\n add(r.to);\n }\n change.entities = [...entities.values()];\n change.types = [...new Set(change.entities.map((e) => e.type))].sort();\n change.relationshipTypes = [\n ...new Set(\n [...change.connected, ...change.disconnected].map((r) => r.type),\n ),\n ].sort();\n}\n","// Build-time output for persisted operations: a manifest the server loads\n// without parsing or validating, and TypeScript types for each\n// operation's variables and result.\n//\n// Statement text is not in the manifest: it depends on variable values\n// (a `where` present or null, cursors, limits) and on the request's\n// claims, so it is compiled per request and cached (see the compile\n// cache). What the manifest fixes is the document and its validation.\n\nimport {\n getNamedType,\n isEnumType,\n isInputObjectType,\n isInterfaceType,\n isListType,\n isNonNullType,\n isObjectType,\n isScalarType,\n isUnionType,\n Kind,\n parse,\n printSchema,\n lexicographicSortSchema,\n specifiedRules,\n typeFromAST,\n validate,\n visit,\n type DocumentNode,\n type FragmentDefinitionNode,\n type GraphQLCompositeType,\n type GraphQLInputType,\n type GraphQLNamedType,\n type GraphQLOutputType,\n type GraphQLSchema,\n type OperationDefinitionNode,\n type SelectionSetNode,\n type ValidationRule,\n} from \"graphql\";\nimport { sha256 } from \"./compile/hmac.js\";\n\nexport interface OperationManifest {\n version: 1;\n /** Hash of the public schema the operations were validated against. */\n schemaHash: string;\n operations: Record<string, ManifestOperation>;\n}\n\nexport interface ManifestOperation {\n name: string | undefined;\n kind: \"query\" | \"mutation\" | \"subscription\";\n /** Root fields, by response key. */\n rootFields: string[];\n /** The validated document, as a GraphQL AST without locations. */\n document: DocumentNode;\n}\n\n/** Hash of the schema clients see: a manifest is valid for it only. */\nexport function schemaHash(schema: GraphQLSchema): string {\n const bytes = sha256(\n new TextEncoder().encode(printSchema(lexicographicSortSchema(schema))),\n );\n return Array.from(bytes, (b) => b.toString(16).padStart(2, \"0\")).join(\"\");\n}\n\n/**\n * Parse and validate persisted operations (id → source) into a manifest.\n * Throws with every problem at once.\n */\nexport function buildManifest(\n schema: GraphQLSchema,\n operations: Record<string, string>,\n rules: ValidationRule[] = [],\n): OperationManifest {\n const out: Record<string, ManifestOperation> = {};\n const problems: string[] = [];\n for (const [id, source] of Object.entries(operations)) {\n let doc: DocumentNode;\n try {\n doc = parse(source, { noLocation: true });\n } catch (err) {\n problems.push(`${id}: ${(err as Error).message}`);\n continue;\n }\n const errors = validate(schema, doc, [...specifiedRules, ...rules]);\n if (errors.length > 0) {\n problems.push(`${id}: ${errors.map((e) => e.message).join(\"; \")}`);\n continue;\n }\n const ops = doc.definitions.filter(\n (d): d is OperationDefinitionNode => d.kind === Kind.OPERATION_DEFINITION,\n );\n if (ops.length !== 1) {\n problems.push(`${id}: a persisted operation holds exactly one operation`);\n continue;\n }\n const op = ops[0]!;\n out[id] = {\n name: op.name?.value,\n kind: op.operation,\n rootFields: op.selectionSet.selections.flatMap((s) =>\n s.kind === Kind.FIELD ? [s.alias?.value ?? s.name.value] : [],\n ),\n document: doc,\n };\n }\n if (problems.length > 0) {\n throw new Error(\n `invalid persisted operations:\\n ${problems.join(\"\\n \")}`,\n );\n }\n return { version: 1, schemaHash: schemaHash(schema), operations: out };\n}\n\n// ---------------------------------------------------------------------------\n// TypeScript types\n// ---------------------------------------------------------------------------\n\n/** How scalars arrive in JSON results and variables. */\nconst SCALAR_TS: Record<string, string> = {\n String: \"string\",\n ID: \"string\",\n Int: \"number\",\n Float: \"number\",\n Boolean: \"boolean\",\n // Decimal strings and ISO-8601 temporals.\n BigInt: \"string\",\n Date: \"string\",\n Time: \"string\",\n LocalTime: \"string\",\n DateTime: \"string\",\n LocalDateTime: \"string\",\n Duration: \"string\",\n};\n\n/**\n * TypeScript declarations for each operation: `<Name>Variables` and\n * `<Name>Result`, plus the enums and input types they use. `ids` name the\n * operations (the manifest's ids when they have no operation name).\n */\nexport function generateTypes(\n schema: GraphQLSchema,\n manifest: OperationManifest,\n /** Custom scalars (`@storedAs`) and their storage types. */\n storage: ReadonlyMap<string, string> = new Map(),\n): string {\n const named = new Map<string, string>();\n const lines: string[] = [\n \"// Generated by lora-graphql compile. Do not edit.\",\n \"\",\n ];\n\n const scalar = (t: GraphQLNamedType): string =>\n SCALAR_TS[t.name] ?? SCALAR_TS[storage.get(t.name) ?? \"\"] ?? \"unknown\";\n\n const enumType = (t: GraphQLNamedType): string => {\n if (!named.has(t.name) && isEnumType(t)) {\n named.set(\n t.name,\n `export type ${t.name} = ${t\n .getValues()\n .map((v) => JSON.stringify(v.name))\n .join(\" | \")};`,\n );\n }\n return t.name;\n };\n\n const inputNamed = (t: GraphQLNamedType): string => {\n if (isScalarType(t)) return scalar(t);\n if (isEnumType(t)) return enumType(t);\n if (isInputObjectType(t) && !named.has(t.name)) {\n named.set(t.name, \"\"); // recursion guard\n const fields = Object.values(t.getFields()).map((f) => {\n const optional = !isNonNullType(f.type) || f.defaultValue !== undefined;\n return ` ${f.name}${optional ? \"?\" : \"\"}: ${input(f.type)};`;\n });\n named.set(\n t.name,\n `export interface ${t.name} {\\n${fields.join(\"\\n\")}\\n}`,\n );\n }\n return t.name;\n };\n\n const input = (t: GraphQLInputType): string => {\n if (isNonNullType(t)) return inputInner(t.ofType);\n return `${inputInner(t)} | null`;\n };\n const inputInner = (t: GraphQLInputType): string =>\n isListType(t)\n ? `Array<${input(t.ofType)}>`\n : inputNamed(getNamedType(t) as GraphQLNamedType);\n\n for (const [id, entry] of Object.entries(manifest.operations)) {\n const doc = entry.document;\n const op = doc.definitions.find(\n (d): d is OperationDefinitionNode => d.kind === Kind.OPERATION_DEFINITION,\n )!;\n const fragments = new Map(\n doc.definitions\n .filter(\n (d): d is FragmentDefinitionNode =>\n d.kind === Kind.FRAGMENT_DEFINITION,\n )\n .map((f) => [f.name.value, f]),\n );\n const base = typeName(op.name?.value ?? id);\n\n const vars = (op.variableDefinitions ?? []).map((v) => {\n const type = typeFromAST(schema, v.type) as GraphQLInputType;\n const optional = !isNonNullType(type) || v.defaultValue !== undefined;\n return ` ${v.variable.name.value}${optional ? \"?\" : \"\"}: ${input(type)};`;\n });\n lines.push(\n `export interface ${base}Variables {${vars.length ? `\\n${vars.join(\"\\n\")}\\n` : \"\"}}`,\n \"\",\n );\n\n const root =\n op.operation === \"query\"\n ? schema.getQueryType()!\n : op.operation === \"mutation\"\n ? schema.getMutationType()!\n : schema.getSubscriptionType()!;\n\n const output = (\n t: GraphQLOutputType,\n set: SelectionSetNode | undefined,\n depth: string,\n ): string => {\n if (isNonNullType(t)) return outputInner(t.ofType, set, depth);\n return `${outputInner(t, set, depth)} | null`;\n };\n const outputInner = (\n t: GraphQLOutputType,\n set: SelectionSetNode | undefined,\n depth: string,\n ): string => {\n if (isListType(t)) return `Array<${output(t.ofType, set, depth)}>`;\n const n = getNamedType(t)!;\n if (isScalarType(n)) return scalar(n);\n if (isEnumType(n)) return enumType(n);\n return selection(n as GraphQLCompositeType, set!, depth);\n };\n\n /** The object type a selection set produces on `parent`. */\n const selection = (\n parent: GraphQLCompositeType,\n set: SelectionSetNode,\n depth: string,\n ): string => {\n const fields = new Map<string, { type: string; optional: boolean }>();\n const add = (\n on: GraphQLCompositeType,\n s: SelectionSetNode,\n conditional: boolean,\n ) => {\n for (const sel of s.selections) {\n if (sel.kind === Kind.FIELD) {\n const key = sel.alias?.value ?? sel.name.value;\n let type: string;\n if (sel.name.value === \"__typename\") {\n type = possible(schema, on)\n .map((p) => JSON.stringify(p))\n .join(\" | \");\n } else {\n const def =\n isObjectType(on) || isInterfaceType(on)\n ? on.getFields()[sel.name.value]\n : undefined;\n if (!def) continue;\n type = output(def.type, sel.selectionSet, `${depth} `);\n }\n const prior = fields.get(key);\n fields.set(key, {\n type:\n prior && prior.type !== type ? `${prior.type} | ${type}` : type,\n optional: (prior?.optional ?? true) && conditional,\n });\n } else if (sel.kind === Kind.INLINE_FRAGMENT) {\n const cond = sel.typeCondition\n ? (schema.getType(\n sel.typeCondition.name.value,\n ) as GraphQLCompositeType)\n : on;\n add(cond, sel.selectionSet, conditional || cond !== on);\n } else {\n const frag = fragments.get(sel.name.value);\n if (!frag) continue;\n const cond = schema.getType(\n frag.typeCondition.name.value,\n ) as GraphQLCompositeType;\n add(cond, frag.selectionSet, conditional || cond !== on);\n }\n }\n };\n add(parent, set, false);\n const body = [...fields].map(\n ([k, f]) => `${depth} ${k}${f.optional ? \"?\" : \"\"}: ${f.type};`,\n );\n return `{\\n${body.join(\"\\n\")}\\n${depth}}`;\n };\n\n lines.push(\n `export interface ${base}Result ${selection(root, op.selectionSet, \"\")}`,\n \"\",\n );\n }\n const declarations = [...named.values()].filter((d) => d.length > 0);\n return [\n ...lines.slice(0, 2),\n ...declarations.flatMap((d) => [d, \"\"]),\n ...lines.slice(2),\n ].join(\"\\n\");\n}\n\nfunction possible(schema: GraphQLSchema, t: GraphQLCompositeType): string[] {\n if (isObjectType(t)) return [t.name];\n if (isUnionType(t) || isInterfaceType(t)) {\n return schema.getPossibleTypes(t).map((p) => p.name);\n }\n return [];\n}\n\n/** `festivals-page#Top` → `FestivalsPageTop`. */\nfunction typeName(id: string): string {\n const words = id.split(/[^A-Za-z0-9]+/).filter(Boolean);\n const name = words.map((w) => w[0]!.toUpperCase() + w.slice(1)).join(\"\");\n return /^[0-9]/.test(name) ? `Op${name}` : name || \"Operation\";\n}\n\n/** Fragments reachable from `root`, transitively. */\nexport function usedFragments(\n root: OperationDefinitionNode,\n fragments: Map<string, FragmentDefinitionNode>,\n): FragmentDefinitionNode[] {\n const seen = new Map<string, FragmentDefinitionNode>();\n const walk = (node: OperationDefinitionNode | FragmentDefinitionNode) =>\n visit(node, {\n FragmentSpread(spread) {\n const f = fragments.get(spread.name.value);\n if (f && !seen.has(f.name.value)) {\n seen.set(f.name.value, f);\n walk(f);\n }\n },\n });\n walk(root);\n return [...seen.values()];\n}\n","// Document guards. `maxCost` bounds the rows an operation touches, not\n// the work of parsing and validating it: these rules bound the document\n// itself, before anything is compiled. `execute()` applies them; for any\n// other server, `validationRules()` and `envelopPlugin()` do.\n\nimport {\n GraphQLError,\n Kind,\n type ASTVisitor,\n type FragmentDefinitionNode,\n type ParseOptions,\n type SelectionSetNode,\n type ValidationContext,\n type ValidationRule,\n} from \"graphql\";\n\nexport interface DocumentGuards {\n /** Deepest field nesting, fragments followed. Default 12. */\n maxDepth?: number;\n /** Aliased fields in one document. Default 30. */\n maxAliases?: number;\n /** Root fields in one operation. Default 20. */\n maxRootFields?: number;\n /** Lexer tokens in one document, checked while parsing. Default 5000. */\n maxTokens?: number;\n /**\n * Allow `__schema` and `__type`. Default: off when `NODE_ENV` is\n * `production`, on otherwise. `__typename` is always allowed.\n */\n introspection?: boolean;\n}\n\nexport const DEFAULT_GUARDS = {\n maxDepth: 12,\n maxAliases: 30,\n maxRootFields: 20,\n maxTokens: 5000,\n} as const;\n\nexport function resolveGuards(\n guards: DocumentGuards = {},\n): Required<DocumentGuards> {\n return {\n maxDepth: guards.maxDepth ?? DEFAULT_GUARDS.maxDepth,\n maxAliases: guards.maxAliases ?? DEFAULT_GUARDS.maxAliases,\n maxRootFields: guards.maxRootFields ?? DEFAULT_GUARDS.maxRootFields,\n maxTokens: guards.maxTokens ?? DEFAULT_GUARDS.maxTokens,\n introspection: guards.introspection ?? nodeEnv() !== \"production\",\n };\n}\n\n/** Validation rules for the guards, to add to the standard ones. */\nexport function validationRules(guards: DocumentGuards = {}): ValidationRule[] {\n const g = resolveGuards(guards);\n const rules: ValidationRule[] = [\n depthRule(g.maxDepth),\n aliasRule(g.maxAliases),\n rootFieldRule(g.maxRootFields),\n ];\n if (!g.introspection) rules.push(noIntrospection);\n return rules;\n}\n\n/** Parse options for the guards (the token limit). */\nexport function parseOptions(guards: DocumentGuards = {}): ParseOptions {\n return { maxTokens: resolveGuards(guards).maxTokens };\n}\n\n/**\n * The guards as an Envelop plugin, for GraphQL Yoga and other Envelop\n * servers: the token limit wraps `parse`, the rest are validation rules.\n * Typed structurally, so the package does not depend on Envelop.\n */\nexport function envelopPlugin(guards: DocumentGuards = {}) {\n const rules = validationRules(guards);\n const options = parseOptions(guards);\n return {\n onParse({\n parseFn,\n setParseFn,\n }: {\n parseFn: (source: unknown, options?: ParseOptions) => unknown;\n setParseFn: (\n fn: (source: unknown, options?: ParseOptions) => unknown,\n ) => void;\n }) {\n setParseFn((source, parseOpts) =>\n parseFn(source, { ...parseOpts, ...options }),\n );\n },\n onValidate({\n addValidationRule,\n }: {\n addValidationRule: (rule: ValidationRule) => void;\n }) {\n for (const rule of rules) addValidationRule(rule);\n },\n };\n}\n\nconst guardError = (message: string) =>\n new GraphQLError(message, { extensions: { code: \"LIMIT_EXCEEDED\" } });\n\nfunction fragmentsOf(\n context: ValidationContext,\n): Map<string, FragmentDefinitionNode> {\n const out = new Map<string, FragmentDefinitionNode>();\n for (const def of context.getDocument().definitions) {\n if (def.kind === Kind.FRAGMENT_DEFINITION) out.set(def.name.value, def);\n }\n return out;\n}\n\n/**\n * Deepest field nesting under `set`. A fragment's depth is measured once\n * (`memo`), so spreading one fragment many times costs nothing extra; a\n * fragment cycle counts as 0 here and is reported by the standard rules.\n */\nfunction depthOf(\n set: SelectionSetNode,\n fragments: Map<string, FragmentDefinitionNode>,\n memo: Map<string, number>,\n): number {\n let deepest = 0;\n for (const sel of set.selections) {\n let d = 0;\n if (sel.kind === Kind.FIELD) {\n d = sel.selectionSet ? 1 + depthOf(sel.selectionSet, fragments, memo) : 1;\n } else if (sel.kind === Kind.INLINE_FRAGMENT) {\n d = depthOf(sel.selectionSet, fragments, memo);\n } else {\n const name = sel.name.value;\n const known = memo.get(name);\n if (known !== undefined) d = known;\n else {\n const frag = fragments.get(name);\n if (!frag) continue;\n memo.set(name, 0);\n d = depthOf(frag.selectionSet, fragments, memo);\n memo.set(name, d);\n }\n }\n deepest = Math.max(deepest, d);\n }\n return deepest;\n}\n\nfunction depthRule(max: number): ValidationRule {\n return (context) => {\n const fragments = fragmentsOf(context);\n return {\n OperationDefinition(op) {\n const depth = depthOf(op.selectionSet, fragments, new Map());\n if (depth > max) {\n context.reportError(\n guardError(`the operation nests fields deeper than ${max} levels`),\n );\n }\n },\n } satisfies ASTVisitor;\n };\n}\n\nfunction aliasRule(max: number): ValidationRule {\n return (context) => {\n let count = 0;\n let reported = false;\n return {\n Field(field) {\n if (!field.alias) return;\n count++;\n if (count > max && !reported) {\n reported = true;\n context.reportError(\n guardError(`the document has more than ${max} aliased fields`),\n );\n }\n },\n } satisfies ASTVisitor;\n };\n}\n\n/** Root fields of an operation, through fragments at the root. */\nfunction rootFields(\n set: SelectionSetNode,\n fragments: Map<string, FragmentDefinitionNode>,\n seen: Set<string>,\n): number {\n let n = 0;\n for (const sel of set.selections) {\n if (sel.kind === Kind.FIELD) n++;\n else if (sel.kind === Kind.INLINE_FRAGMENT) {\n n += rootFields(sel.selectionSet, fragments, seen);\n } else {\n const frag = fragments.get(sel.name.value);\n if (!frag || seen.has(sel.name.value)) continue;\n seen.add(sel.name.value);\n n += rootFields(frag.selectionSet, fragments, seen);\n }\n }\n return n;\n}\n\nfunction rootFieldRule(max: number): ValidationRule {\n return (context) => {\n const fragments = fragmentsOf(context);\n return {\n OperationDefinition(op) {\n if (rootFields(op.selectionSet, fragments, new Set()) > max) {\n context.reportError(\n guardError(`the operation has more than ${max} root fields`),\n );\n }\n },\n } satisfies ASTVisitor;\n };\n}\n\nconst noIntrospection: ValidationRule = (context) => ({\n Field(field) {\n const name = field.name.value;\n if (name === \"__schema\" || name === \"__type\") {\n context.reportError(\n new GraphQLError(\"introspection is disabled\", {\n nodes: [field],\n extensions: { code: \"FORBIDDEN\" },\n }),\n );\n }\n },\n});\n\nexport function nodeEnv(): string | undefined {\n return (\n globalThis as { process?: { env?: Record<string, string | undefined> } }\n ).process?.env?.[\"NODE_ENV\"];\n}\n","// Observability: an event after every statement, OpenTelemetry-shaped\n// spans and a small metrics interface. Tracer and meter are typed\n// structurally, so the package does not depend on @opentelemetry/api:\n// pass `trace.getTracer(\"lora-graphql\")` and any object with `counter` /\n// `histogram` methods.\n\nimport type { QueryResult, Statement } from \"./driver.js\";\n\nexport interface StatementEndEvent {\n /** The root field the statements belong to. */\n field: string;\n /** Statements run in one call: reads batch theirs, writes run one by one. */\n statements: Statement[];\n mode: \"read\" | \"write\";\n durationMs: number;\n /** Rows returned, over every statement. */\n rows: number;\n /** Set when the statements failed. */\n error?: unknown;\n /** Estimated rows touched, for reads (the `maxCost` estimate). */\n cost?: number;\n operationName?: string;\n /** Id of the persisted operation, when the request used one. */\n persistedId?: string;\n}\n\nexport interface SpanLike {\n setAttribute(key: string, value: string | number | boolean): unknown;\n setStatus(status: { code: number; message?: string }): unknown;\n recordException(exception: Error | string): unknown;\n end(): void;\n}\n\nexport interface TracerLike {\n startActiveSpan<T>(name: string, fn: (span: SpanLike) => T): T;\n}\n\nexport interface MetricsLike {\n counter(name: string, value: number, attributes?: Attributes): void;\n histogram(name: string, value: number, attributes?: Attributes): void;\n}\n\nexport type Attributes = Record<string, string | number | boolean>;\n\nexport interface ObservabilityOptions {\n /** Called after every statement (or batch of read statements). */\n onStatementEnd?: (event: StatementEndEvent) => void;\n /**\n * Emits a `lora.graphql.field` span per root field, containing a\n * `lora.cypher` span per statement call.\n */\n tracer?: TracerLike;\n /** Put the Cypher text in spans as `db.statement`. Default false. */\n traceStatements?: boolean;\n /**\n * Receives `lora.graphql.statements` (counter), `lora.graphql.errors`\n * (counter), `lora.graphql.statement.duration` (ms) and\n * `lora.graphql.cost` (estimated rows) histograms.\n */\n metrics?: MetricsLike;\n}\n\n/** What a statement call is part of. */\nexport interface StatementMeta {\n field: string;\n mode: \"read\" | \"write\";\n cost?: number | undefined;\n operationName?: string | undefined;\n persistedId?: string | undefined;\n}\n\n/** OpenTelemetry's SpanStatusCode.ERROR. */\nconst STATUS_ERROR = 2;\n\nexport class Observer {\n readonly #options: ObservabilityOptions;\n\n constructor(options: ObservabilityOptions) {\n this.#options = options;\n }\n\n get active(): boolean {\n const o = this.#options;\n return !!(o.onStatementEnd || o.tracer || o.metrics);\n }\n\n /** Run a root field's resolver inside its span. */\n field<T>(\n meta: { field: string; operationName?: string | undefined },\n fn: () => Promise<T>,\n ): Promise<T> {\n const tracer = this.#options.tracer;\n if (!tracer) return fn();\n return tracer.startActiveSpan(\"lora.graphql.field\", async (span) => {\n span.setAttribute(\"graphql.field.name\", meta.field);\n if (meta.operationName) {\n span.setAttribute(\"graphql.operation.name\", meta.operationName);\n }\n try {\n return await fn();\n } catch (err) {\n fail(span, err);\n throw err;\n } finally {\n span.end();\n }\n });\n }\n\n /** Run statements, timing them and reporting the outcome. */\n statements<T extends QueryResult | QueryResult[]>(\n meta: StatementMeta,\n statements: Statement[],\n run: () => Promise<T>,\n ): Promise<T> {\n if (!this.active) return run();\n const tracer = this.#options.tracer;\n const body = async (span?: SpanLike): Promise<T> => {\n if (span) {\n span.setAttribute(\"db.system\", \"loradb\");\n span.setAttribute(\"db.operation.name\", meta.mode);\n span.setAttribute(\"graphql.field.name\", meta.field);\n if (this.#options.traceStatements) {\n span.setAttribute(\n \"db.statement\",\n statements.map((s) => s.text).join(\";\\n\"),\n );\n }\n }\n const start = performance.now();\n let result: T | undefined;\n let error: unknown;\n try {\n result = await run();\n return result;\n } catch (err) {\n error = err;\n if (span) fail(span, err);\n throw err;\n } finally {\n const durationMs = performance.now() - start;\n const rows = result === undefined ? 0 : countRows(result);\n if (span) {\n span.setAttribute(\"db.response.returned_rows\", rows);\n span.end();\n }\n this.#report(meta, statements, durationMs, rows, error);\n }\n };\n return tracer\n ? tracer.startActiveSpan(\"lora.cypher\", (span) => body(span))\n : body();\n }\n\n #report(\n meta: StatementMeta,\n statements: Statement[],\n durationMs: number,\n rows: number,\n error: unknown,\n ): void {\n const { onStatementEnd, metrics } = this.#options;\n try {\n onStatementEnd?.({\n field: meta.field,\n statements,\n mode: meta.mode,\n durationMs,\n rows,\n ...(error !== undefined ? { error } : {}),\n ...(meta.cost !== undefined ? { cost: meta.cost } : {}),\n ...(meta.operationName ? { operationName: meta.operationName } : {}),\n ...(meta.persistedId ? { persistedId: meta.persistedId } : {}),\n });\n if (metrics) {\n const attributes: Attributes = { field: meta.field, mode: meta.mode };\n if (meta.operationName) attributes[\"operation\"] = meta.operationName;\n metrics.counter(\n \"lora.graphql.statements\",\n statements.length,\n attributes,\n );\n metrics.histogram(\n \"lora.graphql.statement.duration\",\n durationMs,\n attributes,\n );\n if (error !== undefined) {\n metrics.counter(\"lora.graphql.errors\", 1, attributes);\n }\n if (meta.cost !== undefined) {\n metrics.histogram(\"lora.graphql.cost\", meta.cost, attributes);\n }\n }\n } catch {\n // Observers must not fail the request.\n }\n }\n}\n\nfunction countRows(result: QueryResult | QueryResult[]): number {\n return Array.isArray(result)\n ? result.reduce((n, r) => n + r.rows.length, 0)\n : result.rows.length;\n}\n\nfunction fail(span: SpanLike, err: unknown): void {\n span.recordException(err instanceof Error ? err : String(err));\n span.setStatus({\n code: STATUS_ERROR,\n message: err instanceof Error ? err.message : String(err),\n });\n}\n","import { fromBase64Url, toBase64Url } from \"../compile/cursor.js\";\n\n/** Opaque global id: the type name and @key value. */\nexport function toGlobalId(type: string, key: unknown): string {\n return toBase64Url(\n JSON.stringify([type, typeof key === \"bigint\" ? key.toString() : key]),\n );\n}\n\nexport function fromGlobalId(\n id: string,\n): { type: string; key: string | number } | undefined {\n try {\n const decoded = JSON.parse(fromBase64Url(id)) as unknown;\n if (\n Array.isArray(decoded) &&\n decoded.length === 2 &&\n typeof decoded[0] === \"string\" &&\n (typeof decoded[1] === \"string\" || typeof decoded[1] === \"number\")\n ) {\n return { type: decoded[0], key: decoded[1] };\n }\n } catch {\n // fall through\n }\n return undefined;\n}\n","// Scalars for LoraDB value types. Temporal values travel as ISO-8601\n// strings in GraphQL and as tagged `{ kind, iso }` objects to and from\n// the engine; BigInt travels as a decimal string.\n\nimport { GraphQLError, GraphQLScalarType, Kind, type ValueNode } from \"graphql\";\n\ntype TemporalKind =\n | \"date\"\n | \"time\"\n | \"localtime\"\n | \"datetime\"\n | \"localdatetime\"\n | \"duration\";\n\nfunction temporal(\n name: string,\n kind: TemporalKind,\n description: string,\n): GraphQLScalarType {\n const parse = (value: unknown) => {\n if (typeof value !== \"string\" || value.length === 0) {\n throw new GraphQLError(`${name} must be an ISO-8601 string`);\n }\n return { kind, iso: value };\n };\n return new GraphQLScalarType({\n name,\n description,\n serialize(value) {\n if (typeof value === \"string\") return value;\n if (\n value !== null &&\n typeof value === \"object\" &&\n typeof (value as { iso?: unknown }).iso === \"string\"\n ) {\n return (value as { iso: string }).iso;\n }\n throw new GraphQLError(`${name} cannot represent ${String(value)}`);\n },\n parseValue: parse,\n parseLiteral(ast: ValueNode) {\n if (ast.kind !== Kind.STRING) {\n throw new GraphQLError(`${name} must be an ISO-8601 string`, {\n nodes: ast,\n });\n }\n return parse(ast.value);\n },\n });\n}\n\nexport const GraphQLDate = temporal(\n \"Date\",\n \"date\",\n \"A calendar date, e.g. `2026-06-21`.\",\n);\nexport const GraphQLTime = temporal(\n \"Time\",\n \"time\",\n \"A time of day with offset, e.g. `21:00:00+02:00`.\",\n);\nexport const GraphQLLocalTime = temporal(\n \"LocalTime\",\n \"localtime\",\n \"A time of day without offset, e.g. `21:00:00`.\",\n);\nexport const GraphQLDateTime = temporal(\n \"DateTime\",\n \"datetime\",\n \"An instant with offset, e.g. `2026-06-21T21:00:00Z`.\",\n);\nexport const GraphQLLocalDateTime = temporal(\n \"LocalDateTime\",\n \"localdatetime\",\n \"A date and time without offset, e.g. `2026-06-21T21:00:00`.\",\n);\nexport const GraphQLDuration = temporal(\n \"Duration\",\n \"duration\",\n \"An ISO-8601 duration, e.g. `P1DT2H`.\",\n);\n\nconst MIN_SAFE = BigInt(Number.MIN_SAFE_INTEGER);\nconst MAX_SAFE = BigInt(Number.MAX_SAFE_INTEGER);\n\nfunction parseBigInt(value: unknown): bigint {\n try {\n if (typeof value === \"bigint\") return value;\n if (typeof value === \"number\" && Number.isSafeInteger(value)) {\n return BigInt(value);\n }\n if (typeof value === \"string\" && /^-?\\d+$/.test(value)) {\n return BigInt(value);\n }\n } catch {\n // fall through\n }\n throw new GraphQLError(\"BigInt must be an integer or a decimal string\");\n}\n\n/** Pass safe integers as numbers; only true 64-bit values as bigint. */\nfunction toParam(n: bigint): number | bigint {\n return n >= MIN_SAFE && n <= MAX_SAFE ? Number(n) : n;\n}\n\nexport const GraphQLBigInt = new GraphQLScalarType({\n name: \"BigInt\",\n description: \"A 64-bit integer, serialised as a decimal string.\",\n serialize(value) {\n if (typeof value === \"bigint\") return value.toString();\n if (typeof value === \"number\" && Number.isInteger(value)) {\n return BigInt(value).toString();\n }\n throw new GraphQLError(`BigInt cannot represent ${String(value)}`);\n },\n parseValue: (value) => toParam(parseBigInt(value)),\n parseLiteral(ast) {\n if (ast.kind === Kind.INT || ast.kind === Kind.STRING) {\n return toParam(parseBigInt(ast.value));\n }\n throw new GraphQLError(\"BigInt must be an integer or a decimal string\", {\n nodes: ast,\n });\n },\n});\n\nexport const CUSTOM_SCALARS: Record<string, GraphQLScalarType> = {\n BigInt: GraphQLBigInt,\n Date: GraphQLDate,\n Time: GraphQLTime,\n LocalTime: GraphQLLocalTime,\n DateTime: GraphQLDateTime,\n LocalDateTime: GraphQLLocalDateTime,\n Duration: GraphQLDuration,\n};\n","// GraphModel → executable GraphQLSchema. Generates only what the model\n// opts into: filters for @filterable fields, sorts for @sortable ones,\n// aggregates for @query(aggregate: true), mutations for @mutation.\n\nimport {\n GraphQLBoolean,\n GraphQLEnumType,\n GraphQLFloat,\n GraphQLID,\n GraphQLInputObjectType,\n GraphQLInt,\n GraphQLInterfaceType,\n GraphQLList,\n GraphQLNonNull,\n GraphQLObjectType,\n GraphQLSchema,\n GraphQLString,\n GraphQLUnionType,\n type GraphQLFieldConfig,\n type GraphQLFieldConfigArgumentMap,\n type GraphQLFieldConfigMap,\n type GraphQLFieldResolver,\n type GraphQLInputFieldConfigMap,\n type GraphQLInputType,\n type GraphQLOutputType,\n type GraphQLResolveInfo,\n GraphQLScalarType,\n} from \"graphql\";\nimport { encodeCursor } from \"../compile/cursor.js\";\nimport type {\n RawConnection,\n RawEdge,\n RootKind,\n SearchResult,\n} from \"../compile/read.js\";\nimport { ModelError, requestError } from \"../errors.js\";\nimport { lowerFirst } from \"../model/build.js\";\nimport type {\n AbstractType,\n CustomField,\n CypherField,\n FilterOperator,\n GraphModel,\n NodeType,\n RelationshipField,\n RelationshipPropertiesType,\n ScalarField,\n ScalarType,\n SearchIndex,\n} from \"../model/types.js\";\nimport { toGlobalId } from \"./global-id.js\";\nimport { assertReadable } from \"./guard.js\";\nimport { buildMutations, type MutationResolver } from \"./mutations.js\";\nimport { hasOwnConnection, names } from \"./names.js\";\nimport { CUSTOM_SCALARS } from \"./scalars.js\";\n\n/** One event of a generated subscription. */\nexport interface ChangeEvent {\n operation: \"CREATE\" | \"UPDATE\" | \"DELETE\" | \"CONNECT\" | \"DISCONNECT\";\n key: unknown;\n /** When the write was committed, ISO-8601. */\n timestamp?: string | undefined;\n /** For CONNECT / DISCONNECT: the relationship and its other end. */\n relationship?:\n | { field: string; type: string; relatedType: string; relatedKey: unknown }\n | undefined;\n /** Stored properties before the write (`previousState: true`). */\n previous?: Record<string, unknown> | undefined;\n}\n\nexport interface SchemaHooks {\n resolveAbstract: (\n abstract: AbstractType,\n info: GraphQLResolveInfo,\n context: unknown,\n ) => Promise<unknown>;\n subscribe: (\n node: NodeType,\n args: Record<string, unknown>,\n context: unknown,\n ) => AsyncIterable<ChangeEvent>;\n resolveChangedNode: (\n node: NodeType,\n event: ChangeEvent,\n info: GraphQLResolveInfo,\n context: unknown,\n ) => Promise<unknown>;\n /** Implementations of custom scalars, by name (the scalars option). */\n scalars?: Readonly<Record<string, GraphQLScalarType>> | undefined;\n /** The resolver of a `@customResolver` field (from the resolvers option). */\n customResolver: (\n node: NodeType,\n field: CustomField,\n ) => GraphQLFieldResolver<Record<string, unknown>, unknown>;\n resolveSearch: (\n node: NodeType,\n index: SearchIndex,\n info: GraphQLResolveInfo,\n context: unknown,\n connection: boolean,\n ) => Promise<unknown>;\n resolveRoot: RootResolver;\n resolveNode: NodeResolver;\n resolveCypher: CypherRootResolver;\n resolveMutation: MutationResolver;\n}\n\nexport type CypherRootResolver = (\n field: CypherField,\n info: GraphQLResolveInfo,\n context: unknown,\n) => Promise<unknown>;\n\nexport type RootResolver = (\n kind: RootKind,\n node: NodeType,\n info: GraphQLResolveInfo,\n context: unknown,\n) => Promise<unknown>;\n\nexport type NodeResolver = (\n id: string,\n info: GraphQLResolveInfo,\n context: unknown,\n) => Promise<unknown>;\n\ntype SortedEdge = RawEdge & { __sort: string };\n\n/** The rows of a page in the requested order. */\nfunction pageOf(src: RawConnection): RawEdge[] {\n const page = src.__rows.slice(0, src.__first);\n return src.__backward ? page.reverse() : page;\n}\n\nconst nonNull = <T extends GraphQLOutputType | GraphQLInputType>(t: T) =>\n new GraphQLNonNull(t);\nconst listOf = <T extends GraphQLOutputType | GraphQLInputType>(t: T) =>\n new GraphQLList(t);\n\n/**\n * Values under response keys: the compiler projects each alias. A field\n * whose row-level READ rule failed arrives as `{ __forbidden: true }`.\n */\nconst byResponseKey: GraphQLFieldResolver<Record<string, unknown>, unknown> = (\n source,\n _args,\n _ctx,\n info,\n) => {\n const value = source[info.path.key as string];\n if (\n value !== null &&\n typeof value === \"object\" &&\n (value as { __forbidden?: unknown }).__forbidden === true\n ) {\n throw requestError(\n \"FORBIDDEN\",\n `not allowed to read ${info.parentType.name}.${info.fieldName}`,\n );\n }\n return value;\n};\n\n/** A stored VECTOR as its numbers. */\nconst vectorByResponseKey: GraphQLFieldResolver<\n Record<string, unknown>,\n unknown\n> = (source, _args, _ctx, info) => {\n const value = source[info.path.key as string] as\n | { values?: number[] }\n | null\n | undefined;\n return value && !Array.isArray(value) ? (value.values ?? null) : value;\n};\n\n/** Same, for nodes: fails on nodes a READ validate rule rejects. */\nconst nodesByResponseKey: GraphQLFieldResolver<\n Record<string, unknown>,\n unknown\n> = (source, _args, _ctx, info) =>\n assertReadable(source[info.path.key as string]);\n\nconst OPERATOR_FIELDS: Record<FilterOperator, string> = {\n EQ: \"eq\",\n IN: \"in\",\n LT: \"lt\",\n LTE: \"lte\",\n GT: \"gt\",\n GTE: \"gte\",\n CONTAINS: \"contains\",\n STARTS_WITH: \"startsWith\",\n ENDS_WITH: \"endsWith\",\n WITHIN_BBOX: \"withinBBox\",\n DISTANCE: \"distance\",\n INCLUDES: \"includes\",\n IS_NULL: \"isNull\",\n CASE_INSENSITIVE: \"caseInsensitive\",\n};\n\nconst OPERATOR_DOCS: Record<FilterOperator, string> = {\n EQ: \"Equal to.\",\n IN: \"Equal to any of.\",\n LT: \"Less than.\",\n LTE: \"Less than or equal to.\",\n GT: \"Greater than.\",\n GTE: \"Greater than or equal to.\",\n CONTAINS: \"Contains the substring.\",\n STARTS_WITH: \"Starts with.\",\n ENDS_WITH: \"Ends with.\",\n WITHIN_BBOX: \"Inside the bounding box, edges included.\",\n DISTANCE: \"Within this distance of a point (metres for geographic points).\",\n INCLUDES: \"The list contains this value.\",\n IS_NULL: \"true: the value is absent; false: it is present.\",\n CASE_INSENSITIVE:\n \"The same string operators, ignoring case. Not index-backed: prefer @fulltext for search.\",\n};\n\nexport function buildSchema(\n model: GraphModel,\n hooks: SchemaHooks,\n): GraphQLSchema {\n const { resolveRoot, resolveNode } = hooks;\n const sortDirection = new GraphQLEnumType({\n name: \"SortDirection\",\n values: {\n ASC: { description: \"Ascending; nulls last.\" },\n DESC: { description: \"Descending; nulls first.\" },\n },\n });\n\n const pageInfo = new GraphQLObjectType({\n name: \"PageInfo\",\n fields: {\n hasNextPage: { type: nonNull(GraphQLBoolean) },\n hasPreviousPage: { type: nonNull(GraphQLBoolean) },\n startCursor: { type: GraphQLString },\n endCursor: { type: GraphQLString },\n },\n });\n\n const countFilter = new GraphQLInputObjectType({\n name: \"CountFilter\",\n description: \"Compare the number of related nodes.\",\n fields: {\n eq: { type: GraphQLInt },\n lt: { type: GraphQLInt },\n lte: { type: GraphQLInt },\n gt: { type: GraphQLInt },\n gte: { type: GraphQLInt },\n },\n });\n\n const point = new GraphQLObjectType({\n name: \"Point\",\n description: \"A WGS-84 geographic point.\",\n fields: {\n longitude: { type: nonNull(GraphQLFloat) },\n latitude: { type: nonNull(GraphQLFloat) },\n height: { type: GraphQLFloat },\n srid: { type: nonNull(GraphQLInt) },\n crs: { type: nonNull(GraphQLString) },\n },\n });\n\n const cartesianPoint = new GraphQLObjectType({\n name: \"CartesianPoint\",\n description: \"A point in a cartesian coordinate system.\",\n fields: {\n x: { type: nonNull(GraphQLFloat) },\n y: { type: nonNull(GraphQLFloat) },\n z: { type: GraphQLFloat },\n srid: { type: nonNull(GraphQLInt) },\n crs: { type: nonNull(GraphQLString) },\n },\n });\n\n const enums = new Map<string, GraphQLEnumType>();\n for (const e of model.enums.values()) {\n enums.set(\n e.name,\n new GraphQLEnumType({\n name: e.name,\n description: e.description,\n values: Object.fromEntries(\n e.values.map((val) => [val.name, { description: val.description }]),\n ),\n }),\n );\n }\n\n const relay = [...model.nodes.values()].some((n) => n.key.relayId);\n const nodeInterface = relay\n ? new GraphQLInterfaceType({\n name: \"Node\",\n description: \"An object with a global id.\",\n fields: { id: { type: nonNull(GraphQLID) } },\n resolveType: (value) =>\n (value as { __typename?: string }).__typename ?? undefined,\n })\n : undefined;\n\n // Custom scalars: the implementation given in the scalars option, or a\n // pass-through that serializes and parses like its storage type.\n const customScalars = new Map<string, GraphQLScalarType>();\n const customScalar = (name: string): GraphQLScalarType | undefined => {\n const stored = model.scalars.get(name);\n if (!stored) return undefined;\n let t = customScalars.get(name);\n if (!t) {\n const base = baseType(stored, undefined) as GraphQLScalarType;\n t =\n hooks.scalars?.[name] ??\n new GraphQLScalarType({\n name,\n description: `Stored as ${stored}.`,\n serialize: base.serialize,\n parseValue: base.parseValue,\n parseLiteral: base.parseLiteral,\n });\n customScalars.set(name, t);\n }\n return t;\n };\n const scalarType = (\n f: ScalarField,\n ): GraphQLScalarType | GraphQLEnumType | GraphQLObjectType =>\n (f.customScalar && customScalar(f.customScalar)) ||\n baseType(f.type, f.enumName);\n const baseType = (\n type: ScalarType,\n enumName: string | undefined,\n ): GraphQLScalarType | GraphQLEnumType | GraphQLObjectType => {\n switch (type) {\n case \"String\":\n return GraphQLString;\n case \"ID\":\n return GraphQLID;\n case \"Int\":\n return GraphQLInt;\n case \"Float\":\n return GraphQLFloat;\n case \"Boolean\":\n return GraphQLBoolean;\n case \"Point\":\n return point;\n case \"CartesianPoint\":\n return cartesianPoint;\n case \"Enum\":\n return enums.get(enumName!)!;\n default:\n return CUSTOM_SCALARS[type]!;\n }\n };\n\n const scalarOutput = (f: ScalarField): GraphQLOutputType => {\n const base = scalarType(f);\n const t: GraphQLOutputType = f.list ? listOf(nonNull(base)) : base;\n return f.required ? nonNull(t) : t;\n };\n\n // --- Filters -------------------------------------------------------------\n\n // --- Points ---------------------------------------------------------------\n\n const pointInput = new GraphQLInputObjectType({\n name: \"PointInput\",\n description: \"A WGS-84 point. Add height for 3D.\",\n fields: {\n longitude: { type: nonNull(GraphQLFloat) },\n latitude: { type: nonNull(GraphQLFloat) },\n height: { type: GraphQLFloat },\n },\n });\n const cartesianPointInput = new GraphQLInputObjectType({\n name: \"CartesianPointInput\",\n description: \"A cartesian point. Add z for 3D.\",\n fields: {\n x: { type: nonNull(GraphQLFloat) },\n y: { type: nonNull(GraphQLFloat) },\n z: { type: GraphQLFloat },\n },\n });\n const spatialInputs = (cartesian: boolean) => {\n const point = cartesian ? cartesianPointInput : pointInput;\n const prefix = cartesian ? \"CartesianPoint\" : \"Point\";\n return {\n bbox: new GraphQLInputObjectType({\n name: `${prefix}BBoxInput`,\n fields: {\n lowerLeft: {\n type: nonNull(point),\n description: \"Minimum corner (south-west).\",\n },\n upperRight: {\n type: nonNull(point),\n description: \"Maximum corner (north-east).\",\n },\n },\n }),\n distance: new GraphQLInputObjectType({\n name: `${prefix}DistanceInput`,\n fields: {\n from: { type: nonNull(point) },\n lte: { type: nonNull(GraphQLFloat) },\n },\n }),\n };\n };\n const spatial = { geo: spatialInputs(false), cartesian: spatialInputs(true) };\n\n /** The input form of a stored field: points take PointInput. */\n const inputTypeOf = (f: ScalarField): GraphQLInputType =>\n f.type === \"Point\"\n ? pointInput\n : f.type === \"CartesianPoint\"\n ? cartesianPointInput\n : (scalarType(f) as GraphQLInputType);\n\n // String operators, ignoring case: `toLower(x) <op> lower(value)`.\n const caseInsensitiveFilter = (owner: string, f: ScalarField) => {\n const text = new Set<FilterOperator>([\n \"EQ\",\n ...[...f.filters].filter((op) =>\n [\"IN\", \"CONTAINS\", \"STARTS_WITH\", \"ENDS_WITH\"].includes(op),\n ),\n ]);\n const fields: GraphQLInputFieldConfigMap = {};\n for (const op of text) {\n fields[OPERATOR_FIELDS[op]] = {\n type: op === \"IN\" ? listOf(nonNull(GraphQLString)) : GraphQLString,\n description: OPERATOR_DOCS[op],\n };\n }\n return new GraphQLInputObjectType({\n name: `${names.fieldFilter(owner, f.name)}CaseInsensitive`,\n fields,\n });\n };\n\n const fieldFilter = (owner: string, f: ScalarField) => {\n const base = inputTypeOf(f);\n const fields: GraphQLInputFieldConfigMap = {};\n const kinds = f.type === \"CartesianPoint\" ? spatial.cartesian : spatial.geo;\n for (const op of f.filters) {\n const name = OPERATOR_FIELDS[op];\n let type: GraphQLInputType;\n switch (op) {\n case \"IN\":\n type = listOf(nonNull(base));\n break;\n case \"WITHIN_BBOX\":\n type = kinds.bbox;\n break;\n case \"DISTANCE\":\n type = kinds.distance;\n break;\n case \"IS_NULL\":\n type = GraphQLBoolean;\n break;\n case \"CASE_INSENSITIVE\":\n type = caseInsensitiveFilter(owner, f);\n break;\n case \"CONTAINS\":\n case \"STARTS_WITH\":\n case \"ENDS_WITH\":\n // A fragment of a custom scalar's value is not one: text\n // operators take the storage type.\n type = f.customScalar\n ? (baseType(f.type, undefined) as GraphQLInputType)\n : base;\n break;\n default:\n type = base;\n }\n fields[name] = { type, description: OPERATOR_DOCS[op] };\n }\n return new GraphQLInputObjectType({\n name: names.fieldFilter(owner, f.name),\n fields,\n });\n };\n\n const wheres = new Map<string, GraphQLInputObjectType>();\n const whereOf = (typeName: string) => wheres.get(typeName)!;\n\n for (const node of model.nodes.values()) {\n const where: GraphQLInputObjectType = new GraphQLInputObjectType({\n name: names.where(node.name),\n description: `Filters ${node.name} nodes. Absent or null filters are ignored.`,\n fields: () => {\n const fields: GraphQLInputFieldConfigMap = {\n AND: { type: listOf(nonNull(where)) },\n OR: { type: listOf(nonNull(where)) },\n NOT: { type: where },\n };\n for (const f of node.fields.values()) {\n if (f.kind === \"scalar\") {\n if (f.filters.size > 0 && !f.private) {\n fields[f.name] = { type: fieldFilter(node.name, f) };\n }\n } else if (f.kind === \"cypher\") {\n if (f.computed && f.computed.filters.size > 0) {\n fields[f.name] = {\n type: fieldFilter(node.name, f.computed),\n description:\n \"Computed by @cypher for every node considered: no index applies.\",\n };\n }\n } else if (f.kind === \"relationship\" && f.filterable) {\n fields[f.name] = {\n type: f.list ? relationFilter(node, f) : whereOf(f.target),\n description: f.list\n ? undefined\n : `Has a related ${f.target} matching the filter.`,\n };\n if (f.list && f.properties && !polymorphic(f)) {\n fields[names.connectionField(f.name)] = {\n type: connectionFilter(node, f),\n description: `Quantifiers over ${f.name} with their relationship properties.`,\n };\n }\n }\n }\n return fields;\n },\n });\n wheres.set(node.name, where);\n }\n\n // Interfaces: their filterable fields, applied to every implementation,\n // and `typename` to pick implementations. Unions: one where per member.\n for (const abstract of model.abstracts.values()) {\n const implementation =\n abstract.kind === \"interface\"\n ? new GraphQLEnumType({\n name: `${abstract.name}Implementation`,\n values: Object.fromEntries(abstract.members.map((m) => [m, {}])),\n })\n : undefined;\n const where: GraphQLInputObjectType = new GraphQLInputObjectType({\n name: names.where(abstract.name),\n description:\n abstract.kind === \"interface\"\n ? `Filters ${abstract.name} nodes of every implementation.`\n : `Filters ${abstract.name} members. With any member named, members not named are left out.`,\n fields: () => {\n if (abstract.kind === \"union\") {\n return Object.fromEntries(\n abstract.members.map((m) => [m, { type: whereOf(m) }]),\n );\n }\n const fields: GraphQLInputFieldConfigMap = {\n AND: { type: listOf(nonNull(where)) },\n OR: { type: listOf(nonNull(where)) },\n NOT: { type: where },\n typename: {\n type: listOf(nonNull(implementation!)),\n description: \"Only these implementations.\",\n },\n };\n for (const f of abstract.fields.values()) {\n if (f.filters.size > 0) {\n fields[f.name] = { type: fieldFilter(abstract.name, f) };\n }\n }\n return fields;\n },\n });\n wheres.set(abstract.name, where);\n }\n\n const polymorphic = (rel: RelationshipField) =>\n model.abstracts.has(rel.target);\n\n const relationFilter = (node: NodeType, rel: RelationshipField) =>\n new GraphQLInputObjectType({\n name: names.relationFilter(node.name, rel.name),\n fields: {\n some: {\n type: whereOf(rel.target),\n description: \"At least one related node matches.\",\n },\n all: {\n type: whereOf(rel.target),\n description: \"Every related node matches.\",\n },\n none: {\n type: whereOf(rel.target),\n description: \"No related node matches.\",\n },\n single: {\n type: whereOf(rel.target),\n description: \"Exactly one related node matches.\",\n },\n count: {\n type: countFilter,\n description: \"The number of related nodes.\",\n },\n ...(polymorphic(rel) || !rel.aggregate\n ? {}\n : {\n aggregate: {\n type: relationAggregateFilter(node, rel),\n description:\n \"Aggregates of the related nodes (and relationship properties).\",\n },\n }),\n },\n });\n\n // --- Connection and aggregate filters -------------------------------------\n\n const connectionWheres = new Map<string, GraphQLInputObjectType>();\n const connectionWhere = (node: NodeType, rel: RelationshipField) => {\n const name = names.relConnectionWhere(node.name, rel.name);\n let t = connectionWheres.get(name);\n if (!t) {\n const props = model.relationshipProperties.get(rel.properties!)!;\n const edgeWhere = propsWhere(props);\n t = new GraphQLInputObjectType({\n name,\n fields: () => ({\n node: { type: whereOf(rel.target) },\n ...(edgeWhere ? { edge: { type: edgeWhere } } : {}),\n }),\n });\n connectionWheres.set(name, t);\n }\n return t;\n };\n\n const connectionFilter = (node: NodeType, rel: RelationshipField) => {\n const pair = connectionWhere(node, rel);\n return new GraphQLInputObjectType({\n name: `${names.relConnection(node.name, rel.name)}Filter`,\n fields: {\n some: { type: pair, description: \"At least one pair matches.\" },\n all: { type: pair, description: \"Every pair matches.\" },\n none: { type: pair, description: \"No pair matches.\" },\n single: { type: pair, description: \"Exactly one pair matches.\" },\n },\n });\n };\n\n const comparisons = new Map<string, GraphQLInputObjectType>();\n const comparison = (base: GraphQLScalarType) => {\n let t = comparisons.get(base.name);\n if (!t) {\n t = new GraphQLInputObjectType({\n name: `${base.name}Comparison`,\n fields: {\n eq: { type: base },\n lt: { type: base },\n lte: { type: base },\n gt: { type: base },\n gte: { type: base },\n },\n });\n comparisons.set(base.name, t);\n }\n return t;\n };\n\n /** Fields whose values can be aggregated: ordered scalars, not lists. */\n const aggregatable = (f: ScalarField) =>\n !f.list &&\n !f.private &&\n f.selectableOn.aggregate &&\n f.selectableOn.read &&\n ![\"Boolean\", \"Enum\", \"Point\", \"CartesianPoint\"].includes(f.type);\n const isNumeric = (f: ScalarField) =>\n f.type === \"Int\" || f.type === \"Float\" || f.type === \"BigInt\";\n\n const aggregateFieldFilters = new Map<string, GraphQLInputObjectType>();\n const aggregateFieldFilter = (f: ScalarField) => {\n const base = scalarType(f) as GraphQLScalarType;\n const name = `${base.name}AggregateFilter`;\n let t = aggregateFieldFilters.get(name);\n if (!t) {\n t = new GraphQLInputObjectType({\n name,\n fields: {\n min: { type: comparison(base) },\n max: { type: comparison(base) },\n ...(isNumeric(f)\n ? {\n avg: { type: comparison(GraphQLFloat) },\n sum: {\n type: comparison(f.type === \"Int\" ? GraphQLFloat : base),\n },\n }\n : {}),\n ...(f.type === \"Duration\"\n ? {\n avg: { type: comparison(base) },\n sum: { type: comparison(base) },\n }\n : {}),\n ...(f.type === \"String\" || f.type === \"ID\"\n ? {\n shortestLength: { type: comparison(GraphQLInt) },\n longestLength: { type: comparison(GraphQLInt) },\n averageLength: { type: comparison(GraphQLFloat) },\n }\n : {}),\n },\n });\n aggregateFieldFilters.set(name, t);\n }\n return t;\n };\n\n const aggregateWheres = new Map<string, GraphQLInputObjectType | undefined>();\n const aggregateWhere = (typeName: string, fields: Iterable<ScalarField>) => {\n if (aggregateWheres.has(typeName)) return aggregateWheres.get(typeName);\n const usable = [...fields].filter(aggregatable);\n const t =\n usable.length > 0\n ? new GraphQLInputObjectType({\n name: `${typeName}AggregateWhere`,\n fields: Object.fromEntries(\n usable.map((f) => [f.name, { type: aggregateFieldFilter(f) }]),\n ),\n })\n : undefined;\n aggregateWheres.set(typeName, t);\n return t;\n };\n\n const relationAggregateFilter = (node: NodeType, rel: RelationshipField) => {\n const target = model.nodes.get(rel.target)!;\n const nodeWhere = aggregateWhere(\n target.name,\n [...target.fields.values()].filter(\n (f): f is ScalarField => f.kind === \"scalar\",\n ),\n );\n const props = rel.properties\n ? model.relationshipProperties.get(rel.properties)\n : undefined;\n const edgeWhere = props\n ? aggregateWhere(props.name, props.fields.values())\n : undefined;\n return new GraphQLInputObjectType({\n name: `${names.relationFilter(node.name, rel.name)}Aggregate`,\n fields: {\n count: { type: countFilter },\n ...(nodeWhere ? { node: { type: nodeWhere } } : {}),\n ...(edgeWhere ? { edge: { type: edgeWhere } } : {}),\n },\n });\n };\n\n const propsWheres = new Map<string, GraphQLInputObjectType | undefined>();\n const propsWhere = (props: RelationshipPropertiesType) => {\n if (propsWheres.has(props.name)) return propsWheres.get(props.name);\n const filterable = [...props.fields.values()].filter(\n (f) => f.filters.size > 0 && !f.private,\n );\n let t: GraphQLInputObjectType | undefined;\n if (filterable.length > 0) {\n t = new GraphQLInputObjectType({\n name: names.where(props.name),\n fields: () => ({\n AND: { type: listOf(nonNull(t!)) },\n OR: { type: listOf(nonNull(t!)) },\n NOT: { type: t! },\n ...Object.fromEntries(\n filterable.map((f) => [\n f.name,\n { type: fieldFilter(props.name, f) },\n ]),\n ),\n }),\n });\n }\n propsWheres.set(props.name, t);\n return t;\n };\n\n // --- Sorts -----------------------------------------------------------------\n\n const sorts = new Map<string, GraphQLInputObjectType>();\n for (const node of model.nodes.values()) {\n const fields: GraphQLInputFieldConfigMap = {};\n for (const f of node.fields.values()) {\n if (f.kind === \"scalar\" && (f.key || f.sortable)) {\n fields[f.name] = { type: sortDirection };\n } else if (f.kind === \"cypher\" && f.computed?.sortable) {\n fields[f.name] = {\n type: sortDirection,\n description: \"Computed by @cypher per node: root fields only.\",\n };\n }\n }\n sorts.set(\n node.name,\n new GraphQLInputObjectType({\n name: names.sort(node.name),\n description: `Sorts ${node.name} nodes. One field per item; the @key breaks ties.`,\n fields,\n }),\n );\n }\n for (const abstract of model.abstracts.values()) {\n const sortable = [...abstract.fields.values()].filter((f) => f.sortable);\n if (abstract.kind !== \"interface\" || sortable.length === 0) continue;\n sorts.set(\n abstract.name,\n new GraphQLInputObjectType({\n name: names.sort(abstract.name),\n description: `Sorts ${abstract.name} nodes of every implementation. Ties break by type name, then key.`,\n fields: Object.fromEntries(\n sortable.map((f) => [f.name, { type: sortDirection }]),\n ),\n }),\n );\n }\n\n // --- Objects and connections ----------------------------------------------\n\n const objects = new Map<string, GraphQLObjectType>();\n const connections = new Map<string, GraphQLObjectType>();\n\n // Interfaces and unions over @node types; `__typename` in each projected\n // node tells them apart.\n const abstractTypes = new Map<\n string,\n GraphQLInterfaceType | GraphQLUnionType\n >();\n const resolveType = (value: unknown) =>\n (value as { __typename?: string }).__typename ?? undefined;\n for (const abstract of model.abstracts.values()) {\n abstractTypes.set(\n abstract.name,\n abstract.kind === \"interface\"\n ? new GraphQLInterfaceType({\n name: abstract.name,\n description: abstract.description,\n fields: () => ({\n ...Object.fromEntries(\n [...abstract.fields.values()]\n .filter((f) => !f.private && f.selectableOn.read)\n .map((f) => [\n f.name,\n { type: scalarOutput(f), description: f.description },\n ]),\n ),\n // Declared relationships: the implementations' field, whose\n // type and arguments the model checked are the same.\n ...Object.fromEntries(\n [...abstract.relationships.values()].map((rel) => {\n const impl = objects.get(abstract.members[0]!)!.getFields()[\n rel.name\n ]!;\n return [\n rel.name,\n {\n type: impl.type,\n description: rel.description,\n args: Object.fromEntries(\n impl.args.map((a) => [\n a.name,\n {\n type: a.type,\n defaultValue: a.defaultValue,\n description: a.description,\n },\n ]),\n ),\n },\n ];\n }),\n ),\n }),\n resolveType,\n })\n : new GraphQLUnionType({\n name: abstract.name,\n description: abstract.description,\n types: () => abstract.members.map((m) => objects.get(m)!),\n resolveType,\n }),\n );\n }\n const outputOf = (\n name: string,\n ): GraphQLObjectType | GraphQLInterfaceType | GraphQLUnionType =>\n objects.get(name) ?? abstractTypes.get(name)!;\n\n const connectionResolvers = {\n edges: (src: RawConnection) =>\n pageOf(src).map((row) => {\n assertReadable(row.node);\n return { ...row, __sort: src.__sort };\n }),\n pageInfo: (src: RawConnection) => {\n const page = pageOf(src);\n // Cursors carry sort values: as readable as the nodes themselves.\n for (const row of page) assertReadable(row.node);\n const cursor = (row: RawEdge | undefined) =>\n row ? encodeCursor(src.__sort, row.__cursor, model.cursorSecret) : null;\n const more = src.__rows.length > src.__first;\n return {\n hasNextPage: src.__backward ? src.__after : more,\n hasPreviousPage: src.__backward ? more : src.__after,\n startCursor: cursor(page[0]),\n endCursor: cursor(page[page.length - 1]),\n };\n },\n totalCount: (src: RawConnection & { __denied?: number }) => {\n if ((src.__denied ?? 0) > 0) {\n throw requestError(\n \"FORBIDDEN\",\n \"not allowed to read some of these nodes\",\n );\n }\n return src.__totalCount ?? 0;\n },\n };\n\n const makeConnection = (\n name: string,\n edgeName: string,\n nodeType: () => GraphQLObjectType,\n propertiesType?: () => GraphQLObjectType,\n aggregate?: () => GraphQLObjectType | undefined,\n ) => {\n const edge = new GraphQLObjectType<SortedEdge>({\n name: edgeName,\n fields: () => ({\n cursor: {\n type: nonNull(GraphQLString),\n resolve: (src) =>\n encodeCursor(src.__sort, src.__cursor, model.cursorSecret),\n },\n node: {\n type: nonNull(nodeType()),\n resolve: (src: SortedEdge) => src.node,\n },\n ...(propertiesType\n ? {\n properties: {\n type: nonNull(propertiesType()),\n resolve: (src: SortedEdge) => src.properties,\n },\n }\n : {}),\n }),\n });\n return new GraphQLObjectType({\n name,\n fields: () => ({\n edges: {\n type: nonNull(listOf(nonNull(edge))),\n resolve: connectionResolvers.edges,\n },\n pageInfo: {\n type: nonNull(pageInfo),\n resolve: connectionResolvers.pageInfo,\n },\n totalCount: {\n type: nonNull(GraphQLInt),\n resolve: connectionResolvers.totalCount,\n },\n ...(aggregate?.()\n ? {\n aggregate: {\n type: nonNull(aggregate()!),\n description:\n \"Aggregates over every matching node (not just this page).\",\n resolve: (src: RawConnection) =>\n (src as RawConnection & { __aggregate?: unknown })\n .__aggregate,\n },\n }\n : {}),\n }),\n });\n };\n\n /**\n * `{ count, node { f { min max avg sum } }, edge { … } }` for connections\n * whose target has @query(aggregate: true).\n */\n const connectionAggregates = new Map<string, GraphQLObjectType>();\n const aggregateSides = new Map<string, GraphQLObjectType | undefined>();\n const relationshipCount = new GraphQLObjectType({\n name: \"RelationshipCount\",\n description:\n \"Related nodes, and the relationships to them: they differ when several relationships lead to the same node.\",\n fields: {\n nodes: { type: nonNull(GraphQLInt) },\n edges: { type: nonNull(GraphQLInt) },\n },\n });\n const connectionAggregate = (\n name: string,\n target: NodeType,\n props: RelationshipPropertiesType | undefined,\n relationship = false,\n ): GraphQLObjectType | undefined => {\n if (!target.aggregate) return undefined;\n let t = connectionAggregates.get(name);\n if (!t) {\n const side = (sideName: string, fields: Iterable<ScalarField>) => {\n if (aggregateSides.has(sideName)) return aggregateSides.get(sideName);\n const usable = [...fields].filter(aggregatable);\n const made =\n usable.length > 0\n ? new GraphQLObjectType({\n name: sideName,\n fields: Object.fromEntries(\n usable.map((f) => [\n f.name,\n { type: nonNull(aggregateFieldType(f)) },\n ]),\n ),\n })\n : undefined;\n aggregateSides.set(sideName, made);\n return made;\n };\n const node = side(\n `${target.name}AggregateNode`,\n [...target.fields.values()].filter(\n (f): f is ScalarField => f.kind === \"scalar\",\n ),\n );\n const edge = props\n ? side(`${props.name}AggregateEdge`, props.fields.values())\n : undefined;\n t = new GraphQLObjectType({\n name,\n fields: {\n count: relationship\n ? { type: nonNull(relationshipCount) }\n : { type: nonNull(GraphQLInt), description: \"Matching nodes.\" },\n ...(node ? { node: { type: nonNull(node) } } : {}),\n ...(edge ? { edge: { type: nonNull(edge) } } : {}),\n },\n });\n connectionAggregates.set(name, t);\n }\n return t;\n };\n\n const propsObjects = new Map<string, GraphQLObjectType>();\n const propsObject = (props: RelationshipPropertiesType) => {\n let t = propsObjects.get(props.name);\n if (!t) {\n t = new GraphQLObjectType({\n name: props.name,\n description: props.description,\n fields: () =>\n Object.fromEntries(\n [...props.fields.values()]\n .filter((f) => !f.private)\n .map((f) => [\n f.name,\n {\n type: scalarOutput(f),\n description: f.description,\n resolve: byResponseKey,\n },\n ]),\n ),\n });\n propsObjects.set(props.name, t);\n }\n return t;\n };\n\n const listArgs = (target: string): GraphQLFieldConfigArgumentMap => ({\n where: { type: whereOf(target) },\n ...(sorts.has(target)\n ? { sort: { type: listOf(nonNull(sorts.get(target)!)) } }\n : {}),\n limit: { type: GraphQLInt },\n });\n\n // Relationship connections whose properties have @sortable fields sort\n // by `edge` too: `sort: [{ edge: { since: DESC } }, { name: ASC }]`.\n const edgeSorts = new Map<string, GraphQLInputObjectType>();\n const edgeSortOf = (\n node: NodeType,\n rel: RelationshipField,\n props: RelationshipPropertiesType,\n ): GraphQLInputObjectType | undefined => {\n const sortable = [...props.fields.values()].filter((f) => f.sortable);\n const target = model.nodes.get(rel.target)!;\n if (sortable.length === 0 || target.fields.has(\"edge\")) return undefined;\n const name = `${names.relConnection(node.name, rel.name)}Sort`;\n let t = edgeSorts.get(name);\n if (!t) {\n const edgeName = names.sort(props.name);\n let edge = edgeSorts.get(edgeName);\n if (!edge) {\n edge = new GraphQLInputObjectType({\n name: edgeName,\n description: `Sorts by ${props.name} relationship properties.`,\n fields: Object.fromEntries(\n sortable.map((f) => [f.name, { type: sortDirection }]),\n ),\n });\n edgeSorts.set(edgeName, edge);\n }\n t = new GraphQLInputObjectType({\n name,\n description: `Sorts ${rel.name} by ${target.name} fields or, under \\`edge\\`, relationship properties. One field per item; the @key breaks ties.`,\n fields: () => ({\n ...Object.fromEntries(\n Object.values(sorts.get(rel.target)!.getFields()).map((f) => [\n f.name,\n { type: f.type, description: f.description },\n ]),\n ),\n edge: { type: edge },\n }),\n });\n edgeSorts.set(name, t);\n }\n return t;\n };\n\n const connectionArgs = (\n target: string,\n where: GraphQLInputType = whereOf(target),\n sort: GraphQLInputObjectType = sorts.get(target)!,\n ): GraphQLFieldConfigArgumentMap => ({\n where: { type: where },\n sort: { type: listOf(nonNull(sort)) },\n first: { type: GraphQLInt },\n after: { type: GraphQLString },\n last: {\n type: GraphQLInt,\n description: \"Page backward: the last n before `before`.\",\n },\n before: { type: GraphQLString },\n });\n\n for (const node of model.nodes.values()) {\n const obj: GraphQLObjectType = new GraphQLObjectType({\n name: node.name,\n description: node.description,\n interfaces: () => [\n ...(node.key.relayId && nodeInterface ? [nodeInterface] : []),\n ...node.interfaces\n .map((i) => abstractTypes.get(i))\n .filter(\n (t): t is GraphQLInterfaceType => t instanceof GraphQLInterfaceType,\n ),\n ],\n fields: () => {\n const fields: GraphQLFieldConfigMap<\n Record<string, unknown>,\n unknown\n > = {};\n if (node.key.relayId) {\n fields[\"id\"] = {\n type: nonNull(GraphQLID),\n description: \"Global id.\",\n resolve: (src, _a, _c, info) =>\n toGlobalId(node.name, src[info.path.key as string]),\n };\n }\n for (const f of node.fields.values()) {\n if (f.kind === \"scalar\") {\n if (f.private || !f.selectableOn.read) continue;\n fields[f.name] = {\n type: scalarOutput(f),\n description: f.description,\n // Vectors are stored tagged; clients see the numbers.\n resolve: f.vector ? vectorByResponseKey : byResponseKey,\n };\n continue;\n }\n if (f.kind === \"cypher\") {\n fields[f.name] = {\n type: cypherOutput(f),\n description: f.description,\n args: cypherArgs(f),\n resolve: f.node ? nodesByResponseKey : byResponseKey,\n };\n continue;\n }\n if (f.kind === \"custom\") {\n const base = namedType(f.type.named) as GraphQLOutputType;\n const item =\n f.type.list && f.type.itemRequired ? nonNull(base) : base;\n const t: GraphQLOutputType = f.type.list ? listOf(item) : item;\n fields[f.name] = {\n type: f.type.required ? nonNull(t) : t,\n description: f.description,\n resolve: hooks.customResolver(node, f),\n };\n continue;\n }\n const target = outputOf(f.target);\n if (!f.list) {\n fields[f.name] = {\n type: f.required ? nonNull(target) : target,\n description: f.description,\n args: { where: { type: whereOf(f.target) } },\n resolve: nodesByResponseKey,\n };\n continue;\n }\n fields[f.name] = {\n type: nonNull(listOf(nonNull(target))),\n description: f.description,\n args: listArgs(f.target),\n resolve: nodesByResponseKey,\n };\n if (!polymorphic(f)) {\n fields[names.connectionField(f.name)] = relationshipConnectionField(\n node,\n f,\n );\n }\n }\n return fields;\n },\n });\n objects.set(node.name, obj);\n connections.set(\n node.name,\n makeConnection(\n names.connection(node.name),\n names.edge(node.name),\n () => obj,\n undefined,\n () =>\n connectionAggregate(\n `${names.connection(node.name)}Aggregate`,\n node,\n undefined,\n ),\n ),\n );\n }\n\n function relationshipConnectionField(\n node: NodeType,\n rel: RelationshipField,\n ): GraphQLFieldConfig<Record<string, unknown>, unknown> {\n if (!hasOwnConnection(rel)) {\n // Aggregates through a relationship count relationships too, and\n // opting out removes them: both need a connection type of its own.\n const target = model.nodes.get(rel.target)!;\n const conn =\n rel.aggregate && !target.aggregate\n ? connections.get(rel.target)!\n : makeConnection(\n names.relConnection(node.name, rel.name),\n names.relEdge(node.name, rel.name),\n () => objects.get(rel.target)!,\n undefined,\n rel.aggregate\n ? () =>\n connectionAggregate(\n `${names.relConnection(node.name, rel.name)}Aggregate`,\n target,\n undefined,\n true,\n )\n : undefined,\n );\n return {\n type: nonNull(conn),\n args: connectionArgs(rel.target),\n resolve: byResponseKey,\n };\n }\n const props = model.relationshipProperties.get(rel.properties!)!;\n const where = connectionWhere(node, rel);\n const conn = makeConnection(\n names.relConnection(node.name, rel.name),\n names.relEdge(node.name, rel.name),\n () => objects.get(rel.target)!,\n () => propsObject(props),\n rel.aggregate\n ? () =>\n connectionAggregate(\n `${names.relConnection(node.name, rel.name)}Aggregate`,\n model.nodes.get(rel.target)!,\n props,\n true,\n )\n : undefined,\n );\n return {\n type: nonNull(conn),\n args: connectionArgs(\n rel.target,\n where,\n edgeSortOf(node, rel, props) ?? sorts.get(rel.target)!,\n ),\n resolve: byResponseKey,\n };\n }\n\n // --- @cypher -----------------------------------------------------------------\n\n // Object types without @node: shapes of @cypher results, read from maps.\n const plainObjects = new Map<string, GraphQLObjectType>();\n for (const plain of model.objects.values()) {\n plainObjects.set(\n plain.name,\n new GraphQLObjectType({\n name: plain.name,\n description: plain.description,\n fields: () =>\n Object.fromEntries(\n [...plain.fields.values()].map((f) => {\n const base = namedType(f.type.named) as GraphQLOutputType;\n const item =\n f.type.list && f.type.itemRequired ? nonNull(base) : base;\n const t: GraphQLOutputType = f.type.list ? listOf(item) : item;\n return [f.name, { type: f.type.required ? nonNull(t) : t }];\n }),\n ),\n }),\n );\n }\n\n const namedType = (named: string) =>\n objects.get(named) ??\n abstractTypes.get(named) ??\n plainObjects.get(named) ??\n enums.get(named) ??\n customScalar(named) ??\n baseType(named as ScalarType, undefined);\n\n function cypherOutput(f: CypherField): GraphQLOutputType {\n const base = namedType(f.type.named) as GraphQLOutputType;\n const item = f.type.list && f.type.itemRequired ? nonNull(base) : base;\n const t: GraphQLOutputType = f.type.list ? listOf(item) : item;\n return f.type.required ? nonNull(t) : t;\n }\n\n function cypherArgs(f: CypherField): GraphQLFieldConfigArgumentMap {\n const out: GraphQLFieldConfigArgumentMap = {};\n for (const a of f.args) {\n const base = namedType(a.type.named) as GraphQLInputType;\n const item = a.type.list && a.type.itemRequired ? nonNull(base) : base;\n const t: GraphQLInputType = a.type.list ? listOf(item) : item;\n out[a.name] = {\n type: a.type.required ? nonNull(t) : t,\n defaultValue: a.defaultValue,\n description: a.description,\n };\n }\n return out;\n }\n\n // --- Aggregates -------------------------------------------------------------\n\n const aggregateFieldTypes = new Map<string, GraphQLObjectType>();\n const aggregateFieldType = (f: ScalarField) => {\n const base = scalarType(f) as GraphQLScalarType;\n const numeric =\n f.type === \"Int\" || f.type === \"Float\" || f.type === \"BigInt\";\n const name = `${base.name}Aggregate`;\n let t = aggregateFieldTypes.get(name);\n if (!t) {\n t = new GraphQLObjectType({\n name,\n fields: {\n min: { type: base },\n max: { type: base },\n ...(numeric\n ? {\n avg: { type: GraphQLFloat },\n sum: { type: f.type === \"Int\" ? GraphQLFloat : base },\n }\n : {}),\n ...(f.type === \"Duration\"\n ? { avg: { type: base }, sum: { type: base } }\n : {}),\n ...(f.type === \"String\" || f.type === \"ID\"\n ? {\n shortest: { type: base, description: \"The shortest value.\" },\n longest: { type: base, description: \"The longest value.\" },\n }\n : {}),\n },\n });\n aggregateFieldTypes.set(name, t);\n }\n return t;\n };\n\n const aggregates = new Map<string, GraphQLObjectType>();\n for (const node of model.nodes.values()) {\n if (!node.aggregate) continue;\n const fields: GraphQLFieldConfigMap<unknown, unknown> = {\n count: { type: nonNull(GraphQLInt) },\n };\n for (const f of node.fields.values()) {\n // Sortable fields opt in; durations cannot be sortable, so they\n // take part whenever they are aggregatable.\n if (\n f.kind === \"scalar\" &&\n (f.key || f.sortable || f.type === \"Duration\") &&\n !f.list &&\n f.selectableOn.aggregate &&\n f.type !== \"Boolean\" &&\n f.type !== \"Enum\"\n ) {\n fields[f.name] = { type: nonNull(aggregateFieldType(f)) };\n }\n }\n aggregates.set(\n node.name,\n new GraphQLObjectType({ name: names.aggregate(node.name), fields }),\n );\n }\n\n // `<plural>Grouped(by: [...])`: the aggregate once per group of @groupBy\n // field values.\n const groups = new Map<\n string,\n { field: GraphQLEnumType; group: GraphQLObjectType }\n >();\n for (const node of model.nodes.values()) {\n if (!node.aggregate) continue;\n const keys = [...node.fields.values()].filter(\n (f): f is ScalarField => f.kind === \"scalar\" && f.groupBy,\n );\n if (keys.length === 0) continue;\n const field = new GraphQLEnumType({\n name: `${node.name}GroupField`,\n values: Object.fromEntries(keys.map((f) => [f.name, { value: f.name }])),\n });\n const key = new GraphQLObjectType({\n name: `${node.name}GroupKey`,\n description:\n \"The group's values of the fields grouped by; the other fields are null.\",\n fields: Object.fromEntries(\n keys.map((f) => [f.name, { type: scalarType(f) }]),\n ),\n });\n const group = new GraphQLObjectType({\n name: `${node.name}Group`,\n fields: {\n by: { type: nonNull(key) },\n aggregate: { type: nonNull(aggregates.get(node.name)!) },\n },\n });\n groups.set(node.name, { field, group });\n }\n\n // --- Query -------------------------------------------------------------------\n\n const query: GraphQLFieldConfigMap<unknown, unknown> = {};\n const root =\n (kind: RootKind, node: NodeType): GraphQLFieldResolver<unknown, unknown> =>\n (_src, _args, context, info) =>\n resolveRoot(kind, node, info, context);\n\n for (const node of model.nodes.values()) {\n if (!node.read) continue;\n const obj = objects.get(node.name)!;\n query[names.listRoot(node)] = {\n type: nonNull(listOf(nonNull(obj))),\n description: `${node.name} nodes, at most \\`limit\\` (default ${node.limit.default}, max ${node.limit.max}).`,\n args: listArgs(node.name),\n resolve: root(\"list\", node),\n };\n query[names.connectionRoot(node)] = {\n type: nonNull(connections.get(node.name)!),\n description: `${node.name} nodes, paginated with keyset cursors.`,\n args: connectionArgs(node.name),\n resolve: root(\"connection\", node),\n };\n query[names.singleRoot(node)] = {\n type: obj,\n description: `The ${node.name} with this ${node.key.name}, or null.`,\n args: {\n [node.key.name]: {\n type: nonNull(scalarType(node.key) as GraphQLInputType),\n },\n },\n resolve: root(\"single\", node),\n };\n if (node.aggregate) {\n query[names.aggregateRoot(node)] = {\n type: nonNull(aggregates.get(node.name)!),\n args: { where: { type: whereOf(node.name) } },\n resolve: root(\"aggregate\", node),\n };\n const grouped = groups.get(node.name);\n if (grouped) {\n query[names.groupedRoot(node)] = {\n type: nonNull(listOf(nonNull(grouped.group))),\n description: `${node.name} aggregates per group of values, ordered by them; at most \\`limit\\` groups.`,\n args: {\n by: { type: nonNull(listOf(nonNull(grouped.field))) },\n where: { type: whereOf(node.name) },\n limit: { type: GraphQLInt },\n },\n resolve: root(\"grouped\", node),\n };\n }\n }\n }\n for (const node of model.nodes.values()) {\n if (!node.read || node.search.length === 0) continue;\n const obj = objects.get(node.name)!;\n const match = new GraphQLObjectType<SearchResult>({\n name: names.match(node.name),\n description: `A ${node.name} and how well it matched, highest first.`,\n fields: {\n score: { type: nonNull(GraphQLFloat) },\n node: {\n type: nonNull(obj),\n resolve: (src) => assertReadable(src.node),\n },\n },\n });\n const searchEdge = new GraphQLObjectType<SortedEdge & { score: number }>({\n name: names.searchEdge(node.name),\n fields: {\n cursor: {\n type: nonNull(GraphQLString),\n resolve: (src) =>\n encodeCursor(src.__sort, src.__cursor, model.cursorSecret),\n },\n score: { type: nonNull(GraphQLFloat) },\n node: {\n type: nonNull(obj),\n resolve: (src) => assertReadable(src.node),\n },\n },\n });\n const searchConnection = new GraphQLObjectType({\n name: names.searchConnection(node.name),\n description: `${node.name} search results, highest score first, paged with cursors.`,\n fields: {\n edges: {\n type: nonNull(listOf(nonNull(searchEdge))),\n resolve: connectionResolvers.edges,\n },\n pageInfo: {\n type: nonNull(pageInfo),\n resolve: connectionResolvers.pageInfo,\n },\n },\n });\n for (const index of node.search) {\n const common = {\n where: { type: whereOf(node.name) },\n limit: { type: GraphQLInt },\n };\n const inputs =\n index.kind === \"fulltext\"\n ? { query: { type: nonNull(GraphQLString) } }\n : {\n vector: { type: listOf(nonNull(GraphQLFloat)) },\n to: { type: scalarType(node.key) as GraphQLInputType },\n };\n query[`${index.queryName}Connection`] = {\n type: nonNull(searchConnection),\n description:\n index.kind === \"fulltext\"\n ? `${index.queryName}, paged with cursors.`\n : `${index.queryName}, paged with cursors within the top ${Math.max(node.limit.max * 4, 1)} candidates.`,\n args: {\n ...inputs,\n where: { type: whereOf(node.name) },\n first: { type: GraphQLInt },\n after: { type: GraphQLString },\n },\n resolve: (_src, _args, context, info) =>\n hooks.resolveSearch(node, index, info, context, true),\n };\n query[index.queryName] = {\n type: nonNull(listOf(nonNull(match))),\n description:\n index.kind === \"fulltext\"\n ? `Full-text search over ${index.fields.map((f) => f.name).join(\", \")}. Terms are ANDed; a trailing * matches a prefix.`\n : `${node.name} nodes most similar to \\`vector\\`, or to the ${node.name} with ${node.key.name} \\`to\\` (${index.similarity.toLowerCase()}).`,\n args:\n index.kind === \"fulltext\"\n ? { query: { type: nonNull(GraphQLString) }, ...common }\n : {\n vector: { type: listOf(nonNull(GraphQLFloat)) },\n to: { type: scalarType(node.key) as GraphQLInputType },\n ...common,\n },\n resolve: (_src, _args, context, info) =>\n hooks.resolveSearch(node, index, info, context, false),\n };\n }\n }\n\n if (nodeInterface) {\n query[\"node\"] = {\n type: nodeInterface,\n description: \"Fetch any object by its global id.\",\n args: { id: { type: nonNull(GraphQLID) } },\n resolve: (_src, args, context, info) =>\n resolveNode((args as { id: string }).id, info, context),\n };\n }\n\n for (const abstract of model.abstracts.values()) {\n if (!abstract.read) continue;\n query[abstract.plural] = {\n type: nonNull(listOf(nonNull(abstractTypes.get(abstract.name)!))),\n description: `${abstract.name} nodes of every ${abstract.kind === \"interface\" ? \"implementation\" : \"member\"}, at most \\`limit\\` (default ${abstract.limit.default}, max ${abstract.limit.max}).`,\n args: listArgs(abstract.name),\n resolve: (_src, _args, context, info) =>\n hooks.resolveAbstract(abstract, info, context),\n };\n }\n\n for (const f of model.queries) {\n query[f.name] = {\n type: cypherOutput(f),\n description: f.description,\n args: cypherArgs(f),\n resolve: (_src, _args, context, info) =>\n hooks.resolveCypher(f, info, context),\n };\n }\n\n const mutation: GraphQLFieldConfigMap<unknown, unknown> = buildMutations(\n {\n model,\n object: (name) => objects.get(name)!,\n inputType: inputTypeOf,\n where: (name) => whereOf(name),\n },\n hooks.resolveMutation,\n );\n for (const f of model.mutations) {\n mutation[f.name] = {\n type: cypherOutput(f),\n description: f.description,\n args: cypherArgs(f),\n resolve: (_src, _args, context, info) =>\n hooks.resolveCypher(f, info, context),\n };\n }\n\n const subscription: GraphQLFieldConfigMap<unknown, unknown> = {};\n const changeOperation = new GraphQLEnumType({\n name: \"ChangeOperation\",\n values: {\n CREATE: {},\n UPDATE: {},\n DELETE: {},\n CONNECT: {\n description:\n \"A relationship was created (`@subscription(relationships: true)`).\",\n },\n DISCONNECT: {\n description:\n \"A relationship was removed (`@subscription(relationships: true)`).\",\n },\n },\n });\n const changeRelationship = new GraphQLObjectType({\n name: \"ChangeRelationship\",\n fields: {\n field: {\n type: nonNull(GraphQLString),\n description: \"`Type.field` that declares it.\",\n },\n type: {\n type: nonNull(GraphQLString),\n description: \"The relationship type.\",\n },\n relatedType: { type: nonNull(GraphQLString) },\n relatedKey: {\n type: nonNull(GraphQLString),\n resolve: (src: { relatedKey: unknown }) => String(src.relatedKey),\n },\n },\n });\n for (const node of model.nodes.values()) {\n if (!node.read || node.subscriptions.size === 0) continue;\n const obj = objects.get(node.name)!;\n const keyType = scalarType(node.key) as GraphQLInputType &\n GraphQLOutputType;\n // The stored values before an update or delete: readable scalar\n // fields without field-level rules (they cannot be checked after the\n // write).\n const previousFields = [...node.fields.values()].filter(\n (f): f is ScalarField =>\n f.kind === \"scalar\" &&\n !f.private &&\n f.selectableOn.read &&\n !f.vector &&\n !(f.authorization?.validate.length ?? 0),\n );\n const previousState =\n node.subscriptionOptions.previousState && previousFields.length > 0\n ? new GraphQLObjectType<Record<string, unknown>>({\n name: `${node.name}PreviousState`,\n fields: Object.fromEntries(\n previousFields.map((f) => [\n f.name,\n {\n type: scalarOutput(f),\n resolve: (src: Record<string, unknown>) =>\n src[f.property] ?? null,\n },\n ]),\n ),\n })\n : undefined;\n const event = new GraphQLObjectType<ChangeEvent>({\n name: `${node.name}ChangeEvent`,\n fields: {\n operation: { type: nonNull(changeOperation) },\n timestamp: {\n type: nonNull(GraphQLString),\n description: \"When the write was committed (ISO-8601).\",\n resolve: (src) => src.timestamp ?? new Date(0).toISOString(),\n },\n ...(node.subscriptionOptions.relationships\n ? {\n relationship: {\n type: changeRelationship,\n description: \"For CONNECT and DISCONNECT: the relationship.\",\n resolve: (src: ChangeEvent) => src.relationship ?? null,\n },\n }\n : {}),\n ...(previousState\n ? {\n previousState: {\n type: previousState,\n description: \"Stored values before an update or delete.\",\n resolve: (src: ChangeEvent) => src.previous ?? null,\n },\n }\n : {}),\n [node.key.name]: {\n type: nonNull(keyType),\n resolve: (src) => src.key,\n },\n node: {\n type: obj,\n description: `The ${node.name} as it is now; null once deleted.`,\n resolve: (src, _args, context, info) =>\n hooks.resolveChangedNode(node, src, info, context),\n },\n },\n });\n subscription[`${lowerFirst(node.name)}Changed`] = {\n type: nonNull(event),\n description: `${node.name} changes made through this API. Give ${node.key.name} to follow one node.`,\n args: {\n [node.key.name]: { type: keyType },\n operations: { type: listOf(nonNull(changeOperation)) },\n where: {\n type: whereOf(node.name),\n description:\n \"Only nodes matching this, as they are after the write. Deletions are then not sent.\",\n },\n },\n subscribe: (_src, args, context) =>\n hooks.subscribe(node, args as Record<string, unknown>, context),\n resolve: (payload: unknown) => payload,\n };\n }\n\n if (Object.keys(query).length === 0) {\n throw new ModelError([\n { message: \"no readable @node types: the Query type would be empty\" },\n ]);\n }\n\n return new GraphQLSchema({\n query: new GraphQLObjectType({ name: \"Query\", fields: query }),\n subscription:\n Object.keys(subscription).length > 0\n ? new GraphQLObjectType({ name: \"Subscription\", fields: subscription })\n : undefined,\n mutation:\n Object.keys(mutation).length > 0\n ? new GraphQLObjectType({ name: \"Mutation\", fields: mutation })\n : undefined,\n types: [\n ...objects.values(),\n ...abstractTypes.values(),\n ...plainObjects.values(),\n ],\n });\n}\n","import {\n execute as graphqlExecute,\n getVariableValues,\n GraphQLError,\n Kind,\n lexicographicSortSchema,\n parse,\n printSchema,\n specifiedRules,\n validate,\n type DocumentNode,\n type ExecutionResult,\n type FieldNode,\n type FragmentDefinitionNode,\n type GraphQLObjectType,\n type GraphQLResolveInfo,\n type GraphQLSchema,\n type OperationDefinitionNode,\n type GraphQLFieldResolver,\n type GraphQLScalarType,\n type ValidationRule,\n} from \"graphql\";\nimport {\n checkCypherFields,\n type CypherFinding,\n} from \"./analyze/cypher-check.js\";\nimport {\n inferRequirements,\n requirementDdl,\n type SchemaRequirement,\n} from \"./analyze/indexes.js\";\nimport { checkPlans, type PlanReport } from \"./analyze/plans.js\";\nimport { lintModel } from \"./analyze/lint.js\";\nimport { analyze, type Statistics } from \"./analyze/statistics.js\";\nimport { newContext, type CompileContext } from \"./compile/context.js\";\nimport {\n compileAbstractRoot,\n compileCypherRoot,\n compileRoot,\n compileSearch,\n type CompiledRead,\n type ReadSet,\n type RootKind,\n} from \"./compile/read.js\";\nimport { fieldArgs, type SelectionContext } from \"./compile/selection.js\";\nimport type { LoraDriver, QueryResult, Statement } from \"./driver.js\";\nimport { affects, type WriteChange } from \"./execute/changes.js\";\nimport { executeCypherMutation } from \"./execute/cypher-mutation.js\";\nimport { LoraTransaction } from \"./execute/transaction.js\";\nimport { EngineFeed } from \"./execute/feed.js\";\nimport type { MutationKind } from \"./schema/mutations.js\";\nimport {\n executeMutation,\n mapWriteError,\n type MutationEnv,\n type PopulatedByCallback,\n} from \"./execute/mutate.js\";\nimport { ModelError, requestError } from \"./errors.js\";\nimport {\n buildManifest,\n generateTypes,\n schemaHash,\n type OperationManifest,\n} from \"./codegen.js\";\nimport {\n envelopPlugin,\n nodeEnv,\n parseOptions,\n validationRules,\n type DocumentGuards,\n} from \"./guards.js\";\nimport { buildModel, type ModelOptions } from \"./model/build.js\";\nimport {\n Observer,\n type ObservabilityOptions,\n type StatementMeta,\n} from \"./observe.js\";\nimport type {\n CypherField,\n GraphModel,\n ModelWarning,\n NodeType,\n SearchIndex,\n} from \"./model/types.js\";\nimport { buildSchema, type ChangeEvent } from \"./schema/build.js\";\nimport {\n authFilter,\n authValidate,\n checkAuthentication,\n checkFieldAuthentication,\n} from \"./compile/auth.js\";\nimport { and, bin, printClauses, prop, v } from \"./compile/cypher.js\";\nimport { bind } from \"./compile/context.js\";\nimport { keyOf } from \"./compile/read.js\";\nimport { compileNodeWhere } from \"./compile/filter.js\";\nimport { lookupPath } from \"./compile/auth.js\";\nimport { fromGlobalId } from \"./schema/global-id.js\";\nimport { assertReadable } from \"./schema/guard.js\";\nimport { names } from \"./schema/names.js\";\n\nexport interface LoraGraphQLOptions extends ModelOptions, ObservabilityOptions {\n /** Annotated SDL: the graph model and the API in one document. */\n typeDefs: string | DocumentNode;\n driver: LoraDriver;\n /** Timeout for every statement, in milliseconds. Default 10 000; 0 disables. */\n timeoutMs?: number;\n /**\n * Reject a root field whose estimated rows touched exceed this, before\n * it runs. The estimate multiplies page sizes through nested lists,\n * capped by relationship degrees from `analyze()` or `@cardinality`.\n * Default 50 000; `Infinity` disables.\n */\n maxCost?: number;\n /**\n * The cost limit for one request, from its context (for example by\n * user or plan). Undefined falls back to `maxCost`.\n */\n budget?: (context: unknown) => number | undefined;\n /** Called with every root field's cost estimate, before it runs. */\n onCost?: (event: CostEvent) => void;\n /**\n * The request's verified claims, from the GraphQL context. Default:\n * `context.jwt`. The library never verifies tokens: do that in the\n * server and put the claims in the context.\n */\n jwt?: (context: unknown) => Record<string, unknown> | undefined;\n /**\n * Most nodes one mutation may create or delete, nested ones included.\n * Default 1000: larger imports belong in a Cypher load, not a GraphQL\n * request. Also the default `limit` of bulk updates and deletes.\n */\n maxBatch?: number;\n /**\n * Changes a `changes()` consumer or subscriber may fall behind before it\n * is ended with an error. Default 1000.\n */\n maxQueuedChanges?: number;\n /** Named callbacks for `@populatedBy(callback:)`. */\n callbacks?: Record<string, PopulatedByCallback>;\n /**\n * Implementations of custom scalars declared with `@storedAs`, e.g. one\n * that validates e-mail addresses. Without one a scalar passes through.\n */\n scalars?: Record<string, GraphQLScalarType>;\n /**\n * Feed subscriptions and `changes()` from the engine's committed change\n * feed (lora-node `db.changes()`): writes from every path and process,\n * in commit order. `onWrite` still reports this instance's mutations,\n * and `previousState` needs them. Default false.\n */\n changeFeed?: boolean;\n /**\n * Resolvers of `@customResolver` fields, by type and field name. The\n * source holds the node's selected fields plus the field's `requires`.\n */\n resolvers?: Record<\n string,\n Record<string, GraphQLFieldResolver<Record<string, unknown>, unknown>>\n >;\n /** Called with every statement before it runs; for logging and tests. */\n onStatement?: (event: StatementEvent) => void;\n /**\n * Hide database error details from clients: they get\n * `extensions.code` `DATABASE_ERROR` and an `id`, and `onError` gets the\n * engine's message. Default: on when `NODE_ENV` is `production`.\n */\n maskErrors?: boolean;\n /** Called with every database error, masked or not. */\n onError?: (event: DatabaseErrorEvent) => void;\n /**\n * Limits on the documents `execute()` and `persist()` accept: depth,\n * aliases, root fields, tokens, introspection. `false` turns them off.\n * For other servers use `validationRules()` or `envelopPlugin()`.\n */\n guards?: DocumentGuards | false;\n /**\n * Make `execute()` refuse `source` and run only persisted operations\n * by `id`. Default false.\n */\n persistedOnly?: boolean;\n}\n\nexport interface CostEvent {\n field: string;\n /** Estimated rows this root field touches. */\n cost: number;\n /** Estimated rows of the operation so far, this field included. */\n total: number;\n /** The limit that applies: `budget(context)` or `maxCost`. */\n limit: number;\n context: unknown;\n}\n\nexport interface DatabaseErrorEvent {\n /** Correlation id, also in the client error's `extensions.id`. */\n id: string;\n /** The root field that failed. */\n field: string;\n /** The engine's message, which may name labels, properties and Cypher. */\n message: string;\n /** The error as thrown by the driver. */\n error: unknown;\n}\n\nexport interface StatementEvent {\n field: string;\n statement: Statement;\n}\n\n/** Per-request options read from the GraphQL context, when present. */\nexport interface LoraGraphQLContext {\n /** Verified claims; enables @authentication and @authorization. */\n jwt?: Record<string, unknown>;\n /** Cancels the request's statements when aborted. */\n signal?: AbortSignal;\n /**\n * Run in this transaction (from `lora.begin()`) instead of one per\n * field: the caller commits, together with its own Cypher.\n */\n transaction?: LoraTransaction;\n}\n\nexport interface AssertSchemaOptions {\n /** Create what is missing instead of only reporting it. */\n create?: boolean;\n}\n\nexport interface SchemaAssertion {\n required: SchemaRequirement[];\n missing: SchemaRequirement[];\n created: SchemaRequirement[];\n}\n\nexport interface CheckOptions {\n /**\n * Flag statements whose largest engine row estimate (from graph\n * statistics) exceeds this. Off by default: estimates ignore a LIMIT\n * that stops an index-ordered scan early.\n */\n rowBudget?: number;\n /** Operations to compile and plan-check (S2), with example variables. */\n operations?: Array<{\n name?: string;\n document: string | DocumentNode;\n variables?: Record<string, unknown>;\n }>;\n}\n\nexport interface CheckReport {\n /** True when nothing below is a failure. */\n ok: boolean;\n /** Model warnings, e.g. an unused @cypher argument. */\n warnings: readonly ModelWarning[];\n /** @cypher statements the engine rejects or that write from a query. */\n cypher: CypherFinding[];\n /** Constraints and indexes the database lacks. */\n missing: SchemaRequirement[];\n /** Indexes the database has that no part of the API needs. */\n unused: Array<{\n name: string;\n type: string;\n labels: string[];\n properties: string[];\n }>;\n /** Schema lint: valid but costly or risky choices (not failures). */\n lint: readonly ModelWarning[];\n /** Plan findings per operation and root field. */\n plans: Array<{ operation: string; field: string; reports: PlanReport[] }>;\n /** Operations that failed to compile. */\n errors: Array<{ operation: string; message: string }>;\n}\n\nexport interface ExecuteArgs {\n /** The document, or `id` of a persisted operation. */\n source?: string;\n id?: string;\n variables?: Record<string, unknown>;\n operationName?: string;\n context?: unknown;\n}\n\nconst DOCUMENT_CACHE_SIZE = 500;\n/** Compiled root fields kept per field node, across variable values. */\nconst COMPILED_PER_FIELD = 16;\n\ninterface CompiledEntry {\n variables: string;\n claims: string;\n statistics: number;\n contextReads: Array<[string, unknown]>;\n compiled: CompiledRead;\n}\n\nexport class LoraGraphQL {\n readonly model: GraphModel;\n readonly #driver: LoraDriver;\n readonly #timeoutMs: number;\n readonly #maxCost: number;\n readonly #maxBatch: number;\n readonly #maxQueued: number;\n readonly #callbacks: Record<string, PopulatedByCallback>;\n readonly #resolvers: NonNullable<LoraGraphQLOptions[\"resolvers\"]>;\n readonly #scalars: LoraGraphQLOptions[\"scalars\"];\n /** Estimated cost spent per request context and operation. */\n readonly #spent = new WeakMap<object, Map<unknown, number>>();\n readonly #jwt: (context: unknown) => Record<string, unknown> | undefined;\n readonly #onStatement: LoraGraphQLOptions[\"onStatement\"];\n readonly #maskErrors: boolean;\n readonly #observer: Observer;\n readonly #budget: LoraGraphQLOptions[\"budget\"];\n readonly #onCost: LoraGraphQLOptions[\"onCost\"];\n /** Persisted operation ids by operation node, for statement events. */\n readonly #persistedIds = new WeakMap<OperationDefinitionNode, string>();\n readonly #guards: DocumentGuards | false;\n readonly #persistedOnly: boolean;\n readonly #onError: LoraGraphQLOptions[\"onError\"];\n readonly #listeners = new Set<(change: WriteChange) => void>();\n /** Consumers of `changes()` when the engine feed is on. */\n readonly #feedListeners = new Set<(change: WriteChange) => void>();\n readonly #feed: EngineFeed | undefined;\n #feedReady: Promise<void> | undefined;\n readonly #documents = new Map<string, DocumentNode>();\n readonly #persisted = new Map<string, DocumentNode>();\n #degrees = new Map<string, number>();\n /** Bumped when statistics change: they shape cost estimates. */\n #statisticsVersion = 0;\n /**\n * Compiled reads by root field node (documents are cached, so a field\n * node repeats across requests), then by variables, claims and the\n * `$context` values the compile read.\n */\n readonly #compiled = new WeakMap<FieldNode, CompiledEntry[]>();\n /**\n * Reads made for subscribers of one change, by statement text and\n * parameters: subscribers whose checks or node reads compile to the same\n * statement share one database call.\n */\n readonly #sharedReads = new WeakMap<\n object,\n Map<string, Promise<QueryResult[]>>\n >();\n #statistics: Statistics | undefined;\n #schema: GraphQLSchema | undefined;\n\n constructor(options: LoraGraphQLOptions) {\n this.model = buildModel(options.typeDefs, options);\n this.#driver = options.driver;\n this.#timeoutMs = options.timeoutMs ?? 10_000;\n this.#maxCost = options.maxCost ?? 50_000;\n this.#maxBatch = options.maxBatch ?? 1000;\n this.#maxQueued = options.maxQueuedChanges ?? 1000;\n this.#callbacks = options.callbacks ?? {};\n const missing = [...this.model.nodes.values()].flatMap((n) =>\n [...n.fields.values()].flatMap((f) =>\n f.kind === \"scalar\" &&\n f.populatedBy &&\n !(f.populatedBy.callback in this.#callbacks)\n ? [`${n.name}.${f.name}: no callback named ${f.populatedBy.callback}`]\n : [],\n ),\n );\n this.#resolvers = options.resolvers ?? {};\n this.#scalars = options.scalars;\n for (const n of this.model.nodes.values()) {\n for (const f of n.fields.values()) {\n if (f.kind === \"custom\" && !this.#resolvers[n.name]?.[f.name]) {\n missing.push(\n `${n.name}.${f.name}: @customResolver needs resolvers.${n.name}.${f.name}`,\n );\n }\n }\n }\n if (missing.length > 0) {\n throw new ModelError(missing.map((message) => ({ message })));\n }\n this.#jwt =\n options.jwt ??\n ((context) => (context as LoraGraphQLContext | undefined)?.jwt);\n this.#onStatement = options.onStatement;\n this.#maskErrors = options.maskErrors ?? nodeEnv() === \"production\";\n this.#onError = options.onError;\n this.#guards = options.guards ?? {};\n if (options.changeFeed) {\n if (!options.driver.changes) {\n throw new Error(\n \"changeFeed needs a driver with changes() (@loradb/lora-node)\",\n );\n }\n this.#feed = new EngineFeed(options.driver, this.model, (change) => {\n change.timestamp ??= new Date().toISOString();\n for (const l of this.#feedListeners) {\n try {\n l(change);\n } catch {\n // A consumer's failure must not stop the feed.\n }\n }\n });\n }\n this.#observer = new Observer(options);\n this.#budget = options.budget;\n this.#onCost = options.onCost;\n this.#persistedOnly = options.persistedOnly ?? false;\n }\n\n /** The configured document guards as validation rules. */\n validationRules(): ValidationRule[] {\n return this.#guards === false ? [] : validationRules(this.#guards);\n }\n\n /** The configured document guards as an Envelop / Yoga plugin. */\n envelopPlugin(): ReturnType<typeof envelopPlugin> {\n return envelopPlugin(\n this.#guards === false\n ? {\n maxDepth: Infinity,\n maxAliases: Infinity,\n maxRootFields: Infinity,\n maxTokens: Infinity,\n introspection: true,\n }\n : this.#guards,\n );\n }\n\n #parse(source: string): DocumentNode {\n return parse(\n source,\n this.#guards === false ? undefined : parseOptions(this.#guards),\n );\n }\n\n #validate(document: DocumentNode): readonly GraphQLError[] {\n return validate(this.getSchema(), document, [\n ...specifiedRules,\n ...this.validationRules(),\n ]);\n }\n\n /** The executable schema, for any graphql-js server. */\n getSchema(): GraphQLSchema {\n const span = <T>(info: GraphQLResolveInfo, fn: () => Promise<T>) =>\n this.#observer.field(\n {\n field: info.fieldName,\n operationName: info.operation.name?.value,\n },\n fn,\n );\n if (this.#schema) return this.#schema;\n const schema = buildSchema(this.model, {\n scalars: this.#scalars,\n customResolver: (node, field) => this.#resolvers[node.name]![field.name]!,\n subscribe: (node, args, context) => this.#subscribe(node, args, context),\n resolveChangedNode: (node, event, info, context) =>\n event.operation === \"DELETE\"\n ? Promise.resolve(null)\n : span(info, () =>\n this.#resolveByKey(\n node,\n event.key,\n info,\n context,\n (event as { [CHANGE]?: WriteChange })[CHANGE],\n ),\n ),\n resolveAbstract: (abstract, info, context) =>\n span(info, () => {\n const compiled = this.#cachedCompile(info, context, (ctx) =>\n compileAbstractRoot(\n ctx,\n abstract,\n this.#args(ctx, info.parentType, info.fieldNodes),\n info.fieldNodes,\n ),\n );\n return this.#run(info.fieldName, compiled, context, info);\n }),\n resolveSearch: (node, index, info, context, connection) =>\n span(info, () =>\n this.#resolveSearch(node, index, info, context, connection),\n ),\n resolveRoot: (kind, node, info, context) =>\n span(info, () => this.#resolveRoot(kind, node, info, context)),\n resolveNode: (id, info, context) =>\n span(info, () => this.#resolveNode(id, info, context)),\n resolveCypher: (field, info, context) =>\n span(info, () => this.#resolveCypher(field, info, context)),\n resolveMutation: (op, node, info, context) =>\n span(info, () => this.#resolveMutation(op, node, info, context)),\n });\n checkCustomRequires(this.model, schema);\n this.#schema = schema;\n return schema;\n }\n\n /** The client-facing SDL: generated types only, no model directives. */\n printPublicSchema(): string {\n return printSchema(lexicographicSortSchema(this.getSchema()));\n }\n\n /** Constraints and indexes the API needs (S1), with the reason for each. */\n requirements(): SchemaRequirement[] {\n return inferRequirements(this.model);\n }\n\n /**\n * Verify the database has every constraint and index the API needs;\n * with `create`, add what is missing. Idempotent. Runs one DDL\n * statement at a time: LoraDB rejects schema commands in transactions.\n */\n async assertSchema(\n options: AssertSchemaOptions = {},\n ): Promise<SchemaAssertion> {\n const required = this.requirements();\n const [indexes, constraints] = await this.#driver.run(\n [\n { text: \"SHOW INDEXES\", params: {} },\n { text: \"SHOW CONSTRAINTS\", params: {} },\n ],\n { mode: \"read\", timeoutMs: this.#timeoutMs },\n );\n const present = (r: SchemaRequirement) => {\n if (r.kind === \"fulltext\" || r.kind === \"vector\") {\n const type = r.kind === \"fulltext\" ? \"FULLTEXT\" : \"VECTOR\";\n return indexes!.rows.some(\n (row) => row[\"name\"] === r.name && row[\"type\"] === type,\n );\n }\n if (r.kind === \"constraint\") {\n const wanted = {\n NODE_KEY: [\"NODE_KEY\"],\n UNIQUE: [\"NODE_KEY\", \"NODE_PROPERTY_UNIQUENESS\"],\n NOT_NULL: [\"NODE_KEY\", \"NODE_PROPERTY_EXISTENCE\"],\n }[r.constraint];\n return constraints!.rows.some(\n (row) =>\n wanted.includes(String(row[\"type\"])) &&\n sameTarget(row, r.label, r.property),\n );\n }\n return indexes!.rows.some(\n (row) =>\n row[\"type\"] === r.index && sameTarget(row, r.label, r.property),\n );\n };\n const missing = required.filter((r) => !present(r));\n const created: SchemaRequirement[] = [];\n if (options.create) {\n for (const r of missing) {\n await this.#driver.run([{ text: requirementDdl(r), params: {} }], {\n mode: \"write\",\n timeoutMs: this.#timeoutMs,\n });\n created.push(r);\n }\n }\n return {\n required,\n missing: options.create ? [] : missing,\n created,\n };\n }\n\n // -------------------------------------------------------------------------\n // Analysis\n // -------------------------------------------------------------------------\n\n /**\n * Sample node counts and relationship degrees (S6). Cost estimates then\n * use each relationship's p99 degree instead of its page limit.\n */\n async analyze(options: { sample?: number } = {}): Promise<Statistics> {\n const stats = await analyze(this.#driver, this.model, {\n ...options,\n timeoutMs: this.#timeoutMs,\n });\n this.useStatistics(stats);\n return stats;\n }\n\n /** Use statistics gathered earlier, e.g. by the CLI. */\n useStatistics(stats: Statistics): void {\n this.#statistics = stats;\n this.#degrees = new Map(\n Object.entries(stats.degrees).map(([k, d]) => [k, d.p99]),\n );\n this.#statisticsVersion++;\n }\n\n get statistics(): Statistics | undefined {\n return this.#statistics;\n }\n\n /**\n * The CI gate: @cypher statements plan, the database has what the API\n * needs, and each operation's statements seek where they should.\n */\n async check(options: CheckOptions = {}): Promise<CheckReport> {\n const report: CheckReport = {\n ok: true,\n warnings: this.model.warnings,\n cypher: await checkCypherFields(this.#driver, this.model),\n missing: (await this.assertSchema()).missing,\n unused: await this.#unusedIndexes(),\n lint: lintModel(this.model, { statistics: !!this.#statistics }),\n plans: [],\n errors: [],\n };\n for (const [i, op] of (options.operations ?? []).entries()) {\n const operation = op.name ?? `operation ${i + 1}`;\n try {\n const fields = await this.explain(op.document, op.variables ?? {}, {\n rowBudget: options.rowBudget,\n });\n for (const f of fields) report.plans.push({ operation, ...f });\n } catch (err) {\n report.errors.push({\n operation,\n message: err instanceof Error ? err.message : String(err),\n });\n }\n }\n report.ok =\n report.cypher.length === 0 &&\n report.missing.length === 0 &&\n report.errors.length === 0 &&\n report.plans.every((p) =>\n p.reports.every((r) => r.findings.length === 0),\n );\n return report;\n }\n\n /** Indexes in the database that no requirement of the API matches. */\n async #unusedIndexes(): Promise<CheckReport[\"unused\"]> {\n const [indexes] = await this.#driver.run(\n [{ text: \"SHOW INDEXES\", params: {} }],\n { mode: \"read\", timeoutMs: this.#timeoutMs },\n );\n const required = this.requirements();\n return indexes!.rows\n .filter((row) => row[\"type\"] !== \"LOOKUP\" && !row[\"owningConstraint\"])\n .filter(\n (row) =>\n !required.some((r) =>\n r.kind === \"fulltext\" || r.kind === \"vector\"\n ? r.name === row[\"name\"]\n : r.kind === \"index\" &&\n r.index === row[\"type\"] &&\n sameTarget(row, r.label, r.property),\n ),\n )\n .map((row) => ({\n name: String(row[\"name\"]),\n type: String(row[\"type\"]),\n labels: (row[\"labelsOrTypes\"] as string[] | null) ?? [],\n properties: (row[\"properties\"] as string[] | null) ?? [],\n }));\n }\n\n /**\n * Compile a query without running it: one entry per root field, with its\n * statements, parameters, read-set, cost and expected access path.\n */\n compile(\n document: string | DocumentNode,\n variables: Record<string, unknown> = {},\n options: { operationName?: string; context?: unknown } = {},\n ): Array<{ field: string; compiled: CompiledRead }> {\n const schema = this.getSchema();\n const doc = typeof document === \"string\" ? parse(document) : document;\n const invalid = validate(schema, doc);\n if (invalid.length > 0) throw invalid[0]!;\n const operation = findOperation(doc, options.operationName);\n if (operation.operation !== \"query\") {\n throw new GraphQLError(\"compile() and explain() take queries\");\n }\n const coerced = getVariableValues(\n schema,\n operation.variableDefinitions ?? [],\n variables,\n );\n if (coerced.errors) throw coerced.errors[0]!;\n const fragments: Record<string, FragmentDefinitionNode> = {};\n for (const def of doc.definitions) {\n if (def.kind === Kind.FRAGMENT_DEFINITION)\n fragments[def.name.value] = def;\n }\n const base: SelectionContext = {\n schema,\n fragments,\n variables: coerced.coerced,\n };\n const queryType = schema.getQueryType()!;\n const out: Array<{ field: string; compiled: CompiledRead }> = [];\n for (const sel of operation.selectionSet.selections) {\n if (sel.kind !== Kind.FIELD || sel.name.value.startsWith(\"__\")) continue;\n const def = queryType.getFields()[sel.name.value];\n if (!def) continue;\n const ctx = this.#context(base, options.context);\n const args = fieldArgs(ctx, def, sel);\n const cypher = this.model.queries.find((q) => q.name === sel.name.value);\n const root = this.#rootOf(sel.name.value);\n const search = this.#searchOf(sel.name.value);\n let compiled: CompiledRead | undefined;\n const abstract = [...this.model.abstracts.values()].find(\n (x) => x.read && x.plural === sel.name.value,\n );\n if (cypher) compiled = compileCypherRoot(ctx, cypher, args, [sel]);\n else if (abstract) {\n compiled = compileAbstractRoot(ctx, abstract, args, [sel]);\n } else if (search) {\n compiled = compileSearch(\n ctx,\n search.node,\n search.index,\n args,\n [sel],\n search.connection,\n );\n } else if (root) {\n compiled = compileRoot(ctx, root.kind, root.node, args, [sel]);\n }\n if (compiled) {\n out.push({ field: sel.alias?.value ?? sel.name.value, compiled });\n }\n }\n return out;\n }\n\n /** Compile a query and check every statement's plan (S2). */\n async explain(\n document: string | DocumentNode,\n variables: Record<string, unknown> = {},\n options: {\n operationName?: string;\n context?: unknown;\n rowBudget?: number | undefined;\n } = {},\n ): Promise<Array<{ field: string; reports: PlanReport[] }>> {\n const out: Array<{ field: string; reports: PlanReport[] }> = [];\n for (const { field, compiled } of this.compile(\n document,\n variables,\n options,\n )) {\n out.push({\n field,\n reports: await checkPlans(this.#driver, compiled, {\n ...(options.rowBudget !== undefined\n ? { rowBudget: options.rowBudget }\n : {}),\n }),\n });\n }\n return out;\n }\n\n // -------------------------------------------------------------------------\n // Execution helpers\n // -------------------------------------------------------------------------\n\n /**\n * Register persisted operations by id. Every document is parsed and\n * validated now, so a broken one fails at startup; at request time an\n * id is looked up and executed without parsing or validating.\n */\n persist(operations: Record<string, string>): void {\n const problems: string[] = [];\n for (const [id, source] of Object.entries(operations)) {\n try {\n const doc = this.#parse(source);\n const errors = this.#validate(doc);\n if (errors.length > 0) {\n problems.push(`${id}: ${errors.map((e) => e.message).join(\"; \")}`);\n } else {\n this.#persisted.set(id, doc);\n for (const def of doc.definitions) {\n if (def.kind === Kind.OPERATION_DEFINITION) {\n this.#persistedIds.set(def, id);\n }\n }\n }\n } catch (err) {\n problems.push(\n `${id}: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n if (problems.length > 0) {\n throw new Error(\n `invalid persisted operations:\\n ${problems.join(\"\\n \")}`,\n );\n }\n }\n\n /**\n * Validate persisted operations (id → source) into a manifest for\n * `loadManifest()`, built once at build time (`lora-graphql compile`).\n */\n buildManifest(operations: Record<string, string>): OperationManifest {\n return buildManifest(this.getSchema(), operations, this.validationRules());\n }\n\n /** TypeScript types for a manifest's variables and results. */\n generateTypes(manifest: OperationManifest): string {\n return generateTypes(this.getSchema(), manifest, this.model.scalars);\n }\n\n /**\n * Register a manifest's operations as persisted operations, without\n * parsing or validating them again. Refused when the manifest was built\n * for another schema.\n */\n loadManifest(manifest: OperationManifest): void {\n const hash = schemaHash(this.getSchema());\n if (manifest.schemaHash !== hash) {\n throw new Error(\n \"the manifest was built for a different schema; run lora-graphql compile again\",\n );\n }\n for (const [id, entry] of Object.entries(manifest.operations)) {\n this.#persisted.set(id, entry.document);\n for (const def of entry.document.definitions) {\n if (def.kind === Kind.OPERATION_DEFINITION) {\n this.#persistedIds.set(def, id);\n }\n }\n }\n }\n\n /**\n * Execute an operation against the schema. Parsed and validated\n * documents are cached by source text; persisted ones by id.\n */\n async execute(args: ExecuteArgs): Promise<ExecutionResult> {\n let document: DocumentNode | undefined;\n if (args.id !== undefined) {\n document = this.#persisted.get(args.id);\n if (!document) {\n return {\n errors: [new GraphQLError(`unknown persisted operation ${args.id}`)],\n };\n }\n } else if (args.source !== undefined) {\n if (this.#persistedOnly) {\n return {\n errors: [\n new GraphQLError(\"only persisted operations are accepted\", {\n extensions: { code: \"PERSISTED_QUERY_ONLY\" },\n }),\n ],\n };\n }\n document = this.#documents.get(args.source);\n if (!document) {\n try {\n document = this.#parse(args.source);\n } catch (err) {\n return { errors: [err as GraphQLError] };\n }\n const errors = this.#validate(document);\n if (errors.length > 0) return { errors };\n if (this.#documents.size >= DOCUMENT_CACHE_SIZE) {\n this.#documents.delete(this.#documents.keys().next().value!);\n }\n this.#documents.set(args.source, document);\n }\n } else {\n return {\n errors: [new GraphQLError(\"execute() needs a source or an id\")],\n };\n }\n const contextValue = args.context ?? {};\n const result = await graphqlExecute({\n schema: this.getSchema(),\n document,\n variableValues: args.variables,\n operationName: args.operationName,\n contextValue,\n });\n // The operation's cost estimate, so clients can tune their queries.\n const spent =\n contextValue !== null && typeof contextValue === \"object\"\n ? this.#spent.get(contextValue)\n : undefined;\n if (spent && spent.size > 0) {\n const cost = [...spent.values()].reduce((a, b) => a + b, 0);\n return {\n ...result,\n extensions: { ...result.extensions, cost: Math.ceil(cost) },\n };\n }\n return result;\n }\n\n // -------------------------------------------------------------------------\n // Change tracking (S5)\n // -------------------------------------------------------------------------\n\n /** Called after every committed mutation with its exact write-set. */\n onWrite(listener: (change: WriteChange) => void): () => void {\n this.#listeners.add(listener);\n return () => this.#listeners.delete(listener);\n }\n\n /**\n * Committed writes as an async iterator, e.g. for a subscription\n * resolver. Only writes made through this instance are seen.\n */\n changes(\n options: { signal?: AbortSignal; maxQueued?: number } = {},\n ): AsyncIterableIterator<WriteChange> {\n const limit = options.maxQueued ?? this.#maxQueued;\n const queue: WriteChange[] = [];\n let wake: (() => void) | undefined;\n let done = false;\n let overflow = false;\n const listener = (change: WriteChange) => {\n // A consumer that falls this far behind is ended with an error,\n // instead of holding every write in memory.\n if (queue.length >= limit) {\n overflow = true;\n stop();\n } else {\n queue.push(change);\n }\n wake?.();\n };\n let stop: () => void;\n let ready: Promise<void> | undefined;\n if (this.#feed) {\n this.#feedListeners.add(listener);\n stop = () => this.#feedListeners.delete(listener);\n this.#feedReady ??= this.#feed.start();\n ready = this.#feedReady;\n } else {\n stop = this.onWrite(listener);\n }\n const finish = () => {\n done = true;\n stop();\n wake?.();\n };\n options.signal?.addEventListener(\"abort\", finish, { once: true });\n const iterator: AsyncIterableIterator<WriteChange> = {\n [Symbol.asyncIterator]: () => iterator,\n next: async () => {\n if (ready) await ready;\n while (queue.length === 0 && !done && !overflow) {\n await new Promise<void>((resolve) => (wake = resolve));\n wake = undefined;\n }\n if (queue.length > 0) return { value: queue.shift()!, done: false };\n if (overflow && !done) {\n done = true;\n throw requestError(\n \"LIMIT_EXCEEDED\",\n `the subscriber fell ${limit} changes behind; resubscribe and reload`,\n );\n }\n return { value: undefined, done: true };\n },\n return: async () => {\n finish();\n return { value: undefined, done: true };\n },\n };\n return iterator;\n }\n\n /** Whether a read with this read-set may observe the change. */\n affects(reads: ReadSet, change: WriteChange): boolean {\n return affects(\n reads,\n change,\n (type) => this.model.nodes.get(type)?.labels ?? [],\n );\n }\n\n // -------------------------------------------------------------------------\n // Resolvers\n // -------------------------------------------------------------------------\n\n #rootOf(fieldName: string): { kind: RootKind; node: NodeType } | undefined {\n for (const node of this.model.nodes.values()) {\n if (!node.read) continue;\n if (fieldName === names.listRoot(node)) return { kind: \"list\", node };\n if (fieldName === names.connectionRoot(node))\n return { kind: \"connection\", node };\n if (fieldName === names.singleRoot(node)) return { kind: \"single\", node };\n if (node.aggregate && fieldName === names.aggregateRoot(node)) {\n return { kind: \"aggregate\", node };\n }\n if (node.aggregate && fieldName === names.groupedRoot(node)) {\n return { kind: \"grouped\", node };\n }\n }\n return undefined;\n }\n\n #searchOf(\n fieldName: string,\n ): { node: NodeType; index: SearchIndex; connection: boolean } | undefined {\n for (const node of this.model.nodes.values()) {\n if (!node.read) continue;\n for (const index of node.search) {\n if (index.queryName === fieldName) {\n return { node, index, connection: false };\n }\n if (`${index.queryName}Connection` === fieldName) {\n return { node, index, connection: true };\n }\n }\n }\n return undefined;\n }\n\n #context(base: SelectionContext, context: unknown): CompileContext {\n return newContext(base, this.model, {\n jwt: this.#jwt(context),\n degrees: this.#degrees,\n requestContext: context,\n });\n }\n\n /**\n * Charge `cost` to the operation: the limit holds per operation, so\n * aliasing a root field many times does not multiply it.\n */\n #charge(\n field: string,\n cost: number,\n context: unknown,\n info?: GraphQLResolveInfo,\n ) {\n let total = cost;\n if (info && context !== null && typeof context === \"object\") {\n const byOperation =\n this.#spent.get(context) ?? new Map<unknown, number>();\n total = (byOperation.get(info.operation) ?? 0) + cost;\n byOperation.set(info.operation, total);\n this.#spent.set(context, byOperation);\n }\n const limit = this.#budget?.(context) ?? this.#maxCost;\n try {\n this.#onCost?.({ field, cost, total, limit, context });\n } catch {\n // Observers must not fail the request.\n }\n if (total > limit) {\n throw requestError(\n \"COST_EXCEEDED\",\n `${field} would bring the operation to about ${Math.ceil(total)} rows touched; the limit is ${limit}. Ask for smaller pages or fewer nested lists.`,\n undefined,\n { cost: Math.ceil(total), maxCost: limit },\n );\n }\n }\n\n #args(\n ctx: CompileContext,\n parent: GraphQLObjectType,\n fieldNodes: readonly FieldNode[],\n ): Record<string, unknown> {\n const def = parent.getFields()[fieldNodes[0]!.name.value]!;\n return fieldArgs(ctx, def, fieldNodes[0]!);\n }\n\n /** `run` once per change for each distinct statement set. */\n #shared(\n change: object | undefined,\n statements: Statement[],\n run: () => Promise<QueryResult[]>,\n ): Promise<QueryResult[]> {\n const key = change ? stableKey(statements) : undefined;\n if (!change || key === undefined) return run();\n let reads = this.#sharedReads.get(change);\n if (!reads) {\n reads = new Map();\n this.#sharedReads.set(change, reads);\n }\n let pending = reads.get(key);\n if (!pending) {\n pending = run();\n reads.set(key, pending);\n }\n return pending;\n }\n\n async #run(\n field: string,\n compiled: CompiledRead,\n context: unknown,\n info?: GraphQLResolveInfo,\n change?: object,\n ): Promise<unknown> {\n this.#charge(field, compiled.cost, context, info);\n for (const statement of compiled.statements) {\n this.#onStatement?.({ field, statement });\n }\n const signal = (context as LoraGraphQLContext | undefined)?.signal;\n const owned = (context as LoraGraphQLContext | undefined)?.transaction;\n let results;\n try {\n results = await this.#observer.statements(\n this.#meta(field, compiled.mode, info, compiled.cost),\n compiled.statements,\n () =>\n owned\n ? runInOrder(owned, compiled.statements)\n : this.#shared(change, compiled.statements, () =>\n this.#driver.run(compiled.statements, {\n mode: compiled.mode,\n timeoutMs: this.#timeoutMs,\n signal,\n // Queries and object @cypher fields are checked read-only\n // when the model is built; writes never reach this path.\n verified: compiled.mode === \"read\",\n }),\n ),\n );\n } catch (err) {\n throw this.#databaseError(field, err);\n }\n return assertReadable(compiled.shape(results));\n }\n\n #meta(\n field: string,\n mode: \"read\" | \"write\",\n info: GraphQLResolveInfo | undefined,\n cost?: number,\n ): StatementMeta {\n return {\n field,\n mode,\n cost,\n operationName: info?.operation.name?.value,\n persistedId: info && this.#persistedIds.get(info.operation),\n };\n }\n\n /**\n * Compile a read root field, or reuse the compile of an earlier request\n * with the same field node, variables, claims and `$context` values.\n * Statement text depends on all of them (claims are folded in).\n */\n #cachedCompile(\n info: GraphQLResolveInfo,\n context: unknown,\n compile: (ctx: CompileContext) => CompiledRead,\n ): CompiledRead {\n const field = info.fieldNodes[0]!;\n const variables = stableKey(info.variableValues);\n const claims = stableKey(this.#jwt(context) ?? null);\n const ctx = this.#context(infoContext(info), context);\n if (variables === undefined || claims === undefined) return compile(ctx);\n const entries = this.#compiled.get(field) ?? [];\n const hit = entries.find(\n (e) =>\n e.variables === variables &&\n e.claims === claims &&\n e.statistics === this.#statisticsVersion &&\n e.contextReads.every(\n ([path, value]) =>\n stableKey(lookupPath(context, path)) === stableKey(value),\n ),\n );\n if (hit) return hit.compiled;\n const compiled = compile(ctx);\n entries.unshift({\n variables,\n claims,\n statistics: this.#statisticsVersion,\n contextReads: ctx.contextReads,\n compiled,\n });\n entries.length = Math.min(entries.length, COMPILED_PER_FIELD);\n this.#compiled.set(field, entries);\n return compiled;\n }\n\n #databaseError(field: string, err: unknown): unknown {\n let error: unknown;\n if (err instanceof GraphQLError) error = err;\n else {\n const mapped = mapWriteError(this.model, err);\n if (mapped !== err) error = mapped;\n else if ((err as { code?: string }).code === \"LORA_INVALID_VECTOR\") {\n error = requestError(\n \"BAD_USER_INPUT\",\n err instanceof Error ? err.message : String(err),\n err,\n );\n } else {\n error = requestError(\n \"DATABASE_ERROR\",\n err instanceof Error ? err.message : String(err),\n err,\n );\n }\n }\n if (!(error instanceof GraphQLError)) return error;\n if (error.extensions[\"code\"] === \"DATABASE_ERROR\") {\n const id = globalThis.crypto.randomUUID();\n try {\n this.#onError?.({\n id,\n field,\n message: error.message,\n error: error.originalError ?? err,\n });\n } catch {\n // A failing error hook must not replace the request's error.\n }\n return this.#maskErrors\n ? new GraphQLError(`database error (id ${id})`, {\n extensions: { code: \"DATABASE_ERROR\", id },\n })\n : new GraphQLError(error.message, {\n extensions: { ...error.extensions, id },\n originalError: error.originalError ?? undefined,\n });\n }\n // Errors the package wrote itself are safe to show; masked, they\n // lose the engine error they were mapped from.\n return this.#maskErrors && error.originalError\n ? new GraphQLError(error.message, { extensions: error.extensions })\n : error;\n }\n\n #resolveRoot(\n kind: RootKind,\n node: NodeType,\n info: GraphQLResolveInfo,\n context: unknown,\n ): Promise<unknown> {\n const compiled = this.#cachedCompile(info, context, (ctx) =>\n compileRoot(\n ctx,\n kind,\n node,\n this.#args(ctx, info.parentType, info.fieldNodes),\n info.fieldNodes,\n ),\n );\n return this.#run(info.fieldName, compiled, context, info);\n }\n\n /**\n * Events for one node type, from the exact write-sets of mutations made\n * through this instance. Nodes the subscriber may not read are skipped;\n * deletions of rule-protected types are only sent to subscribers that\n * follow that key (they cannot be checked after the fact).\n */\n #subscribe(\n node: NodeType,\n args: Record<string, unknown>,\n context: unknown,\n ): AsyncGenerator<ChangeEvent> {\n const base: SelectionContext = {\n schema: this.getSchema(),\n fragments: {},\n variables: {},\n };\n // Checked now, so an unauthenticated subscribe fails as a result\n // rather than as a broken stream.\n const ctx = this.#context(base, context);\n checkAuthentication(ctx, node, \"SUBSCRIBE\");\n checkAuthentication(ctx, node, \"READ\");\n // Rules the claims alone decide against fail here too.\n for (const op of [\"SUBSCRIBE\", \"READ\"] as const) {\n authFilter(ctx, node, \"n\", op);\n authValidate(ctx, node, \"n\", op, \"BEFORE\");\n }\n return this.#events(node, args, context, base);\n }\n\n async *#events(\n node: NodeType,\n args: Record<string, unknown>,\n context: unknown,\n base: SelectionContext,\n ): AsyncGenerator<ChangeEvent> {\n const key = args[node.key.name];\n const where = args[\"where\"] as Record<string, unknown> | null | undefined;\n const offered = new Set<string>(node.subscriptions);\n if (node.subscriptionOptions.relationships) {\n offered.add(\"CONNECT\");\n offered.add(\"DISCONNECT\");\n }\n const wanted = new Set(\n ((args[\"operations\"] as string[] | null) ?? [...offered]).filter((op) =>\n offered.has(op),\n ),\n );\n const ruled = (r: { operations: ReadonlySet<string> }) =>\n r.operations.has(\"READ\") || r.operations.has(\"SUBSCRIBE\");\n const guarded =\n !!node.authorization?.filter.some(ruled) ||\n !!node.authorization?.validate.some(ruled);\n // Whether events must be checked in the database: read rules, or a\n // `where` (on the node as it is after the write).\n const check = guarded || (where != null && Object.keys(where).length > 0);\n const signal = (context as LoraGraphQLContext | undefined)?.signal;\n for await (const change of this.changes(signal ? { signal } : {})) {\n const events = changeEvents(change, node).filter(\n (e) =>\n wanted.has(e.operation) &&\n (key == null || keyOf(e.key) === keyOf(key)),\n );\n if (events.length === 0) continue;\n // A deleted node cannot be checked: its deletion reaches only\n // subscribers that follow its key, and only unfiltered ones.\n const deletions = events.filter(\n (e) => e.operation === \"DELETE\" && (!check || (key != null && !where)),\n );\n const live = events.filter((e) => e.operation !== \"DELETE\");\n const visible = check\n ? await this.#visible(\n node,\n live.map((e) => e.key),\n where,\n base,\n context,\n change,\n )\n : undefined;\n for (const event of [...live, ...deletions]) {\n if (\n event.operation !== \"DELETE\" &&\n visible &&\n !visible.has(keyOf(event.key))\n ) {\n continue;\n }\n yield event;\n }\n }\n }\n\n /** Which of `keys` the subscriber may read (and `where` matches), in one query. */\n async #visible(\n node: NodeType,\n keys: unknown[],\n where: Record<string, unknown> | null | undefined,\n base: SelectionContext,\n context: unknown,\n change?: object,\n ): Promise<Set<string>> {\n if (keys.length === 0) return new Set();\n const ctx = this.#context(base, context);\n const text = printClauses([\n { kind: \"unwind\", expr: bind(ctx, keys), alias: \"k\" },\n {\n kind: \"match\",\n pattern: {\n start: { variable: \"n\", labels: [node.labels[0]!] },\n hops: [],\n },\n where: and(\n bin(\"=\", prop(v(\"n\"), node.key.property), v(\"k\")),\n compileNodeWhere(ctx, node, \"n\", where),\n authFilter(ctx, node, \"n\", \"READ\"),\n authValidate(ctx, node, \"n\", \"READ\", \"BEFORE\"),\n authFilter(ctx, node, \"n\", \"SUBSCRIBE\"),\n authValidate(ctx, node, \"n\", \"SUBSCRIBE\", \"BEFORE\"),\n ),\n },\n {\n kind: \"return\",\n items: [{ expr: prop(v(\"n\"), node.key.property), alias: \"key\" }],\n },\n ]);\n const statements = [{ text, params: ctx.params }];\n const [result] = await this.#shared(change, statements, () =>\n this.#driver.run(statements, {\n mode: \"read\",\n timeoutMs: this.#timeoutMs,\n verified: true,\n }),\n );\n return new Set(result!.rows.map((r) => keyOf(r[\"key\"])));\n }\n\n #resolveByKey(\n node: NodeType,\n key: unknown,\n info: GraphQLResolveInfo,\n context: unknown,\n change?: object,\n ): Promise<unknown> {\n const ctx = this.#context(infoContext(info), context);\n const compiled = compileRoot(\n ctx,\n \"single\",\n node,\n { [node.key.name]: key },\n info.fieldNodes,\n );\n return this.#run(info.fieldName, compiled, context, info, change);\n }\n\n #resolveSearch(\n node: NodeType,\n index: SearchIndex,\n info: GraphQLResolveInfo,\n context: unknown,\n connection = false,\n ): Promise<unknown> {\n const compiled = this.#cachedCompile(info, context, (ctx) =>\n compileSearch(\n ctx,\n node,\n index,\n this.#args(ctx, info.parentType, info.fieldNodes),\n info.fieldNodes,\n connection,\n ),\n );\n return this.#run(info.fieldName, compiled, context, info);\n }\n\n async #resolveNode(\n id: string,\n info: GraphQLResolveInfo,\n context: unknown,\n ): Promise<unknown> {\n const decoded = fromGlobalId(id);\n const node = decoded && this.model.nodes.get(decoded.type);\n if (!decoded || !node || !node.key.relayId || !node.read) return null;\n let key: unknown = decoded.key;\n if (node.key.type === \"BigInt\" && typeof key === \"string\") {\n const n = BigInt(key);\n key = Number.isSafeInteger(Number(n)) ? Number(n) : n;\n }\n const ctx = this.#context(infoContext(info), context);\n const compiled = compileRoot(\n ctx,\n \"single\",\n node,\n { [node.key.name]: key },\n info.fieldNodes,\n );\n const value = (await this.#run(\n info.fieldName,\n compiled,\n context,\n )) as Record<string, unknown> | null;\n return value && { ...value, __typename: node.name };\n }\n\n async #resolveCypher(\n field: CypherField,\n info: GraphQLResolveInfo,\n context: unknown,\n ): Promise<unknown> {\n const ctx = this.#context(infoContext(info), context);\n // A root query reads; a root mutation's operations are its own, so\n // any listed operation guards it.\n const op =\n field.owner === \"Mutation\"\n ? [...(field.authentication ?? [])][0]\n : (\"READ\" as const);\n if (op) checkFieldAuthentication(ctx, field.owner, field, op);\n const args = this.#args(ctx, info.parentType, info.fieldNodes);\n if (field.owner !== \"Mutation\") {\n const compiled = this.#cachedCompile(info, context, (c) =>\n compileCypherRoot(\n c,\n field,\n this.#args(c, info.parentType, info.fieldNodes),\n info.fieldNodes,\n ),\n );\n return this.#run(info.fieldName, compiled, context, info);\n }\n let value: unknown;\n try {\n value = await executeCypherMutation(\n this.#mutationEnv(info, context, ctx.jwt),\n field,\n args,\n info.fieldNodes,\n );\n } catch (err) {\n throw this.#databaseError(info.fieldName, err);\n }\n // A hand-written write has no known write-set: report it broadly.\n this.#emit({\n operation: \"CYPHER\",\n field: field.name,\n created: [],\n updated: [],\n deleted: [],\n connected: [],\n disconnected: [],\n entities: [],\n types: [],\n relationshipTypes: [],\n broad: true,\n });\n return value;\n }\n\n async #resolveMutation(\n op: MutationKind,\n node: NodeType,\n info: GraphQLResolveInfo,\n context: unknown,\n ): Promise<unknown> {\n const ctx = this.#context(infoContext(info), context);\n const args = this.#args(ctx, info.parentType, info.fieldNodes);\n try {\n const { payload, change } = await executeMutation(\n this.#mutationEnv(info, context, ctx.jwt),\n op,\n node,\n args,\n info.fieldNodes,\n info.fieldName,\n );\n const owned = (context as LoraGraphQLContext | undefined)?.transaction;\n if (owned) owned.record(change);\n else this.#emit(change);\n return payload;\n } catch (err) {\n throw this.#databaseError(info.fieldName, err);\n }\n }\n\n #mutationEnv(\n info: GraphQLResolveInfo,\n context: unknown,\n jwt: Record<string, unknown> | undefined,\n ): MutationEnv {\n return {\n model: this.model,\n driver: this.#driver,\n selection: infoContext(info),\n jwt,\n timeoutMs: this.#timeoutMs,\n signal: (context as LoraGraphQLContext | undefined)?.signal,\n degrees: this.#degrees,\n maxBatch: this.#maxBatch,\n requestContext: context,\n callbacks: this.#callbacks,\n transaction: (context as LoraGraphQLContext | undefined)?.transaction\n ?.driverTransaction,\n onStatement: (statement) =>\n this.#onStatement?.({ field: info.fieldName, statement }),\n observe: this.#observer.active\n ? (statement, run) =>\n this.#observer.statements(\n this.#meta(info.fieldName, \"write\", info),\n [statement],\n run,\n )\n : undefined,\n };\n }\n\n /**\n * Open a transaction the caller owns. Put it in the GraphQL context as\n * `transaction`: every operation of those requests runs in it, next to\n * the application's own `tx.execute(cypher)`. Nothing is visible to\n * others, and no change event fires, until `tx.commit()`.\n */\n async begin(): Promise<LoraTransaction> {\n if (!this.#driver.begin) {\n throw new Error(\"transactions need @loradb/lora-node\");\n }\n const tx = await this.#driver.begin({\n mode: \"write\",\n timeoutMs: this.#timeoutMs,\n });\n return new LoraTransaction(tx, (change) => this.#emit(change));\n }\n\n /** Stop the engine change feed (with `changeFeed: true`). */\n close(): void {\n this.#feed?.stop();\n this.#feedReady = undefined;\n }\n\n #emit(change: WriteChange): void {\n change.timestamp ??= new Date().toISOString();\n for (const listener of this.#listeners) {\n try {\n listener(change);\n } catch {\n // A listener's failure must not fail a committed write.\n }\n }\n }\n}\n\n/** The write an event came from, for reads shared across its subscribers. */\nconst CHANGE = Symbol(\"change\");\n\n/** A write's events for one node type, one per node, most specific first. */\nfunction changeEvents(change: WriteChange, node: NodeType): ChangeEvent[] {\n const out = new Map<string, ChangeEvent>();\n const previous = new Map<string, Record<string, unknown>>();\n for (const b of change.before ?? []) {\n if (b.type === node.name) previous.set(keyOf(b.key), b.properties);\n }\n const make = (\n operation: ChangeEvent[\"operation\"],\n key: unknown,\n extra: Partial<ChangeEvent> = {},\n ): ChangeEvent => {\n const event: ChangeEvent = {\n operation,\n key,\n timestamp: change.timestamp,\n ...extra,\n };\n if (operation === \"UPDATE\" || operation === \"DELETE\") {\n event.previous = previous.get(keyOf(key));\n }\n Object.defineProperty(event, CHANGE, { value: change });\n return event;\n };\n const add = (operation: ChangeEvent[\"operation\"], key: unknown) => {\n const id = keyOf(key);\n if (!out.has(id)) out.set(id, make(operation, key));\n };\n for (const e of change.deleted)\n if (e.type === node.name) add(\"DELETE\", e.key);\n for (const e of change.created)\n if (e.type === node.name) add(\"CREATE\", e.key);\n // Updated nodes, and nodes that gained or lost a relationship.\n for (const e of change.entities)\n if (e.type === node.name) add(\"UPDATE\", e.key);\n const events = [...out.values()];\n if (node.subscriptionOptions.relationships) {\n for (const [operation, refs] of [\n [\"CONNECT\", change.connected],\n [\"DISCONNECT\", change.disconnected],\n ] as const) {\n for (const r of refs) {\n for (const [self, other] of [\n [r.from, r.to],\n [r.to, r.from],\n ] as const) {\n if (self.type !== node.name) continue;\n events.push(\n make(operation, self.key, {\n relationship: {\n field: r.field,\n type: r.type,\n relatedType: other.type,\n relatedKey: other.key,\n },\n }),\n );\n }\n }\n }\n }\n return events;\n}\n\nasync function runInOrder(\n tx: LoraTransaction,\n statements: Statement[],\n): Promise<QueryResult[]> {\n const out: QueryResult[] = [];\n for (const s of statements) out.push(await tx.driverTransaction.execute(s));\n return out;\n}\n\nfunction infoContext(info: GraphQLResolveInfo): SelectionContext {\n return {\n schema: info.schema,\n fragments: info.fragments,\n variables: info.variableValues,\n };\n}\n\nfunction findOperation(\n doc: DocumentNode,\n operationName: string | undefined,\n): OperationDefinitionNode {\n const ops = doc.definitions.filter(\n (d): d is OperationDefinitionNode => d.kind === Kind.OPERATION_DEFINITION,\n );\n const op = operationName\n ? ops.find((o) => o.name?.value === operationName)\n : ops.length === 1\n ? ops[0]\n : undefined;\n if (!op) {\n throw new GraphQLError(\n operationName\n ? `unknown operation ${operationName}`\n : \"the document must contain exactly one operation, or name one\",\n );\n }\n return op;\n}\n\n/**\n * Every `@customResolver(requires:)` is a valid selection on its type and\n * does not require custom fields (they are computed after the read).\n */\nfunction checkCustomRequires(model: GraphModel, schema: GraphQLSchema): void {\n const problems: Array<{ type: string; field: string; message: string }> = [];\n for (const node of model.nodes.values()) {\n for (const f of node.fields.values()) {\n if (f.kind !== \"custom\" || !f.requires) continue;\n let doc: DocumentNode;\n try {\n doc = parse(`fragment R on ${node.name} { ${f.requires} }`);\n } catch (err) {\n problems.push({\n type: node.name,\n field: f.name,\n message: `requires: ${(err as Error).message}`,\n });\n continue;\n }\n const errors = validate(\n schema,\n doc,\n specifiedRules.filter((r) => r.name !== \"NoUnusedFragmentsRule\"),\n );\n for (const e of errors) {\n problems.push({\n type: node.name,\n field: f.name,\n message: `requires: ${e.message}`,\n });\n }\n for (const name of requiredCustomFields(node, f.requires)) {\n problems.push({\n type: node.name,\n field: f.name,\n message: `requires: ${name} is a @customResolver field`,\n });\n }\n }\n }\n if (problems.length > 0) throw new ModelError(problems);\n}\n\nfunction requiredCustomFields(node: NodeType, requires: string): string[] {\n const doc = parse(`{ ${requires} }`);\n const op = doc.definitions[0] as OperationDefinitionNode;\n return op.selectionSet.selections.flatMap((s) =>\n s.kind === Kind.FIELD && node.fields.get(s.name.value)?.kind === \"custom\"\n ? [s.name.value]\n : [],\n );\n}\n\n/**\n * A deterministic key for JSON-like values (object keys sorted, bigints\n * tagged); undefined when the value cannot be keyed (functions, cycles,\n * class instances), which turns caching off for that request.\n */\nfunction stableKey(value: unknown): string | undefined {\n const seen = new Set<unknown>();\n let ok = true;\n const walk = (v: unknown): unknown => {\n if (typeof v === \"bigint\") return { $bigint: v.toString() };\n if (typeof v === \"function\" || typeof v === \"symbol\") {\n ok = false;\n return null;\n }\n if (v === null || typeof v !== \"object\") return v;\n if (seen.has(v)) {\n ok = false;\n return null;\n }\n seen.add(v);\n if (Array.isArray(v)) return v.map(walk);\n const proto = Object.getPrototypeOf(v);\n if (proto !== Object.prototype && proto !== null) {\n ok = false;\n return null;\n }\n const out: Record<string, unknown> = {};\n for (const k of Object.keys(v).sort()) {\n out[k] = walk((v as Record<string, unknown>)[k]);\n }\n return out;\n };\n const json = JSON.stringify(walk(value));\n return ok ? (json ?? \"undefined\") : undefined;\n}\n\nfunction sameTarget(\n row: Record<string, unknown>,\n label: string,\n property: string,\n): boolean {\n const labels = row[\"labelsOrTypes\"] as string[] | null;\n const props = row[\"properties\"] as string[] | null;\n return (\n row[\"entityType\"] === \"NODE\" &&\n labels?.length === 1 &&\n labels[0] === label &&\n props?.length === 1 &&\n props[0] === property\n );\n}\n","// The narrow interface the library needs from a LoraDB database, plus one\n// adapter that fits both `@loradb/lora-node` and `@loradb/lora-wasm`\n// structurally, so neither binding is a dependency of this package.\n\nexport type LoraParams = Record<string, unknown>;\n\nexport interface Statement {\n text: string;\n params: LoraParams;\n}\n\nexport interface QueryResult {\n columns: string[];\n rows: Array<Record<string, unknown>>;\n}\n\nexport interface PlanNode {\n id: number;\n operator: string;\n details: Record<string, string>;\n estimatedRows: number | null;\n children: PlanNode[];\n}\n\nexport interface QueryPlan {\n query: string;\n shape: \"readOnly\" | \"mutating\";\n resultColumns: string[];\n tree: PlanNode;\n}\n\nexport interface RunOptions {\n /** `read` runs in a read-only transaction: the engine rejects writes. */\n mode: \"read\" | \"write\";\n timeoutMs?: number | undefined;\n signal?: AbortSignal | undefined;\n /**\n * A read the library vouches for: generated, or a @cypher statement\n * checked read-only at startup. The driver may stream it outside a\n * read-only transaction.\n */\n verified?: boolean;\n}\n\n/** An open interactive transaction: statements see earlier writes. */\nexport interface DriverTransaction {\n execute(statement: Statement): Promise<QueryResult>;\n commit(): Promise<void>;\n rollback(): Promise<void>;\n /** False once committed, rolled back, or failed (a failure rolls back). */\n readonly isOpen: boolean;\n}\n\nexport interface LoraDriver {\n /** Run statements atomically, in one transaction, in order. */\n run(statements: Statement[], options: RunOptions): Promise<QueryResult[]>;\n /**\n * Open an interactive transaction. Needed for mutations, which check\n * their writes (connect targets, cardinality, authorization) before\n * committing. Optional: the WASM binding has none, so it serves reads.\n */\n begin?(options: RunOptions): Promise<DriverTransaction>;\n /** Plan a statement without running it. Optional: the WASM binding has no `explain()`. */\n explain?(statement: Statement): Promise<QueryPlan>;\n /** The engine's committed change feed (lora-node `db.changes()`). */\n changes?(options: {\n fromLsn?: number;\n signal?: AbortSignal;\n }): AsyncIterable<DriverChangeBatch> & { ready: Promise<void> };\n}\n\n/** One change of a committed write, as lora-node reports it. */\nexport interface DriverChange {\n kind:\n | \"nodeCreated\"\n | \"nodeUpdated\"\n | \"nodeDeleted\"\n | \"relationshipCreated\"\n | \"relationshipUpdated\"\n | \"relationshipDeleted\"\n | \"reset\";\n id?: number;\n labels?: string[];\n type?: string;\n startId?: number;\n endId?: number;\n properties?: Record<string, unknown>;\n}\n\nexport interface DriverChangeBatch {\n lsn: number;\n changes: DriverChange[];\n}\n\n/** The subset of a LoraDB `Database` the adapter calls. */\nexport interface LoraDatabaseLike {\n transaction(\n statements: Array<{ query: string; params?: never }>,\n mode?: \"read_write\" | \"read_only\",\n options?: { timeoutMs?: number; signal?: AbortSignal },\n ): Promise<QueryResult[]>;\n explain?(query: string, params?: never): Promise<QueryPlan>;\n changes?(options?: {\n fromLsn?: number;\n signal?: AbortSignal;\n }): AsyncIterable<DriverChangeBatch> & { ready: Promise<void> };\n stream?(\n query: string,\n params?: never,\n options?: { timeoutMs?: number; signal?: AbortSignal },\n ): {\n columns(): string[];\n toArray(): Promise<Array<Record<string, unknown>>>;\n };\n begin?(mode?: \"read_write\" | \"read_only\"): Promise<{\n execute(\n query: string,\n params?: never,\n options?: { timeoutMs?: number; signal?: AbortSignal },\n ): Promise<QueryResult>;\n commit(): Promise<void>;\n rollback(): Promise<void>;\n readonly isOpen: boolean;\n }>;\n}\n\n/**\n * Wrap a `Database` from `@loradb/lora-node` or `@loradb/lora-wasm`.\n *\n * ```ts\n * const db = await createDatabase();\n * const lora = new LoraGraphQL({ typeDefs, driver: loraDriver(db) });\n * ```\n */\nexport function loraDriver(db: LoraDatabaseLike): LoraDriver {\n const stream =\n typeof db.stream === \"function\" ? db.stream.bind(db) : undefined;\n const driver: LoraDriver = {\n async run(statements, options) {\n // A single generated read streams: LoraDB 0.15 runs reads under a\n // deadline or inside a transaction without early termination, so a\n // `LIMIT 20` over an index-ordered scan would read the whole label.\n // The stream checks the deadline between rows.\n if (\n stream &&\n options.mode === \"read\" &&\n options.verified &&\n statements.length === 1\n ) {\n const s = statements[0]!;\n const rows = stream(s.text, s.params as never, runLimits(options));\n return [{ columns: rows.columns(), rows: await rows.toArray() }];\n }\n return db.transaction(\n statements.map((s) => ({ query: s.text, params: s.params as never })),\n options.mode === \"read\" ? \"read_only\" : \"read_write\",\n runLimits(options),\n );\n },\n };\n if (typeof db.begin === \"function\") {\n const begin = db.begin.bind(db);\n driver.begin = async (options) => {\n const tx = await begin(\n options.mode === \"read\" ? \"read_only\" : \"read_write\",\n );\n const limits = runLimits(options);\n return {\n execute: (s) => tx.execute(s.text, s.params as never, limits),\n commit: () => tx.commit(),\n rollback: () => tx.rollback(),\n get isOpen() {\n return tx.isOpen;\n },\n };\n };\n }\n if (typeof db.explain === \"function\") {\n const explain = db.explain.bind(db);\n driver.explain = (s) => explain(s.text, s.params as never);\n }\n if (typeof db.changes === \"function\") {\n driver.changes = db.changes.bind(db);\n }\n return driver;\n}\n\nfunction runLimits(options: RunOptions): {\n timeoutMs?: number;\n signal?: AbortSignal;\n} {\n const limits: { timeoutMs?: number; signal?: AbortSignal } = {};\n if (options.timeoutMs !== undefined) limits.timeoutMs = options.timeoutMs;\n if (options.signal !== undefined) limits.signal = options.signal;\n return limits;\n}\n"],"names":["v","name","param","lit","value","prop","target","key","bin","op","left","right","not","expr","isNull","negated","fn","args","and","operands","fold","or","present","e","acc","SIMPLE_NAME","RESERVED","w","id","printExpr","printOperand","precedence","NOT_PRECEDENCE","m","entries","p","where","printPattern","l","PRECEDENCE","parentOp","s","parent","own","printNode","n","labels","rel","node","inner","printItems","items","i","printTail","orderBy","limit","o","printClauses","clauses","indent","c","printClause","yields","y","line","scanParams","text","out","skipQuoted","end","start","quote","renameParams","rename","last","ref","codeOnly","checkCypherFields","driver","model","findings","fields","f","field","params","statement","owner","at","message","err","RANGE_OPS","RANGE_UNINDEXABLE","TEXT_OPS","inferRequirements","label","schemaName","hasUnique","kinds","ops","range","spatial","k","index","reason","property","suffix","snake","requirementId","r","describeRequirement","requirementDdl","props","options","kind","SEEK_OPERATORS","checkPlans","compiled","reports","plan","nodes","flatten","sameColumns","x","scans","seeks","estimates","estimatedRows","SEEKS","BIND_NOTHING","scanExpands","expand","source","sourceScan","a","b","lintModel","writes","guarded","analyze","sample","stats","statements","rels","arrow","count","degrees","values","summarize","q","newContext","base","bind","ctx","freshVar","candidate","ModelError","problems","formatProblem","requestError","code","cause","extensions","GraphQLError","listAggregate","list","lengths","item","init","step","durationSum","distinctCount","keys","directiveTypeDefs","PRELUDE_TYPES","DEFAULT_LIMIT","MAX_LIMIT","BUILTIN_SCALARS","ALLOWED_OPS","KEY_TYPES","UNSORTABLE","RELATIONSHIP_TYPE","ROOT_TYPES","buildModel","typeDefs","globalLimit","resolveGlobalLimit","schema","user","parse","buildASTSchema","concatAST","d","atType","type","userTypes","t","enums","scalars","nodeTypes","propsTypes","plainTypes","rootTypes","interfaceTypes","unionTypes","jwtShape","warnings","isScalarType","stored","storageOf","isEnumType","val","isInterfaceType","isUnionType","isObjectType","directive","claim","isNode","isProps","nodeNames","plainNames","objects","named","getNamedType","isScalarLike","shapeOf","unwrap","targetNames","propsNames","relationshipProperties","buildScalarField","checkPropertyCollisions","at0","primaryLabels","rootFieldOwners","nodeArgs","primary","custom","other","authOps","cypher","buildCypherField","buildRelationshipField","search","readSearch","defaultPlural","query","mutation","mutations","subscription","authentication","authorization","readAuthorization","plural","root","lowerFirst","resolveLimit","abstracts","members","relationships","declaredRel","declareRelationship","mf","queries","mutationFields","rules","rule","checkAuthorizationWhere","returned","dedupeProblems","iface","first","opts","shape","enumName","customScalar","unique","isPrivate","relayId","sortable","groupBy","filterable","alias","defaultArgs","timestampArgs","readonlyFlag","settableArgs","selectableArgs","populatedArgs","fieldAuthorization","vectorArgs","vector","dimensions","vectorQuery","generate","keyArgs","timestamp","defaultValue","defaultMatches","filters","allowed","requested","bad","indexes","vectorQueryNames","readOnlyRules","properties","forbidden","cardinality","limitArgs","seen","typeName","max","def","global","ast","getDirectiveValues","required","isNonNullType","depth","itemRequired","isListType","STORAGE_TYPES","arg","Kind","WRITE_CLAUSES","warn","namedType","abstract","object","columnName","inferColumn","cypherArgs","argNamed","argShape","unwrapInput","known","computed","matches","tail","filter","validate","SCALAR_WHERE_OPS","JWT_OPS","COUNT_WHERE_OPS","isRecord","visit","path","here","checkNodeWhere","claimRefs","operand","defaultName","fulltext","Plural","upperFirst","raw","snakeCase","vectors","names","hasOwnConnection","connectionTypeNames","toLoraPoint","input","toStored","copies","isPolymorphic","memberFields","member","declared","abstractOf","SCALAR_OPS","COUNT_OPS","compileNodeWhere","variable","compileWhere","nodeKeys","checkFieldAuthentication","fieldValidate","pred","scalarPredicate","relationshipPredicate","bound","connectionPredicate","compilePropsWhere","lookup","parts","branches","box","lowered","ciOp","ciValue","cypherOp","lower","relationshipPattern","from","targetLabel","to","relVariable","related","projection","authFilter","compileMemberWhere","mine","typename","rest","checkAuthentication","memberWhere","sum","distinct","lists","nonEmpty","probe","quantifier","failing","compareCount","aggregatePredicate","total","pairWhere","negate","nonEmptyPair","AGGREGATE_KEYS","side","onEdge","fieldName","aggs","agg","bounds","aggregate","claimsSatisfy","compileRulePart","MissingClaim","folded","compileRule","toExpr","foldOr","authValidate","when","validateRules","underNot","child","foldAnd","matchClaims","substitute","wasInAuth","exprs","head","mapped","lookupPath","cur","part","sameValue","ka","kb","expected","claimOp","K","sha256","data","h","padded","view","bits","off","s0","rotr","s1","hh","t1","t2","outView","hmacSha256","block","outer","constantTimeEqual","diff","SIGNATURE_BYTES","encodeCursor","sort","secret","json","_k","payload","toBase64Url","bytesToBase64Url","sign","decodeCursor","cursor","arity","encoded","dot","given","base64UrlToBytes","fromBase64Url","encoder","bytes","b64","collectFields","selectionSets","visited","set","sel","included","applies","frag","subSelections","fieldArgs","getArgumentValues","GraphQLSkipDirective","GraphQLIncludeDirective","condition","cond","isAbstractType","keyExpr","edge","compileRoot","fieldNodes","sets","compileList","compileSingle","compileConnection","compileAggregate","compileGrouped","finish","columns","expectation","extra","mode","readSet","resolveSort","rootMatch","projectNode","sortItems","row","signature","backward","resolvePage","connType","edgeType","connectionSelections","cursorValues","statsColumns","statsCtx","statsRoot","deniedItem","wanted","fns","column","aggregateReturn","results","page","setPath","refuseRowRules","what","AGGREGATES","nativeAggregate","group","native","order","carried","aggType","aggregateWanted","assertNoneDenied","aggregateRow","by","groupType","aggSets","fieldType","sub","bucket","compileCypherRoot","call","bindStatement","rows","projectAbstract","resolveAbstractSort","direction","memberList","sortExprs","tagged","mergedOrder","compileAbstractRoot","limitValue","calls","slice","projectPolymorphic","body","collectOne","SEARCH_SORT","compileSearch","connection","after","keyset","pool","candidates","exclude","coalesceFalse","selections","searchConnectionSelections","searchNodeSelections","matchType","compileByKeys","byKey","keyOf","EXACT_OPS","POINT_OPS","anchor","computedFields","carry","computedClauses","projectCypher","predicate","seekFromWhere","findRelatedAnchor","keysetPredicate","leadBound","lead","walk","eq","inList","seek","dedupe","access","family","argument","tieBreak","one","propName","dir","sortSignature","equal","disjunction","requiresCache","requiresSelection","requires","cached","objType","defs","pre","selected","all","connectionOf","nested","result","projectRelationship","connected","projectRelationshipConnection","fanOut","degree","pattern","userSort","limitParam","typeNames","whereArg","nodeWhere","edgeWhere","filterFor","nv","rv","edgeEntries","projectProperties","rowsVar","matching","cx","cr","sides","chain","otherwise","gather","per","propsType","totalCount","sideName","sideType","existing","edgeNodes","edgeField","affects","reads","change","labelsOf","assertReadable","mutationNames","nonNull","GraphQLNonNull","listOf","GraphQLList","settable","requiredOnCreate","isUpdatable","adjustable","buildMutations","resolve","inputs","once","description","GraphQLInputObjectType","scalarInputs","propsCreate","propsUpdate","propsRequired","connectInput","nestedCreateInput","createInput","nestedUpdateInput","updateInput","canCreate","polymorphicFields","update","byMember","allows","connect","create","GraphQLBoolean","relationFields","GraphQLInt","scalarsOf","upsertInput","numericAdjust","adjustType","GraphQLFloat","adjustInput","info","GraphQLObjectType","listPayload","obj","run","_src","_args","context","updatable","adjust","updateArgs","runStatement","env","tx","asList","WritePlan","storedDefault","satisfied","inverseFields","operation","cb","ownerKey","pick","adding","replace","updates","disconnect","nestedDelete","spec","edgeProps","u","remove","TEMPORAL_KIND","tag","NOW","timestamps","labelTest","seekThenExpand","andText","Runner","task","assertBatch","assertUniqueKeys","groups","stamped","now","guard","matchText","pairs","doomed","relRef","link","links","lctx","linked","found","missing","notConnected","ctx0","written","before","visible","todo","prepared","actx","adjustments","compileAdjust","shapes","sctx","rowsParam","g","removes","entry","touched","add","fresh","memberTest","byField","ownerName","requiredMissing","queue","next","batch","declaredField","isDoomed","keysByNode","restricting","blocking","back","orphan","relIds","pctx","inverse","refs","ends","current","payloadSelections","payloadType","executeMutation","owned","planCtx","emptyChange","runner","payloadFor","payloadTypeName","done","bulkLimit","upsert","fillChange","kept","entities","addEntity","mapWriteError","executeCypherMutation","read","LoraTransaction","#tx","#emit","#pending","emit","ID_CACHE","EngineFeed","#driver","#model","#byLabel","#ids","#controller","#lastLsn","#open","signal","feed","#pump","#toChange","#entity","#remember","#resolveEnds","#relationship","fill","owners","schemaHash","printSchema","lexicographicSortSchema","buildManifest","operations","doc","errors","specifiedRules","SCALAR_TS","generateTypes","manifest","storage","lines","scalar","enumType","inputNamed","isInputObjectType","optional","inputInner","fragments","vars","typeFromAST","output","outputInner","selection","on","conditional","possible","prior","declarations","usedFragments","spread","DEFAULT_GUARDS","resolveGuards","guards","nodeEnv","validationRules","depthRule","aliasRule","rootFieldRule","noIntrospection","parseOptions","envelopPlugin","parseFn","setParseFn","parseOpts","addValidationRule","guardError","fragmentsOf","depthOf","memo","deepest","reported","rootFields","STATUS_ERROR","Observer","#options","meta","tracer","span","fail","error","durationMs","countRows","#report","onStatementEnd","metrics","attributes","toGlobalId","fromGlobalId","decoded","temporal","GraphQLScalarType","GraphQLDate","GraphQLTime","GraphQLLocalTime","GraphQLDateTime","GraphQLLocalDateTime","GraphQLDuration","MIN_SAFE","MAX_SAFE","parseBigInt","toParam","GraphQLBigInt","CUSTOM_SCALARS","pageOf","src","byResponseKey","_ctx","vectorByResponseKey","nodesByResponseKey","OPERATOR_FIELDS","OPERATOR_DOCS","buildSchema","hooks","resolveRoot","resolveNode","sortDirection","GraphQLEnumType","pageInfo","GraphQLString","countFilter","point","cartesianPoint","nodeInterface","GraphQLInterfaceType","GraphQLID","customScalars","baseType","scalarType","scalarOutput","pointInput","cartesianPointInput","spatialInputs","cartesian","prefix","inputTypeOf","caseInsensitiveFilter","fieldFilter","wheres","whereOf","relationFilter","polymorphic","connectionFilter","implementation","relationAggregateFilter","connectionWheres","connectionWhere","propsWhere","pair","comparisons","comparison","aggregatable","isNumeric","aggregateFieldFilters","aggregateFieldFilter","aggregateWheres","aggregateWhere","usable","propsWheres","sorts","connections","abstractTypes","resolveType","impl","GraphQLUnionType","outputOf","connectionResolvers","more","makeConnection","edgeName","nodeType","propertiesType","connectionAggregates","aggregateSides","relationshipCount","connectionAggregate","relationship","made","aggregateFieldType","propsObjects","propsObject","listArgs","edgeSorts","edgeSortOf","connectionArgs","_a","_c","cypherOutput","relationshipConnectionField","conn","plainObjects","plain","aggregateFieldTypes","numeric","aggregates","grouped","match","searchEdge","searchConnection","common","changeOperation","changeRelationship","keyType","previousFields","previousState","event","GraphQLSchema","DOCUMENT_CACHE_SIZE","COMPILED_PER_FIELD","LoraGraphQL","#timeoutMs","#maxCost","#maxBatch","#maxQueued","#callbacks","#resolvers","#scalars","#spent","#jwt","#onStatement","#maskErrors","#observer","#budget","#onCost","#persistedIds","#guards","#persistedOnly","#onError","#listeners","#feedListeners","#feed","#feedReady","#documents","#persisted","#degrees","#statisticsVersion","#compiled","#sharedReads","#statistics","#schema","#parse","#validate","document","#subscribe","#resolveByKey","CHANGE","#cachedCompile","#args","#run","#resolveSearch","#resolveRoot","#resolveNode","#resolveCypher","#resolveMutation","checkCustomRequires","constraints","sameTarget","created","report","#unusedIndexes","variables","invalid","findOperation","coerced","getVariableValues","queryType","#context","#rootOf","#searchOf","hash","contextValue","graphqlExecute","spent","cost","listener","wake","overflow","stop","ready","iterator","#charge","byOperation","#shared","stableKey","pending","#meta","runInOrder","#databaseError","compile","claims","infoContext","hit","#events","offered","ruled","check","events","changeEvents","deletions","live","#visible","#mutationEnv","jwt","previous","make","self","operationName","requiredCustomFields","ok","proto","loraDriver","db","stream","runLimits","begin","limits","explain"],"mappings":";AAyIO,MAAMA,IAAI,CAACC,OAAwB,EAAE,MAAM,OAAO,MAAAA,MAC5CC,KAAQ,CAACD,OAAwB,EAAE,MAAM,SAAS,MAAAA,MAClDE,IAAM,CAACC,OAAmD;AAAA,EACrE,MAAM;AAAA,EACN,OAAAA;AACF,IACaC,KAAO,CAACC,GAAcC,OAAuB;AAAA,EACxD,MAAM;AAAA,EACN,QAAAD;AAAA,EACA,KAAAC;AACF,IACaC,IAAM,CAACC,GAAcC,GAAYC,OAAuB;AAAA,EACnE,MAAM;AAAA,EACN,IAAAF;AAAA,EACA,MAAAC;AAAA,EACA,OAAAC;AACF,IACaC,KAAM,CAACC,OAAsB,EAAE,MAAM,OAAO,MAAAA,EAAA,IAC5CC,KAAS,CAACD,GAAYE,IAAU,QAAiB;AAAA,EAC5D,MAAM;AAAA,EACN,MAAAF;AAAA,EACA,SAAAE;AACF,IACaC,KAAK,CAACf,MAAiBgB,OAAwB;AAAA,EAC1D,MAAM;AAAA,EACN,IAAIhB;AAAAA,EACJ,MAAAgB;AACF;AAGO,SAASC,MAAOC,GAAqD;AAC1E,SAAOC,GAAK,OAAOD,CAAQ;AAC7B;AAGO,SAASE,MAAMF,GAAqD;AACzE,SAAOC,GAAK,MAAMD,CAAQ;AAC5B;AAEA,SAASC,GACPX,GACAU,GACkB;AAClB,QAAMG,IAAUH,EAAS,OAAO,CAACI,MAAiBA,MAAM,MAAS;AACjE,MAAID,EAAQ,WAAW;AACvB,WAAOA,EAAQ,OAAO,CAACE,GAAKD,MAAMf,EAAIC,GAAIe,GAAKD,CAAC,CAAC;AACnD;AAMA,MAAME,KAAc,4BAGdC,KAAW,IAAI;AAAA,EACnB;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,EACA,IAAI,CAACC,MAAMA,EAAE,aAAa;AAC9B;AAGO,SAAS1B,EAAK2B,GAAoB;AACvC,SAAIH,GAAY,KAAKG,CAAE,KAAK,CAACF,GAAS,IAAIE,EAAG,aAAa,IAAUA,IAC7D,MAAMA,EAAG,QAAQ,MAAM,IAAI,IAAI;AACxC;AAEO,SAASC,EAAU,GAAiB;AACzC,UAAQ,EAAE,MAAA;AAAA,IACR,KAAK;AACH,aAAO5B,EAAK,EAAE,IAAI;AAAA,IACpB,KAAK;AACH,aAAO,MAAMA,EAAK,EAAE,IAAI;AAAA,IAC1B,KAAK;AACH,aAAI,EAAE,UAAU,OAAa,SACzB,OAAO,EAAE,SAAU,WAAiB,KAAK,UAAU,EAAE,KAAK,IACvD,OAAO,EAAE,KAAK;AAAA,IACvB,KAAK;AACH,aAAO,GAAG6B,GAAa,EAAE,MAAM,CAAC,IAAI7B,EAAK,EAAE,GAAG,CAAC;AAAA,IACjD,KAAK;AACH,aAAO,GAAG6B,GAAa,EAAE,MAAM,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,IAAIA,GAAa,EAAE,OAAO,EAAE,EAAE,CAAC;AAAA,IAC7E,KAAK;AACH,aAAO,OAAOC,GAAW,EAAE,IAAI,KAAKC,MAAkB,EAAE,KAAK,SAAS,WAAW,IAAIH,EAAU,EAAE,IAAI,CAAC,MAAMA,EAAU,EAAE,IAAI,CAAC;AAAA,IAC/H,KAAK;AACH,aAAO,GAAGC,GAAa,EAAE,IAAI,CAAC,OAAO,EAAE,UAAU,SAAS,EAAE;AAAA,IAC9D,KAAK;AACH,aAAO,GAAG,EAAE,EAAE,IAAI,EAAE,KAAK,IAAID,CAAS,EAAE,KAAK,IAAI,CAAC;AAAA,IACpD,KAAK;AACH,aAAO,IAAI,EAAE,MAAM,IAAIA,CAAS,EAAE,KAAK,IAAI,CAAC;AAAA,IAC9C,KAAK;AACH,aAAO,KAAK,EAAE,QAAQ,IAAI,CAACI,MAAM,GAAGhC,EAAKgC,EAAE,GAAG,CAAC,KAAKJ,EAAUI,EAAE,KAAK,CAAC,EAAE,EAAE,KAAK,IAAI,CAAC;AAAA,IACtF,KAAK,iBAAiB;AACpB,YAAMC,IAAU,EAAE,QAAQ;AAAA,QAAI,CAACC,MAC7BA,EAAE,SAAS,aACP,IAAIlC,EAAKkC,EAAE,GAAG,CAAC,KACf,GAAGlC,EAAKkC,EAAE,GAAG,CAAC,KAAKN,EAAUM,EAAE,KAAK,CAAC;AAAA,MAAA;AAE3C,aAAOD,EAAQ,WAAW,IACtB,GAAGjC,EAAK,EAAE,QAAQ,CAAC,QACnB,GAAGA,EAAK,EAAE,QAAQ,CAAC,MAAMiC,EAAQ,KAAK,IAAI,CAAC;AAAA,IACjD;AAAA,IACA,KAAK,iBAAiB;AACpB,YAAME,IAAQ,EAAE,QAAQ,UAAUP,EAAU,EAAE,KAAK,CAAC,KAAK;AACzD,aAAO,IAAIQ,GAAa,EAAE,OAAO,CAAC,GAAGD,CAAK,MAAMP,EAAU,EAAE,UAAU,CAAC;AAAA,IACzE;AAAA,IACA,KAAK;AACH,aAAO,IAAI5B,EAAK,EAAE,QAAQ,CAAC,OAAO4B,EAAU,EAAE,IAAI,CAAC,GAAG,EAAE,QAAQ,UAAUA,EAAU,EAAE,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,aAAa,MAAMA,EAAU,EAAE,UAAU,CAAC,KAAK,EAAE;AAAA,IAC3J,KAAK;AACH,aAAO,UAAU5B,EAAK,EAAE,WAAW,CAAC,MAAM4B,EAAU,EAAE,IAAI,CAAC,KAAK5B,EAAK,EAAE,QAAQ,CAAC,OAAO4B,EAAU,EAAE,IAAI,CAAC,MAAMA,EAAU,EAAE,IAAI,CAAC;AAAA,IACjI,KAAK;AACH,aAAO,GAAG5B,EAAK,EAAE,QAAQ,CAAC,GAAG,EAAE,OAAO,IAAI,CAACqC,MAAM,MAAMrC,EAAKqC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;AAAA,IAC1E,KAAK;AACH,aAAO,aAAaT,EAAU,EAAE,IAAI,CAAC,SAASA,EAAU,EAAE,IAAI,CAAC,SAASA,EAAU,EAAE,IAAI,CAAC;AAAA,IAC3F,KAAK;AACH,aAAO,GAAGC,GAAa,EAAE,MAAM,CAAC,IAAI,EAAE,OAAOD,EAAU,EAAE,IAAI,IAAI,EAAE,KAAK,EAAE,KAAKA,EAAU,EAAE,EAAE,IAAI,EAAE;AAAA,EAAA;AAEzG;AAKA,MAAMU,KAAuC;AAAA,EAC3C,IAAI;AAAA,EACJ,KAAK;AAAA,EACL,KAAK;AAAA,EACL,MAAM;AAAA,EACN,KAAK;AAAA,EACL,MAAM;AAAA,EACN,KAAK;AAAA,EACL,MAAM;AAAA,EACN,IAAI;AAAA,EACJ,UAAU;AAAA,EACV,eAAe;AAAA,EACf,aAAa;AAAA,EACb,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AACP,GACMP,KAAiB;AAEvB,SAASD,GAAW,GAAiB;AACnC,SAAI,EAAE,SAAS,WAAiBQ,GAAW,EAAE,EAAE,IAC3C,EAAE,SAAS,QAAcP,KACzB,EAAE,SAAS,WAAiB,IACzB;AACT;AAEA,SAASF,GAAa,GAASU,GAA6B;AAC1D,QAAMC,IAAIZ,EAAU,CAAC,GACfa,IAASF,IAAWD,GAAWC,CAAQ,IAAI,IAC3CG,IAAMZ,GAAW,CAAC;AAExB,SAAIS,MAAa,QAAQ,EAAE,SAAS,YAAY,EAAE,OAAO,QAChD,IAAIC,CAAC,MAEVE,IAAMD,KAAUC,MAAQ,MACxBA,MAAQD,KAAUF,MAAaA,MAAa,SAASA,MAAa,QAC7DC,IAEF,IAAIA,CAAC;AACd;AAEA,SAASG,GAAUC,GAAwB;AACzC,QAAMC,IAASD,EAAE,OAAO,IAAI,CAACP,MAAM,MAAMrC,EAAKqC,CAAC,CAAC,EAAE,KAAK,EAAE;AACzD,SAAO,IAAIO,EAAE,WAAW5C,EAAK4C,EAAE,QAAQ,IAAI,EAAE,GAAGC,CAAM;AACxD;AAEO,SAAST,GAAaF,GAAoB;AAC/C,MAAIM,IAAIG,GAAUT,EAAE,KAAK;AACzB,aAAW,EAAE,KAAAY,GAAK,MAAAC,EAAA,KAAUb,EAAE,MAAM;AAClC,UAAMc,IAAQ,IAAIF,EAAI,WAAW9C,EAAK8C,EAAI,QAAQ,IAAI,EAAE,IAAI9C,EAAK8C,EAAI,IAAI,CAAC;AAC1E,IAAAN,KACEM,EAAI,cAAc,QACd,IAAIE,CAAK,OACTF,EAAI,cAAc,OAChB,KAAKE,CAAK,MACV,IAAIA,CAAK,KACjBR,KAAKG,GAAUI,CAAI;AAAA,EACrB;AACA,SAAOP;AACT;AAEA,SAASS,GAAWC,GAA6B;AAC/C,SAAOA,EACJ,IAAI,CAACC,MAAM;AACV,UAAMvC,IAAOgB,EAAUuB,EAAE,IAAI;AAE7B,WADIA,EAAE,UAAU,UACZA,EAAE,KAAK,SAAS,SAASA,EAAE,KAAK,SAASA,EAAE,QAAcvC,IACtD,GAAGA,CAAI,OAAOZ,EAAKmD,EAAE,KAAK,CAAC;AAAA,EACpC,CAAC,EACA,KAAK,IAAI;AACd;AAEA,SAASC,GACPC,GACAC,GACQ;AACR,MAAId,IAAI;AACR,SAAIa,KAAWA,EAAQ,SAAS,MAC9Bb,KACE,eACAa,EAAQ,IAAI,CAACE,MAAM,GAAG3B,EAAU2B,EAAE,IAAI,CAAC,IAAIA,EAAE,SAAS,EAAE,EAAE,KAAK,IAAI,IAEnED,MAAOd,KAAK,UAAUZ,EAAU0B,CAAK,CAAC,KACnCd;AACT;AAEO,SAASgB,GAAaC,GAAmBC,IAAS,IAAY;AACnE,SAAOD,EAAQ,IAAI,CAACE,MAAMD,IAASE,GAAYD,GAAGD,CAAM,CAAC,EAAE,KAAK;AAAA,CAAI;AACtE;AAEA,SAASE,GAAYD,GAAWD,GAAwB;AACtD,UAAQC,EAAE,MAAA;AAAA,IACR,KAAK;AACH,aACE,SAASvB,GAAauB,EAAE,OAAO,CAAC,MAC/BA,EAAE,QAAQ;AAAA,EAAKD,CAAM,SAAS9B,EAAU+B,EAAE,KAAK,CAAC,KAAK;AAAA,IAE1D,KAAK;AACH,aAAO,UAAU/B,EAAU+B,EAAE,IAAI,CAAC,OAAO3D,EAAK2D,EAAE,KAAK,CAAC;AAAA,IACxD,KAAK,aAAa;AAChB,YAAME,IAASF,EAAE,OACd;AAAA,QAAI,CAACG,MACJA,EAAE,SAASA,EAAE,UAAUA,EAAE,OACrB,GAAG9D,EAAK8D,EAAE,IAAI,CAAC,OAAO9D,EAAK8D,EAAE,KAAK,CAAC,KACnC9D,EAAK8D,EAAE,IAAI;AAAA,MAAA,EAEhB,KAAK,IAAI;AACZ,aACE,QAAQH,EAAE,SAAS,IAAIA,EAAE,KAAK,IAAI/B,CAAS,EAAE,KAAK,IAAI,CAAC,WAAWiC,CAAM,MACvEF,EAAE,QAAQ;AAAA,EAAKD,CAAM,SAAS9B,EAAU+B,EAAE,KAAK,CAAC,KAAK;AAAA,IAE1D;AAAA,IACA,KAAK;AACH,aAAOA,EAAE,KACN,KAAA,EACA,MAAM;AAAA,CAAI,EACV,IAAI,CAACI,GAAMZ,MAAOA,MAAM,IAAIY,IAAOL,IAASK,EAAK,SAAU,EAC3D,KAAK;AAAA,CAAI;AAAA,IACd,KAAK;AACH,aACE,QAAQJ,EAAE,WAAW,cAAc,EAAE,GAAGV,GAAWU,EAAE,KAAK,CAAC,MAC1DA,EAAE,QAAQ,UAAU/B,EAAU+B,EAAE,KAAK,CAAC,KAAK,MAC5CP,GAAUO,EAAE,SAASA,EAAE,KAAK;AAAA,IAEhC,KAAK,QAAQ;AACX,YAAMX,IAAQU,IAAS;AAKvB,aAAO;AAAA,EAHLC,EAAE,QAAQ,SAAS,IACf,GAAGX,CAAK,QAAQW,EAAE,QAAQ,IAAI3D,CAAI,EAAE,KAAK,IAAI,CAAC;AAAA,IAC9C,EACmB,GAAGwD,GAAaG,EAAE,MAAMX,CAAK,CAAC;AAAA,EAAKU,CAAM;AAAA,IACpE;AAAA,IACA,KAAK;AACH,aAAO,UAAUT,GAAWU,EAAE,KAAK,CAAC,KAAKP,GAAUO,EAAE,SAASA,EAAE,KAAK;AAAA,EAAA;AAE3E;AC/aO,SAASK,GAAWC,GAA0B;AACnD,QAAMC,IAAkB,CAAA;AACxB,MAAIf,IAAI;AACR,SAAOA,IAAIc,EAAK,UAAQ;AACtB,UAAMN,IAAIM,EAAKd,CAAC;AAChB,QAAIQ,MAAM,OAAOA,MAAM;AACrB,MAAAR,IAAIgB,GAAWF,GAAMd,GAAGQ,CAAC;AAAA,aAChBA,MAAM,KAAK;AACpB,YAAMS,IAAMH,EAAK,QAAQ,KAAKd,IAAI,CAAC;AACnC,MAAAA,IAAIiB,IAAM,IAAIH,EAAK,SAASG,IAAM;AAAA,IACpC,WAAWT,MAAM,OAAOM,EAAKd,IAAI,CAAC,MAAM,KAAK;AAC3C,YAAMiB,IAAMH,EAAK,QAAQ;AAAA,GAAMd,CAAC;AAChC,MAAAA,IAAIiB,IAAM,IAAIH,EAAK,SAASG,IAAM;AAAA,IACpC,WAAWT,MAAM,OAAOM,EAAKd,IAAI,CAAC,MAAM,KAAK;AAC3C,YAAMiB,IAAMH,EAAK,QAAQ,MAAMd,IAAI,CAAC;AACpC,MAAAA,IAAIiB,IAAM,IAAIH,EAAK,SAASG,IAAM;AAAA,IACpC,WAAWT,MAAM,KAAK;AACpB,YAAMU,IAAQlB;AACd,MAAAA;AACA,UAAInD;AACJ,UAAIiE,EAAKd,CAAC,MAAM,KAAK;AACnB,cAAMiB,IAAMH,EAAK,QAAQ,KAAKd,IAAI,CAAC;AACnC,QAAAnD,IAAOiE,EAAK,MAAMd,IAAI,GAAGiB,IAAM,IAAIH,EAAK,SAASG,CAAG,GACpDjB,IAAIiB,IAAM,IAAIH,EAAK,SAASG,IAAM;AAAA,MACpC,OAAO;AACL,cAAMpC,IAAI,0BAA0B,KAAKiC,EAAK,MAAMd,CAAC,CAAC;AACtD,QAAAnD,IAAOgC,IAAIA,EAAE,CAAC,IAAI,IAClBmB,KAAKnD,EAAK;AAAA,MACZ;AACA,MAAIA,OAAU,KAAK,EAAE,MAAAA,GAAM,OAAAqE,GAAO,KAAKlB,GAAG;AAAA,IAC5C;AACE,MAAAA;AAAA,EAEJ;AACA,SAAOe;AACT;AAEA,SAASC,GAAWF,GAAcI,GAAeC,GAAuB;AACtE,MAAInB,IAAIkB,IAAQ;AAChB,SAAOlB,IAAIc,EAAK;AACd,QAAIA,EAAKd,CAAC,MAAM,KAAM,CAAAA,KAAK;AAAA,SAAA;AAAA,UAClBc,EAAKd,CAAC,MAAMmB,UAAcnB,IAAI;AAClC,MAAAA;AAAA;AAEP,SAAOA;AACT;AAGO,SAASoB,GACdN,GACAO,GACQ;AACR,MAAIN,IAAM,IACNO,IAAO;AACX,aAAWC,KAAOV,GAAWC,CAAI;AAC/B,IAAAC,KAAOD,EAAK,MAAMQ,GAAMC,EAAI,KAAK,IAAI,MAAMF,EAAOE,EAAI,IAAI,GAC1DD,IAAOC,EAAI;AAEb,SAAOR,IAAMD,EAAK,MAAMQ,CAAI;AAC9B;AAGO,SAASE,GAASV,GAAsB;AAC7C,MAAIC,IAAM,IACNf,IAAI;AACR,SAAOA,IAAIc,EAAK,UAAQ;AACtB,UAAMN,IAAIM,EAAKd,CAAC;AAChB,QAAIQ,MAAM,OAAOA,MAAM;AACrB,MAAAR,IAAIgB,GAAWF,GAAMd,GAAGQ,CAAC,GACzBO,KAAO;AAAA,aACEP,MAAM,OAAOM,EAAKd,IAAI,CAAC,MAAM,KAAK;AAC3C,YAAMiB,IAAMH,EAAK,QAAQ;AAAA,GAAMd,CAAC;AAChC,MAAAA,IAAIiB,IAAM,IAAIH,EAAK,SAASG,IAAM,GAClCF,KAAO;AAAA,IACT,WAAWP,MAAM,OAAOM,EAAKd,IAAI,CAAC,MAAM,KAAK;AAC3C,YAAMiB,IAAMH,EAAK,QAAQ,MAAMd,IAAI,CAAC;AACpC,MAAAA,IAAIiB,IAAM,IAAIH,EAAK,SAASG,IAAM,GAClCF,KAAO;AAAA,IACT;AACE,MAAAA,KAAOP,GACPR;AAAA,EAEJ;AACA,SAAOe,EAAI,YAAA,EAAc,QAAQ,QAAQ,GAAG;AAC9C;AChFA,eAAsBU,GACpBC,GACAC,GAC0B;AAC1B,MAAI,CAACD,EAAO,QAAS,QAAO,CAAA;AAC5B,QAAME,IAA4B,CAAA,GAC5BC,IAAwB;AAAA,IAC5B,GAAGF,EAAM;AAAA,IACT,GAAGA,EAAM;AAAA,IACT,GAAG,CAAC,GAAGA,EAAM,MAAM,OAAA,CAAQ,EAAE;AAAA,MAAQ,CAAClC,MACpC,CAAC,GAAGA,EAAE,OAAO,OAAA,CAAQ,EAAE;AAAA,QACrB,CAACqC,MAAwBA,EAAE,SAAS;AAAA,MAAA;AAAA,IACtC;AAAA,EACF;AAEF,aAAWC,KAASF,GAAQ;AAC1B,UAAMG,IAAkC,CAAA,GAClCC,IAAYb,GAAaW,EAAM,WAAW,CAAChD,OAC/CiD,EAAO,KAAKjD,CAAC,EAAE,IAAI,MACZ,KAAKA,CAAC,GACd,GACKmD,IAAQP,EAAM,MAAM,IAAII,EAAM,KAAK,GACnCjB,IAAOoB,IACT,eAAerF,EAAKqF,EAAM,OAAO,CAAC,CAAE,CAAC;AAAA;AAAA;AAAA,EAA6CD,CAAS;AAAA;AAAA,SAAepF,EAAKkF,EAAM,UAAU,CAAC,cAChI;AAAA,EAAWE,CAAS;AAAA;AAAA,SAAepF,EAAKkF,EAAM,UAAU,CAAC,aACvDI,IAAK,CAACC,MACVR,EAAS,KAAK,EAAE,MAAMG,EAAM,OAAO,OAAOA,EAAM,MAAM,SAAAK,GAAS;AACjE,QAAI;AAEF,OADa,MAAMV,EAAO,QAAQ,EAAE,MAAAZ,GAAM,QAAAkB,GAAyB,GAC1D,UAAU,cAAcD,EAAM,UAAU,cAC/CI,EAAG,gDAAgD;AAAA,IAEvD,SAASE,GAAK;AACZ,MAAAF,EAAGE,aAAe,QAAQA,EAAI,UAAU,OAAOA,CAAG,CAAC;AAAA,IACrD;AAAA,EACF;AACA,SAAOT;AACT;ACHA,MAAMU,yBAAgB,IAAoB,CAAC,MAAM,OAAO,MAAM,KAAK,CAAC,GAOvDC,KAAoB,oBAAI,IAAgB,CAAC,UAAU,CAAC,GAC3DC,yBAAe,IAAoB;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAgBM,SAASC,GAAkBd,GAAwC;AACxE,QAAMZ,IAA2B,CAAA;AACjC,aAAWnB,KAAQ+B,EAAM,MAAM,OAAA,GAAU;AACvC,UAAMe,IAAQ9C,EAAK,OAAO,CAAC;AAC3B,eAAWP,KAAKO,EAAK;AACnB,MAAAmB,EAAI;AAAA,QACF1B,EAAE,SAAS,aACP;AAAA,UACE,MAAM;AAAA,UACN,MAAMA,EAAE;AAAA,UACR,OAAAqD;AAAA,UACA,YAAYrD,EAAE,OAAO,IAAI,CAACyC,MAAMA,EAAE,QAAQ;AAAA,UAC1C,UAAUzC,EAAE;AAAA,UACZ,QAAQ,GAAGO,EAAK,IAAI,kBAAkBP,EAAE,IAAI,KAAKA,EAAE,SAAS;AAAA,QAAA,IAE9D;AAAA,UACE,MAAM;AAAA,UACN,MAAMA,EAAE;AAAA,UACR,OAAAqD;AAAA,UACA,UAAUrD,EAAE,MAAM;AAAA,UAClB,YAAYA,EAAE;AAAA,UACd,YAAYA,EAAE;AAAA,UACd,QAAQ,GAAGO,EAAK,IAAI,IAAIP,EAAE,MAAM,IAAI,kBAAkBA,EAAE,SAAS;AAAA,QAAA;AAAA,MACnE;AAGR,eAAWyC,KAAKlC,EAAK,OAAO,OAAA,GAAU;AACpC,UAAIkC,EAAE,SAAS,SAAU;AACzB,YAAMK,IAAK,GAAGvC,EAAK,IAAI,IAAIkC,EAAE,IAAI;AACjC,UAAIA,EAAE,KAAK;AACT,QAAAf,EAAI,KAAK;AAAA,UACP,MAAM;AAAA,UACN,YAAY;AAAA,UACZ,MAAM4B,GAAWD,GAAOZ,EAAE,UAAU,KAAK;AAAA,UACzC,OAAAY;AAAA,UACA,UAAUZ,EAAE;AAAA,UACZ,QAAQ,GAAGK,CAAE;AAAA,QAAA,CACd;AAED;AAAA,MACF;AACA,YAAMS,IAAYd,EAAE;AACpB,MAAIc,KACF7B,EAAI,KAAK;AAAA,QACP,MAAM;AAAA,QACN,YAAY;AAAA,QACZ,MAAM4B,GAAWD,GAAOZ,EAAE,UAAU,QAAQ;AAAA,QAC5C,OAAAY;AAAA,QACA,UAAUZ,EAAE;AAAA,QACZ,QAAQ,GAAGK,CAAE;AAAA,MAAA,CACd,GAECL,EAAE,YAAYA,EAAE,YAAY,CAACA,EAAE,QACjCf,EAAI,KAAK;AAAA,QACP,MAAM;AAAA,QACN,YAAY;AAAA,QACZ,MAAM4B,GAAWD,GAAOZ,EAAE,UAAU,QAAQ;AAAA,QAC5C,OAAAY;AAAA,QACA,UAAUZ,EAAE;AAAA,QACZ,QAAQ,GAAGK,CAAE;AAAA,MAAA,CACd;AAEH,YAAMU,wBAAY,IAAA,GACZC,IAAM,CAAC,GAAGhB,EAAE,OAAO;AACzB,UAAI,CAACc,KAAa,CAACL,GAAkB,IAAIT,EAAE,IAAI,GAAG;AAChD,cAAMiB,IAAQD,EAAI,OAAO,CAACzF,MAAOiF,GAAU,IAAIjF,CAAE,CAAC;AAClD,QAAI0F,EAAM,SAAS,IACjBF,EAAM,IAAI,SAAS,GAAGV,CAAE,sBAAsBY,EAAM,KAAK,IAAI,CAAC,EAAE,IACvDjB,EAAE,YACXe,EAAM,IAAI,SAAS,GAAGV,CAAE,eAAe;AAAA,MAE3C;AACA,YAAMa,IAAUF,EAAI;AAAA,QAClB,CAACzF,MAAOA,MAAO,iBAAiBA,MAAO;AAAA,MAAA;AAEzC,MAAI2F,EAAQ,SAAS,KACnBH,EAAM,IAAI,SAAS,GAAGV,CAAE,sBAAsBa,EAAQ,KAAK,IAAI,CAAC,EAAE;AAEpE,YAAMlC,IAAOgC,EAAI,OAAO,CAACzF,MAAOmF,GAAS,IAAInF,CAAE,CAAC;AAChD,MAAIyD,EAAK,SAAS,KAChB+B,EAAM,IAAI,QAAQ,GAAGV,CAAE,sBAAsBrB,EAAK,KAAK,IAAI,CAAC,EAAE;AAEhE,iBAAWmC,KAAKnB,EAAE;AAChB,QAAI,CAACe,EAAM,IAAII,CAAC,KAAK,EAAEA,MAAM,WAAWL,MACtCC,EAAM,IAAII,GAAG,GAAGd,CAAE,qBAAqBc,CAAC,GAAG;AAG/C,iBAAW,CAACC,GAAOC,CAAM,KAAKN;AAC5B,QAAA9B,EAAI,KAAK;AAAA,UACP,MAAM;AAAA,UACN,OAAAmC;AAAA,UACA,MAAMP,GAAWD,GAAOZ,EAAE,UAAUoB,EAAM,aAAa;AAAA,UACvD,OAAAR;AAAA,UACA,UAAUZ,EAAE;AAAA,UACZ,QAAAqB;AAAA,QAAA,CACD;AAAA,IAEL;AAAA,EACF;AACA,SAAOpC;AACT;AAEA,SAAS4B,GAAWD,GAAeU,GAAkBC,GAAwB;AAC3E,SAAO,GAAGC,GAAMZ,CAAK,CAAC,IAAIY,GAAMF,CAAQ,CAAC,IAAIC,CAAM;AACrD;AAEA,SAASC,GAAMjE,GAAmB;AAChC,SAAOA,EACJ,QAAQ,sBAAsB,OAAO,EACrC,QAAQ,kBAAkB,GAAG,EAC7B,YAAA;AACL;AAGO,SAASkE,GAAcC,GAA8B;AAC1D,UAAQA,EAAE,MAAA;AAAA,IACR,KAAK;AACH,aAAO,SAASA,EAAE,KAAK,IAAIA,EAAE,KAAK,IAAIA,EAAE,QAAQ;AAAA,IAClD,KAAK;AACH,aAAO,cAAcA,EAAE,UAAU,IAAIA,EAAE,KAAK,IAAIA,EAAE,QAAQ;AAAA,IAC5D,KAAK;AACH,aAAO,YAAYA,EAAE,IAAI,IAAIA,EAAE,KAAK,IAAIA,EAAE,WAAW,KAAK,GAAG,CAAC,IAAIA,EAAE,QAAQ;AAAA,IAC9E,KAAK;AACH,aAAO,UAAUA,EAAE,IAAI,IAAIA,EAAE,KAAK,IAAIA,EAAE,QAAQ,IAAIA,EAAE,UAAU,IAAIA,EAAE,UAAU;AAAA,EAAA;AAEtF;AAGO,SAASC,GAAoBD,GAA8B;AAChE,UAAQA,EAAE,MAAA;AAAA,IACR,KAAK;AACH,aAAO,GAAGA,EAAE,KAAK,cAAcA,EAAE,KAAK,IAAIA,EAAE,QAAQ;AAAA,IACtD,KAAK;AACH,aAAO,GAAGA,EAAE,UAAU,mBAAmBA,EAAE,KAAK,IAAIA,EAAE,QAAQ;AAAA,IAChE,KAAK;AACH,aAAO,kBAAkBA,EAAE,IAAI,QAAQA,EAAE,KAAK,IAAIA,EAAE,WAAW,KAAK,IAAI,CAAC;AAAA,IAC3E,KAAK;AACH,aAAO,gBAAgBA,EAAE,IAAI,QAAQA,EAAE,KAAK,IAAIA,EAAE,QAAQ,MAAMA,EAAE,UAAU,gBAAgBA,EAAE,WAAW,aAAa;AAAA,EAAA;AAE5H;AAGO,SAASE,GAAeF,GAA8B;AAC3D,QAAMd,IAAQvB,GAAMqC,EAAE,KAAK,GACrB3G,IAAOsE,GAAMqC,EAAE,IAAI;AACzB,MAAIA,EAAE,SAAS,YAAY;AACzB,UAAMG,IAAQH,EAAE,WAAW,IAAI,CAACzE,MAAM,KAAKoC,GAAMpC,CAAC,CAAC,EAAE,EAAE,KAAK,IAAI,GAC1D6E,IACJJ,EAAE,aAAa,WACX,4DACA;AACN,WAAO,yBAAyB3G,CAAI,yBAAyB6F,CAAK,cAAciB,CAAK,IAAIC,CAAO;AAAA,EAClG;AACA,MAAIJ,EAAE,SAAS;AACb,WAAO,uBAAuB3G,CAAI,yBAAyB6F,CAAK,WAAWvB,GAAMqC,EAAE,QAAQ,CAAC,mDAAmDA,EAAE,UAAU,sCAAsCA,EAAE,WAAW,aAAa;AAE7N,QAAMJ,IAAWjC,GAAMqC,EAAE,QAAQ;AACjC,MAAIA,EAAE,SAAS,cAAc;AAC3B,UAAMK,IAAO;AAAA,MACX,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,UAAU;AAAA,IAAA,EACVL,EAAE,UAAU;AACd,WAAO,qBAAqB3G,CAAI,yBAAyB6F,CAAK,eAAeU,CAAQ,IAAIS,CAAI;AAAA,EAC/F;AAEA,SAAO,UADML,EAAE,UAAU,UAAU,KAAK,GAAGA,EAAE,KAAK,GAC7B,SAAS3G,CAAI,yBAAyB6F,CAAK,WAAWU,CAAQ;AACrF;AAEA,SAASjC,GAAM3C,GAAoB;AACjC,SAAO,MAAMA,EAAG,QAAQ,MAAM,IAAI,IAAI;AACxC;ACxNA,MAAMsF,KAA8D;AAAA,EAClE,OAAO,CAAC,oBAAoB;AAAA,EAC5B,OAAO,CAAC,2BAA2B,oBAAoB;AAAA,EACvD,MAAM,CAAC,gBAAgB;AAAA,EACvB,OAAO,CAAC,iBAAiB;AAC3B;AAEA,eAAsBC,GACpBrC,GACAsC,GACAJ,IAAkC,CAAA,GACX;AACvB,MAAI,CAAClC,EAAO;AACV,UAAM,IAAI;AAAA,MACR;AAAA,IAAA;AAGJ,QAAMuC,IAAwB,CAAA;AAC9B,aAAW,CAAC,GAAGhC,CAAS,KAAK+B,EAAS,WAAW,WAAW;AAC1D,UAAME,IAAO,MAAMxC,EAAO,QAAQO,CAAS,GACrCkC,IAAQC,GAAQF,EAAK,IAAI,GACzBtC,IAA0B,CAAA;AAChC,IAAIsC,EAAK,UAAU,cACjBtC,EAAS,KAAK;AAAA,MACZ,MAAM;AAAA,MACN,SAAS;AAAA,MACT,WAAWK,EAAU;AAAA,IAAA,CACtB,GAEC,MAAM,KAAK,CAACoC,GAAYH,EAAK,eAAeF,EAAS,OAAO,KAC9DpC,EAAS,KAAK;AAAA,MACZ,MAAM;AAAA,MACN,SAAS,qBAAqBoC,EAAS,QAAQ,KAAK,IAAI,CAAC,oBAAoBE,EAAK,cAAc,KAAK,IAAI,CAAC;AAAA,MAC1G,WAAWjC,EAAU;AAAA,IAAA,CACtB;AAEH,eAAW9D,KAAK6F,EAAS,aAAa,OAAO,CAACM,MAAMA,EAAE,cAAc,CAAC,GAAG;AACtE,YAAMC,IAAQJ,EAAM;AAAA,QAClB,CAAC1E,MACCA,EAAE,aAAa,qBACfA,EAAE,QAAQ,QAAW,MAAM,WAAW,EAAE,SAAStB,EAAE,KAAK;AAAA,MAAA,GAEtDqG,IAAQL,EAAM;AAAA,QAClB,CAAC1E,MACCqE,GAAe3F,EAAE,MAAM,EAAE,SAASsB,EAAE,QAAQ,KAC5CA,EAAE,QAAQ,QAAW,MAAM,WAAW,EAAE,SAAStB,EAAE,KAAK;AAAA,MAAA;AAE5D,OAAIoG,EAAM,SAAS,KAAKC,EAAM,WAAW,MACvC5C,EAAS,KAAK;AAAA,QACZ,MAAM;AAAA,QACN,SAAS,qBAAqBzD,EAAE,MAAM,aAAaA,EAAE,KAAK,KAAKA,EAAE,MAAM,gBACrEoG,EAAM,SAAS,IAAI,oBAAoB,SACzC;AAAA,QACA,WAAWtC,EAAU;AAAA,MAAA,CACtB;AAAA,IAEL;AACA,UAAMwC,IAAYN,EACf,OAAO,CAAC1E,MAAMA,EAAE,SAAS,SAAS,MAAM,KAAKA,EAAE,kBAAkB,IAAI,EACrE,IAAI,CAACA,MAAMA,EAAE,aAAc,GACxBiF,IAAgBD,EAAU,SAAS,IAAI,KAAK,IAAI,GAAGA,CAAS,IAAI;AACtE,IACEb,EAAQ,cAAc,UACtBc,MAAkB,QAClBA,IAAgBd,EAAQ,aAExBhC,EAAS,KAAK;AAAA,MACZ,MAAM;AAAA,MACN,SAAS,wBAAwB8C,CAAa,gCAAgCd,EAAQ,SAAS;AAAA,MAC/F,WAAW3B,EAAU;AAAA,IAAA,CACtB,GAEHgC,EAAQ,KAAK;AAAA,MACX,WAAAhC;AAAA,MACA,MAAAiC;AAAA,MACA,WAAWC,EAAM,IAAI,CAAC1E,MAAMA,EAAE,QAAQ;AAAA,MACtC,eAAAiF;AAAA,MACA,UAAA9C;AAAA,IAAA,CACD;AAAA,EACH;AACA,SAAOqC;AACT;AAEA,MAAMU,KAAQ,IAAI,IAAI,OAAO,OAAOb,EAAc,EAAE,MAAM,GACpDc,yBAAmB,IAAI,CAAC,YAAY,UAAU,UAAU,YAAY,CAAC;AASpE,SAASC,GACd5C,GACAiC,GACe;AACf,SAAOE,GAAQF,EAAK,IAAI,EACrB,OAAO,CAAC,MAAM,EAAE,aAAa,QAAQ,EACrC,QAAQ,CAACY,MAAW;AACnB,UAAMC,IAASC,GAAWF,CAAM;AAChC,WAAOC,IACH;AAAA,MACE;AAAA,QACE,MAAM;AAAA,QACN,SAAS,UAAUD,EAAO,QAAQ,SAAY,EAAE,gBAAgBC,EAAO,QAAQ,GAC7EA,EAAO,QAAQ,SAAY,KAAKA,EAAO,QAAQ,MAAS,KAAK,EAC/D;AAAA,QACA,WAAW9C,EAAU;AAAA,MAAA;AAAA,IACvB,IAEF,CAAA;AAAA,EACN,CAAC;AACL;AAGA,SAAS+C,GAAWF,GAAwC;AAC1D,WAASrF,IAAIqF,EAAO,SAAS,CAAC,GAAGrF,GAAGA,IAAIA,EAAE,SAAS,CAAC,GAAG;AACrD,QAAIkF,GAAM,IAAIlF,EAAE,QAAQ,EAAG;AAI3B,QAHIA,EAAE,aAAa,qBAIjBA,EAAE,aAAa,cACf2E,GAAQ3E,CAAC,EACN,MAAM,CAAC,EACP,MAAM,CAACZ,MAAM+F,GAAa,IAAI/F,EAAE,QAAQ,CAAC;AAE5C,aAAOY;AAAA,EAEX;AAEF;AAEA,SAAS2E,GAAQxE,GAA4B;AAC3C,SAAO,CAACA,GAAM,GAAGA,EAAK,SAAS,QAAQwE,EAAO,CAAC;AACjD;AAEA,SAASC,GAAYY,GAAaC,GAAsB;AACtD,SAAOD,EAAE,WAAWC,EAAE,UAAUD,EAAE,MAAM,CAACX,GAAGtE,MAAMsE,MAAMY,EAAElF,CAAC,CAAC;AAC9D;AClKO,SAASmF,GACdxD,GACAiC,IAAuB,IACP;AAChB,QAAM7C,IAAsB,CAAA;AAC5B,aAAWnB,KAAQ+B,EAAM,MAAM,OAAA,GAAU;AACvC,UAAMyD,IAASxF,EAAK,UAAU,OAAO,GAC/ByF,IACJzF,EAAK,mBAAmB,WACvBA,EAAK,eAAe,OAAO,UAAU,KAAK,MAC1CA,EAAK,eAAe,SAAS,UAAU,KAAK;AAC/C,IAAIwF,KAAU,CAACC,KACbtE,EAAI,KAAK;AAAA,MACP,MAAMnB,EAAK;AAAA,MACX,SAAS,kBAAkB,CAAC,GAAGA,EAAK,SAAS,EAAE,KAAK,IAAI,CAAC;AAAA,IAAA,CAC1D;AAEH,eAAWkC,KAAKlC,EAAK,OAAO,OAAA;AAC1B,MAAIkC,EAAE,SAAS,aACTA,EAAE,QAAQ,IAAI,kBAAkB,KAClCf,EAAI,KAAK;AAAA,QACP,MAAMnB,EAAK;AAAA,QACX,OAAOkC,EAAE;AAAA,QACT,SACE;AAAA,MAAA,CACH,GAECA,EAAE,QAAQ,IAAI,SAAS,KACzBf,EAAI,KAAK;AAAA,QACP,MAAMnB,EAAK;AAAA,QACX,OAAOkC,EAAE;AAAA,QACT,SACE;AAAA,MAAA,CACH,IAIHA,EAAE,SAAS,kBACXA,EAAE,QACFA,EAAE,gBAAgB,UAClB,CAAC8B,EAAQ,cAET7C,EAAI,KAAK;AAAA,QACP,MAAMnB,EAAK;AAAA,QACX,OAAOkC,EAAE;AAAA,QACT,SACE;AAAA,MAAA,CACH;AAAA,EAGP;AACA,SAAOf;AACT;ACtCA,eAAsBuE,GACpB5D,GACAC,GACAiC,IAAmD,CAAA,GAC9B;AACrB,QAAM2B,IAAS3B,EAAQ,UAAU,KAC3B4B,IAAoB,EAAE,OAAO,CAAA,GAAI,SAAS,CAAA,EAAC;AACjD,aAAW5F,KAAQ+B,EAAM,MAAM,OAAA,GAAU;AACvC,UAAMe,IAAQ7F,EAAK+C,EAAK,OAAO,CAAC,CAAE,GAC5B6F,IAAa;AAAA,MACjB,EAAE,MAAM,YAAY/C,CAAK,0BAA0B,QAAQ,CAAA,EAAC;AAAA,IAAE,GAE1DgD,IAAO,CAAC,GAAG9F,EAAK,OAAO,OAAA,CAAQ,EAAE;AAAA,MACrC,CAACkC,MAAMA,EAAE,SAAS,kBAAkBA,EAAE;AAAA,IAAA;AAExC,eAAWA,KAAK4D,GAAM;AACpB,UAAI5D,EAAE,SAAS,eAAgB;AAE/B,YAAMpC,IAASoC,EAAE,QACd,IAAI,CAACjD,MAAM8C,EAAM,MAAM,IAAI9C,CAAC,EAAG,OAAO,CAAC,CAAE,EACzC,IAAI,CAACK,MAAM,KAAKrC,EAAKqC,CAAC,CAAC,EAAE,EACzB,KAAK,MAAM,GACRW,IAAQ,KAAKhD,EAAKiF,EAAE,IAAI,CAAC,KACzB6D,KACH7D,EAAE,cAAc,QAAQ,IAAIjC,CAAK,UAAU,KAAKA,CAAK,UACtD,UAAUH,CAAM;AAClB,MAAA+F,EAAW,KAAK;AAAA,QACd,MAAM,YAAY/C,CAAK,0CAA0CiD,CAAK;AAAA,QACtE,QAAQ,EAAE,QAAAJ,EAAA;AAAA,MAAO,CAClB;AAAA,IACH;AACA,UAAM,CAACK,GAAO,GAAGC,CAAO,IAAI,MAAMnE,EAAO,IAAI+D,GAAY;AAAA,MACvD,MAAM;AAAA,MACN,WAAW7B,EAAQ;AAAA,IAAA,CACpB;AACD,IAAA4B,EAAM,MAAM5F,EAAK,IAAI,IAAI,OAAOgG,EAAO,KAAK,CAAC,GAAI,KAAQ,CAAC,GAC1DF,EAAK,QAAQ,CAAC5D,GAAG9B,MAAM;AACrB,YAAM8F,IAASD,EAAQ7F,CAAC,EAAG,KAAK,IAAI,CAACwD,MAAM,OAAOA,EAAE,CAAI,CAAC,EAAE;AAAA,QACzD,CAACyB,GAAGC,MAAMD,IAAIC;AAAA,MAAA;AAEhB,MAAAM,EAAM,QAAQ,GAAG5F,EAAK,IAAI,IAAIkC,EAAE,IAAI,EAAE,IAAIiE,GAAUD,CAAM;AAAA,IAC5D,CAAC;AAAA,EACH;AACA,SAAON;AACT;AAEA,SAASO,GAAUD,GAA+B;AAChD,QAAM3D,IAAK,CAAC6D,MACVF,EAAO,WAAW,IACd,IACAA,EAAO,KAAK,IAAIA,EAAO,SAAS,GAAG,KAAK,MAAME,IAAIF,EAAO,MAAM,CAAC,CAAC;AACvE,SAAO;AAAA,IACL,SAASA,EAAO;AAAA,IAChB,MACEA,EAAO,WAAW,IACd,IACAA,EAAO,OAAO,CAACb,GAAGC,MAAMD,IAAIC,GAAG,CAAC,IAAIY,EAAO;AAAA,IACjD,QAAQ3D,EAAG,GAAG;AAAA,IACd,KAAKA,EAAG,IAAI;AAAA,IACZ,KAAK2D,EAAO,WAAW,IAAI,IAAIA,EAAOA,EAAO,SAAS,CAAC;AAAA,EAAA;AAE3D;ACpDO,SAASG,GACdC,GACAvE,GACAiC,IAII,CAAA,GACY;AAChB,SAAO;AAAA,IACL,GAAGsC;AAAA,IACH,OAAAvE;AAAA,IACA,QAAQ,CAAA;AAAA,IACR,MAAM,oBAAI,IAAI,CAAC,MAAM,CAAC;AAAA,IACtB,OAAO,EAAE,QAAQ,oBAAI,OAAO,eAAe,oBAAI,MAAI;AAAA,IACnD,KAAKiC,EAAQ;AAAA,IACb,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,SAASA,EAAQ,WAAW,oBAAI,IAAA;AAAA,IAChC,gBAAgBA,EAAQ;AAAA,IACxB,8BAAc,IAAA;AAAA,IACd,cAAc,CAAA;AAAA,EAAC;AAEnB;AAGO,SAASuC,EAAKC,GAAqBpJ,GAAsB;AAC9D,QAAMH,IAAO,IAAI,OAAO,KAAKuJ,EAAI,MAAM,EAAE,MAAM;AAC/C,SAAAA,EAAI,OAAOvJ,CAAI,IAAIG,GACZF,GAAMD,CAAI;AACnB;AAGO,SAASwJ,GAASD,GAAqBF,GAAsB;AAClE,MAAII,IAAYJ;AAChB,WAASlG,IAAI,GAAGoG,EAAI,KAAK,IAAIE,CAAS,GAAGtG,IAAK,CAAAsG,IAAY,GAAGJ,CAAI,GAAGlG,CAAC;AACrE,SAAAoG,EAAI,KAAK,IAAIE,CAAS,GACfA;AACT;ACzDO,MAAMC,WAAmB,MAAM;AAAA,EAC3B;AAAA,EAET,YAAYC,GAA0B;AACpC;AAAA,MACE,yCAAyCA,EAAS,MAAM,IAAIA,EAAS,WAAW,IAAI,YAAY,UAAU;AAAA,IACxGA,EAAS,IAAI,CAACzH,MAAM,SAAS0H,GAAc1H,CAAC,CAAC,EAAE,KAAK;AAAA,CAAI;AAAA,IAAA,GAE5D,KAAK,OAAO,cACZ,KAAK,WAAWyH;AAAA,EAClB;AACF;AAEO,SAASC,GAAc1H,GAAyB;AACrD,QAAMC,IACJD,EAAE,QAAQA,EAAE,QAAQ,GAAGA,EAAE,IAAI,IAAIA,EAAE,KAAK,KAAMA,EAAE,QAAQA,EAAE;AAC5D,SAAOC,IAAQ,GAAGA,CAAK,KAAKD,EAAE,OAAO,KAAKA,EAAE;AAC9C;AAcO,SAAS2H,EACdC,GACAvE,GACAwE,GACAC,IAAsC,CAAA,GACxB;AACd,SAAO,IAAIC,GAAa1E,GAAS;AAAA,IAC/B,YAAY,EAAE,MAAAuE,GAAM,GAAGE,EAAA;AAAA,IACvB,eAAeD,aAAiB,QAAQA,IAAQ;AAAA,EAAA,CACjD;AACH;ACzBO,SAASG,GACdX,GACAvC,GACAmD,GACApD,IAA4B,CAAA,GACtB;AACN,MACEC,MAAS,oBACTA,MAAS,mBACTA,MAAS,iBACT;AACA,UAAMxE,IAAIgH,GAASD,GAAK,OAAO,GACzBa,IAAgB;AAAA,MACpB,MAAM;AAAA,MACN,UAAU5H;AAAA,MACV,MAAA2H;AAAA,MACA,OAAOtJ,GAAOd,EAAEyC,CAAC,GAAG,EAAI;AAAA,MACxB,YAAYzB,GAAG,QAAQhB,EAAEyC,CAAC,CAAC;AAAA,IAAA;AAO7B,WAAO0H,GAAcX,GALV;AAAA,MACT,gBAAgB;AAAA,MAChB,eAAe;AAAA,MACf,eAAe;AAAA,IAAA,EAEYvC,CAAI,GAAGoD,CAAO;AAAA,EAC7C;AACA,QAAM3C,IAAI+B,GAASD,GAAK,OAAO,GAEzBN,IAAe;AAAA,IACnB,MAAM;AAAA,IACN,UAAUxB;AAAA,IACV,MAAA0C;AAAA,IACA,OAAOtJ,GAAOd,EAAE0H,CAAC,GAAG,EAAI;AAAA,IACxB,YAAY;AAAA,EAAA,GAERlG,IAAMiI,GAASD,GAAK,SAAS,GAC7Bc,IAAOb,GAASD,GAAK,UAAU,GAC/BpI,IAAO,CAACmJ,GAAYC,OAAsB;AAAA,IAC9C,MAAM;AAAA,IACN,aAAahJ;AAAA,IACb,MAAA+I;AAAA,IACA,UAAUD;AAAA,IACV,MAAMpB;AAAA,IACN,MAAAsB;AAAA,EAAA;AAEF,UAAQvD,GAAA;AAAA,IACN,KAAK;AACH,aAAOjG,GAAG,QAAQkI,CAAM;AAAA,IAC1B,KAAK;AAAA,IACL,KAAK;AACH,aAAO9H,EAAKjB,EAAI,IAAI,GAAG;AAAA,QACrB,MAAM;AAAA,QACN,MAAM;AAAA,UACJ,MAAM;AAAA,UACN,IAAI;AAAA,UACJ,MAAMW,GAAOd,EAAEwB,CAAG,CAAC;AAAA,UACnB,OAAOhB,EAAIyG,MAAS,QAAQ,MAAM,KAAKjH,EAAEsK,CAAI,GAAGtK,EAAEwB,CAAG,CAAC;AAAA,QAAA;AAAA,QAExD,MAAMxB,EAAEsK,CAAI;AAAA,QACZ,MAAMtK,EAAEwB,CAAG;AAAA,MAAA,CACZ;AAAA,IACH,KAAK;AAAA,IACL,KAAK;AACH,aAAOJ,EAAKjB,EAAI,IAAI,GAAG;AAAA,QACrB,MAAM;AAAA,QACN,MAAM;AAAA,UACJ,MAAM;AAAA,UACN,IAAI;AAAA,UACJ,MAAMW,GAAOd,EAAEwB,CAAG,CAAC;AAAA,UACnB,OAAOhB;AAAA,YACLyG,MAAS,aAAa,MAAM;AAAA,YAC5BjG,GAAG,QAAQhB,EAAEsK,CAAI,CAAC;AAAA,YAClBtJ,GAAG,QAAQhB,EAAEwB,CAAG,CAAC;AAAA,UAAA;AAAA,QACnB;AAAA,QAEF,MAAMxB,EAAEsK,CAAI;AAAA,QACZ,MAAMtK,EAAEwB,CAAG;AAAA,MAAA,CACZ;AAAA,IACH,KAAK;AACH,aAAOwF,EAAQ,WACXyD,EAAA,IACArJ,EAAKjB,EAAI,CAAC,GAAGK,EAAI,KAAKR,EAAEwB,CAAG,GAAGxB,EAAEsK,CAAI,CAAC,CAAC;AAAA,IAC5C,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,MAAM9J,EAAI,KAAKQ,GAAG,QAAQkI,CAAM,GAAG/I,EAAI,CAAC,CAAC;AAAA,QACzC,MAAMA,EAAI,IAAI;AAAA,QACd,MAAMK;AAAA,UACJ;AAAA,UACAwG,EAAQ,WACJyD,EAAA,IACAzJ,GAAG,WAAWI,EAAKjB,EAAI,CAAC,GAAGK,EAAI,KAAKR,EAAEwB,CAAG,GAAGxB,EAAEsK,CAAI,CAAC,CAAC,CAAC;AAAA,UACzDtJ,GAAG,QAAQkI,CAAM;AAAA,QAAA;AAAA,MACnB;AAAA,EACF;AAGJ,WAASuB,IAAoB;AAC3B,WAAOrJ,EAAKjB,EAAI,IAAI,GAAG;AAAA,MACrB,MAAM;AAAA,MACN,MAAMW,GAAOd,EAAEwB,CAAG,CAAC;AAAA,MACnB,MAAMxB,EAAEsK,CAAI;AAAA,MACZ,MAAM9J,EAAI,KAAKR,EAAEwB,CAAG,GAAGxB,EAAEsK,CAAI,CAAC;AAAA,IAAA,CAC/B;AAAA,EACH;AACF;AAMO,SAASI,GAAclB,GAAqBmB,GAAkB;AACnE,QAAMnJ,IAAMiI,GAASD,GAAK,MAAM,GAC1BnD,IAAIoD,GAASD,GAAK,UAAU;AAClC,SAAOxI,GAAG,QAAQ;AAAA,IAChB,MAAM;AAAA,IACN,aAAaQ;AAAA,IACb,MAAM,EAAE,MAAM,QAAQ,OAAO,CAAA,EAAC;AAAA,IAC9B,UAAU6E;AAAA,IACV,MAAMsE;AAAA,IACN,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,MAAMnK,EAAI,MAAMR,EAAEqG,CAAC,GAAGrG,EAAEwB,CAAG,CAAC;AAAA,MAC5B,MAAMxB,EAAEwB,CAAG;AAAA,MACX,MAAMhB,EAAI,KAAKR,EAAEwB,CAAG,GAAG,EAAE,MAAM,QAAQ,OAAO,CAACxB,EAAEqG,CAAC,CAAC,GAAG;AAAA,IAAA;AAAA,EACxD,CACD;AACH;ACxJO,MAAMuE;AAAA;AAAA,EAAkC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAA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"}