@loradb/lora-graphql 0.21.0 → 0.22.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.
- package/README.md +500 -77
- package/dist/analyze/access.d.ts +45 -2
- package/dist/analyze/statistics.d.ts +1 -0
- package/dist/cli.js +386 -323
- package/dist/cli.js.map +1 -1
- package/dist/compile/auth.d.ts +49 -0
- package/dist/compile/cache.d.ts +11 -1
- package/dist/compile/context.d.ts +20 -0
- package/dist/compile/cost.d.ts +36 -0
- package/dist/compile/read.d.ts +7 -0
- package/dist/{diff-CcRU-3_p.js → diff-B9iDdELF.js} +13 -12
- package/dist/{diff-CcRU-3_p.js.map → diff-B9iDdELF.js.map} +1 -1
- package/dist/driver-C5dSoSD8.js +13905 -0
- package/dist/driver-C5dSoSD8.js.map +1 -0
- package/dist/driver.d.ts +2 -0
- package/dist/errors.d.ts +29 -1
- package/dist/execute/budget.d.ts +22 -0
- package/dist/execute/changes.d.ts +2 -0
- package/dist/execute/cypher-mutation.d.ts +4 -1
- package/dist/execute/mutate.d.ts +29 -1
- package/dist/guards.d.ts +19 -1
- package/dist/index.d.ts +3 -3
- package/dist/index.js +19 -17
- package/dist/lora-graphql.d.ts +120 -13
- package/dist/model/desugar.d.ts +10 -0
- package/dist/model/directives.d.ts +1 -1
- package/dist/model/inputs.d.ts +9 -0
- package/dist/model/types.d.ts +46 -3
- package/dist/model/unique-together.d.ts +3 -0
- package/dist/schema/build.d.ts +6 -1
- package/dist/testing.js +1 -1
- package/package.json +2 -2
- package/dist/driver-DAtBEMWj.js +0 -11845
- package/dist/driver-DAtBEMWj.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"driver-DAtBEMWj.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/errors.ts","../src/model/types.ts","../src/compile/context.ts","../src/model/points.ts","../src/model/relations.ts","../src/compile/aggregate.ts","../src/compile/filter.ts","../src/compile/auth.ts","../src/analyze/access.ts","../src/analyze/statistics.ts","../src/compile/cache.ts","../src/model/directives.ts","../src/model/positions.ts","../src/model/desugar.ts","../src/model/inputs.ts","../src/model/build.ts","../src/schema/names.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 /** Inline `{key: value}` properties: a start node seeks on them. */\n properties?: Array<{ key: string; value: Expr }>;\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 const props = n.properties?.length\n ? ` {${n.properties.map((p) => `${name(p.key)}: ${printExpr(p.value)}`).join(\", \")}}`\n : \"\";\n return `(${n.variable ? name(n.variable) : \"\"}${labels}${props})`;\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\n/**\n * `text` with the same length and offsets, strings and comments blanked\n * and the insides of backtick-quoted names replaced by `_`, so structure\n * (brackets, commas, keywords) can be read without being fooled by them.\n */\nexport function maskLiterals(text: string): string {\n let out = \"\";\n let i = 0;\n while (i < text.length) {\n const c = text[i]!;\n let end: number;\n if (c === \"'\" || c === '\"') {\n end = skipQuoted(text, i, c);\n out += \" \".repeat(end - i);\n } else if (c === \"`\") {\n const close = text.indexOf(\"`\", i + 1);\n end = close < 0 ? text.length : close + 1;\n out +=\n \"`\" + \"_\".repeat(Math.max(0, end - i - 2)) + (close < 0 ? \"\" : \"`\");\n } else if (c === \"/\" && text[i + 1] === \"/\") {\n const nl = text.indexOf(\"\\n\", i);\n end = nl < 0 ? text.length : nl;\n out += \" \".repeat(end - i);\n } else if (c === \"/\" && text[i + 1] === \"*\") {\n const close = text.indexOf(\"*/\", i + 2);\n end = close < 0 ? text.length : close + 2;\n out += text.slice(i, end).replace(/[^\\n]/g, \" \");\n } else {\n end = i + 1;\n out += c;\n }\n i = end;\n }\n return out;\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 * Lint-level observations that do not fail a check: label scans inside\n * a `CALL { }` body, such as a `@cypher` statement's own access path.\n * They are the statement's author's to review, not the root field's.\n */\n notes: 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 // The root field's access path is the part of the plan outside every\n // CALL { } body; scans inside one belong to that subquery (a @cypher\n // statement, a nested list) and are reported as notes, not blamed on\n // the root.\n const outer = flattenOuter(plan.tree);\n const inner = nodes.filter((n) => !outer.includes(n));\n const findings: PlanFinding[] = [];\n const notes: PlanFinding[] = inner\n .filter((n) => n.operator === \"NodeByLabelScan\")\n .map((n) => ({\n rule: \"full-scan\" as const,\n message: `a subquery scans :${n.details[\"labels\"] ?? \"?\"} (NodeByLabelScan), e.g. a @cypher statement's own MATCH`,\n statement: statement.text,\n }));\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 = outer.filter(\n (n) =>\n n.operator === \"NodeByLabelScan\" &&\n n.details[\"labels\"]?.split(/[,:|&\\s]+/).includes(e.label),\n );\n const seeks = outer.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 notes,\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\n/** Like flatten, without the bodies of `CallSubquery` (its later children). */\nfunction flattenOuter(node: PlanNode): PlanNode[] {\n const children =\n node.operator === \"CallSubquery\"\n ? node.children.slice(0, 1)\n : node.children;\n return [node, ...children.flatMap(flattenOuter)];\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 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\n/**\n * `@mutation` types with a generated write no rule guards: any caller\n * that reaches the API can make it. An error in `check()`, unless the type\n * declares the operation open with `@authorization(public: [...])`. A\n * write is guarded by `@authentication` for it, a filter or validate rule\n * for it (a `@authorizationDefaults(mutations:)` default included), or a\n * schema bypass alone does not count: it only lets some callers skip rules.\n */\nexport function unguardedMutations(model: GraphModel): ModelWarning[] {\n const out: ModelWarning[] = [];\n for (const node of model.nodes.values()) {\n const rules = [\n ...(node.authorization?.filter ?? []),\n ...(node.authorization?.validate ?? []),\n ];\n const open = [...node.mutations].filter(\n (op) =>\n !node.authentication?.has(op) &&\n !rules.some((r) => r.operations.has(op)) &&\n !node.authorization?.public?.has(op),\n );\n if (open.length > 0) {\n out.push({\n type: node.name,\n message: `${open.join(\", \")} ${open.length === 1 ? \"has\" : \"have\"} no @authentication or @authorization rule: any caller that reaches the API can make ${open.length === 1 ? \"it\" : \"them\"}. Guard ${open.length === 1 ? \"it\" : \"them\"}, or declare @authorization(public: [${open.join(\", \")}])`,\n });\n }\n }\n return out;\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 | \"PERSISTED_QUERY_ONLY\"\n | \"WRONG_OPERATION_TYPE\";\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","// The validated graph model: what the annotated SDL says about labels,\n// properties, relationships and the API surface. Everything downstream\n// (schema generation, compilation, index inference) reads only this.\n\nexport type ScalarType =\n | \"String\"\n | \"ID\"\n | \"Int\"\n | \"Float\"\n | \"Boolean\"\n | \"BigInt\"\n | \"Date\"\n | \"Time\"\n | \"LocalTime\"\n | \"DateTime\"\n | \"LocalDateTime\"\n | \"Duration\"\n | \"Point\"\n | \"CartesianPoint\"\n /** A user-declared enum, stored as its value name. */\n | \"Enum\";\n\nexport type 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\nexport type IndexKind = \"RANGE\" | \"TEXT\" | \"POINT\";\n\nexport type MutationOperation = \"CREATE\" | \"UPDATE\" | \"DELETE\";\nexport type AuthOperation =\n | \"READ\"\n | MutationOperation\n | \"CREATE_RELATIONSHIP\"\n | \"DELETE_RELATIONSHIP\"\n | \"SUBSCRIBE\"\n | RelationshipOperation;\n\n/** Operations of rules on a relationship field, over `source`, `target`, `edge`. */\nexport type RelationshipOperation =\n | \"CONNECT\"\n | \"DISCONNECT\"\n | \"UPDATE_EDGE\"\n | \"READ_EDGE\";\n\nexport const RELATIONSHIP_OPERATIONS: ReadonlySet<AuthOperation> = new Set([\n \"CONNECT\",\n \"DISCONNECT\",\n \"UPDATE_EDGE\",\n \"READ_EDGE\",\n]);\n\n/** Field-level options shared by every field kind. */\ninterface FieldBase {\n /** Operations on which reading this field needs an authenticated request. */\n authentication: ReadonlySet<AuthOperation> | undefined;\n /** Claims `@authentication(jwt:)` requires, when set. */\n authenticationJwt?: AuthorizationWhere | undefined;\n /** Field-level `@authorization` (validate rules only). */\n authorization?: Authorization | undefined;\n}\n\nexport interface ScalarField extends FieldBase {\n kind: \"scalar\";\n /** API field name. */\n name: string;\n /** Stored property name (differs from `name` under `@alias`). */\n property: string;\n type: ScalarType;\n /** Enum type name when `type` is `Enum`. */\n enumName: string | undefined;\n /** The custom scalar clients see, when the field is one (`@storedAs`). */\n customScalar?: string | undefined;\n list: boolean;\n required: boolean;\n key: boolean;\n unique: boolean;\n private: boolean;\n relayId: boolean;\n filters: ReadonlySet<FilterOperator>;\n sortable: boolean;\n /** `@groupBy`: a grouping key of `<plural>Grouped`. */\n groupBy: boolean;\n /** Indexes requested explicitly with `@index`. */\n indexes: readonly IndexKind[];\n /** `@key(generate: true)`: creates fill a UUID when the input omits it. */\n generate: boolean;\n /**\n * `@key(scope: VIEWER)`: a created key starts with the caller's `@viewer`\n * claim and `separator`.\n */\n keyScope?: { separator: string } | undefined;\n /** `@default(value:)`, stored on create when the input omits the field. */\n defaultValue: { value: unknown } | undefined;\n /** `@timestamp`: set to the current time by these operations. */\n timestamp: ReadonlySet<\"CREATE\" | \"UPDATE\"> | undefined;\n /** Never client-settable (`@readonly`, `@timestamp`, `@private`). */\n readonly: boolean;\n /** `@settable`: which mutations may set it (both false when readonly). */\n settableOn: { create: boolean; update: boolean };\n /** `@selectable`: readable (false: write-only), and aggregatable. */\n selectableOn: { read: boolean; aggregate: boolean };\n /** `@populatedBy`: a named callback computes it on these operations. */\n populatedBy:\n | { callback: string; operations: ReadonlySet<\"CREATE\" | \"UPDATE\"> }\n | undefined;\n /**\n * Set on the stand-in for a `@filterable` / `@sortable` `@cypher` field:\n * its value is the statement's, computed per row, not a property.\n */\n computedBy?: CypherField;\n /** `@vector`: stored as a VECTOR, searchable by similarity. */\n vector:\n | { dimensions: number; similarity: \"COSINE\" | \"EUCLIDEAN\" }\n | undefined;\n description: string | undefined;\n}\n\nexport type NestedOperation =\n | \"CREATE\"\n | \"CONNECT\"\n | \"DISCONNECT\"\n | \"UPDATE\"\n | \"DELETE\";\n\nexport interface RelationshipField extends FieldBase {\n kind: \"relationship\";\n name: string;\n /** Node type that declares the field. */\n owner: string;\n /** Relationship type, e.g. `IN_GENRE`. */\n type: string;\n direction: \"IN\" | \"OUT\";\n /** Target node type name. */\n target: string;\n list: boolean;\n required: boolean;\n /** `@relationshipProperties` type name. */\n properties: string | undefined;\n /**\n * The concrete @node types the field reaches: the target itself, or an\n * interface's implementations / a union's members.\n */\n members: readonly string[];\n /** For a member copy of a polymorphic field: the field it came from. */\n via?: RelationshipField | undefined;\n filterable: boolean;\n /** UNDIRECTED: reads follow the relationship both ways. */\n queryDirection: \"DIRECTED\" | \"UNDIRECTED\";\n /** What deleting the owner does to nodes reached through the field. */\n onDelete: \"DETACH\" | \"CASCADE\" | \"RESTRICT\";\n /** Nested writes mutation inputs offer for the field. */\n nestedOperations: ReadonlySet<NestedOperation>;\n /**\n * `@settable` / `@readonly`: whether create and update inputs offer the\n * field at all (an upsert of an existing node keeps its relationship).\n */\n settableOn: { create: boolean; update: boolean };\n /** Whether the field's connection and filters offer aggregates. */\n aggregate: boolean;\n cardinality: number | undefined;\n limit: PageLimit | undefined;\n description: string | undefined;\n}\n\n/** How a `@cypher` field's value, or one of its arguments, is typed. */\nexport interface TypeShape {\n /** Named type: a scalar, enum or (for results) node type name. */\n named: string;\n list: boolean;\n required: boolean;\n itemRequired: boolean;\n}\n\nexport interface CypherArgument {\n name: string;\n type: TypeShape;\n defaultValue: unknown;\n description: string | undefined;\n}\n\nexport interface CypherField extends FieldBase {\n kind: \"cypher\";\n name: string;\n /** Node type name, or `Query` / `Mutation` for root fields. */\n owner: string;\n statement: string;\n /** The result column holding the field's value. */\n columnName: string;\n /** The field's type; `node` names a @node type when it returns nodes. */\n type: TypeShape;\n node: string | undefined;\n /** An interface or union over @node types, when it returns those. */\n abstract: string | undefined;\n /** A plain object type (no @node), when it returns maps. */\n object: string | undefined;\n args: readonly CypherArgument[];\n /** `$parameters` the statement uses, in order of first use. */\n params: readonly string[];\n /**\n * `@filterable` / `@sortable`: a scalar stand-in for filters and sorts,\n * whose value the statement computes per row (never through an index).\n */\n computed: ScalarField | undefined;\n description: string | undefined;\n}\n\n/**\n * A field computed in JavaScript (`@customResolver`): never stored or\n * filtered; `requires` is fetched with the node so the resolver can use it.\n */\nexport interface CustomField extends FieldBase {\n kind: \"custom\";\n name: string;\n owner: string;\n /** Selection on the owner type, e.g. `name genre { name }`. */\n requires: string | undefined;\n type: TypeShape;\n description: string | undefined;\n}\n\nexport type Field = ScalarField | RelationshipField | CypherField | CustomField;\n\n/** A `${jwt.path}` / `${context.path}` placeholder inside a rule string. */\nexport const PLACEHOLDER = /\\$\\{(jwt|context|viewer)\\.([A-Za-z0-9_.]+)\\}/g;\n\n/** `{ node, jwt, AND, OR, NOT }`, as written in `@authorization`. */\nexport type AuthorizationWhere = Record<string, unknown>;\n\nexport interface AuthorizationFilterRule {\n operations: ReadonlySet<AuthOperation>;\n requireAuthentication: boolean;\n /** `requireAuthentication` was left to its default (true). */\n requireAuthenticationDefaulted?: boolean;\n where: AuthorizationWhere;\n}\n\nexport interface AuthorizationValidateRule {\n operations: ReadonlySet<AuthOperation>;\n when: ReadonlySet<\"BEFORE\" | \"AFTER\">;\n requireAuthentication: boolean;\n /** `requireAuthentication` was left to its default (true). */\n requireAuthenticationDefaulted?: boolean;\n where: AuthorizationWhere;\n}\n\nexport interface Authorization {\n filter: readonly AuthorizationFilterRule[];\n validate: readonly AuthorizationValidateRule[];\n /** `bypass: false`: the schema's bypass does not skip these rules. */\n bypass?: boolean;\n /** `public:` operations deliberately open to every caller. */\n public?: ReadonlySet<AuthOperation>;\n /**\n * `mask:` on a scalar field: a row failing `unless` reads the field as\n * `value`, in projections and filters alike.\n */\n mask?: ReadonlyArray<{ unless: AuthorizationWhere; value: unknown }>;\n}\n\nexport interface PageLimit {\n default: number;\n max: number;\n}\n\nexport interface NodeType {\n name: string;\n /** First label is the primary label every MATCH uses. */\n labels: readonly string[];\n /** Plural used for root fields, e.g. `festivals`. */\n plural: string;\n fields: ReadonlyMap<string, Field>;\n key: ScalarField;\n read: boolean;\n aggregate: boolean;\n /** Generated mutations; empty unless `@mutation`. */\n mutations: ReadonlySet<MutationOperation>;\n /** Change events to subscribe to; empty unless `@subscription`. */\n subscriptions: ReadonlySet<MutationOperation>;\n /** `@subscription(relationships:, previousState:)`. */\n subscriptionOptions: { relationships: boolean; previousState: boolean };\n limit: PageLimit;\n /** Operations that need an authenticated request. */\n authentication: ReadonlySet<AuthOperation> | undefined;\n /** Claims `@authentication(jwt:)` requires, when set. */\n authenticationJwt: AuthorizationWhere | undefined;\n authorization: Authorization | undefined;\n /** Full-text and vector indexes with their search root fields. */\n search: readonly SearchIndex[];\n /** Interfaces the type implements. */\n interfaces: readonly string[];\n description: string | undefined;\n}\n\nexport type SearchIndex =\n | {\n kind: \"fulltext\";\n name: string;\n fields: readonly ScalarField[];\n analyzer: \"STANDARD\" | \"SIMPLE\";\n /** Root field, e.g. `searchFestivals`. */\n queryName: string;\n }\n | {\n kind: \"vector\";\n name: string;\n field: ScalarField;\n dimensions: number;\n similarity: \"COSINE\" | \"EUCLIDEAN\";\n queryName: string;\n };\n\n/** An interface over @node types, or a union of them. */\nexport interface AbstractType {\n kind: \"interface\" | \"union\";\n name: string;\n /** Concrete @node types: implementations or members. */\n members: readonly string[];\n /** An interface's scalar fields, as declared on the interface. */\n fields: ReadonlyMap<string, ScalarField>;\n /**\n * An interface's `@declareRelationship` fields: every implementation has\n * a relationship field of that name, target and shape.\n */\n relationships: ReadonlyMap<string, DeclaredRelationship>;\n plural: string;\n read: boolean;\n limit: PageLimit;\n description: string | undefined;\n}\n\nexport interface DeclaredRelationship {\n name: string;\n target: string;\n list: boolean;\n description: string | undefined;\n}\n\n/**\n * An object type without @node, returned by @cypher fields as maps: its\n * fields are read from the map's keys.\n */\nexport interface PlainObjectType {\n name: string;\n fields: ReadonlyMap<string, { name: string; type: TypeShape }>;\n description: string | undefined;\n}\n\nexport interface RelationshipPropertiesType {\n name: string;\n fields: ReadonlyMap<string, ScalarField>;\n description: string | undefined;\n}\n\nexport interface EnumType {\n name: string;\n values: ReadonlyArray<{ name: string; description: string | undefined }>;\n description: string | undefined;\n}\n\nexport interface GraphModel {\n nodes: ReadonlyMap<string, NodeType>;\n /** Interfaces and unions over @node types. */\n abstracts: ReadonlyMap<string, AbstractType>;\n enums: ReadonlyMap<string, EnumType>;\n relationshipProperties: ReadonlyMap<string, RelationshipPropertiesType>;\n /** `@cypher` fields declared on `Query` and `Mutation`. */\n queries: readonly CypherField[];\n mutations: readonly CypherField[];\n /** Problems that do not stop the model, e.g. an unused @cypher argument. */\n warnings: readonly ModelWarning[];\n /** Custom scalars (`@storedAs`), by name: their storage type. */\n scalars: ReadonlyMap<string, ScalarType>;\n /** Custom scalars' SDL descriptions, by name, when they have one. */\n scalarDescriptions: ReadonlyMap<string, string>;\n /** Object types without @node that @cypher fields return. */\n objects: ReadonlyMap<string, PlainObjectType>;\n /** The `@jwt` claims shape, when declared: claim name → token path. */\n jwt: ReadonlyMap<string, string> | undefined;\n /**\n * `@authorizationDefaults(bypass:)`: a claims-only test that, when a\n * request passes it, skips every filter and validate rule.\n */\n bypass: AuthorizationWhere | undefined;\n /** The `@viewer` claim: the caller's node type and identifying field. */\n viewer: { claim: string; type: string; field: string } | undefined;\n /** Secret cursors are signed with, when configured. */\n cursorSecret: string | undefined;\n}\n\nexport interface ModelWarning {\n type: string;\n field?: string;\n message: string;\n}\n\nexport function scalarFields(t: {\n fields: ReadonlyMap<string, Field>;\n}): ScalarField[] {\n return [...t.fields.values()].filter(\n (f): f is ScalarField => f.kind === \"scalar\",\n );\n}\n\nexport function cypherFields(t: NodeType): CypherField[] {\n return [...t.fields.values()].filter(\n (f): f is CypherField => f.kind === \"cypher\",\n );\n}\n\nexport function relationshipFields(t: NodeType): RelationshipField[] {\n return [...t.fields.values()].filter(\n (f): f is RelationshipField => f.kind === \"relationship\",\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 * Claims the compile read, by the path looked up in the token (`\"\"` is\n * the whole token). `bound` stays true while every read only substituted\n * the value into a rule's `node` filter, so a cached compile may rebind\n * it as a parameter; otherwise the value may shape the statement text.\n */\n claimReads: Map<string, { value: unknown; bound: boolean }>;\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 claimReads: new Map(),\n };\n}\n\n/** Record that the compile read the claim at `path` (see `claimReads`). */\nexport function noteClaim(\n ctx: CompileContext,\n path: string,\n value: unknown,\n bound: boolean,\n): void {\n const seen = ctx.claimReads.get(path);\n ctx.claimReads.set(path, { value, bound: bound && (seen?.bound ?? true) });\n}\n\n/** Bind a value as the next positional parameter `$pN`. */\n/**\n * A rule value that is an expression, not a parameter: a string with\n * `${viewer.field}` placeholders, read from the caller's node in the\n * statement. `bind` returns the expression as is.\n */\nexport const EXPR = Symbol(\"expr\");\n\nexport function exprValue(expr: Expr): { [EXPR]: Expr } {\n return { [EXPR]: expr };\n}\n\nexport function bind(ctx: CompileContext, value: unknown): Expr {\n if (value !== null && typeof value === \"object\" && EXPR in value) {\n return (value as { [EXPR]: Expr })[EXPR];\n }\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 { 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","// 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","// `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 checkPropertyAccess,\n fieldValidate,\n maskedValue,\n maskSettled,\n refuseEdgeRowRules,\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 // A masked field is compared as the reader sees it.\n const pred = scalarPredicate(\n ctx,\n maskedValue(ctx, node, f, variable, 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 // Filtering on a property reveals it: the same rules as reading it.\n if (f) checkPropertyAccess(ctx, props.name, f, \"READ\");\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 list = value as Where[];\n // A literal `OR: []` matches nothing. A branch left empty once its\n // absent and null filters are left out is itself left out, and an\n // OR with no branch left adds nothing: absent variables never widen\n // a filter to every row.\n if (list.length === 0) {\n parts.push(lit(false));\n continue;\n }\n const branches = list\n .map((w) => compileWhere(ctx, w, lookup))\n .filter((b): b is Expr => b !== undefined);\n if (branches.length > 0) parts.push(or(...branches));\n } else if (key === \"NOT\") {\n // A NOT with nothing left inside adds nothing (not \"NOT TRUE\"). In\n // an authorization rule it still denies: a rule never widens.\n const inner = compileWhere(ctx, value as Where, lookup);\n if (inner) parts.push(not(inner));\n else if (ctx.inAuth) parts.push(lit(false));\n } else {\n const compile = lookup(key);\n // In a rule, a key that compiles to nothing would silently widen\n // it: deny instead. The model checks refuse such keys at startup.\n if (!compile && ctx.inAuth) parts.push(lit(false));\n else parts.push(compile?.(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 if (w[\"edge\"] != null) refuseEdgeRowRules(ctx, rel);\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) checkPropertyAccess(ctx, props!.name, field, \"READ\");\n else {\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 if (!maskSettled(ctx, target, field)) {\n throw requestError(\n \"FORBIDDEN\",\n `cannot aggregate ${target.name}.${field.name}: it is masked per row`,\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 if (value[\"edge\"] != null) refuseEdgeRowRules(ctx, rel);\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 RelationshipField,\n RelationshipOperation,\n RelationshipPropertiesType,\n} from \"../model/types.js\";\nimport { PLACEHOLDER } from \"../model/types.js\";\nimport { and, bin, fn, lit, not, or, type Expr } from \"./cypher.js\";\nimport {\n bind,\n exprValue,\n freshVar,\n noteClaim,\n type CompileContext,\n} from \"./context.js\";\nimport { compileNodeWhere, compilePropsWhere } 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 || bypassed(ctx, node)) 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\n/**\n * The per-row condition for reading a field with field-level READ rules\n * (`@authorization(validate:)`, `@authentication`), for projecting it. It\n * never throws: a request without the token a rule needs gets a condition\n * that is false on every row, so the statement has the same shape with or\n * without a token and its plan can be checked anonymously. `code` is the\n * error a failing row reads as. Undefined when nothing guards the field.\n */\nexport function fieldReadGuard(\n ctx: CompileContext,\n node: NodeType,\n field: {\n authentication: ReadonlySet<AuthOperation> | undefined;\n authenticationJwt?: AuthorizationWhere | undefined;\n authorization?: Authorization | undefined;\n },\n variable: string,\n): { when: Expr; code: \"FORBIDDEN\" | \"UNAUTHENTICATED\" } | undefined {\n if (ctx.inAuth) return undefined;\n if (\n field.authentication?.has(\"READ\") &&\n (!ctx.jwt || !claimsSatisfy(ctx, field.authenticationJwt))\n ) {\n return { when: lit(false), code: \"UNAUTHENTICATED\" };\n }\n const rules = (field.authorization?.validate ?? []).filter(\n (r) => r.operations.has(\"READ\") && r.when.has(\"BEFORE\"),\n );\n if (rules.length === 0 || bypassed(ctx, node)) return undefined;\n if (rules.every((r) => r.requireAuthentication) && !ctx.jwt) {\n return { when: lit(false), code: \"UNAUTHENTICATED\" };\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 === true) return undefined;\n return { when: folded === false ? lit(false) : folded, code: \"FORBIDDEN\" };\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 || bypassed(ctx, node)) {\n return undefined;\n }\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\n/**\n * Whether `op` may touch a relationship property with field-level rules.\n * A @relationshipProperties type can sit under several relationship\n * fields, from either end, so its rules test claims only (checked at\n * startup) and fold to a yes or no here. `\"unauthenticated\"` when every\n * rule needs a token and the request has none.\n */\nexport function propertyAccess(\n ctx: CompileContext,\n field: {\n authentication: ReadonlySet<AuthOperation> | undefined;\n authenticationJwt?: AuthorizationWhere | undefined;\n authorization?: Authorization | undefined;\n },\n op: AuthOperation,\n): \"allowed\" | \"forbidden\" | \"unauthenticated\" {\n if (ctx.inAuth) return \"allowed\";\n if (\n field.authentication?.has(op) &&\n (!ctx.jwt || !claimsSatisfy(ctx, field.authenticationJwt))\n ) {\n return \"unauthenticated\";\n }\n const rules = (field.authorization?.validate ?? []).filter((r) =>\n r.operations.has(op),\n );\n if (rules.length === 0 || bypassed(ctx, undefined)) return \"allowed\";\n if (rules.every((r) => r.requireAuthentication) && !ctx.jwt) {\n return \"unauthenticated\";\n }\n const granted = rules.some(\n (r) =>\n !(r.requireAuthentication && !ctx.jwt) &&\n compileRule(ctx, undefined, \"\", r.where) === true,\n );\n return granted ? \"allowed\" : \"forbidden\";\n}\n\n/** Throws unless `op` may write (or filter by) the relationship property. */\nexport function checkPropertyAccess(\n ctx: CompileContext,\n type: string,\n field: Parameters<typeof propertyAccess>[1] & { name: string },\n op: AuthOperation,\n): void {\n const access = propertyAccess(ctx, field, op);\n if (access === \"unauthenticated\") {\n throw requestError(\n \"UNAUTHENTICATED\",\n `${type}.${field.name} needs an authenticated request`,\n );\n }\n if (access === \"forbidden\") {\n throw requestError(\n \"FORBIDDEN\",\n `not allowed to ${op.toLowerCase()} ${type}.${field.name}`,\n );\n }\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/**\n * The schema's bypass (`@authorizationDefaults(bypass:)`) grants this\n * request: it skips every filter and validate rule, except on a type with\n * `@authorization(bypass: false)`. Claims only, so it is decided here.\n */\nexport function bypassed(\n ctx: CompileContext,\n node: NodeType | undefined,\n): boolean {\n const bypass = ctx.model.bypass;\n if (!bypass || !ctx.jwt || node?.authorization?.bypass === false) {\n return false;\n }\n try {\n return compileRulePart(ctx, undefined, \"\", bypass) === true;\n } catch (err) {\n if (err instanceof MissingClaim) return false;\n throw err;\n }\n}\n\n/**\n * A scalar field's value as the reader may see it: under\n * `@authorization(mask:)`, a row failing `unless` reads the mask's value.\n * Rules see the stored value, and so does a request the bypass lets\n * through. `raw` is the stored value's expression.\n */\nexport function maskedValue(\n ctx: CompileContext,\n node: NodeType,\n field: { authorization?: Authorization | undefined },\n variable: string,\n raw: Expr,\n): Expr {\n const masks = field.authorization?.mask;\n if (!masks?.length || ctx.inAuth || bypassed(ctx, node)) return raw;\n let value = raw;\n // The first mask that fails decides: build from the last one out.\n for (const m of [...masks].reverse()) {\n const unless = compileRule(ctx, node, variable, m.unless);\n if (unless === true) continue;\n const substitute = bind(ctx, m.value);\n value =\n unless === false\n ? substitute\n : {\n kind: \"case\",\n when: fn(\"coalesce\", unless, lit(false)),\n then: value,\n else: substitute,\n };\n }\n return value;\n}\n\n/**\n * Whether a masked field reads its stored value on every row for this\n * request (no mask, or every `unless` settled true by the claims). Sorting,\n * grouping and aggregating need it: a per-row mask there would reveal or\n * reorder by the hidden values.\n */\nexport function maskSettled(\n ctx: CompileContext,\n node: NodeType,\n field: { authorization?: Authorization | undefined },\n): boolean {\n const masks = field.authorization?.mask;\n if (!masks?.length || ctx.inAuth || bypassed(ctx, node)) return true;\n const probe = { ...ctx, params: {}, vars: new Set(ctx.vars) };\n return masks.every(\n (m) => compileRule(probe, node, \"probe\", m.unless) === true,\n );\n}\n\n/**\n * `@key(scope: VIEWER)`: a created key must start with the caller's\n * `@viewer` claim and the separator. Checked in JavaScript before any\n * statement runs, so the answer never depends on whether the key exists.\n * A claim containing the separator is refused: it could reach into\n * another caller's key space (`a` taking `a:b:…` from `a:b`).\n */\nexport function checkKeyScope(\n ctx: CompileContext,\n node: NodeType,\n key: unknown,\n /**\n * The caller's node's `@key`, looked up by the claim when `@viewer` maps\n * to another field (an opaque subject); null when there is no such node.\n */\n viewerKey?: unknown,\n): void {\n const scope = node.key.keyScope;\n const mapping = ctx.model.viewer;\n if (!scope || !mapping || ctx.inAuth || bypassed(ctx, node)) return;\n if (!ctx.jwt) {\n throw requestError(\n \"UNAUTHENTICATED\",\n `create on ${node.name} needs an authenticated request`,\n );\n }\n const viewerNode = ctx.model.nodes.get(mapping.type);\n // The key space is the viewer node's key: the claim itself when @viewer\n // maps to the key, else the key looked up by the claim.\n const owner =\n viewerNode && mapping.field !== viewerNode.key.name\n ? viewerKey\n : claim(ctx, mapping.claim);\n const prefix =\n typeof owner === \"string\" || typeof owner === \"number\"\n ? `${owner}${scope.separator}`\n : undefined;\n if (\n prefix === undefined ||\n String(owner).includes(scope.separator) ||\n typeof key !== \"string\" ||\n !key.startsWith(prefix) ||\n key.length === prefix.length\n ) {\n throw forbidden(node, \"CREATE\");\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 | undefined,\n variable: string,\n where: AuthorizationWhere,\n ends?: RuleEnds,\n): Folded {\n try {\n return compileRulePart(ctx, node, variable, where, false, ends);\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 ends?: RuleEnds,\n): Folded {\n const child = (w: Where, negated = underNot): Folded => {\n if (negated) return compileRulePart(ctx, node, variable, w, true, ends);\n try {\n return compileRulePart(ctx, node, variable, w, false, ends);\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(\n ctx,\n node,\n variable,\n value as Where,\n true,\n ends,\n );\n parts.push(typeof inner === \"boolean\" ? !inner : not(inner));\n } else if (key === \"viewer\") {\n parts.push(viewerTest(ctx, value));\n } else if (ends && (key === \"source\" || key === \"target\")) {\n const end = ends[key];\n parts.push(\n inRule(ctx, value, (w) =>\n compileNodeWhere(ctx, end.node, end.variable, w),\n ),\n );\n } else if (ends && key === \"edge\") {\n const edge = ends.edge;\n parts.push(\n edge\n ? inRule(ctx, value, (w) =>\n compilePropsWhere(ctx, edge.props, edge.variable, w),\n )\n : false,\n );\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\n/**\n * A filter part of a rule, with `$jwt` / `$context` strings substituted,\n * compiled as a rule (no nested rules applied). Empty compiles deny.\n */\nfunction inRule(\n ctx: CompileContext,\n value: unknown,\n compile: (where: Where) => Expr | undefined,\n): Folded {\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 return compile(bound.value as Where) ?? false;\n } finally {\n ctx.inAuth = wasInAuth;\n }\n}\n\n/** The statement variables a relationship rule's parts test. */\ninterface RuleEnds {\n source: { node: NodeType; variable: string };\n target: { node: NodeType; variable: string };\n edge: { props: RelationshipPropertiesType; variable: string } | undefined;\n}\n\n/**\n * Rules on relationship fields for `op` on relationships of `rel`, with\n * the statement's owner-side, target-side and relationship variables. The\n * rules of `rel` itself apply, and so do those of a field on the other\n * side declaring the same relationship type (a connect from\n * `Person.trips` answers to `Trip.members`' rules), with source and\n * target swapped. Within a field any rule grants; across fields all must.\n *\n * `\"write\"` throws UNAUTHENTICATED / FORBIDDEN when the claims already\n * decide against the request; `\"read\"` never throws. Undefined when no\n * rule applies or the claims alone grant.\n */\nexport function relationshipRules(\n ctx: CompileContext,\n rel: RelationshipField,\n op: RelationshipOperation,\n vars: { owner: string; target: string; rel: string },\n mode: \"write\" | \"read\" = \"write\",\n): Expr | false | undefined {\n if (ctx.inAuth) return undefined;\n const parts: Folded[] = [];\n for (const { field, flipped } of relationshipRuleFields(ctx, rel)) {\n const rules = (field.authorization?.validate ?? []).filter((r) =>\n r.operations.has(op),\n );\n if (rules.length === 0) continue;\n if (bypassed(ctx, ctx.model.nodes.get(field.owner))) continue;\n const label = `${op.toLowerCase().replace(\"_\", \" \")} ${field.owner}.${field.name}`;\n if (rules.every((r) => r.requireAuthentication) && !ctx.jwt) {\n if (mode === \"read\") return false;\n throw requestError(\n \"UNAUTHENTICATED\",\n `${label} needs an authenticated request`,\n );\n }\n const source = ctx.model.nodes.get(field.owner)!;\n const target = ctx.model.nodes.get(field.target)!;\n const props = field.properties\n ? ctx.model.relationshipProperties.get(field.properties)\n : undefined;\n const ends: RuleEnds = {\n source: { node: source, variable: flipped ? vars.target : vars.owner },\n target: { node: target, variable: flipped ? vars.owner : vars.target },\n edge: props ? { props, variable: vars.rel } : undefined,\n };\n const folded = foldOr(\n rules.map((r) =>\n r.requireAuthentication && !ctx.jwt\n ? false\n : compileRule(ctx, undefined, \"\", r.where, ends),\n ),\n );\n if (folded === false && mode === \"write\") {\n throw requestError(\"FORBIDDEN\", `not allowed to ${label}`);\n }\n parts.push(folded);\n }\n const all = foldAnd(parts);\n return all === true ? undefined : all === false ? false : all;\n}\n\n/** FORBIDDEN: using a relationship's properties its READ_EDGE rules guard. */\nexport function refusedEdgeRead(rel: RelationshipField): Error {\n return requestError(\n \"FORBIDDEN\",\n `${rel.owner}.${rel.name}: its READ_EDGE rules decide per relationship, so its properties cannot be filtered, sorted or aggregated by`,\n );\n}\n\n/**\n * Throws when `rel`'s properties have READ_EDGE rules that are not settled\n * by the claims alone: filtering, sorting or aggregating by them would\n * reveal what the rules hide per relationship.\n */\nexport function refuseEdgeRowRules(\n ctx: CompileContext,\n rel: RelationshipField,\n): void {\n if (ctx.inAuth) return;\n const probe = { ...ctx, params: {}, vars: new Set(ctx.vars) };\n const rule = relationshipRules(\n probe,\n rel,\n \"READ_EDGE\",\n { owner: \"a\", target: \"b\", rel: \"r\" },\n \"read\",\n );\n if (rule !== undefined) throw refusedEdgeRead(rel);\n}\n\n/** Fields whose relationship rules cover `rel`'s relationships. */\nexport function relationshipRuleFields(\n ctx: CompileContext,\n rel: RelationshipField,\n): Array<{ field: RelationshipField; flipped: boolean }> {\n const out: Array<{ field: RelationshipField; flipped: boolean }> = [];\n const hasRules = (f: RelationshipField) =>\n f.authorization?.validate.some((r) =>\n [...r.operations].some((op) =>\n [\"CONNECT\", \"DISCONNECT\", \"UPDATE_EDGE\", \"READ_EDGE\"].includes(op),\n ),\n ) ?? false;\n if (hasRules(rel)) out.push({ field: rel, flipped: false });\n const target = ctx.model.nodes.get(rel.target);\n for (const f of target?.fields.values() ?? []) {\n if (\n f.kind === \"relationship\" &&\n f !== rel &&\n f.type === rel.type &&\n f.target === rel.owner &&\n f.direction !== rel.direction &&\n hasRules(f)\n ) {\n out.push({ field: f, flipped: true });\n }\n }\n return out;\n}\n\n/**\n * `viewer: { … }`: the caller's own node (found by the `@viewer` claim)\n * passes the filter. One seek by the claim, as a pattern comprehension so\n * it composes with the rest of the rule:\n * `size([(v:Person {subject: $claim}) WHERE <filter> | 1]) > 0`. Without\n * the claim it is unknown, like any test on a missing claim.\n */\nfunction viewerTest(ctx: CompileContext, where: unknown): Folded {\n const mapping = ctx.model.viewer;\n const node = mapping && ctx.model.nodes.get(mapping.type);\n // The model build refuses `viewer` without a @viewer claim.\n if (!mapping || !node) return false;\n const id = substitute(`$jwt.${mapping.claim}`, ctx);\n const bound = substitute(where, ctx);\n if (!id.ok || !bound.ok) throw new MissingClaim();\n const field = node.fields.get(mapping.field);\n const property = field?.kind === \"scalar\" ? field.property : mapping.field;\n const x = freshVar(ctx, \"viewer\");\n const wasInAuth = ctx.inAuth;\n ctx.inAuth = true;\n try {\n const pred = compileNodeWhere(ctx, node, x, bound.value as Where);\n return bin(\n \">\",\n fn(\"size\", {\n kind: \"comprehension\",\n pattern: {\n start: {\n variable: x,\n labels: [node.labels[0]!],\n properties: [{ key: property, value: bind(ctx, id.value) }],\n },\n hops: [],\n },\n where: pred,\n projection: lit(1),\n }),\n lit(0),\n );\n } finally {\n ctx.inAuth = wasInAuth;\n }\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(\n ctx: CompileContext,\n path: string,\n bound = false,\n): unknown {\n const [head, ...rest] = path.split(\".\");\n const mapped = ctx.model.jwt?.get(head!) ?? head!;\n const full = [mapped, ...rest].join(\".\");\n const value = lookupPath(ctx.jwt, full);\n noteClaim(ctx, full, value, bound);\n return value;\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, and the\n * `${jwt.path}` / `${context.path}` placeholders inside strings; not ok\n * when a referenced value is absent (or, in a placeholder, not a scalar).\n */\n/**\n * A rule string with `${viewer.field}` placeholders: the caller's node's\n * fields, found by the `@viewer` claim. A placeholder naming the field the\n * claim maps to is the claim itself; another field is read in the\n * statement, with one seek by the claim. Without the claim it is unknown.\n */\nfunction viewerString(\n ctx: CompileContext,\n value: string,\n): { ok: boolean; value: unknown } {\n const mapping = ctx.model.viewer;\n const node = mapping && ctx.model.nodes.get(mapping.type);\n if (!mapping || !node) return { ok: false, value: undefined };\n const id = claim(ctx, mapping.claim, true);\n if (typeof id !== \"string\" && typeof id !== \"number\") {\n return { ok: false, value: undefined };\n }\n const parts: Expr[] = [];\n let text = \"\";\n let ok = true;\n let last = 0;\n const flush = () => {\n if (text) parts.push(bind(ctx, text));\n text = \"\";\n };\n for (const m of value.matchAll(PLACEHOLDER)) {\n text += value.slice(last, m.index);\n last = m.index! + m[0].length;\n const [, source, path] = m as unknown as [string, string, string];\n if (source === \"viewer\") {\n if (path === mapping.field) {\n text += String(id);\n continue;\n }\n const field = node.fields.get(path);\n const property = field?.kind === \"scalar\" ? field.property : path;\n const v = freshVar(ctx, \"viewer\");\n flush();\n parts.push(\n fn(\"head\", {\n kind: \"comprehension\",\n pattern: {\n start: {\n variable: v,\n labels: [node.labels[0]!],\n properties: [\n {\n key:\n (node.fields.get(mapping.field) as { property?: string })\n ?.property ?? mapping.field,\n value: bind(ctx, id),\n },\n ],\n },\n hops: [],\n },\n where: undefined,\n projection: {\n kind: \"prop\",\n target: { kind: \"var\", name: v },\n key: property,\n },\n }),\n );\n continue;\n }\n const resolved =\n source === \"jwt\"\n ? claim(ctx, path)\n : lookupPath(ctx.requestContext, path);\n if (source === \"context\") ctx.contextReads.push([path, resolved]);\n if (\n typeof resolved === \"string\" ||\n typeof resolved === \"number\" ||\n typeof resolved === \"boolean\"\n ) {\n text += String(resolved);\n } else ok = false;\n }\n text += value.slice(last);\n if (!ok) return { ok: false, value: undefined };\n if (parts.length === 0) return { ok: true, value: text };\n flush();\n return {\n ok: true,\n value: exprValue(parts.reduce((a, b) => bin(\"+\", a, b))),\n };\n}\n\nfunction substitute(\n value: unknown,\n ctx: CompileContext,\n): { ok: boolean; value: unknown } {\n // \"\\$…\" is the literal string \"$…\" (an unescaped \"$…\" is a placeholder).\n if (typeof value === \"string\" && value.startsWith(\"\\\\$\")) {\n return { ok: true, value: value.slice(1) };\n }\n if (typeof value === \"string\" && value.includes(\"${viewer.\")) {\n return viewerString(ctx, value);\n }\n if (typeof value === \"string\" && value.includes(\"${\")) {\n let ok = true;\n const built = value.replace(\n PLACEHOLDER,\n (_, source: string, path: string) => {\n let v: unknown;\n if (source === \"jwt\") v = claim(ctx, path);\n else {\n v = lookupPath(ctx.requestContext, path);\n ctx.contextReads.push([path, v]);\n }\n if (\n typeof v === \"string\" ||\n typeof v === \"number\" ||\n typeof v === \"bigint\" ||\n typeof v === \"boolean\"\n ) {\n return String(v);\n }\n ok = false;\n return \"\";\n },\n );\n return ok ? { ok, value: built } : { ok, value: undefined };\n }\n if (\n typeof value === \"string\" &&\n (value.startsWith(\"$jwt.\") || value.startsWith(\"$context.\"))\n ) {\n let v: unknown;\n // Only bound as a filter value: a cached compile may rebind it.\n if (value.startsWith(\"$jwt.\")) v = claim(ctx, value.slice(5), true);\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","// Who may do what, read off the model: for every type and guarded field,\n// each operation as each kind of caller (anonymous, authenticated, and each\n// role the rules test). The claims part of every rule is decided the way a\n// request decides it; what is left depends on the rows. Stable output, so\n// consumers can snapshot it and review changes as diffs.\n\nimport type { GraphQLSchema } from \"graphql\";\nimport {\n authFilter,\n authValidate,\n bypassed,\n checkAuthentication,\n fieldReadGuard,\n maskSettled,\n relationshipRules,\n} from \"../compile/auth.js\";\nimport { newContext, type CompileContext } from \"../compile/context.js\";\nimport { printExpr, type Expr } from \"../compile/cypher.js\";\nimport type {\n AuthOperation,\n AuthorizationWhere,\n GraphModel,\n ModelWarning,\n NodeType,\n RelationshipOperation,\n} from \"../model/types.js\";\n\nexport type AccessVerdict =\n /** Every row, for this caller. */\n | \"allowed\"\n /** Only rows a filter rule admits; others are invisible. */\n | \"filtered\"\n /** Checked per row; a failing row is FORBIDDEN. */\n | \"validated\"\n /** Rows failing a mask read a substitute value. */\n | \"masked\"\n /** Never, for this caller. */\n | \"denied\"\n /** Needs a token this caller does not have. */\n | \"unauthenticated\";\n\nexport interface AccessEntry {\n type: string;\n /** The field, for field-level and relationship rules. */\n field?: string;\n operation: AuthOperation;\n principal: string;\n verdict: AccessVerdict;\n /** What decides it: `filter[0]`, `validate[1]`, `@authentication`, `bypass`, … */\n by: string[];\n}\n\ninterface Principal {\n name: string;\n jwt: Record<string, unknown> | undefined;\n}\n\n/** The access matrix of `model`, in a stable order. */\nexport function accessMatrix(\n model: GraphModel,\n schema: GraphQLSchema,\n): AccessEntry[] {\n const principals = principalsOf(model);\n const out: AccessEntry[] = [];\n const context = (p: Principal) =>\n newContext({ schema, fragments: {}, variables: {} }, model, {\n jwt: p.jwt,\n });\n for (const node of [...model.nodes.values()].sort(byName)) {\n const ops: AuthOperation[] = [\n ...(node.read ? ([\"READ\"] as const) : []),\n ...([\"CREATE\", \"UPDATE\", \"DELETE\"] as const).filter((op) =>\n node.mutations.has(op),\n ),\n ];\n for (const op of ops) {\n for (const p of principals) {\n out.push({\n type: node.name,\n operation: op,\n principal: p.name,\n ...typeVerdict(context(p), node, op),\n });\n }\n }\n for (const f of [...node.fields.values()].sort(byName)) {\n if (f.kind === \"relationship\") {\n const ruleOps = new Set<RelationshipOperation>();\n for (const r of f.authorization?.validate ?? []) {\n for (const op of r.operations) {\n if (\n op === \"CONNECT\" ||\n op === \"DISCONNECT\" ||\n op === \"UPDATE_EDGE\" ||\n op === \"READ_EDGE\"\n ) {\n ruleOps.add(op);\n }\n }\n }\n for (const op of [...ruleOps].sort()) {\n for (const p of principals) {\n out.push({\n type: node.name,\n field: f.name,\n operation: op,\n principal: p.name,\n ...relationshipVerdict(context(p), node, f, op),\n });\n }\n }\n }\n const guarded =\n f.kind !== \"custom\" &&\n (f.authentication?.has(\"READ\") ||\n f.authorization?.validate.some((r) => r.operations.has(\"READ\")) ||\n (f.authorization?.mask?.length ?? 0) > 0);\n if (!guarded) continue;\n for (const p of principals) {\n out.push({\n type: node.name,\n field: f.name,\n operation: \"READ\",\n principal: p.name,\n ...fieldVerdict(context(p), node, f),\n });\n }\n }\n }\n return out;\n}\n\nfunction typeVerdict(\n ctx: CompileContext,\n node: NodeType,\n op: AuthOperation,\n): Pick<AccessEntry, \"verdict\" | \"by\"> {\n const by = rulesFor(node, op);\n try {\n checkAuthentication(ctx, node, op);\n if (bypassed(ctx, node)) return { verdict: \"allowed\", by: [\"bypass\"] };\n const filter = op === \"CREATE\" ? undefined : authFilter(ctx, node, \"n\", op);\n if (filter && isFalse(filter)) return { verdict: \"denied\", by };\n const validate =\n authValidate(ctx, node, \"n\", op, \"BEFORE\") ??\n (op === \"READ\" ? undefined : authValidate(ctx, node, \"n\", op, \"AFTER\"));\n const verdict: AccessVerdict = filter\n ? \"filtered\"\n : validate\n ? \"validated\"\n : \"allowed\";\n return { verdict, by: verdict === \"allowed\" ? allowedBy(by) : by };\n } catch (err) {\n return failed(err, by);\n }\n}\n\nfunction fieldVerdict(\n ctx: CompileContext,\n node: NodeType,\n field: Parameters<typeof fieldReadGuard>[2] & {\n name: string;\n kind: string;\n authorization?: NodeType[\"authorization\"];\n },\n): Pick<AccessEntry, \"verdict\" | \"by\"> {\n const by = [\n ...(field.authentication?.has(\"READ\") ? [\"@authentication\"] : []),\n ...(field.authorization?.validate ?? []).flatMap((r, i) =>\n r.operations.has(\"READ\") ? [`validate[${i}]`] : [],\n ),\n ...(field.authorization?.mask ?? []).map((_, i) => `mask[${i}]`),\n ];\n if (bypassed(ctx, node) && !field.authentication?.has(\"READ\")) {\n return { verdict: \"allowed\", by: [\"bypass\"] };\n }\n const guard = fieldReadGuard(ctx, node, field, \"n\");\n if (guard?.code === \"UNAUTHENTICATED\") {\n return { verdict: \"unauthenticated\", by };\n }\n if (guard && isFalse(guard.when)) return { verdict: \"denied\", by };\n if (guard) return { verdict: \"validated\", by };\n if (field.kind === \"scalar\" && !maskSettled(ctx, node, field)) {\n return { verdict: \"masked\", by };\n }\n return { verdict: \"allowed\", by };\n}\n\nfunction relationshipVerdict(\n ctx: CompileContext,\n node: NodeType,\n field: Parameters<typeof relationshipRules>[1],\n op: RelationshipOperation,\n): Pick<AccessEntry, \"verdict\" | \"by\"> {\n const by = (field.authorization?.validate ?? []).flatMap((r, i) =>\n r.operations.has(op) ? [`validate[${i}]`] : [],\n );\n if (bypassed(ctx, node)) return { verdict: \"allowed\", by: [\"bypass\"] };\n try {\n const rule = relationshipRules(ctx, field, op, {\n owner: \"a\",\n target: \"b\",\n rel: \"r\",\n });\n if (rule === false) return { verdict: \"denied\", by };\n return { verdict: rule ? \"validated\" : \"allowed\", by };\n } catch (err) {\n return failed(err, by);\n }\n}\n\nfunction rulesFor(node: NodeType, op: AuthOperation): string[] {\n return [\n ...(node.authentication?.has(op) ? [\"@authentication\"] : []),\n ...(node.authorization?.filter ?? []).flatMap((r, i) =>\n r.operations.has(op) ? [`filter[${i}]`] : [],\n ),\n ...(node.authorization?.validate ?? []).flatMap((r, i) =>\n r.operations.has(op) ? [`validate[${i}]`] : [],\n ),\n ...(node.authorization?.public?.has(op) ? [\"public\"] : []),\n ];\n}\n\n/** An allowed verdict names what granted it: rules that folded to true. */\nfunction allowedBy(by: string[]): string[] {\n return by.length > 0 ? by : [\"no rule\"];\n}\n\nfunction failed(\n err: unknown,\n by: string[],\n): Pick<AccessEntry, \"verdict\" | \"by\"> {\n const code = (err as { extensions?: { code?: unknown } }).extensions?.code;\n if (code === \"UNAUTHENTICATED\") return { verdict: \"unauthenticated\", by };\n if (code === \"FORBIDDEN\") return { verdict: \"denied\", by };\n throw err;\n}\n\nconst isFalse = (e: Expr) => printExpr(e) === \"false\";\n\nconst byName = (a: { name: string }, b: { name: string }) =>\n a.name < b.name ? -1 : a.name > b.name ? 1 : 0;\n\n/**\n * Anonymous, authenticated (a token with no roles), and one principal per\n * claim value the rules test with `includes`, `eq` or `in` (`roles:admin`).\n */\nfunction principalsOf(model: GraphModel): Principal[] {\n const subject = model.viewer?.claim ?? \"sub\";\n const base = token(model, { [subject]: \"someone\" });\n const tested = new Map<\n string,\n { claim: string; value: unknown; list: boolean }\n >();\n const visit = (where: unknown) => {\n if (Array.isArray(where)) return where.forEach(visit);\n if (where === null || typeof where !== \"object\") return;\n for (const [key, value] of Object.entries(where)) {\n if (key === \"jwt\" && value && typeof value === \"object\") {\n for (const [claim, ops] of Object.entries(value)) {\n for (const [op, operand] of Object.entries(\n (ops ?? {}) as Record<string, unknown>,\n )) {\n const values =\n op === \"in\" && Array.isArray(operand)\n ? operand\n : op === \"includes\" || op === \"eq\"\n ? [operand]\n : [];\n for (const v of values) {\n if (typeof v !== \"string\" || claim === subject) continue;\n tested.set(`${claim}:${v}`, {\n claim,\n value: v,\n list: op === \"includes\",\n });\n }\n }\n }\n } else visit(value);\n }\n };\n const rules = (a: NodeType[\"authorization\"]) => [\n ...(a?.filter ?? []).map((r) => r.where),\n ...(a?.validate ?? []).map((r) => r.where),\n ...(a?.mask ?? []).map((m) => m.unless),\n ];\n visit(model.bypass);\n for (const node of model.nodes.values()) {\n visit(rules(node.authorization));\n visit(node.authenticationJwt);\n for (const f of node.fields.values()) {\n visit(rules(f.authorization));\n visit(f.authenticationJwt);\n }\n }\n for (const props of model.relationshipProperties.values()) {\n for (const f of props.fields.values()) visit(rules(f.authorization));\n }\n return [\n { name: \"anonymous\", jwt: undefined },\n { name: \"authenticated\", jwt: base },\n ...[...tested.entries()]\n .sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0))\n .map(([name, t]) => ({\n name,\n jwt: token(model, {\n [subject]: \"someone\",\n [t.claim]: t.list ? [t.value] : t.value,\n }),\n })),\n ];\n}\n\n/**\n * A token carrying `claims` where the `@jwt` type says they live\n * (`@jwtClaim(path: \"app_metadata.roles\")`).\n */\nfunction token(\n model: GraphModel,\n claims: Record<string, unknown>,\n): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n for (const [claim, value] of Object.entries(claims)) {\n const path = (model.jwt?.get(claim) ?? claim).split(\".\");\n let at = out;\n for (const part of path.slice(0, -1)) {\n at = (at[part] ??= {}) as Record<string, unknown>;\n }\n at[path[path.length - 1]!] = value;\n }\n return out;\n}\n\n/**\n * Authorization lints for `check`: valid rules that are probably not what\n * was meant.\n */\nexport function accessLints(\n model: GraphModel,\n schema: GraphQLSchema,\n): ModelWarning[] {\n const out: ModelWarning[] = [];\n const subject = model.viewer?.claim ?? \"sub\";\n const authenticated = newContext(\n { schema, fragments: {}, variables: {} },\n model,\n { jwt: token(model, { [subject]: \"someone\" }) },\n );\n for (const node of model.nodes.values()) {\n const filters = node.authorization?.filter ?? [];\n filters.forEach((rule, i) => {\n // A filter any signed-in caller passes filters nothing for them.\n const probe = { ...authenticated, params: {}, vars: new Set([\"n\"]) };\n const alone = {\n ...node,\n authorization: { filter: [rule], validate: [] },\n };\n if (\n authFilter(probe, alone, \"n\", [...rule.operations][0]!) === undefined\n ) {\n out.push({\n type: node.name,\n message: `filter[${i}] holds for every authenticated caller: it only keeps out anonymous ones (use @authentication for that)`,\n });\n }\n });\n const rules = [\n ...filters.map((r, i) => ({ r, label: `filter[${i}]` })),\n ...(node.authorization?.validate ?? []).map((r, i) => ({\n r,\n label: `validate[${i}]`,\n })),\n ];\n for (const { r, label } of rules) {\n if (!r.requireAuthenticationDefaulted) continue;\n const branch = claimFreeBranch(r.where);\n if (branch !== undefined) {\n out.push({\n type: node.name,\n message: `${label} has a branch that needs no claims (${branch}), but requireAuthentication defaults to true, so anonymous callers are refused by the whole rule; set requireAuthentication: false if anonymous callers should get that branch`,\n });\n }\n }\n if (model.bypass && node.authorization?.bypass !== false) {\n for (const f of node.fields.values()) {\n if (\n f.kind !== \"custom\" &&\n ((f.authorization?.validate.length ?? 0) > 0 ||\n (f.authorization?.mask?.length ?? 0) > 0)\n ) {\n out.push({\n type: node.name,\n field: f.name,\n message: `the schema's bypass skips the rules of ${node.name}.${f.name} for callers passing it; add @authorization(bypass: false) to ${node.name} if they must hold for everyone`,\n });\n }\n }\n }\n }\n return out;\n}\n\n/** The path of an OR branch that tests no claim, if the rule has one. */\nfunction claimFreeBranch(where: AuthorizationWhere): string | undefined {\n const or = where[\"OR\"];\n if (!Array.isArray(or)) return undefined;\n const i = or.findIndex((b) => !usesClaims(b));\n return i >= 0 ? `OR[${i}]` : undefined;\n}\n\nfunction usesClaims(where: unknown): boolean {\n if (typeof where === \"string\") {\n return where.startsWith(\"$jwt.\") || where.includes(\"${jwt.\");\n }\n if (Array.isArray(where)) return where.some(usesClaims);\n if (where === null || typeof where !== \"object\") return false;\n return Object.entries(where).some(\n ([k, v]) =>\n k === \"jwt\" || k === \"viewer\" || k === \"isViewer\" || usesClaims(v),\n );\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","// The compile cache: compiled read root fields, reused by later requests\n// whose compile would produce the same statements.\n//\n// An entry is keyed on what the compile actually read, not on the whole\n// request: the variables the field's selection references, the claims\n// the compile looked up (recorded in `CompileContext.claimReads`), the\n// `$context` values it read, and whether the request is authenticated.\n// A claim that a rule only substitutes into a `node` filter (`\"$jwt.sub\"`)\n// is bound as a parameter: the entry keeps the statement text and swaps\n// in each request's value, so per-user tokens share one compile.\n\nimport {\n Kind,\n type ASTNode,\n type FieldNode,\n type FragmentDefinitionNode,\n} from \"graphql\";\nimport type { CompiledRead } from \"./read.js\";\nimport type { CompileContext } from \"./context.js\";\nimport { lookupPath } from \"./auth.js\";\n\n/** Compiled root fields kept per field node, across keys. */\nexport const COMPILED_PER_FIELD = 16;\n/** Compiled root fields kept in total, across field nodes. */\nexport const COMPILED_TOTAL = 4096;\n\n/** A claim a rule binds as a filter value: rebound per request. */\ninterface Slot {\n statement: number;\n param: string;\n path: string;\n}\n\ninterface Entry {\n variables: string;\n authenticated: boolean;\n statistics: number;\n /** Claims whose value shapes the statement: must be equal. */\n claims: Array<[path: string, key: string]>;\n /** Claims bound as parameters: any non-empty string, rebound. */\n slots: Slot[];\n /** Paths of `slots`, deduplicated. */\n slotPaths: string[];\n contextReads: Array<[string, unknown]>;\n compiled: CompiledRead;\n}\n\ntype Compile = (jwt: Record<string, unknown> | undefined) => {\n ctx: CompileContext;\n compiled: CompiledRead;\n};\n\nexport interface CacheRequest {\n fieldNodes: readonly FieldNode[];\n fragments: Record<string, FragmentDefinitionNode>;\n /** Coerced variable values, or undefined when there are none. */\n variables: Record<string, unknown> | undefined;\n jwt: Record<string, unknown> | undefined;\n context: unknown;\n statistics: number;\n}\n\nexport class CompileCache {\n readonly #byField = new WeakMap<FieldNode, Entry[]>();\n /** Every live entry, oldest first, for the total cap. */\n readonly #live = new Map<Entry, FieldNode>();\n readonly #variableNames = new WeakMap<FieldNode, string[] | null>();\n /** Claims a field's compile bound into rule filters, to try as slots. */\n readonly #bindHints = new WeakMap<FieldNode, string[]>();\n readonly #total: number;\n\n constructor(total = COMPILED_TOTAL) {\n this.#total = total;\n }\n\n get size(): number {\n return this.#live.size;\n }\n\n /**\n * The cached compile for this request, or a fresh one from `compile`\n * (given a context with `jwt` as the claims), stored for later ones.\n */\n get(request: CacheRequest, compile: Compile): CompiledRead {\n const field = request.fieldNodes[0]!;\n const variables = this.#variablesKey(request);\n if (variables === undefined) return compile(request.jwt).compiled;\n const authenticated = !!request.jwt;\n const entries = this.#byField.get(field) ?? [];\n for (const e of entries) {\n if (\n e.variables !== variables ||\n e.authenticated !== authenticated ||\n e.statistics !== request.statistics ||\n !e.claims.every(\n ([path, key]) => stableKey(claimAt(request.jwt, path)) === key,\n ) ||\n !e.slotPaths.every((path) => bindable(claimAt(request.jwt, path))) ||\n !e.contextReads.every(\n ([path, value]) =>\n stableKey(lookupPath(request.context, path)) === stableKey(value),\n )\n ) {\n continue;\n }\n return e.slots.length === 0 ? e.compiled : rebind(e, request.jwt);\n }\n\n const miss = this.#compileMiss(field, request.jwt, compile);\n const { ctx, compiled, slots } = miss;\n const claims: Array<[string, string]> = [];\n for (const [path, read] of ctx.claimReads) {\n if (slots.some((s) => s.path === path)) continue;\n const key = stableKey(read.value);\n if (key === undefined) return compiled;\n claims.push([path, key]);\n }\n const entry: Entry = {\n variables,\n authenticated,\n statistics: request.statistics,\n claims,\n slots,\n slotPaths: [...new Set(slots.map((s) => s.path))],\n contextReads: ctx.contextReads,\n compiled,\n };\n entries.unshift(entry);\n this.#live.set(entry, field);\n for (const dropped of entries.splice(COMPILED_PER_FIELD)) {\n this.#live.delete(dropped);\n }\n this.#byField.set(field, entries);\n if (this.#live.size > this.#total) {\n const [oldest, owner] = this.#live.entries().next().value!;\n this.#live.delete(oldest);\n const list = this.#byField.get(owner);\n const at = list?.indexOf(oldest) ?? -1;\n if (at >= 0) list!.splice(at, 1);\n }\n return compiled;\n }\n\n /**\n * Compile on a miss. When an earlier compile of this field bound claims\n * into rule filters (the hint), compile with a marker in their place:\n * if each marker lands only as a whole parameter value, those\n * parameters are the claims' slots and the compile serves every value.\n * Otherwise compile with the real claims, and stop trying for the field.\n */\n #compileMiss(\n field: FieldNode,\n jwt: Record<string, unknown> | undefined,\n compile: Compile,\n ): { ctx: CompileContext; compiled: CompiledRead; slots: Slot[] } {\n const hint = this.#bindHints.get(field);\n if (jwt && hint && hint.length > 0) {\n const values = hint.map((path) => lookupPath(jwt, path));\n if (values.every(bindable)) {\n const markers = hint.map((_, i) => `${MARKER}${i}X`);\n let marked: unknown = jwt;\n hint.forEach((path, i) => {\n marked = withPath(marked, path.split(\".\"), markers[i]);\n });\n let result: ReturnType<Compile> | undefined;\n try {\n result = compile(marked as Record<string, unknown>);\n } catch {\n result = undefined;\n }\n const slots = result && findSlots(result, hint, markers);\n if (result && slots) {\n const entry = { compiled: result.compiled, slots };\n return {\n ctx: result.ctx,\n compiled: rebind(entry, jwt),\n slots,\n };\n }\n this.#bindHints.set(field, []);\n }\n }\n const { ctx, compiled } = compile(jwt);\n // Learned from an authenticated compile: without claims, none are read.\n if (hint === undefined && jwt) {\n this.#bindHints.set(\n field,\n [...ctx.claimReads]\n .filter(([, read]) => read.bound && bindable(read.value))\n .map(([path]) => path),\n );\n }\n return { ctx, compiled, slots: [] };\n }\n\n /**\n * The variables the field's selection references, keyed; the whole\n * variable map when that cannot be told (fragment arguments).\n */\n #variablesKey(request: CacheRequest): string | undefined {\n const field = request.fieldNodes[0]!;\n let used = this.#variableNames.get(field);\n if (used === undefined) {\n used = variableNames(request.fieldNodes, request.fragments);\n this.#variableNames.set(field, used);\n }\n const values = request.variables;\n if (!values) return \"\";\n if (used === null) return stableKey(values);\n const picked: Record<string, unknown> = {};\n for (const name of used) {\n if (Object.hasOwn(values, name)) picked[name] = values[name];\n }\n return stableKey(picked);\n }\n}\n\n/** A claim value a cached compile may rebind: a non-empty string. */\nfunction bindable(value: unknown): value is string {\n return typeof value === \"string\" && value.length > 0;\n}\n\nfunction claimAt(\n jwt: Record<string, unknown> | undefined,\n path: string,\n): unknown {\n return path === \"\" ? jwt : lookupPath(jwt, path);\n}\n\n/** A marker no real claim holds; the uppercase X survives no lowercasing. */\nconst MARKER = \"\\u0000lora-claim-\";\n\n/**\n * The parameters holding each marker as their whole value. Undefined when\n * a marker is missing, appears anywhere else (statement text, inside a\n * value), or a hinted claim was not read as a bound value.\n */\nfunction findSlots(\n result: { ctx: CompileContext; compiled: CompiledRead },\n paths: string[],\n markers: string[],\n): Slot[] | undefined {\n for (const path of paths) {\n if (!result.ctx.claimReads.get(path)?.bound) return undefined;\n }\n const slots: Slot[] = [];\n const statements = result.compiled.statements;\n for (let s = 0; s < statements.length; s++) {\n const { text, params } = statements[s]!;\n if (text.includes(MARKER)) return undefined;\n for (const [param, value] of Object.entries(params)) {\n const i = markers.indexOf(value as string);\n if (i >= 0) slots.push({ statement: s, param, path: paths[i]! });\n else if (typeof value === \"string\" && value.includes(MARKER)) {\n return undefined;\n } else if (value !== null && typeof value === \"object\") {\n if ((stableKey(value) ?? MARKER).includes(\"lora-claim-\")) {\n return undefined;\n }\n }\n }\n }\n if (!paths.every((path) => slots.some((s) => s.path === path))) {\n return undefined;\n }\n return slots;\n}\n\n/** A copy of `root` with `value` at `path`, sharing everything else. */\nfunction withPath(root: unknown, path: string[], value: unknown): unknown {\n const [head, ...rest] = path;\n const copy: Record<string, unknown> = Array.isArray(root)\n ? ([...root] as unknown as Record<string, unknown>)\n : { ...(root as Record<string, unknown>) };\n copy[head!] =\n rest.length === 0\n ? value\n : withPath((root as Record<string, unknown>)[head!], rest, value);\n return copy;\n}\n\n/** The entry's compile with this request's claims in its slots. */\nfunction rebind(\n entry: Pick<Entry, \"compiled\" | \"slots\">,\n jwt: Record<string, unknown> | undefined,\n): CompiledRead {\n const statements = entry.compiled.statements.map((s) => ({\n text: s.text,\n params: s.params,\n }));\n const copied = new Set<number>();\n for (const slot of entry.slots) {\n const st = statements[slot.statement]!;\n if (!copied.has(slot.statement)) {\n st.params = { ...st.params };\n copied.add(slot.statement);\n }\n st.params[slot.param] = claimAt(jwt, slot.path);\n }\n return { ...entry.compiled, statements };\n}\n\n/**\n * The variables a field's selection references: in arguments, directives\n * and fragments it spreads. Null when a spread fragment declares its own\n * variables (fragment arguments), which this does not follow.\n */\nfunction variableNames(\n fieldNodes: readonly FieldNode[],\n fragments: Record<string, FragmentDefinitionNode>,\n): string[] | null {\n const names = new Set<string>();\n const visited = new Set<string>();\n let exact = true;\n const walk = (node: unknown): void => {\n if (Array.isArray(node)) {\n for (const n of node) walk(n);\n return;\n }\n if (node === null || typeof node !== \"object\") return;\n const ast = node as ASTNode;\n if (ast.kind === Kind.VARIABLE) {\n names.add(ast.name.value);\n return;\n }\n if (ast.kind === Kind.FRAGMENT_SPREAD) {\n const name = ast.name.value;\n if (!visited.has(name)) {\n visited.add(name);\n const fragment = fragments[name];\n if (fragment) {\n if (fragment.variableDefinitions?.length) exact = false;\n walk(fragment);\n }\n }\n }\n for (const [k, v] of Object.entries(ast)) {\n if (k === \"loc\") continue;\n if (v !== null && typeof v === \"object\") walk(v);\n }\n };\n walk(fieldNodes);\n return exact ? [...names].sort() : null;\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 */\nexport function 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","// 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(\n generate: Boolean = false\n \"VIEWER: a created key must start with the caller's @viewer claim and the separator (lou:tomorrowland).\"\n scope: KeyScope\n separator: String = \":\"\n ) on FIELD_DEFINITION\n\n enum KeyScope {\n VIEWER\n }\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 \"The claim that identifies the caller: the node of \\`type\\` whose \\`field\\` (a @key or @unique field) equals it. Enables isViewer and viewer in rules.\"\n directive @viewer(type: String!, field: 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 a type: false keeps the schema's bypass (see @authorizationDefaults) from skipping this type's rules.\"\n bypass: Boolean\n \"On a @mutation type: operations deliberately open to every caller, so check() does not report them as unguarded.\"\n public: [AuthOperation!]\n \"On a scalar field: a row failing unless reads the field as value (null when left out) instead of failing the request.\"\n mask: [AuthorizationMask!]\n ) on OBJECT | FIELD_DEFINITION\n\n \"Named rules over claims, usable in any rule as { rule: name }, on \\`extend schema\\`.\"\n directive @authorizationRules(\n rules: [AuthorizationRuleDefinition!]!\n ) on SCHEMA\n\n input AuthorizationRuleDefinition {\n name: String!\n where: AuthorizationWhere!\n }\n\n \"A named rule of this type, usable in its rules as { rule: name } and through a relationship to it as { rel: { rule: name } }.\"\n directive @authorizationRule(\n name: String!\n where: AuthorizationWhere!\n ) repeatable on OBJECT\n\n \"Schema-wide authorization settings, on \\`extend schema\\`.\"\n directive @authorizationDefaults(\n \"A claims-only test (jwt, AND, OR, NOT): a request passing it skips every filter and validate rule (not @authentication).\"\n bypass: AuthorizationWhere\n \"The write rule of every @mutation type that declares no CREATE, UPDATE or DELETE rule of its own.\"\n mutations: AuthorizationWhere\n ) on SCHEMA\n\n input AuthorizationMask {\n unless: AuthorizationWhere!\n value: DefaultValue\n }\n\n input AuthorizationFilterRule {\n operations: [AuthOperation!]! = [READ, UPDATE, DELETE]\n \"Default true: without a token the rule denies.\"\n requireAuthentication: Boolean\n where: AuthorizationWhere!\n }\n\n input AuthorizationValidateRule {\n operations: [AuthOperation!]! = [READ, CREATE, UPDATE, DELETE]\n when: [AuthorizationWhen!]! = [BEFORE, AFTER]\n \"Default true: without a token the rule denies.\"\n requireAuthentication: Boolean\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 \"On a relationship field: creating one of its relationships (connect, nested create).\"\n CONNECT\n \"On a relationship field: removing one of its relationships (disconnect).\"\n DISCONNECT\n \"On a relationship field: setting properties on an existing relationship (edge update, re-connect).\"\n UPDATE_EDGE\n \"On a relationship field: reading, filtering, sorting or aggregating its properties.\"\n READ_EDGE\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 \"KeyScope\",\n \"AuthorizationMask\",\n \"AuthorizationRuleDefinition\",\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","// Where each directive applies. GraphQL's `on` locations already refuse a\n// directive on the wrong kind of definition (a field directive on a type);\n// this table refuses one on the wrong kind of *field or type*: a\n// `@selectable` on a plain object field, an `@authorization` on an\n// interface field. A directive the model would not apply is a model error,\n// never silently ignored.\n\nimport {\n getNamedType,\n isInterfaceType,\n isObjectType,\n isUnionType,\n parse,\n type ConstDirectiveNode,\n type GraphQLField,\n type GraphQLNamedType,\n type GraphQLSchema,\n} from \"graphql\";\nimport type { ModelProblem } from \"../errors.js\";\nimport { directiveTypeDefs } from \"./directives.js\";\n\nexport type Position =\n | \"node type\"\n | \"relationship properties type\"\n | \"@jwt type\"\n | \"object type without @node\"\n | \"Query or Mutation type\"\n | \"interface\"\n | \"union\"\n | \"node field\"\n | \"relationship field\"\n | \"@cypher field\"\n | \"Query or Mutation field\"\n | \"@customResolver field\"\n | \"relationship property\"\n | \"interface field\"\n | \"interface relationship field\"\n | \"field of an object type without @node\"\n | \"@jwt claim\";\n\n/**\n * The directives each position applies, plus those it refuses with a more\n * specific message elsewhere in the model build (listed so they are not\n * reported twice).\n */\nexport const DIRECTIVE_POSITIONS: Readonly<\n Record<Position, readonly string[]>\n> = {\n \"node type\": [\n \"node\",\n \"authorizationRule\",\n \"query\",\n \"mutation\",\n \"subscription\",\n \"authentication\",\n \"authorization\",\n \"fulltext\",\n \"limit\",\n ],\n \"relationship properties type\": [\"relationshipProperties\"],\n \"@jwt type\": [\"jwt\"],\n \"object type without @node\": [],\n \"Query or Mutation type\": [],\n interface: [\"query\", \"plural\", \"limit\"],\n union: [\"query\", \"plural\", \"limit\"],\n \"node field\": [\n \"key\",\n \"unique\",\n \"private\",\n \"relayId\",\n \"sortable\",\n \"groupBy\",\n \"filterable\",\n \"alias\",\n \"index\",\n \"default\",\n \"timestamp\",\n \"readonly\",\n \"authentication\",\n \"settable\",\n \"selectable\",\n \"populatedBy\",\n \"authorization\",\n \"vector\",\n // Refused with \"@relationship target must be a @node type\".\n \"relationship\",\n ],\n \"relationship field\": [\n \"relationship\",\n \"authorization\",\n \"authentication\",\n \"settable\",\n \"readonly\",\n \"filterable\",\n \"cardinality\",\n \"limit\",\n // Refused with \"@x is not allowed on a relationship field\".\n \"key\",\n \"unique\",\n \"sortable\",\n \"alias\",\n \"index\",\n \"default\",\n \"timestamp\",\n \"populatedBy\",\n \"selectable\",\n \"private\",\n \"groupBy\",\n \"vector\",\n \"relayId\",\n ],\n \"@cypher field\": [\n \"cypher\",\n \"authorization\",\n \"authentication\",\n \"filterable\",\n \"sortable\",\n // Refused with \"@x cannot be combined with @cypher\".\n \"relationship\",\n \"key\",\n \"unique\",\n \"alias\",\n \"index\",\n \"default\",\n \"timestamp\",\n \"groupBy\",\n ],\n \"Query or Mutation field\": [\n \"cypher\",\n \"authorization\",\n \"authentication\",\n // Refused with a specific message.\n \"filterable\",\n \"sortable\",\n \"relationship\",\n \"key\",\n \"unique\",\n \"alias\",\n \"index\",\n \"default\",\n \"timestamp\",\n \"groupBy\",\n ],\n \"@customResolver field\": [\n \"customResolver\",\n \"authentication\",\n // Refused with \"@x cannot be combined with @customResolver\".\n \"cypher\",\n \"relationship\",\n \"key\",\n \"filterable\",\n \"sortable\",\n \"groupBy\",\n ],\n \"relationship property\": [\n \"private\",\n \"sortable\",\n \"filterable\",\n \"alias\",\n \"default\",\n \"timestamp\",\n \"readonly\",\n \"authentication\",\n \"settable\",\n \"selectable\",\n \"authorization\",\n // Refused with a specific message.\n \"key\",\n \"unique\",\n \"relayId\",\n \"index\",\n \"vector\",\n \"groupBy\",\n ],\n \"interface field\": [\n \"filterable\",\n \"sortable\",\n // Refused with a specific message.\n \"key\",\n \"unique\",\n \"relayId\",\n \"index\",\n \"vector\",\n \"groupBy\",\n ],\n \"interface relationship field\": [\"declareRelationship\"],\n \"field of an object type without @node\": [],\n \"@jwt claim\": [\"jwtClaim\", \"viewer\"],\n};\n\nconst HINTS: Partial<Record<Position, string>> = {\n \"interface field\": \"; put it on the field of each implementation\",\n \"@customResolver field\": \"; the resolver decides what it returns\",\n \"field of an object type without @node\":\n \"; this type only shapes @cypher results\",\n \"object type without @node\": \"; this type only shapes @cypher results\",\n};\n\nlet known: ReadonlySet<string> | undefined;\n\n/** The directives this library defines (not graphql's built-ins). */\nexport function libraryDirectives(): ReadonlySet<string> {\n known ??= new Set(\n parse(directiveTypeDefs).definitions.flatMap((d) =>\n d.kind === \"DirectiveDefinition\" ? [d.name.value] : [],\n ),\n );\n return known;\n}\n\nexport interface PositionContext {\n schema: GraphQLSchema;\n nodeNames: ReadonlySet<string>;\n propsNames: ReadonlySet<string>;\n jwtType: string | undefined;\n /** @node types, interfaces and unions: what a relationship may target. */\n targetNames: ReadonlySet<string>;\n userTypes: readonly GraphQLNamedType[];\n}\n\n/** Report every library directive used where the model would ignore it. */\nexport function checkDirectivePositions(\n ctx: PositionContext,\n problems: ModelProblem[],\n): void {\n const ours = libraryDirectives();\n const check = (\n directives: readonly ConstDirectiveNode[],\n position: Position,\n type: string,\n field?: string,\n ) => {\n const allowed = DIRECTIVE_POSITIONS[position];\n for (const dir of directives) {\n const name = dir.name.value;\n if (!ours.has(name) || allowed.includes(name)) continue;\n problems.push({\n type,\n ...(field ? { field } : {}),\n message: `@${name} is not supported on ${/^[aeiou]/.test(position) ? \"an\" : \"a\"} ${position}${HINTS[position] ?? \"\"}`,\n });\n }\n };\n const typeDirectives = (t: GraphQLNamedType) => [\n ...(t.astNode?.directives ?? []),\n ...t.extensionASTNodes.flatMap((n) => n.directives ?? []),\n ];\n const has = (f: GraphQLField<unknown, unknown>, name: string) =>\n f.astNode?.directives?.some((x) => x.name.value === name) ?? false;\n\n for (const t of ctx.userTypes) {\n if (isUnionType(t)) {\n check(typeDirectives(t), \"union\", t.name);\n continue;\n }\n if (isInterfaceType(t)) {\n check(typeDirectives(t), \"interface\", t.name);\n for (const f of Object.values(t.getFields())) {\n check(\n f.astNode?.directives ?? [],\n has(f as GraphQLField<unknown, unknown>, \"declareRelationship\")\n ? \"interface relationship field\"\n : \"interface field\",\n t.name,\n f.name,\n );\n }\n continue;\n }\n if (!isObjectType(t)) continue;\n let typePosition: Position;\n let fieldPosition: (f: GraphQLField<unknown, unknown>) => Position;\n if (t.name === \"Query\" || t.name === \"Mutation\") {\n typePosition = \"Query or Mutation type\";\n fieldPosition = () => \"Query or Mutation field\";\n } else if (t.name === ctx.jwtType) {\n typePosition = \"@jwt type\";\n fieldPosition = () => \"@jwt claim\";\n } else if (ctx.nodeNames.has(t.name)) {\n typePosition = \"node type\";\n fieldPosition = (f) =>\n has(f, \"customResolver\")\n ? \"@customResolver field\"\n : has(f, \"cypher\")\n ? \"@cypher field\"\n : ctx.targetNames.has(getNamedType(f.type).name)\n ? \"relationship field\"\n : \"node field\";\n } else if (ctx.propsNames.has(t.name)) {\n typePosition = \"relationship properties type\";\n fieldPosition = () => \"relationship property\";\n } else if (t.name === \"Subscription\") {\n continue;\n } else {\n typePosition = \"object type without @node\";\n fieldPosition = () => \"field of an object type without @node\";\n }\n check(typeDirectives(t), typePosition, t.name);\n for (const f of Object.values(t.getFields())) {\n check(f.astNode?.directives ?? [], fieldPosition(f), t.name, f.name);\n }\n }\n}\n","// Rule sugar, expanded at model build into the rule AST the compiler\n// already understands, so a sugared rule compiles to exactly the statement\n// its hand-written form does.\n//\n// - `isViewer: true` on the viewer type (the `@viewer` claim's type) becomes\n// `{ <viewer field>: { eq: \"$jwt.<claim>\" } }`, at any depth of a `node`\n// filter: `{ node: { author: { isViewer: true } } }`.\n// - `{ rule: \"name\" }` is replaced by that named rule's where: a rule of\n// the type it stands on (`@authorizationRule`), or a claims-only schema\n// rule (`@authorizationRules`). Inside a node filter it names a rule of\n// that node's type and must test `node` only:\n// `{ node: { trip: { rule: \"member\" } } }`.\n\nimport type { ModelProblem } from \"../errors.js\";\nimport type {\n AbstractType,\n AuthorizationWhere,\n NodeType,\n RelationshipPropertiesType,\n} from \"./types.js\";\n\n/** The `@viewer` claim: which node, by which unique field, is the caller. */\nexport interface ViewerMapping {\n claim: string;\n type: string;\n field: string;\n}\n\n/** Named rules: claims-only schema rules, and rules per node type. */\nexport interface NamedRules {\n schema: ReadonlyMap<string, AuthorizationWhere>;\n byType: ReadonlyMap<string, ReadonlyMap<string, AuthorizationWhere>>;\n /** Cycles reported so far, so each is reported once. */\n reportedCycles?: Set<string>;\n}\n\n/**\n * Stands where a rule reference could not expand (an error was reported):\n * the rule checks skip it rather than report it again as empty.\n */\nexport const UNEXPANDED: Readonly<Record<string, never>> = Object.freeze({});\n\nexport interface DesugarContext {\n nodes: ReadonlyMap<string, NodeType>;\n props: ReadonlyMap<string, RelationshipPropertiesType>;\n viewer: ViewerMapping | undefined;\n /** Interfaces and unions, for filters through an abstract relationship. */\n abstracts?: ReadonlyMap<string, AbstractType>;\n rules?: NamedRules;\n /** Named rules being expanded, to report a cycle with its chain. */\n expanding?: string[];\n at: (message: string) => void;\n}\n\ntype Where = Record<string, unknown>;\n\nconst isRecord = (x: unknown): x is Where =>\n typeof x === \"object\" && x !== null && !Array.isArray(x);\n\nconst QUANTIFIERS = new Set([\"some\", \"all\", \"none\", \"single\"]);\n\n/**\n * A rule's where, sugar expanded. `owner` is the type the rule's `node`\n * part tests (undefined on relationship properties: claims only).\n */\nexport function desugarRule(\n ctx: DesugarContext,\n owner: NodeType | undefined,\n where: AuthorizationWhere,\n ends?: { source: NodeType; target: NodeType },\n): AuthorizationWhere {\n if (!isRecord(where)) return where;\n const keys = Object.keys(where);\n if (keys.length === 1 && keys[0] === \"rule\") {\n // Alone, the reference is its rule: exactly the hand-written form.\n return expandRule(ctx, owner, where[\"rule\"]) ?? UNEXPANDED;\n }\n const out: Where = {};\n const extra: Where[] = [];\n for (const [key, value] of Object.entries(where)) {\n if (key === \"rule\") {\n const expanded = expandRule(ctx, owner, value);\n if (expanded) extra.push(expanded);\n } else if (key === \"AND\" || key === \"OR\") {\n out[key] = Array.isArray(value)\n ? value.map((w) => desugarRule(ctx, owner, w as Where, ends))\n : value;\n } else if (key === \"NOT\") {\n out[key] = desugarRule(ctx, owner, value as Where, ends);\n } else if (ends && (key === \"source\" || key === \"target\")) {\n out[key] = desugarNode(ctx, ends[key], value);\n } else if (key === \"node\" && owner) {\n out[key] = desugarNode(ctx, owner, value);\n } else if (key === \"viewer\") {\n const viewerType = ctx.viewer && ctx.nodes.get(ctx.viewer.type);\n if (!viewerType) {\n ctx.at(\"`viewer` needs a @viewer claim on the @jwt type\");\n out[key] = value;\n } else out[key] = desugarNode(ctx, viewerType, value);\n } else {\n out[key] = value;\n }\n }\n if (extra.length > 0) {\n out[\"AND\"] = [...(Array.isArray(out[\"AND\"]) ? out[\"AND\"] : []), ...extra];\n }\n return out;\n}\n\n/**\n * The where of the rule `name` names, where it stands: a rule of `owner`\n * (`@authorizationRule`), else a schema rule. Its own references expand\n * too; a cycle is reported with its chain.\n */\nfunction expandRule(\n ctx: DesugarContext,\n owner: NodeType | undefined,\n name: unknown,\n): Where | undefined {\n if (typeof name !== \"string\") {\n ctx.at(\"`rule` takes the name of a rule\");\n return undefined;\n }\n const own = owner && ctx.rules?.byType.get(owner.name)?.get(name);\n const schema = ctx.rules?.schema.get(name);\n const id = own ? `${owner.name}.${name}` : name;\n const def = own ?? schema;\n if (!def) {\n ctx.at(\n `unknown rule \"${name}\"${owner ? ` (not a rule of ${owner.name} or of the schema)` : \" (not a schema rule)\"}`,\n );\n return undefined;\n }\n return withinRule(ctx, id, () =>\n desugarRule(ctx, own ? owner : undefined, def),\n );\n}\n\n/** Expand a named rule's body, refusing a cycle. */\nfunction withinRule(\n ctx: DesugarContext,\n id: string,\n expand: () => Where,\n): Where | undefined {\n const stack = (ctx.expanding ??= []);\n const at = stack.indexOf(id);\n if (at >= 0) {\n const cycle = stack.slice(at);\n const reported = (ctx.rules!.reportedCycles ??= new Set());\n const id_ = [...cycle].sort().join(\"\\0\");\n if (!reported.has(id_)) {\n reported.add(id_);\n ctx.at(`rule cycle: ${[...cycle, id].join(\" → \")}`);\n }\n return undefined;\n }\n stack.push(id);\n try {\n return expand();\n } finally {\n stack.pop();\n }\n}\n\n/**\n * A rule of `node`'s type, used inside a node filter: its `node` parts\n * become the filter itself. A rule that tests anything but `node` (claims,\n * the viewer) cannot stand inside a node filter.\n */\nfunction expandNodeRule(\n ctx: DesugarContext,\n node: NodeType,\n name: unknown,\n): unknown {\n if (typeof name !== \"string\") {\n ctx.at(\"`rule` takes the name of a rule\");\n return undefined;\n }\n const def = ctx.rules?.byType.get(node.name)?.get(name);\n if (!def) {\n ctx.at(\n ctx.rules?.schema.has(name)\n ? `rule \"${name}\" is a schema rule over claims; use it beside node, not inside it`\n : `unknown rule \"${name}\" (not a rule of ${node.name})`,\n );\n return undefined;\n }\n const expanded = withinRule(ctx, `${node.name}.${name}`, () =>\n desugarRule(ctx, node, def),\n );\n return expanded && toNodeFilter(ctx, node, name, expanded);\n}\n\nfunction toNodeFilter(\n ctx: DesugarContext,\n node: NodeType,\n name: string,\n where: Where,\n): unknown {\n const parts: unknown[] = [];\n for (const [key, value] of Object.entries(where)) {\n if (key === \"node\") parts.push(value);\n else if (key === \"AND\" || key === \"OR\") {\n parts.push({\n [key]: (value as Where[]).map((w) => toNodeFilter(ctx, node, name, w)),\n });\n } else if (key === \"NOT\") {\n parts.push({ NOT: toNodeFilter(ctx, node, name, value as Where) });\n } else {\n ctx.at(\n `rule ${node.name}.${name} tests ${key}; only a rule that tests node alone can be used inside a node filter`,\n );\n }\n }\n return parts.length === 1 ? parts[0] : { AND: parts };\n}\n\n/** A `node` filter over `node`, sugar expanded, keys kept in order. */\nexport function desugarNode(\n ctx: DesugarContext,\n node: NodeType,\n where: unknown,\n): unknown {\n if (!isRecord(where)) return where;\n const keys = Object.keys(where);\n if (keys.length === 1 && keys[0] === \"rule\") {\n return expandNodeRule(ctx, node, where[\"rule\"]) ?? UNEXPANDED;\n }\n const out: Where = {};\n // Tests that must go under AND, because their key is taken.\n const extra: Where[] = [];\n for (const [key, value] of Object.entries(where)) {\n if (key === \"rule\") {\n const expanded = expandNodeRule(ctx, node, value);\n if (expanded) extra.push(expanded as Where);\n continue;\n }\n if (key === \"AND\" || key === \"OR\") {\n out[key] = Array.isArray(value)\n ? value.map((w) => desugarNode(ctx, node, w))\n : value;\n continue;\n }\n if (key === \"NOT\") {\n out[key] = desugarNode(ctx, node, value);\n continue;\n }\n if (key === \"isViewer\") {\n const test = isViewer(ctx, node, value);\n if (test) {\n const [field, ops] = test;\n // The field may be tested too: then both must hold.\n if (field in where) extra.push({ [field]: ops });\n else out[field] = ops;\n }\n continue;\n }\n const f = node.fields.get(key);\n if (f?.kind === \"relationship\") {\n const target = ctx.nodes.get(f.target);\n const abstract = ctx.abstracts?.get(f.target);\n const inner = (w: unknown) =>\n target\n ? desugarNode(ctx, target, w)\n : abstract\n ? desugarAbstract(ctx, abstract, w)\n : w;\n out[key] = f.list ? quantified(value, inner) : inner(value);\n continue;\n }\n if (!f && key.endsWith(\"Connection\")) {\n const rel = node.fields.get(key.slice(0, -\"Connection\".length));\n const target =\n rel?.kind === \"relationship\" ? ctx.nodes.get(rel.target) : undefined;\n if (target) {\n out[key] = quantified(value, (pair) =>\n isRecord(pair) && \"node\" in pair\n ? { ...pair, node: desugarNode(ctx, target, pair[\"node\"]) }\n : pair,\n );\n continue;\n }\n }\n out[key] = value;\n }\n if (extra.length > 0) {\n out[\"AND\"] = [...(Array.isArray(out[\"AND\"]) ? out[\"AND\"] : []), ...extra];\n }\n return out;\n}\n\n/**\n * A filter through a relationship to an interface or union. A union's\n * filter names members (`{ Person: { isViewer: true } }`): each is a node\n * filter of that member. An interface's filter tests the interface's own\n * fields, where node sugar has no single type to expand against.\n */\nfunction desugarAbstract(\n ctx: DesugarContext,\n abstract: AbstractType,\n where: unknown,\n): unknown {\n if (!isRecord(where)) return where;\n if (abstract.kind === \"union\") {\n return Object.fromEntries(\n Object.entries(where).map(([member, w]) => {\n const node = abstract.members.includes(member)\n ? ctx.nodes.get(member)\n : undefined;\n return [member, node ? desugarNode(ctx, node, w) : w];\n }),\n );\n }\n const visit = (w: unknown): void => {\n if (Array.isArray(w)) return w.forEach(visit);\n if (!isRecord(w)) return;\n for (const [k, v] of Object.entries(w)) {\n if (k === \"isViewer\" || k === \"rule\") {\n ctx.at(\n `${k} cannot stand in a filter over the interface ${abstract.name}; filter one implementation through a union, or test the viewer field`,\n );\n } else if (k === \"AND\" || k === \"OR\" || k === \"NOT\") visit(v);\n }\n };\n visit(where);\n return where;\n}\n\nfunction quantified(value: unknown, map: (w: unknown) => unknown): unknown {\n if (!isRecord(value)) return value;\n return Object.fromEntries(\n Object.entries(value).map(([q, inner]) => [\n q,\n QUANTIFIERS.has(q) ? map(inner) : inner,\n ]),\n );\n}\n\nfunction isViewer(\n ctx: DesugarContext,\n node: NodeType,\n value: unknown,\n): [string, Where] | undefined {\n if (!ctx.viewer) {\n ctx.at(\"isViewer needs a @viewer claim on the @jwt type\");\n return undefined;\n }\n if (value !== true) {\n ctx.at(\"isViewer takes `true`; wrap it in NOT for the opposite\");\n return undefined;\n }\n if (node.name !== ctx.viewer.type) {\n ctx.at(\n `isViewer applies to ${ctx.viewer.type} (the @viewer type), not ${node.name}`,\n );\n return undefined;\n }\n return [ctx.viewer.field, { eq: `$jwt.${ctx.viewer.claim}` }];\n}\n\n/** Model problems for a `@viewer` mapping, once the node types are built. */\nexport function checkViewer(\n viewer: ViewerMapping,\n nodes: ReadonlyMap<string, NodeType>,\n jwtType: string,\n problems: ModelProblem[],\n): void {\n const at = (message: string): void => {\n problems.push({ type: jwtType, field: viewer.claim, message });\n };\n const node = nodes.get(viewer.type);\n if (!node) return at(`@viewer: ${viewer.type} is not a @node type`);\n const f = node.fields.get(viewer.field);\n if (f?.kind !== \"scalar\") {\n return at(`@viewer: ${viewer.type} has no field ${viewer.field}`);\n }\n if (!f.key && !f.unique) {\n at(\n `@viewer: ${viewer.type}.${viewer.field} must be @key or @unique, so it names one node`,\n );\n }\n if (f.list) at(`@viewer: ${viewer.type}.${viewer.field} cannot be a list`);\n}\n","// What the generated mutation inputs offer, decided from the model alone,\n// so an input type that would have no field is left out (with whatever\n// would take it) instead of breaking the schema.\n\nimport { memberFields } from \"./relations.js\";\nimport type {\n GraphModel,\n NodeType,\n RelationshipField,\n RelationshipPropertiesType,\n ScalarField,\n} from \"./types.js\";\n\n/** Whether clients may set a field on `op` (`@settable`, `@readonly`, …). */\nexport function settable(\n f: ScalarField | RelationshipField,\n op: \"CREATE\" | \"UPDATE\",\n): boolean {\n return op === \"CREATE\" ? f.settableOn.create : f.settableOn.update;\n}\n\n/**\n * Whether an update input for `node` has any field: a scalar settable on\n * update, or a relationship offering a nested operation.\n */\nexport function isUpdatable(\n model: GraphModel,\n node: NodeType,\n seen: Set<string> = new Set(),\n): boolean {\n if (seen.has(node.name)) return false;\n seen.add(node.name);\n return [...node.fields.values()].some((f) =>\n f.kind === \"scalar\"\n ? settable(f, \"UPDATE\")\n : f.kind === \"relationship\" &&\n settable(f, \"UPDATE\") &&\n offersNested(model, f, true, seen),\n );\n}\n\n/** Whether the create or update input of `rel` offers any operation. */\nexport function offersNested(\n model: GraphModel,\n rel: RelationshipField,\n update: boolean,\n seen: Set<string> = new Set(),\n): boolean {\n const allows = (op: Parameters<typeof rel.nestedOperations.has>[0]) =>\n rel.nestedOperations.has(op);\n const members = memberFields(model, rel);\n if (allows(\"CONNECT\") && members.length > 0) return true;\n if (\n allows(\"CREATE\") &&\n members.some((m) => model.nodes.get(m.target)?.mutations.has(\"CREATE\"))\n ) {\n return true;\n }\n if (!update) return false;\n if (allows(\"DISCONNECT\") && members.length > 0) return true;\n // Interfaces and unions offer connect, create and disconnect only.\n if (model.abstracts.has(rel.target)) return false;\n const target = model.nodes.get(rel.target)!;\n if (allows(\"DELETE\") && target.mutations.has(\"DELETE\")) return true;\n if (!allows(\"UPDATE\")) return false;\n const props = rel.properties\n ? model.relationshipProperties.get(rel.properties)\n : undefined;\n return (\n (props !== undefined && hasSettable(props, \"UPDATE\")) ||\n (target.mutations.has(\"UPDATE\") && isUpdatable(model, target, seen))\n );\n}\n\n/** Whether any property of a @relationshipProperties type is settable on `op`. */\nexport function hasSettable(\n props: RelationshipPropertiesType,\n op: \"CREATE\" | \"UPDATE\",\n): boolean {\n return [...props.fields.values()].some((f) => settable(f, op));\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 valueFromAST,\n type ConstValueNode,\n type DocumentNode,\n type GraphQLArgument,\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 { checkDirectivePositions } from \"./positions.js\";\nimport {\n UNEXPANDED,\n checkViewer,\n desugarRule,\n type DesugarContext,\n type NamedRules,\n type ViewerMapping,\n} from \"./desugar.js\";\nimport { codeOnly, maskLiterals, 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\";\nimport { PLACEHOLDER, RELATIONSHIP_OPERATIONS } from \"./types.js\";\nimport { isUpdatable } from \"./inputs.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 // `extend schema @authorizationDefaults(...)`.\n const defaults: {\n bypass?: AuthorizationWhere;\n mutations?: AuthorizationWhere;\n } = {};\n for (const node of [schema.astNode, ...schema.extensionASTNodes]) {\n if (!node) continue;\n const args = directive(\n d(\"authorizationDefaults\"),\n { astNode: node },\n (message) => problems.push({ type: \"schema\", message }),\n );\n if (!args) continue;\n if (args[\"bypass\"] != null)\n defaults.bypass = args[\"bypass\"] as AuthorizationWhere;\n if (args[\"mutations\"] != null)\n defaults.mutations = args[\"mutations\"] as AuthorizationWhere;\n }\n // `extend schema @authorizationRules(rules: [...])`: claims-only rules.\n const schemaRules = new Map<string, AuthorizationWhere>();\n for (const node of [schema.astNode, ...schema.extensionASTNodes]) {\n for (const dir of node?.directives ?? []) {\n if (dir.name.value !== \"authorizationRules\") continue;\n const args = directive(\n d(\"authorizationRules\"),\n { astNode: { directives: [dir] } },\n (message) => problems.push({ type: \"schema\", message }),\n );\n for (const r of (args?.[\"rules\"] as\n | Array<{ name: string; where: AuthorizationWhere }>\n | undefined) ?? []) {\n if (schemaRules.has(r.name)) {\n problems.push({\n type: \"schema\",\n message: `@authorizationRules: rule \"${r.name}\" is defined twice`,\n });\n }\n schemaRules.set(r.name, r.where);\n }\n }\n }\n\n const enums = new Map<string, EnumType>();\n const scalars = new Map<string, ScalarType>();\n const scalarDescriptions = new Map<string, string>();\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 let jwtType: string | undefined;\n let viewer: ViewerMapping | 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)) {\n scalars.set(t.name, stored);\n if (t.description) scalarDescriptions.set(t.name, t.description);\n }\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 jwtType = t.name;\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 const viewerArgs = directive(d(\"viewer\"), f, atType(t.name));\n if (viewerArgs) {\n if (viewer) {\n problems.push({\n type: t.name,\n field: f.name,\n message: `only one @viewer claim is allowed (${viewer.claim} has one)`,\n });\n }\n viewer = {\n claim: f.name,\n type: viewerArgs[\"type\"] as string,\n field: viewerArgs[\"field\"] as string,\n };\n }\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 checkDirectivePositions(\n { schema, nodeNames, propsNames, jwtType, targetNames, userTypes },\n problems,\n );\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.populatedBy?.operations.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, @populatedBy(operations: [CREATE]) 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.settableOn.create\n ) {\n problems.push({\n type: node.name,\n field: f.name,\n message:\n \"a required relationship must be settable on create, or creates could never set it\",\n });\n } else 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 // `@authorizationRule(name:, where:)` on node types (repeatable).\n const typeRules = new Map<string, Map<string, AuthorizationWhere>>();\n for (const t of nodeTypes) {\n const own = new Map<string, AuthorizationWhere>();\n for (const dir of t.astNode?.directives ?? []) {\n if (dir.name.value !== \"authorizationRule\") continue;\n const args = directive(\n d(\"authorizationRule\"),\n { astNode: { directives: [dir] } },\n atType(t.name),\n );\n if (!args) continue;\n const name = args[\"name\"] as string;\n if (own.has(name)) {\n atType(t.name)(`@authorizationRule: rule \"${name}\" is defined twice`);\n }\n if (schemaRules.has(name)) {\n atType(t.name)(\n `@authorizationRule: rule \"${name}\" shadows the schema rule of that name; rename one`,\n );\n }\n own.set(name, args[\"where\"] as AuthorizationWhere);\n }\n if (own.size > 0) typeRules.set(t.name, own);\n }\n const namedRules: NamedRules = { schema: schemaRules, byType: typeRules };\n const schemaDesugar = (where: AuthorizationWhere) =>\n desugarRule(\n {\n nodes,\n props: relationshipProperties,\n viewer,\n abstracts,\n rules: namedRules,\n at: (message) =>\n problems.push({\n type: \"schema\",\n message: `@authorization: ${message}`,\n }),\n },\n undefined,\n where,\n );\n // Schema rules test claims only, so they stay compile-time decisions.\n for (const [name, where] of schemaRules) {\n const expanded = schemaDesugar(where);\n const violations = claimsOnlyViolations(expanded);\n for (const key of violations) {\n problems.push({\n type: \"schema\",\n message: `@authorizationRules: rule \"${name}\" tests claims only (jwt, AND, OR, NOT); ${key} is not allowed (a node rule belongs on its type, with @authorizationRule)`,\n });\n }\n if (violations.length === 0) {\n checkRuleWhere(\n nodes,\n relationshipProperties,\n undefined,\n \"schema\",\n undefined,\n expanded,\n problems,\n jwtShape,\n );\n }\n }\n\n // @authorizationDefaults: a claims-only bypass, and the write rule of\n // every @mutation type without one of its own.\n if (defaults.bypass) {\n defaults.bypass = schemaDesugar(defaults.bypass);\n const violations = claimsOnlyViolations(defaults.bypass);\n for (const key of violations) {\n problems.push({\n type: \"schema\",\n message: `@authorizationDefaults(bypass:) tests claims only (jwt, AND, OR, NOT), so it stays a compile-time decision; ${key} is not allowed`,\n });\n }\n if (violations.length === 0) {\n checkRuleWhere(\n nodes,\n relationshipProperties,\n undefined,\n \"schema\",\n undefined,\n defaults.bypass,\n problems,\n jwtShape,\n );\n }\n }\n if (defaults.mutations) {\n const WRITES: AuthOperation[] = [\"CREATE\", \"UPDATE\", \"DELETE\"];\n for (const node of nodes.values()) {\n if (node.mutations.size === 0) continue;\n const own = [\n ...(node.authorization?.filter ?? []),\n ...(node.authorization?.validate ?? []),\n ].some((r) => WRITES.some((op) => r.operations.has(op)));\n if (own) continue;\n (node as { authorization: Authorization }).authorization = {\n ...(node.authorization ?? { filter: [] }),\n validate: [\n ...(node.authorization?.validate ?? []),\n {\n operations: new Set<AuthOperation>(WRITES),\n when: new Set<\"BEFORE\" | \"AFTER\">([\"BEFORE\", \"AFTER\"]),\n requireAuthentication: true,\n where: defaults.mutations,\n },\n ],\n };\n }\n }\n for (const node of nodes.values()) {\n if (node.authorization?.mask) {\n problems.push({\n type: node.name,\n message: \"@authorization(mask:) belongs on a scalar field\",\n });\n }\n for (const f of node.fields.values()) {\n const masks = f.authorization?.mask ?? [];\n const at = (message: string) =>\n problems.push({ type: node.name, field: f.name, message });\n if (masks.length > 0 && (f.kind !== \"scalar\" || f.key)) {\n at(\n \"@authorization(mask:) belongs on a scalar field that is not the @key\",\n );\n } else if (f.kind === \"scalar\") {\n for (const m of masks) {\n const missing = (m as { missingValue?: boolean }).missingValue;\n if (m.value === null && f.required) {\n at(\n missing\n ? \"@authorization(mask:) on a non-null field needs a value\"\n : \"@authorization(mask:) value null does not fit a non-null field\",\n );\n } else if (\n m.value !== null &&\n (!defaultMatches(f.type, f.list, m.value) ||\n (f.enumName !== undefined &&\n !(enums.get(f.enumName)?.values ?? []).some(\n (v) => v.name === m.value,\n )))\n ) {\n at(\n `@authorization(mask:) value ${JSON.stringify(m.value)} does not fit ${f.list ? `[${f.enumName ?? f.type}]` : (f.enumName ?? f.type)}`,\n );\n }\n }\n }\n if (f.authorization?.bypass !== undefined || f.authorization?.public) {\n problems.push({\n type: node.name,\n field: f.name,\n message: \"@authorization(bypass:, public:) belong on the type\",\n });\n }\n }\n }\n\n abstractsOf.set(nodes, abstracts);\n const ruleEnds = (f: RelationshipField): RuleEnds | undefined => {\n const source = nodes.get(f.owner);\n const target = nodes.get(f.target);\n if (!source || !target) return undefined;\n return {\n source,\n target,\n edge: f.properties ? relationshipProperties.get(f.properties) : undefined,\n };\n };\n // Rule sugar (isViewer, viewer) expands into the plain rule AST before\n // the rules are checked, so the checks and the compiler see one form.\n if (viewer && jwtType) checkViewer(viewer, nodes, jwtType, problems);\n for (const node of nodes.values()) {\n if (node.key.keyScope && !viewer) {\n problems.push({\n type: node.name,\n field: node.key.name,\n message:\n \"@key(scope: VIEWER) needs a @viewer claim on the @jwt type: it names whose key space a create writes in\",\n });\n }\n }\n const viewerNode = viewer ? nodes.get(viewer.type) : undefined;\n const desugar = (\n owner: NodeType | undefined,\n type: string,\n field: string | undefined,\n rules: ReadonlyArray<{ where: AuthorizationWhere }>,\n ends?: { source: NodeType; target: NodeType },\n ) => {\n const ctx: DesugarContext = {\n nodes,\n props: relationshipProperties,\n viewer,\n abstracts,\n rules: namedRules,\n at: (message) =>\n problems.push({\n type,\n ...(field ? { field } : {}),\n message: `@authorization: ${message}`,\n }),\n };\n for (const rule of rules) {\n (rule as { where: AuthorizationWhere }).where = desugarRule(\n ctx,\n owner,\n rule.where,\n ends,\n );\n }\n };\n for (const node of nodes.values()) {\n desugar(node, node.name, undefined, [\n ...(node.authorization?.filter ?? []),\n ...(node.authorization?.validate ?? []),\n ]);\n for (const f of node.fields.values()) {\n if (!f.authorization) continue;\n for (const m of f.authorization.mask ?? []) {\n const rule = { where: m.unless };\n desugar(node, node.name, f.name, [rule]);\n (m as { unless: AuthorizationWhere }).unless = rule.where;\n }\n const rel = f.authorization.validate.filter(isRelationshipRule);\n desugar(node, node.name, f.name, [\n ...f.authorization.filter,\n ...f.authorization.validate.filter((r) => !isRelationshipRule(r)),\n ]);\n const ends = f.kind === \"relationship\" ? ruleEnds(f) : undefined;\n if (ends) desugar(undefined, node.name, f.name, rel, ends);\n }\n }\n for (const props of relationshipProperties.values()) {\n for (const f of props.fields.values()) {\n if (f.authorization) {\n desugar(undefined, props.name, f.name, f.authorization.validate);\n }\n }\n }\n // Named rules of a type are checked as rules of that type, used or not.\n for (const [typeName, own] of typeRules) {\n const node = nodes.get(typeName);\n if (!node) continue;\n for (const name of own.keys()) {\n // Expanded by reference, so a cycle's chain starts at this rule.\n const rule = { where: { rule: name } as AuthorizationWhere };\n desugar(node, typeName, undefined, [rule]);\n checkAuthorizationWhere(\n nodes,\n relationshipProperties,\n node,\n rule.where,\n problems,\n jwtShape,\n viewerNode,\n );\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 rule of rules) {\n const misplaced = [...rule.operations].filter((op) =>\n RELATIONSHIP_OPERATIONS.has(op),\n );\n if (misplaced.length > 0) {\n problems.push({\n type: node.name,\n message: `@authorization: ${misplaced.join(\", \")} rules belong on a relationship field`,\n });\n }\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 for (const m of f.authorization.mask ?? []) {\n checkAuthorizationWhere(\n nodes,\n relationshipProperties,\n node,\n m.unless,\n problems,\n jwtShape,\n viewerNode,\n );\n }\n for (const rule of f.authorization.validate) {\n if (!isRelationshipRule(rule)) {\n rules.push(rule);\n continue;\n }\n const ends = f.kind === \"relationship\" ? ruleEnds(f) : undefined;\n if (!ends) {\n if (f.kind === \"scalar\") {\n problems.push({\n type: node.name,\n field: f.name,\n message:\n \"@authorization: CONNECT, DISCONNECT, UPDATE_EDGE and READ_EDGE rules belong on a relationship field\",\n });\n } else if (f.kind === \"relationship\") {\n problems.push({\n type: node.name,\n field: f.name,\n message:\n \"@authorization: relationship rules need a @node target, not an interface or union\",\n });\n }\n continue;\n }\n checkRuleWhere(\n nodes,\n relationshipProperties,\n undefined,\n node.name,\n f.name,\n rule.where,\n problems,\n jwtShape,\n viewerNode,\n ends,\n );\n }\n }\n for (const rule of rules) {\n checkAuthorizationWhere(\n nodes,\n relationshipProperties,\n node,\n rule.where,\n problems,\n jwtShape,\n viewerNode,\n );\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 relationshipProperties,\n node,\n { jwt: where },\n problems,\n jwtShape,\n );\n }\n }\n }\n\n // Rules on relationship properties: validate rules over claims, for\n // reading and writing the property.\n for (const props of relationshipProperties.values()) {\n for (const f of props.fields.values()) {\n if (!f.authorization && !f.authentication) continue;\n const at = (message: string) =>\n problems.push({ type: props.name, field: f.name, message });\n if (f.authorization?.filter.length) {\n at(\n \"@authorization on a relationship property takes validate rules only\",\n );\n }\n if (f.authorization?.mask) {\n at(\"@authorization(mask:) belongs on a scalar field of a @node type\");\n }\n const ops = [\n ...(f.authorization?.validate ?? []).flatMap((r) => [...r.operations]),\n ...(f.authentication ?? []),\n ];\n const unsupported = [\n ...new Set(ops.filter((op) => !PROPERTY_OPS.has(op))),\n ];\n if (unsupported.length > 0) {\n at(\n `rules on a relationship property apply to READ, CREATE and UPDATE, not ${unsupported.join(\", \")}`,\n );\n }\n for (const rule of f.authorization?.validate ?? []) {\n checkRuleWhere(\n nodes,\n relationshipProperties,\n undefined,\n props.name,\n f.name,\n rule.where,\n problems,\n jwtShape,\n );\n }\n if (f.authenticationJwt) {\n checkRuleWhere(\n nodes,\n relationshipProperties,\n undefined,\n props.name,\n f.name,\n { jwt: f.authenticationJwt },\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 const model: GraphModel = {\n nodes,\n abstracts,\n enums,\n relationshipProperties,\n queries,\n mutations: mutationFields,\n warnings,\n objects,\n scalars,\n scalarDescriptions,\n jwt: jwtShape,\n viewer,\n bypass: defaults.bypass,\n cursorSecret: options.cursorSecret,\n };\n // An update input with nothing in it would break the schema: the\n // mutations that take it are left out, and the model says so.\n for (const node of nodes.values()) {\n if (node.mutations.has(\"UPDATE\") && !isUpdatable(model, node)) {\n warnings.push({\n type: node.name,\n message:\n \"@mutation(operations: [UPDATE]) but nothing is updatable (no field settable on update, no relationship with a nested operation): update mutations are left out\",\n });\n }\n }\n return model;\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 const scopeArgs = key ? keyArgs(d, f, at) : undefined;\n const keyScope =\n scopeArgs?.[\"scope\"] === \"VIEWER\"\n ? { separator: (scopeArgs[\"separator\"] as string | undefined) ?? \":\" }\n : undefined;\n if (keyScope) {\n if (generate) at(\"@key(scope:) and @key(generate: true) are exclusive\");\n if (keyScope.separator.length === 0) {\n at(\"@key(separator:) cannot be empty\");\n }\n if (type !== \"ID\" && type !== \"String\") {\n at(\"@key(scope:) needs an ID or String field\");\n }\n }\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 ...(keyScope ? { keyScope } : {}),\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(\n directive(d(\"authorization\"), f, at),\n at,\n true,\n );\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 // Directives about stored values have no meaning on a relationship:\n // refused, never silently ignored.\n for (const forbidden of [\n \"key\",\n \"unique\",\n \"sortable\",\n \"alias\",\n \"index\",\n \"default\",\n \"timestamp\",\n \"populatedBy\",\n \"selectable\",\n \"private\",\n \"groupBy\",\n \"vector\",\n \"relayId\",\n \"storedAs\",\n ]) {\n if (directive(d(forbidden), f, at)) {\n at(`@${forbidden} is not allowed on a relationship field`);\n }\n }\n const settableArgs = directive(d(\"settable\"), f, at);\n const readonlyFlag = directive(d(\"readonly\"), f, at) !== undefined;\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 settableOn: {\n create:\n !readonlyFlag &&\n ((settableArgs?.[\"onCreate\"] as boolean | undefined) ?? true),\n update:\n !readonlyFlag &&\n ((settableArgs?.[\"onUpdate\"] as boolean | undefined) ?? true),\n },\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: argumentDefault(a),\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`. */\n/**\n * The column a statement returns, when it returns exactly one: the alias\n * of the single item of its last top-level RETURN (or the item, when it\n * is a bare variable). Brackets, strings and comments are respected, so\n * `RETURN coalesce(a, b) AS n` and a RETURN inside `CALL { }` do not\n * confuse it.\n */\n/**\n * An SDL argument's default, as a value. graphql 16 keeps it on\n * `defaultValue`; graphql 17 builds `default: { literal }` from SDL and\n * leaves `defaultValue` undefined, so reading only `defaultValue` drops\n * `peers(limit: Int = 2)` to `peers(limit: Int)` there.\n */\nfunction argumentDefault(a: GraphQLArgument): unknown {\n if (a.defaultValue !== undefined) return a.defaultValue;\n const d = (a as { default?: { value?: unknown; literal?: ConstValueNode } })\n .default;\n if (!d) return undefined;\n if (\"value\" in d) return d.value;\n return d.literal ? valueFromAST(d.literal, a.type) : undefined;\n}\n\nfunction inferColumn(statement: string): string | undefined {\n const code = maskLiterals(statement);\n const depths: number[] = [];\n let depth = 0;\n for (const c of code) {\n if (c === \")\" || c === \"]\" || c === \"}\") depth--;\n depths.push(depth);\n if (c === \"(\" || c === \"[\" || c === \"{\") depth++;\n }\n const topLevel = (re: RegExp, from = 0) =>\n [...code.slice(from).matchAll(re)]\n .map((m) => ({ index: m.index! + from, length: m[0].length }))\n .filter((m) => depths[m.index] === 0);\n const last = topLevel(/\\bRETURN\\b/gi).at(-1);\n if (!last) return undefined;\n const start = last.index + last.length;\n const stop =\n topLevel(/\\b(ORDER\\s+BY|SKIP|LIMIT|UNION)\\b/gi, start)[0]?.index ??\n code.length;\n const commas = topLevel(/,/g, start).filter((m) => m.index < stop);\n if (commas.length > 0) return undefined;\n const item = code.slice(start, stop).replace(/^\\s*DISTINCT\\b/i, \"\");\n const offset = stop - item.length;\n const alias = /\\bAS\\s+(`[^`]*`|[A-Za-z_][A-Za-z0-9_]*)\\s*$/i.exec(item);\n if (alias) {\n const at = offset + alias.index + alias[0].indexOf(alias[1]!);\n const name = statement.slice(at, at + alias[1]!.length);\n return name.startsWith(\"`\") ? name.slice(1, -1) : name;\n }\n const bare = item.trim();\n return /^[A-Za-z_][A-Za-z0-9_]*$/.test(bare) ? bare : 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 relationship = false,\n): Authorization | undefined {\n const rules = readAuthorization(args);\n if (!rules) return undefined;\n for (const r of rules.validate) {\n const ops = [...r.operations];\n const rel = ops.filter((op) => RELATIONSHIP_OPERATIONS.has(op));\n if (rel.length > 0 && !relationship) {\n at(`${rel.join(\", \")} rules belong on a relationship field`);\n } else if (rel.length > 0 && rel.length < ops.length) {\n at(\n `a rule on ${rel.join(\", \")} tests source, target and edge; give READ its own rule`,\n );\n } else if (rel.length === 0 && ops.some((op) => op !== \"READ\")) {\n at(\n relationship\n ? \"field-level @authorization on a relationship field takes READ rules, or CONNECT, DISCONNECT, UPDATE_EDGE and READ_EDGE rules; write rules for the nodes belong on the types\"\n : \"field-level @authorization on a relationship or @cypher field takes READ rules only; write rules belong on the types\",\n );\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 requireAuthenticationDefaulted: r.requireAuthentication == null,\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 requireAuthenticationDefaulted: r.requireAuthentication == null,\n where: r.where,\n }));\n return {\n filter,\n validate,\n ...(args[\"bypass\"] != null ? { bypass: args[\"bypass\"] as boolean } : {}),\n ...(args[\"public\"] != null\n ? { public: new Set(args[\"public\"] as AuthOperation[]) }\n : {}),\n ...(args[\"mask\"] != null\n ? {\n mask: (\n args[\"mask\"] as Array<{\n unless: AuthorizationWhere;\n value?: unknown;\n }>\n ).map((m) => ({\n unless: m.unless,\n value: m.value ?? null,\n ...(\"value\" in m ? {} : { missingValue: true }),\n })),\n }\n : {}),\n };\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 PROPERTY_OPS = new Set<AuthOperation>([\"READ\", \"CREATE\", \"UPDATE\"]);\nconst JWT_OPS = new Set([...SCALAR_WHERE_OPS, \"includes\", \"exists\"]);\nconst COUNT_WHERE_OPS = new Set([\"eq\", \"lt\", \"lte\", \"gt\", \"gte\"]);\n\n/** Keys of a rule that are not claim tests: `node`, `viewer`, … */\nfunction claimsOnlyViolations(where: unknown, path = \"\"): string[] {\n if (!isRecord(where)) return [];\n const out: string[] = [];\n for (const [k, value] of Object.entries(where)) {\n const here = path ? `${path}.${k}` : k;\n if (k === \"AND\" || k === \"OR\") {\n if (Array.isArray(value)) {\n value.forEach((w, i) =>\n out.push(...claimsOnlyViolations(w, `${here}[${i}]`)),\n );\n }\n } else if (k === \"NOT\") out.push(...claimsOnlyViolations(value, here));\n else if (k !== \"jwt\") out.push(here);\n }\n return out;\n}\n\n/** A rule over a relationship's source, target and edge. */\nconst isRelationshipRule = (rule: {\n operations: ReadonlySet<AuthOperation>;\n}): boolean =>\n [...rule.operations].some((op) => RELATIONSHIP_OPERATIONS.has(op));\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 props: ReadonlyMap<string, RelationshipPropertiesType>,\n node: NodeType,\n where: unknown,\n problems: ModelProblem[],\n jwtShape?: ReadonlyMap<string, string>,\n viewerNode?: NodeType,\n) {\n checkRuleWhere(\n nodes,\n props,\n node,\n node.name,\n undefined,\n where,\n problems,\n jwtShape,\n viewerNode,\n );\n}\n\n/**\n * Check a rule's where. Without `node` (a relationship property's rules)\n * only claims may be tested: a @relationshipProperties type can sit under\n * several relationship fields, from either end, so `node` would be\n * ambiguous.\n */\n/** The ends a relationship field's rule tests, for its checks. */\ninterface RuleEnds {\n source: NodeType;\n target: NodeType;\n edge: RelationshipPropertiesType | undefined;\n}\n\nfunction checkRuleWhere(\n nodes: ReadonlyMap<string, NodeType>,\n props: ReadonlyMap<string, RelationshipPropertiesType>,\n node: NodeType | undefined,\n type: string,\n field: string | undefined,\n where: unknown,\n problems: ModelProblem[],\n jwtShape?: ReadonlyMap<string, string>,\n viewerNode?: NodeType,\n ends?: RuleEnds,\n) {\n const at = (message: string) =>\n problems.push({\n type,\n ...(field ? { field } : {}),\n message: `@authorization: ${message}`,\n });\n // A filter over a node type, with the strings and claims it uses.\n const nodePart = (t: NodeType, value: unknown, here: string) => {\n checkNodeWhere(nodes, props, t, value, here, at);\n for (const problem of ruleStringProblems(value)) at(`${here}: ${problem}`);\n for (const problem of viewerRefProblems(value, viewerNode))\n at(`${here}: ${problem}`);\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 };\n const expected = ends\n ? \"source, target, edge, viewer, jwt, AND, OR or NOT\"\n : \"node, viewer, jwt, AND, OR or NOT\";\n const visit = (w: unknown, path: string) => {\n if (w === UNEXPANDED) return; // already reported\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 (ends && (k === \"source\" || k === \"target\")) {\n nodePart(ends[k], value, here);\n } else if (ends && k === \"edge\") {\n if (!ends.edge) at(`${here}: the relationship has no properties`);\n else {\n checkEdgeWhere(ends.edge, value, here, at);\n for (const problem of ruleStringProblems(value))\n at(`${here}: ${problem}`);\n }\n } else if (k === \"node\" && ends) {\n at(`${here}: a relationship rule tests source, target and edge`);\n } else if (k === \"node\" && !node) {\n at(\n `${here}: rules on relationship properties test claims (jwt) only; node rules belong on the node types`,\n );\n } else if (k === \"node\" && node) {\n nodePart(node, value, here);\n } else if (k === \"viewer\") {\n // Desugaring already reported a missing @viewer.\n if (viewerNode) nodePart(viewerNode, value, here);\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, operand] of Object.entries(ops)) {\n if (!JWT_OPS.has(op))\n at(`${here}.${claim}: unknown operator ${op}`);\n if (JSON.stringify(operand ?? null).includes(\"${\")) {\n at(\n `${here}.${claim}.${op}: claim tests compare with literals; \\${...} placeholders belong in node parts`,\n );\n }\n }\n }\n }\n }\n } else {\n at(`${here}: expected ${expected}`);\n }\n }\n };\n visit(where, \"\");\n}\n\nfunction checkNodeWhere(\n nodes: ReadonlyMap<string, NodeType>,\n props: ReadonlyMap<string, RelationshipPropertiesType>,\n node: NodeType,\n where: unknown,\n path: string,\n at: (message: string) => void,\n) {\n if (where === UNEXPANDED) return; // already reported\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, props, node, x, `${here}[${i}]`, at),\n );\n continue;\n }\n if (k === \"NOT\") {\n checkNodeWhere(nodes, props, node, value, here, at);\n continue;\n }\n const field = node.fields.get(k);\n const connection = k.endsWith(\"Connection\")\n ? node.fields.get(k.slice(0, -\"Connection\".length))\n : undefined;\n if (\n !field &&\n connection?.kind === \"relationship\" &&\n connection.list &&\n connection.properties\n ) {\n // `<field>Connection: { some: { node, edge } }`, as in a public where.\n checkConnectionWhere(nodes, props, connection, value, here, at);\n } else 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 const abstract = abstractsOf.get(nodes)?.get(field.target);\n const check = (w: unknown, path: string) =>\n target\n ? checkNodeWhere(nodes, props, target, w, path, at)\n : abstract\n ? checkAbstractWhere(nodes, props, abstract, w, path, at)\n : undefined;\n if (!target && !abstract) continue;\n if (!field.list) {\n check(value, here);\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 check(inner, `${here}.${q}`);\n } else {\n at(`${here}: expected some, all, none, single or count`);\n }\n }\n }\n }\n}\n\n/**\n * Interfaces and unions of a model being built, by its node map: the rule\n * checks below receive the node map only.\n */\nconst abstractsOf = new WeakMap<\n ReadonlyMap<string, NodeType>,\n ReadonlyMap<string, AbstractType>\n>();\n\n/**\n * A rule's filter through a relationship to an interface or union: a\n * union's names members, each a node filter of that member; an\n * interface's tests its own fields and `typename`.\n */\nfunction checkAbstractWhere(\n nodes: ReadonlyMap<string, NodeType>,\n props: ReadonlyMap<string, RelationshipPropertiesType>,\n abstract: AbstractType,\n where: unknown,\n path: string,\n at: (message: string) => void,\n) {\n if (where === UNEXPANDED) return; // already reported\n if (!isRecord(where) || 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 (abstract.kind === \"union\") {\n const member = abstract.members.includes(k) ? nodes.get(k) : undefined;\n if (!member) at(`${here}: ${k} is not a member of ${abstract.name}`);\n else checkNodeWhere(nodes, props, member, value, here, at);\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 checkAbstractWhere(nodes, props, abstract, x, `${here}[${i}]`, at),\n );\n } else if (k === \"NOT\") {\n checkAbstractWhere(nodes, props, abstract, value, here, at);\n } else if (k === \"typename\") {\n if (\n !Array.isArray(value) ||\n value.some((m) => !abstract.members.includes(m as string))\n ) {\n at(`${here}: a list of ${abstract.name}'s implementations`);\n }\n } else if (!abstract.fields.has(k)) {\n at(`${here}: ${abstract.name} has no field ${k}`);\n } else 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 }\n}\n\n/** A rule's `<field>Connection` test: quantifiers over { node, edge }. */\nfunction checkConnectionWhere(\n nodes: ReadonlyMap<string, NodeType>,\n props: ReadonlyMap<string, RelationshipPropertiesType>,\n rel: RelationshipField,\n value: unknown,\n path: string,\n at: (message: string) => void,\n) {\n if (!isRecord(value) || Object.keys(value).length === 0) {\n return at(`${path} must be a non-empty object`);\n }\n const target = nodes.get(rel.target);\n const edgeType = props.get(rel.properties!);\n for (const [q, inner] of Object.entries(value)) {\n const here = `${path}.${q}`;\n if (![\"some\", \"all\", \"none\", \"single\"].includes(q)) {\n at(`${path}: expected some, all, none or single`);\n continue;\n }\n if (!isRecord(inner) || Object.keys(inner).length === 0) {\n at(`${here} is empty: a rule must test something`);\n continue;\n }\n for (const [side, test] of Object.entries(inner)) {\n if (side === \"node\") {\n if (target)\n checkNodeWhere(nodes, props, target, test, `${here}.node`, at);\n } else if (side === \"edge\") {\n if (edgeType) checkEdgeWhere(edgeType, test, `${here}.edge`, at);\n } else {\n at(`${here}: expected node or edge`);\n }\n }\n }\n}\n\nfunction checkEdgeWhere(\n edgeType: RelationshipPropertiesType,\n where: unknown,\n path: string,\n at: (message: string) => void,\n) {\n if (!isRecord(where) || 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 } else if (k === \"AND\" || k === \"OR\") {\n if (!Array.isArray(value)) at(`${here} must be a list`);\n else\n value.forEach((x, i) =>\n checkEdgeWhere(edgeType, x, `${here}[${i}]`, at),\n );\n } else if (k === \"NOT\") {\n checkEdgeWhere(edgeType, value, here, at);\n } else if (!edgeType.fields.has(k)) {\n at(`${here}: ${edgeType.name} has no field ${k}`);\n } else 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 }\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 // A list of strings indexes each of its strings.\n else if (field.type !== \"String\" && field.type !== \"ID\") {\n at(`@fulltext: ${f} is not a String or [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/**\n * Claim names referenced anywhere in a value: as \"$jwt.name…\" strings and\n * as ${jwt.name…} placeholders.\n */\nfunction claimRefs(value: unknown): string[] {\n if (typeof value === \"string\") {\n if (value.includes(\"${\")) {\n return [...value.matchAll(PLACEHOLDER)]\n .filter((m) => m[1] === \"jwt\")\n .map((m) => m[2]!.split(\".\")[0]!);\n }\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\nconst REFERENCE_PATH = /^[A-Za-z0-9_]+(\\.[A-Za-z0-9_]+)*$/;\n\n/**\n * Malformed claim and context references in a rule's strings: a whole\n * string \"$jwt.path\" names a path and nothing else; any `${` starts a\n * `${jwt.path}` or `${context.path}` placeholder.\n */\n/** `${viewer.field}` placeholders need @viewer, a scalar field, a string operand. */\nfunction viewerRefProblems(\n value: unknown,\n viewerNode: NodeType | undefined,\n inList = false,\n): string[] {\n if (typeof value === \"string\") {\n const refs = [...value.matchAll(PLACEHOLDER)].filter(\n (m) => m[1] === \"viewer\",\n );\n if (refs.length === 0) return [];\n if (!viewerNode) {\n return [\n `\"${value}\": \\${viewer.…} needs a @viewer claim on the @jwt type`,\n ];\n }\n const out: string[] = [];\n if (inList) {\n out.push(\n `\"${value}\": \\${viewer.…} stands for one value, not inside a list`,\n );\n }\n for (const m of refs) {\n if (viewerNode.fields.get(m[2]!)?.kind !== \"scalar\") {\n out.push(`\"${value}\": ${viewerNode.name} has no scalar field ${m[2]}`);\n }\n }\n return out;\n }\n if (Array.isArray(value)) {\n return value.flatMap((v) => viewerRefProblems(v, viewerNode, true));\n }\n if (value !== null && typeof value === \"object\") {\n return Object.values(value).flatMap((v) =>\n viewerRefProblems(v, viewerNode, inList),\n );\n }\n return [];\n}\n\nfunction ruleStringProblems(value: unknown): string[] {\n if (typeof value === \"string\") {\n if (value.includes(\"${\")) {\n const rest = value.replace(PLACEHOLDER, (m, _source, path: string) =>\n REFERENCE_PATH.test(path) ? \"\" : m,\n );\n return rest.includes(\"${\")\n ? [`\"${value}\": a placeholder is \\${jwt.<claim>} or \\${context.<path>}`]\n : [];\n }\n for (const prefix of [\"$jwt.\", \"$context.\"]) {\n if (\n value.startsWith(prefix) &&\n !REFERENCE_PATH.test(value.slice(prefix.length))\n ) {\n const source = prefix.slice(1, -1);\n const path =\n /^[A-Za-z0-9_.]*[A-Za-z0-9_]/.exec(value.slice(prefix.length))?.[0] ??\n \"claim\";\n return [\n `\"${value}\" is not a ${source} reference; to put one inside a string write \"\\${${source}.${path}}${value.slice(prefix.length + path.length)}\"`,\n ];\n }\n }\n // A misspelt placeholder would be compared as a literal and silently\n // stop meaning what it says. A literal \"$\" is written \"\\\\$\".\n if (\n value.startsWith(\"$\") &&\n !value.startsWith(\"$jwt.\") &&\n !value.startsWith(\"$context.\")\n ) {\n return [\n `\"${value}\" is not a placeholder: write $jwt.<claim> or $context.<path>, or \"\\\\${value}\" for the literal string`,\n ];\n }\n return [];\n }\n if (Array.isArray(value)) return value.flatMap(ruleStringProblems);\n if (value !== null && typeof value === \"object\") {\n return Object.values(value).flatMap(ruleStringProblems);\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","// 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 versionInfo,\n} from \"graphql\";\n\nexport interface SelectionContext {\n schema: GraphQLSchema;\n fragments: Record<string, FragmentDefinitionNode>;\n /**\n * Variable values as graphql-js hands them to `getArgumentValues`: the\n * coerced map on graphql 16, `{ sources, coerced }` on 17. Read plain\n * values through `coercedVariables()`.\n */\n variables: Record<string, unknown>;\n}\n\nconst GRAPHQL_17 = versionInfo.major >= 17;\n\n/** The coerced variable values, on graphql 16 and 17 alike. */\nexport function coercedVariables(\n variables: unknown,\n): Record<string, unknown> | undefined {\n const v = variables as Record<string, unknown> | null | undefined;\n if (v == null) return undefined;\n return GRAPHQL_17 ? (v[\"coerced\"] as Record<string, unknown>) : v;\n}\n\n/**\n * The variable values of a `getVariableValues()` result, in the shape the\n * installed graphql's `getArgumentValues()` takes: 16 returns\n * `{ coerced }`, 17 returns `{ variableValues: { sources, coerced } }`.\n */\nexport function variableValuesOf(result: object): Record<string, unknown> {\n const r = result as Record<string, unknown>;\n return (GRAPHQL_17 ? r[\"variableValues\"] : r[\"coerced\"]) as Record<\n string,\n unknown\n >;\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// apps/loradb.com/docs/graphql/translation-rules.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 checkPropertyAccess,\n fieldReadGuard,\n fieldValidate,\n maskedValue,\n maskSettled,\n propertyAccess,\n refusedEdgeRead,\n relationshipRules,\n} from \"./auth.js\";\nimport { bind, freshVar, noteClaim, 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 * At most one row, found by an exact @key seek, projecting only stored\n * properties: no relationship, @cypher field or rule traversal. Cheap\n * enough for a driver to run synchronously.\n */\n bounded?: boolean;\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 const compiled = finish(\n ctx,\n clauses,\n [\"this\"],\n ([r]) => r!.rows[0]?.[\"this\"] ?? null,\n { label, access: \"exact\", reason: `lookup by @key ${node.key.name}` },\n );\n // Every selected field is a stored property, and nothing traversed a\n // relationship (READ rules included: their filters record what they read).\n const objType = ctx.schema.getType(node.name) as GraphQLObjectType;\n const storedOnly = [...collectFields(ctx, objType, sets).values()].every(\n (nodes) => {\n const name = nodes[0]!.name.value;\n return (\n name === \"__typename\" ||\n (name === \"id\" && node.key.relayId) ||\n node.fields.get(name)?.kind === \"scalar\"\n );\n },\n );\n if (\n storedOnly &&\n compiled.reads.relationships.length === 0 &&\n compiled.statements.length === 1\n ) {\n compiled.bounded = true;\n }\n return compiled;\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 if (!maskSettled(ctx, node, field)) {\n throw requestError(\n \"FORBIDDEN\",\n `cannot ${what} ${node.name}.${field.name}: it is masked per row`,\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 // The index call and its filters, for the page (with the keyset) and\n // for `totalCount` (every match, in its own parameter scope).\n const matches = (c: CompileContext, keyset: Expr | undefined): Clause[] => {\n const where = and(\n compileNodeWhere(c, node, \"this\", args[\"where\"] as Where | undefined),\n authFilter(c, 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(c, index.name), bind(c, query)],\n yields: [{ item: \"node\", alias: \"this\" }, { item: \"score\" }],\n where,\n });\n return clauses;\n }\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(c, 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(c, to)),\n authFilter(c, node, \"anchor\", \"READ\"),\n coalesceFalse(authValidate(c, node, \"anchor\", \"READ\", \"BEFORE\")),\n coalesceFalse(fieldValidate(c, node, index.field, \"anchor\", \"READ\")),\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(c, vector);\n }\n clauses.push({\n kind: \"procedure\",\n procedure: \"db.index.vector.queryNodes\",\n args: [bind(c, index.name), bind(c, candidates), source],\n yields: [{ item: \"node\", alias: \"this\" }, { item: \"score\" }],\n where: and(exclude, where),\n });\n return clauses;\n };\n const sel = connection\n ? searchConnectionSelections(ctx, node, fieldNodes)\n : undefined;\n if (sel && !sel.page) {\n // Only `totalCount`: no page is read.\n return searchCount(ctx, node, matches, (rows) => ({\n __rows: [],\n __first: limit,\n __after: cursor !== undefined,\n __backward: false,\n __sort: SEARCH_SORT,\n __totalCount: rows,\n }));\n }\n const clauses = matches(ctx, keyset);\n const selections = sel\n ? sel.node\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 (sel) {\n const count = sel.totalCount\n ? searchCount(ctx, node, matches, () => undefined)\n : undefined;\n const compiled = finish(\n ctx,\n clauses,\n [\"node\", \"score\", \"__cursor\"],\n ([r, c]): RawConnection => {\n const row = c?.rows[0];\n if (c) assertNoneDenied(row);\n return {\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 ...(c ? { __totalCount: Number(row?.[\"totalCount\"] ?? 0) } : {}),\n };\n },\n undefined,\n count?.statements ?? [],\n );\n if (count) compiled.cost += count.cost;\n return compiled;\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/**\n * `totalCount` of a search connection: every match after \\`where\\` and the\n * read rules (a vector search counts within its candidate window), in its\n * own parameter scope. A row the READ rules would refuse makes the count\n * FORBIDDEN, as on other connections.\n */\nfunction searchCount(\n ctx: CompileContext,\n node: NodeType,\n matches: (c: CompileContext, keyset: Expr | undefined) => Clause[],\n shape: (count: number) => RawConnection | undefined,\n): CompiledRead {\n const statsCtx: CompileContext = {\n ...ctx,\n params: {},\n vars: new Set([\"this\"]),\n computed: new Map(),\n };\n const clauses: Clause[] = [\n ...matches(statsCtx, undefined),\n {\n kind: \"return\",\n items: [\n { expr: fn(\"count\", v(\"this\")), alias: \"totalCount\" },\n ...deniedItem(statsCtx, node, \"this\"),\n ],\n },\n ];\n const compiled = finish(\n statsCtx,\n clauses,\n [\"totalCount\"],\n ([r]) => {\n const row = r!.rows[0];\n assertNoneDenied(row);\n return shape(Number(row?.[\"totalCount\"] ?? 0));\n },\n undefined,\n );\n compiled.cost = 1;\n return compiled;\n}\n\n/** The `edges { node }` selections of a search connection. */\nfunction searchConnectionSelections(\n ctx: CompileContext,\n node: NodeType,\n fieldNodes: readonly FieldNode[],\n): ReturnType<typeof connectionSelections> {\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 );\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 if (p === \"jwt\") noteClaim(ctx, \"\", ctx.jwt, false);\n // An explicit null for an argument with an SDL default takes the\n // default, as the library's own `limit` arguments do.\n const declared = field.args.find((a) => a.name === p);\n const value =\n p === \"jwt\"\n ? (ctx.jwt ?? null)\n : (args[p] ?? declared?.defaultValue ?? 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 checkPropertyAccess(ctx, props.name, field, \"READ\");\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 // Field-level READ rules and @authentication: a row failing them reads\n // the field as FORBIDDEN (UNAUTHENTICATED without a token), checked\n // per row so the statement is the same with or without a token.\n const guarded = field ?? connectionOf(node, fieldName);\n const guard = guarded\n ? fieldReadGuard(ctx, node, guarded, variable)\n : undefined;\n if (field?.kind === \"scalar\") {\n const masked = maskedValue(\n ctx,\n node,\n field,\n variable,\n prop(v(variable), field.property),\n );\n if (guard) {\n entries.push({\n kind: \"entry\",\n key,\n value: guardedValue(guard, masked),\n });\n } else if (field.authorization?.mask?.length) {\n entries.push({ kind: \"entry\", key, value: masked });\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 entries.push({\n kind: \"entry\",\n key,\n value: guard ? guardedValue(guard, result.expr) : 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\n/** `value` where the guard holds, else the marker the resolvers raise. */\nfunction guardedValue(\n guard: NonNullable<ReturnType<typeof fieldReadGuard>>,\n value: Expr,\n): Expr {\n return {\n kind: \"case\",\n when: fn(\"coalesce\", guard.when, lit(false)),\n then: value,\n else: {\n kind: \"map\",\n entries: [\n { key: \"__forbidden\", value: lit(true) },\n ...(guard.code === \"UNAUTHENTICATED\"\n ? [{ key: \"__unauthenticated\", value: lit(true) }]\n : []),\n ],\n },\n };\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 // READ_EDGE rules decide per relationship: its properties read as\n // FORBIDDEN where they fail, and nothing may filter, sort or aggregate\n // by them (that would reveal the values the rule hides).\n const edgeRead = props\n ? relationshipRules(\n ctx,\n rel,\n \"READ_EDGE\",\n { owner: parent, target: x, rel: r },\n \"read\",\n )\n : undefined;\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 if (\n edgeRead !== undefined &&\n (edgeWhere != null ||\n sort.some((k) => k.edge) ||\n (sel.aggregate?.edge.length ?? 0) > 0)\n ) {\n throw refusedEdgeRead(rel);\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, edgeRead),\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 // A READ_EDGE rule may test the parent end: keep it in scope.\n items: [\n { expr: v(r) },\n { expr: v(x) },\n ...(edgeRead !== undefined ? [{ expr: v(parent) }] : []),\n ],\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 guard?: Expr | false,\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 // Rules on a relationship property test claims only: a request they\n // refuse reads it as FORBIDDEN, on every row that has it.\n if (propertyAccess(ctx, field, \"READ\") !== \"allowed\") {\n entries.push({\n kind: \"entry\",\n key,\n value: {\n kind: \"map\",\n entries: [{ key: \"__forbidden\", value: lit(true) }],\n },\n });\n continue;\n }\n if (guard !== undefined) {\n entries.push({\n kind: \"entry\",\n key,\n value: guardedValue(\n { when: guard === false ? lit(false) : guard, code: \"FORBIDDEN\" },\n prop(v(variable), field.property),\n ),\n });\n continue;\n }\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 } else {\n checkPropertyAccess(ctx, props!.name, field, \"READ\");\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 { hasSettable, isUpdatable, settable } from \"../model/inputs.js\";\n\nexport { isUpdatable, settable };\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 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/** 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 // Nothing settable on create: no `edge` at all, not an empty input.\n if (!hasSettable(props, \"CREATE\")) return {};\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 sets the relationship properties given and keeps the others.`,\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(model, 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\" || !settable(rel, \"CREATE\")) 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\" && settable(f, \"CREATE\")) {\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\" || !settable(rel, \"UPDATE\")) 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(model, 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 checkKeyScope,\n claim,\n relationshipRules,\n checkAuthentication,\n checkFieldAuthentication,\n checkPropertyAccess,\n fieldValidate,\n forbidden,\n propertyAccess,\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 Field,\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 /** The caller's node's @key, for @key(scope: VIEWER) (see executeMutation). */\n viewerKey?: unknown;\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 /** Relationship properties the input sets. */\n props: Record<string, unknown>;\n /** `@default`s of the properties it leaves out: for a new relationship only. */\n defaults: Record<string, unknown>;\n /**\n * Relationship properties the input sets whose rules refuse it when the\n * relationship is new (`create`) or already exists (`update`): known\n * only once the MERGE ran, so the check follows it (and rolls back).\n */\n refused?: { create?: Error; update?: Error };\n}\n\ninterface CreateRow {\n key: unknown;\n props: Input;\n /**\n * Fields the input sets. Field rules guard these only: a `@default`,\n * `@populatedBy` value or generated key is the server's, not the\n * caller's write (G-22).\n */\n written: Set<string>;\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 * Replacing a single relationship: the target being connected, whose\n * relationship (and its properties) stays if it is already there.\n */\n keep?: unknown;\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 checkKeyScope(this.ctx, node, key, this.env.viewerKey);\n const props: Input = {};\n const written = new Set<string>();\n if (input[node.key.name] !== undefined && input[node.key.name] !== null) {\n written.add(node.key.name);\n }\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 written.add(f.name);\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, written });\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 && !settable(f, \"CREATE\")) {\n throw requestError(\n \"BAD_USER_INPUT\",\n `${node.name}.${f.name} cannot be set on create`,\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 const value = await cb({\n operation,\n type: node.name,\n field: f.name,\n key,\n input,\n context: this.env.requestContext,\n });\n // A required field must stay set, whatever the callback returns.\n if (f.required && (value === null || value === undefined)) {\n throw requestError(\n \"CONSTRAINT_VIOLATION\",\n `${node.name}.${f.name} is required, but its @populatedBy callback ${f.populatedBy!.callback} returned ${String(value)}`,\n undefined,\n { type: node.name, field: f.name },\n );\n }\n return value;\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 // `@authentication` on the relationship field covers writing it too.\n checkFieldAuthentication(\n this.ctx,\n owner.name,\n rel,\n update ? \"UPDATE\" : \"CREATE\",\n );\n if (asList(value[\"connect\"]).length + asList(value[\"create\"]).length > 0) {\n checkFieldAuthentication(\n this.ctx,\n owner.name,\n rel,\n \"CREATE_RELATIONSHIP\",\n );\n }\n if (\n (value[\"disconnect\"] != null && value[\"disconnect\"] !== false) ||\n (value[\"delete\"] != null && value[\"delete\"] !== false)\n ) {\n checkFieldAuthentication(\n this.ctx,\n owner.name,\n rel,\n \"DELETE_RELATIONSHIP\",\n );\n }\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. Re-connecting\n // the current target keeps its relationship as it is.\n const keep =\n connect.length === 1 ? connect[0]![target.key.name] : undefined;\n this.disconnects.push({\n rel,\n from: ownerKey,\n to: undefined,\n ...(keep !== undefined ? { keep } : {}),\n });\n }\n }\n for (const c of connect) {\n this.links.push({\n rel,\n from: ownerKey,\n to: c[target.key.name],\n ...edgeProps(this.ctx, 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 ...edgeProps(this.ctx, 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 checkPropertyAccess(this.ctx, props.name, f, \"UPDATE\");\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 ctx: CompileContext,\n rel: RelationshipField,\n edge: Input | undefined,\n): Pick<Link, \"props\" | \"defaults\" | \"refused\"> {\n if (!rel.properties) return { props: {}, defaults: {} };\n const props = ctx.model.relationshipProperties.get(rel.properties)!;\n const out: Record<string, unknown> = {};\n const defaults: Record<string, unknown> = {};\n let refused: Link[\"refused\"];\n for (const f of props.fields.values()) {\n const value = edge?.[f.name];\n if (value !== undefined && value !== null && settable(f, \"CREATE\")) {\n // Setting a property on connect creates it on a new relationship\n // and updates it on an existing one: both rules must be known.\n const onCreate = propertyAccess(ctx, f, \"CREATE\");\n const onUpdate = propertyAccess(ctx, f, \"UPDATE\");\n if (onCreate !== \"allowed\" && onUpdate !== \"allowed\") {\n checkPropertyAccess(ctx, props.name, f, \"CREATE\");\n }\n if (onCreate !== \"allowed\") {\n refused = {\n ...refused,\n create: propertyError(props.name, f, \"CREATE\", onCreate),\n };\n }\n if (onUpdate !== \"allowed\") {\n refused = {\n ...refused,\n update: propertyError(props.name, f, \"UPDATE\", onUpdate),\n };\n } else if (!settable(f, \"UPDATE\")) {\n // Re-connecting an existing pair would update the property.\n refused = {\n ...refused,\n update: requestError(\n \"BAD_USER_INPUT\",\n `${props.name}.${f.name} is set when the relationship is created; it cannot change on a re-connect`,\n ),\n };\n }\n out[f.property] = toStored(f, value);\n } else if (f.defaultValue) {\n defaults[f.property] = storedDefault(f);\n }\n }\n return refused ? { props: out, defaults, refused } : { props: out, defaults };\n}\n\nfunction propertyError(\n type: string,\n f: ScalarField,\n op: \"CREATE\" | \"UPDATE\",\n access: \"forbidden\" | \"unauthenticated\" | \"allowed\",\n): Error {\n return access === \"unauthenticated\"\n ? requestError(\n \"UNAUTHENTICATED\",\n `${type}.${f.name} needs an authenticated request`,\n )\n : requestError(\n \"FORBIDDEN\",\n `not allowed to ${op.toLowerCase()} ${type}.${f.name}`,\n );\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: { fields: ReadonlyMap<string, Field> },\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.p = <now>` for a relationship's `@timestamp(operations: [UPDATE])`s. */\nfunction edgeStamps(model: GraphModel, rel: RelationshipField): string {\n const props = rel.properties\n ? model.relationshipProperties.get(rel.properties)\n : undefined;\n return (props ? timestamps(props, \"UPDATE\") : [])\n .map(([p, now]) => `, r.${name(p)} = ${now}`)\n .join(\"\");\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/** `row.fresh OR (<expr>)`: a filter that nodes this mutation creates skip. */\nconst orFresh = (e: Expr | undefined): Expr | undefined =>\n e && bin(\"OR\", prop(v(\"row\"), \"fresh\"), e);\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 * A type this mutation creates under a key held by a node the caller\n * cannot read; see {@link Runner.moveHiddenKeys}.\n */\n hiddenKey: NodeType | undefined;\n /**\n * A @unique value this mutation creates that another node holds; see\n * {@link Runner.moveTakenUniques}.\n */\n takenUnique: { node: NodeType; field: ScalarField } | undefined;\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.moveHiddenKeys(plan);\n await this.moveTakenUniques(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 /**\n * A create under a key held by a node the caller cannot read must not\n * tell them the key exists (G-20). The unique constraint would fail it\n * with CONSTRAINT_VIOLATION before the rules run, while a free key gets\n * the rules' answer: an existence oracle. So the hidden node moves to a\n * placeholder key for the rest of the transaction, and the mutation runs\n * on a graph that differs from the free-key case only in that hidden\n * key: every error it raises is the one a free key gets. When it would\n * succeed, `executeMutation` fails it with the FORBIDDEN of a denied\n * create. Either way the transaction rolls back, and the key with it.\n */\n async moveHiddenKeys(plan: WritePlan): Promise<void> {\n for (const [node, rows] of plan.creates) {\n const ctx = this.ctx();\n const visible = authFilter(ctx, node, \"n\", \"READ\");\n if (!visible) continue;\n const moves = rows.map((r) => ({ key: r.key, to: placeholderKey(node) }));\n const key = `n.${name(node.key.property)}`;\n const [moved] = await this.run(\n `UNWIND ${printExpr(bind(ctx, moves))} AS m\\n` +\n `MATCH (n:${name(node.labels[0]!)}) WHERE ${key} = m.key` +\n ` AND NOT coalesce(${printExpr(visible)}, false)\\n` +\n `SET ${key} = m.to\\nRETURN count(n) AS moved`,\n ctx,\n );\n if (Number(moved?.[\"moved\"] ?? 0) > 0) this.hiddenKey ??= node;\n }\n }\n\n /**\n * The G-20 treatment for @unique values: a create under rules whose\n * unique value another node holds would fail the constraint before the\n * rules answer, telling a caller who may not create the node that the\n * value is taken. The holder's value moves aside for the transaction,\n * so every error is the one a free value gets; when the mutation would\n * succeed, `executeMutation` fails it with the constraint violation a\n * permitted caller gets. The transaction rolls back either way. Types\n * without CREATE rules skip this: there is nothing to leak.\n */\n async moveTakenUniques(plan: WritePlan): Promise<void> {\n for (const [node, rows] of plan.creates) {\n const ruled = node.authorization?.validate.some((r) =>\n r.operations.has(\"CREATE\"),\n );\n if (!ruled) continue;\n for (const f of node.fields.values()) {\n if (f.kind !== \"scalar\" || !f.unique || f.key) continue;\n const moves = rows\n .map((r) => r.props[f.property])\n .filter((value) => value !== undefined && value !== null)\n .map((value) => ({\n value,\n to: `\\u0000taken:${globalThis.crypto.randomUUID()}`,\n }));\n if (moves.length === 0) continue;\n const ctx = this.ctx();\n const p = `n.${name(f.property)}`;\n const [moved] = await this.run(\n `UNWIND ${printExpr(bind(ctx, moves))} AS m\\n` +\n `MATCH (n:${name(node.labels[0]!)}) WHERE ${p} = m.value\\n` +\n `SET ${p} = m.to\\nRETURN count(n) AS moved`,\n ctx,\n );\n if (Number(moved?.[\"moved\"] ?? 0) > 0) {\n this.takenUnique ??= { node, field: f };\n }\n }\n }\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 // One statement per field and shape (listed keys, or a single\n // relationship's current target), however many nodes it covers.\n const groups = new Map<\n string,\n { rel: RelationshipField; list: boolean; rows: typeof plan.disconnects }\n >();\n for (const d of plan.disconnects) {\n const id = `${d.rel.owner}.${d.rel.name}\\0${d.rel.target}\\0${d.to ? \"list\" : \"single\"}`;\n const group = groups.get(id) ?? { rel: d.rel, list: !!d.to, rows: [] };\n group.rows.push(d);\n groups.set(id, group);\n }\n for (const { rel, list, rows: batch } of groups.values()) {\n const owner = this.env.model.nodes.get(rel.owner)!;\n const target = this.env.model.nodes.get(rel.target)!;\n const ctx = this.ctx();\n const input = printExpr(\n bind(\n ctx,\n batch.map((d) => ({\n from: d.from,\n to: d.to ?? null,\n keep: d.keep ?? null,\n })),\n ),\n );\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 bKey = `b.${name(target.key.property)}`;\n const matchText =\n `UNWIND ${input} AS row\\n` +\n (list ? `UNWIND row.to AS k\\n` : \"\") +\n seekThenExpand(\"a\", owner, \"row.from\", rel, \"r\", \"b\", target) +\n (list\n ? ` AND ${bKey} = k`\n : // Re-connecting the current target keeps its relationship.\n ` AND (row.keep IS NULL OR ${bKey} <> row.keep)`) +\n `${guard}\\n`;\n const returned = `row.from AS from, ${bKey} AS key`;\n const pairs = (rows: Array<Record<string, unknown>>) =>\n rows.map((r) => ({ from: r[\"from\"], to: r[\"key\"] }));\n // Rules on the relationship field, before the relationships go.\n if (\n relationshipRules(this.ctx(), rel, \"DISCONNECT\", {\n owner: \"a\",\n target: \"b\",\n rel: \"r\",\n }) !== undefined\n ) {\n const doomed = await this.run(`${matchText}RETURN ${returned}`, ctx);\n await this.checkRelationshipRules(\"DISCONNECT\", rel, pairs(doomed));\n }\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(rel, row[\"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) => ({\n from: l.from,\n to: l.to,\n props: l.props,\n defaults: l.defaults,\n // Created by this mutation: not a node the caller must be\n // able to see already. Its READ filter may well depend on\n // the relationship this statement creates.\n fresh: plan.isFresh(target.name, l.to),\n })),\n ),\n );\n const props = rel.properties\n ? this.env.model.relationshipProperties.get(rel.properties)\n : undefined;\n const onCreate = [\n \"r += row.defaults\",\n ...(props ? timestamps(props, \"CREATE\") : []).map(\n ([p, now]) => `r.${name(p)} = ${now}`,\n ),\n ];\n // A re-connect that sets properties updates the relationship.\n const onMatch = (props ? timestamps(props, \"UPDATE\") : []).map(\n ([p, now]) =>\n `r.${name(p)} = CASE WHEN size(keys(row.props)) > 0 THEN ${now} ELSE r.${name(p)} END`,\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(orFresh(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 // Defaults apply when the relationship is created, never to an\n // existing one (a re-connect keeps what it has).\n `ON CREATE SET ${onCreate.join(\", \")}\\n` +\n (onMatch.length > 0 ? `ON MATCH SET ${onMatch.join(\", \")}\\n` : \"\") +\n `SET r += row.props\\nRETURN row.from AS from, row.to AS key, existed`;\n const linked = await this.run(text, lctx);\n // Rules on the properties set, now that new and existing\n // relationships are told apart; a refusal rolls the mutation back.\n const byPair = new Map(\n links.map((l) => [`${keyOf(l.from)}\\0${keyOf(l.to)}`, l]),\n );\n for (const row of linked) {\n const refused = byPair.get(\n `${keyOf(row[\"from\"])}\\0${keyOf(row[\"key\"])}`,\n )?.refused;\n const error =\n row[\"existed\"] === true ? refused?.update : refused?.create;\n if (error) throw error;\n }\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 // Rules on the relationship field: a new relationship is a CONNECT,\n // an existing one given properties an UPDATE_EDGE.\n await this.checkRelationshipRules(\n \"CONNECT\",\n rel,\n linked\n .filter((r) => r[\"existed\"] !== true)\n .map((r) => ({ from: r[\"from\"], to: r[\"key\"] })),\n );\n await this.checkRelationshipRules(\n \"UPDATE_EDGE\",\n rel,\n linked\n .filter(\n (r) =>\n r[\"existed\"] === true &&\n Object.keys(\n byPair.get(`${keyOf(r[\"from\"])}\\0${keyOf(r[\"key\"])}`)?.props ??\n {},\n ).length > 0,\n )\n .map((r) => ({ from: r[\"from\"], to: r[\"key\"] })),\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 /**\n * Rules on the relationship field (and on a field declaring the same\n * relationship from the other side) for `op`, on each pair's\n * relationship as it stands: after the write for CONNECT and\n * UPDATE_EDGE, before it for DISCONNECT. FORBIDDEN when any fails; the\n * mutation rolls back.\n */\n async checkRelationshipRules(\n op: \"CONNECT\" | \"DISCONNECT\" | \"UPDATE_EDGE\",\n rel: RelationshipField,\n pairs: Array<{ from: unknown; to: unknown }>,\n ): Promise<void> {\n if (pairs.length === 0) return;\n const ctx = this.ctx();\n const cond = relationshipRules(ctx, rel, op, {\n owner: \"a\",\n target: \"b\",\n rel: \"r\",\n });\n if (cond === undefined) return;\n const owner = this.env.model.nodes.get(rel.owner)!;\n const target = this.env.model.nodes.get(rel.target)!;\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 `MATCH (a)${arrow(rel, \"r\", \"b\", undefined)}\\n` +\n `RETURN coalesce(${printExpr(cond === false ? lit(false) : cond)}, false) AS ok`,\n ctx,\n );\n if (rows.some((r) => r[\"ok\"] !== true)) {\n throw requestError(\n \"FORBIDDEN\",\n `not allowed to ${op.toLowerCase().replace(\"_\", \" \")} ${owner.name}.${rel.name}`,\n );\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 edgeStamps(this.env.model, u.rel) +\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 await this.checkRelationshipRules(\n \"UPDATE_EDGE\",\n u.rel,\n rows.map((r) => ({ from: u.from, to: r[\"key\"] })),\n );\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 && !settable(f, \"UPDATE\")) {\n throw requestError(\n \"BAD_USER_INPUT\",\n `${node.name}.${f.name} cannot be changed after create`,\n );\n }\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 // The count is bound in the WITH and tested after it: the form\n // every LoraDB release plans as a seek (G-11).\n `WITH a, size([(a)${arrow(field, \"\", \"x\", undefined)} WHERE ${memberTest(model, \"x\", field)} | 1]) AS related WHERE related = 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 /**\n * AFTER rules on created nodes: the type's rules on every row, a field's\n * rules on the rows whose input sets the field. Rows are checked in\n * groups that set the same guarded fields.\n */\n async validateCreated(plan: WritePlan): Promise<void> {\n for (const [node, rows] of plan.creates) {\n const guarded = [...node.fields.values()]\n .filter((f) => f.kind === \"scalar\" && f.authorization)\n .map((f) => f.name);\n const groups = new Map<string, { fields: string[]; keys: unknown[] }>();\n for (const r of rows) {\n const fields = guarded.filter((f) => r.written.has(f));\n const id = fields.join(\"\\0\");\n const group = groups.get(id) ?? { fields, keys: [] };\n group.keys.push(r.key);\n groups.set(id, group);\n }\n for (const { fields, keys } of groups.values()) {\n await this.validateAfter(node, keys, \"CREATE\", new Set(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\n/**\n * A key no request names, of the key's type, for a node moved out of the\n * way by {@link Runner.moveHiddenKeys}: never committed.\n */\nfunction placeholderKey(node: NodeType): unknown {\n if (node.key.type === \"Int\" || node.key.type === \"BigInt\") {\n const [hi, lo] = globalThis.crypto.getRandomValues(new Uint32Array(2));\n // Below -2^62: outside GraphQL's Int, and a BigInt key there is taken\n // with odds of 1 in 2^62 (the unique constraint would still catch it).\n return -(2n ** 62n) - ((BigInt(hi! & 0x3fffffff) << 32n) | BigInt(lo!));\n }\n return `\\u0000lora-graphql:hidden:${globalThis.crypto.randomUUID()}`;\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\n/**\n * Throw UNAUTHENTICATED / FORBIDDEN when the validate rules for `op` are\n * decided against the request by its claims alone, so a refused write\n * takes no statement (and no writer lock). Rules that depend on the rows\n * are left to the statements.\n */\nfunction settleClaims(\n ctx: CompileContext,\n node: NodeType,\n op: \"CREATE\" | \"UPDATE\" | \"DELETE\",\n): void {\n const probe = { ...ctx, params: {}, vars: new Set(ctx.vars) };\n authValidate(probe, node, \"n\", op, \"BEFORE\");\n authValidate(probe, node, \"n\", op, \"AFTER\");\n}\n\nasync function lookupViewerKey(\n env: MutationEnv,\n tx: DriverTransaction,\n ctx: CompileContext,\n): Promise<unknown> {\n const mapping = env.model.viewer;\n const viewerNode = mapping && env.model.nodes.get(mapping.type);\n if (\n !mapping ||\n !viewerNode ||\n mapping.field === viewerNode.key.name ||\n !env.jwt ||\n ![...env.model.nodes.values()].some((n) => n.key.keyScope)\n ) {\n return undefined;\n }\n const value = claim(ctx, mapping.claim);\n if (typeof value !== \"string\" && typeof value !== \"number\") return null;\n const field = viewerNode.fields.get(mapping.field);\n const property = field?.kind === \"scalar\" ? field.property : mapping.field;\n const rows = (\n await runStatement(env, tx, {\n text:\n `MATCH (v:${name(viewerNode.labels[0]!)}) WHERE v.${name(property)} = $claim\\n` +\n `RETURN v.${name(viewerNode.key.property)} AS key LIMIT 1`,\n params: { claim: value },\n })\n ).rows;\n return rows[0]?.[\"key\"] ?? null;\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 // Rules the claims alone settle against refuse before any statement,\n // as @authentication does (an upsert may turn out an update: skipped).\n if (op !== \"UPSERT\") settleClaims(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 // @key(scope: VIEWER) under a @viewer that maps to a non-key field (an\n // opaque subject): the key space is the caller's node's key, looked up\n // once by the claim before anything is written.\n const viewerKey = await lookupViewerKey(env, tx, planCtx);\n if (viewerKey !== undefined) env = { ...env, viewerKey };\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 // Only now, so that any other error is the one a free key gets.\n if (runner.hiddenKey) throw forbidden(runner.hiddenKey, \"CREATE\");\n if (runner.takenUnique) {\n const { node: taken, field } = runner.takenUnique;\n throw requestError(\n \"CONSTRAINT_VIOLATION\",\n `${taken.name}.${field.name} must be unique; the value is taken`,\n undefined,\n { type: taken.name, field: field.name },\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 read and update. One the caller can read\n // but not update looks new, and its create fails on the key constraint;\n // one the caller cannot read (even where the UPDATE rules would let it\n // through) takes the create path and fails like a denied create\n // (Runner.moveHiddenKeys): updating it would reveal it (G-20).\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\", \"READ\")) +\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 and relationships set only on create keep the value they\n // were created with.\n const kept = Object.fromEntries(\n Object.entries(input).filter(([k]) => {\n const f = node.fields.get(k);\n return (\n (f?.kind !== \"scalar\" && f?.kind !== \"relationship\") ||\n settable(f, \"UPDATE\")\n );\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 in the owning process made it (hand-written\n// Cypher and `@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 #onError: (err: unknown) => 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 onError: (err: unknown) => void = () => {},\n ) {\n this.#driver = driver;\n this.#model = model;\n this.#emit = emit;\n this.#onError = onError;\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 /**\n * Deliver batches until the feed ends or fails. Runs detached, so it\n * never throws: a feed that fell behind resumes where it stopped at\n * once; any other failure is reported and the feed reopens from its\n * last position after a backoff (100 ms doubling to 10 s, reset by a\n * delivered batch), until stop().\n */\n async #pump(\n feed: AsyncIterable<DriverChangeBatch>,\n signal: AbortSignal,\n backoffMs = 100,\n ): Promise<void> {\n let delay = backoffMs;\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 delay = 100;\n }\n return;\n } catch (err) {\n if (signal.aborted) return;\n if ((err as { code?: string }).code !== \"LORA_CHANGES_LAGGED\") {\n this.#report(err);\n await sleep(delay, signal);\n delay = Math.min(delay * 2, 10_000);\n }\n }\n while (!signal.aborted) {\n try {\n const next = this.#driver.changes!({\n ...(this.#lastLsn !== undefined ? { fromLsn: this.#lastLsn } : {}),\n signal,\n });\n await next.ready;\n void this.#pump(next, signal, delay);\n return;\n } catch (err) {\n if (signal.aborted) return;\n this.#report(err);\n await sleep(delay, signal);\n delay = Math.min(delay * 2, 10_000);\n }\n }\n }\n\n #report(err: unknown): void {\n try {\n this.#onError(err);\n } catch {\n // A failing error hook must not stop the feed.\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\n/** Resolve after `ms`, or at once when `signal` aborts. */\nfunction sleep(ms: number, signal: AbortSignal): Promise<void> {\n return new Promise((resolve) => {\n if (signal.aborted) return resolve();\n const timer = setTimeout(done, ms);\n signal.addEventListener(\"abort\", done, { once: true });\n function done() {\n clearTimeout(timer);\n signal.removeEventListener(\"abort\", done);\n resolve();\n }\n });\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 sets: SelectionSetNode[],\n depth: string,\n ): string => {\n if (isNonNullType(t)) return outputInner(t.ofType, sets, depth);\n return `${outputInner(t, sets, depth)} | null`;\n };\n const outputInner = (\n t: GraphQLOutputType,\n sets: SelectionSetNode[],\n depth: string,\n ): string => {\n if (isListType(t)) return `Array<${output(t.ofType, sets, 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, sets, depth);\n };\n\n /**\n * The object type selection sets produce on `parent`. Fields with the\n * same response key are merged as graphql-js merges them: one field,\n * with the sub-selections of every mention.\n */\n const selection = (\n parent: GraphQLCompositeType,\n sets: SelectionSetNode[],\n depth: string,\n ): string => {\n interface Mention {\n /** The field's output type, or the `__typename` literal union. */\n type: GraphQLOutputType | string;\n sets: SelectionSetNode[];\n }\n const fields = new Map<\n string,\n { mentions: Mention[]; optional: boolean }\n >();\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: GraphQLOutputType | 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 = def.type;\n }\n const entry = fields.get(key) ?? { mentions: [], optional: true };\n // Same output type: one field whose selection is the union of\n // the mentions'. Different ones (members of an abstract type\n // with fields of different types) stay alternatives.\n const same = entry.mentions.find(\n (m) => String(m.type) === String(type),\n );\n if (same) {\n if (sel.selectionSet) same.sets.push(sel.selectionSet);\n } else {\n entry.mentions.push({\n type,\n sets: sel.selectionSet ? [sel.selectionSet] : [],\n });\n }\n entry.optional &&= conditional;\n fields.set(key, entry);\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 for (const set of sets) add(parent, set, false);\n const body = [...fields].map(([k, f]) => {\n const types = [\n ...new Set(\n f.mentions.map((m) =>\n typeof m.type === \"string\"\n ? m.type\n : output(m.type, m.sets, `${depth} `),\n ),\n ),\n ];\n return `${depth} ${k}${f.optional ? \"?\" : \"\"}: ${types.join(\" | \")};`;\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 /**\n * Deepest field nesting, fragments followed. Default 12. An\n * introspection field (`__schema`, `__type`) counts as one level here:\n * its subtree follows the type-reference chain, not the graph, and is\n * bounded by `maxIntrospectionDepth`.\n */\n maxDepth?: number;\n /**\n * Deepest nesting under `__schema` or `__type`, the field included.\n * Default 20: the standard introspection query (every option on) needs\n * 15, and a runaway `ofType { ofType … }` chain is still refused.\n */\n maxIntrospectionDepth?: 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 maxIntrospectionDepth: 20,\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 maxIntrospectionDepth:\n guards.maxIntrospectionDepth ?? DEFAULT_GUARDS.maxIntrospectionDepth,\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, g.maxIntrospectionDepth),\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 =\n sel.selectionSet && !INTROSPECTION_ROOTS.has(sel.name.value)\n ? 1 + depthOf(sel.selectionSet, fragments, memo)\n : 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\n/** Fields whose subtree is measured by `maxIntrospectionDepth`. */\nconst INTROSPECTION_ROOTS = new Set([\"__schema\", \"__type\"]);\n\n/**\n * Deepest introspection field (`__schema`, `__type`) under `set`, counted\n * from that field. `seen` stops fragment cycles.\n */\nfunction introspectionDepthOf(\n set: SelectionSetNode,\n fragments: Map<string, FragmentDefinitionNode>,\n memo: Map<string, number>,\n seen: Set<string> = new Set(),\n): number {\n let deepest = 0;\n for (const sel of set.selections) {\n let d = 0;\n if (sel.kind === Kind.FIELD) {\n if (!sel.selectionSet) continue;\n d = INTROSPECTION_ROOTS.has(sel.name.value)\n ? 1 + depthOf(sel.selectionSet, fragments, memo)\n : introspectionDepthOf(sel.selectionSet, fragments, memo, seen);\n } else if (sel.kind === Kind.INLINE_FRAGMENT) {\n d = introspectionDepthOf(sel.selectionSet, fragments, memo, 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 d = introspectionDepthOf(frag.selectionSet, fragments, memo, seen);\n }\n deepest = Math.max(deepest, d);\n }\n return deepest;\n}\n\nfunction depthRule(max: number, maxIntrospection: number): ValidationRule {\n return (context) => {\n const fragments = fragmentsOf(context);\n return {\n OperationDefinition(op) {\n const memo = new Map<string, number>();\n const depth = depthOf(op.selectionSet, fragments, memo);\n if (depth > max) {\n context.reportError(\n guardError(`the operation nests fields deeper than ${max} levels`),\n );\n }\n const introspection = introspectionDepthOf(\n op.selectionSet,\n fragments,\n memo,\n );\n if (introspection > maxIntrospection) {\n context.reportError(\n guardError(\n `the operation nests introspection deeper than ${maxIntrospection} levels`,\n ),\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 * Throws for a field whose row-level READ rule failed: the compiler\n * projects it as `{ __forbidden: true }` (with `__unauthenticated` when\n * the request had no token), whatever the field's type.\n */\nfunction assertFieldReadable(value: unknown, info: GraphQLResolveInfo): void {\n if (\n value === null ||\n typeof value !== \"object\" ||\n (value as { __forbidden?: unknown }).__forbidden !== true\n ) {\n return;\n }\n if ((value as { __unauthenticated?: unknown }).__unauthenticated) {\n throw requestError(\n \"UNAUTHENTICATED\",\n `${info.parentType.name}.${info.fieldName} needs an authenticated request`,\n );\n }\n throw requestError(\n \"FORBIDDEN\",\n `not allowed to read ${info.parentType.name}.${info.fieldName}`,\n );\n}\n\n/** Values under response keys: the compiler projects each alias. */\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 assertFieldReadable(value, info);\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 assertFieldReadable(value, info);\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 const value = source[info.path.key as string];\n assertFieldReadable(value, info);\n return assertReadable(value);\n};\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. The\n // SDL's description wins over the implementation's, so clients see the\n // schema's documentation and the schema hash does not depend on which\n // implementation was passed.\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 documented = model.scalarDescriptions.get(name);\n const given = hooks.scalars?.[name];\n if (given) {\n t =\n documented === undefined || documented === given.description\n ? given\n : new GraphQLScalarType({\n ...given.toConfig(),\n description: documented,\n });\n } else {\n const base = baseType(stored, undefined) as GraphQLScalarType;\n t = new GraphQLScalarType({\n name,\n description: documented ?? `Stored as ${stored}.`,\n serialize: base.serialize,\n parseValue: base.parseValue,\n parseLiteral: base.parseLiteral,\n });\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 // `@selectable(onRead: false)` hides it here as on a node.\n .filter((f) => !f.private && f.selectableOn.read)\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 // Every property hidden from reads (@private, @selectable(onRead:\n // false)): no edge type, and no `properties` on the edge. The\n // properties stay settable through `edge` inputs.\n [...props.fields.values()].some((f) => !f.private && f.selectableOn.read)\n ? () => propsObject(props)\n : undefined,\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 totalCount: {\n type: nonNull(GraphQLInt),\n description:\n \"Every match after `where` and the read rules (a vector search counts within its candidate window).\",\n resolve: connectionResolvers.totalCount,\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 subscribe as graphqlSubscribe,\n getOperationAST,\n getVariableValues,\n GraphQLError,\n Kind,\n lexicographicSortSchema,\n parse,\n printSchema,\n specifiedRules,\n validate,\n validateSchema,\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, unguardedMutations } from \"./analyze/lint.js\";\nimport {\n accessLints,\n accessMatrix,\n type AccessEntry,\n} from \"./analyze/access.js\";\nimport { analyze, type Statistics } from \"./analyze/statistics.js\";\nimport { newContext, type CompileContext } from \"./compile/context.js\";\nimport { CompileCache, stableKey } from \"./compile/cache.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 {\n coercedVariables,\n fieldArgs,\n variableValuesOf,\n type SelectionContext,\n} 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()`): every write to the database, from\n * any path in the process that owns it, in commit order. `onWrite`\n * still reports this instance's mutations, and `previousState` needs\n * 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()`, `subscribe()` and `persist()`\n * 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()` and `subscribe()` refuse `source` and run only\n * persisted operations by `id`. Default false.\n */\n persistedOnly?: boolean;\n /**\n * How `execute()` commits a mutation with several root fields.\n * `\"field\"` (the default): each root field in its own transaction, so a\n * later failure leaves the earlier ones committed. `\"operation\"`: every\n * root field in one transaction, committed only when the operation\n * reports no error, rolled back (with `data: null`) otherwise. A\n * `transaction` in the context takes precedence. Servers that call\n * graphql-js on `getSchema()` directly get per-operation atomicity by\n * putting a `lora.begin()` transaction in the context.\n */\n mutationTransaction?: \"field\" | \"operation\";\n /**\n * Add `extensions.timing` to `execute()` results: the request's total\n * time, the time spent in LoraDB, and both per root field, in\n * milliseconds. `true` for every request, or a function deciding per\n * request from the GraphQL context (for example only for admins or in\n * development). Default off: timings sent to clients can act as a\n * timing side channel.\n */\n timing?: boolean | ((context: unknown) => boolean);\n}\n\n/** `extensions.timing` of an `execute()` result (see the `timing` option). */\nexport interface ExecutionTiming {\n /** The whole `execute()` call: parse, validation, execution. */\n totalMs: number;\n /** Time spent running statements in LoraDB. */\n databaseMs: number;\n /** Per root field, by response key (alias or name). */\n fields: Record<string, { totalMs: number; databaseMs: number }>;\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 /**\n * The root field that failed, or `changeFeed` for a failure of the\n * change feed (it reopens from where it stopped after a backoff).\n */\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 * Full-text and vector indexes present under their name but defined\n * differently (labels, properties, kind): search would keep using the\n * old definition. Without `create`; with it they are re-created.\n */\n mismatched: SchemaRequirement[];\n /** Indexes `create` dropped and created again with the model's definition. */\n recreated: 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 /**\n * Operations to compile and plan-check (S2), with example variables and\n * the GraphQL context to compile them under (e.g. `{ jwt }`, so rules\n * compile as they do for a signed-in caller). Without one, an operation\n * compiles as an anonymous request would.\n */\n operations?: Array<{\n name?: string;\n document: string | DocumentNode;\n variables?: Record<string, unknown>;\n context?: 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 /**\n * `@mutation` types with writes no rule guards (failures): declare them\n * with `@authorization(public: [...])` when that is intended.\n */\n security: 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/** A subscriber's share of one change: the events of its node type. */\ninterface SubscriberDelivery {\n change: WriteChange;\n events: ChangeEvent[];\n}\ntype SubscriberSink = (delivery: SubscriberDelivery) => void;\n\ninterface SubscriberGroup {\n node: NodeType;\n all: Set<SubscriberSink>;\n byKey: Map<string, Set<SubscriberSink>>;\n}\n\n/**\n * A statement compiled once for a subscription, reused while its claims\n * and the `$context` values it read are unchanged. `param` names the\n * parameter each run fills in; `share` keys the reads subscribers share.\n */\ninterface SubscriptionCompile<C> {\n claims: string;\n statistics: number;\n variables: string | undefined;\n contextReads: Array<[string, unknown]>;\n compiled: C;\n param: string;\n share: string | undefined;\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 /**\n * Cost spent per subscription event (its root value). A subscription\n * reuses one context and operation for every event, so each event is\n * charged on its own, like one operation.\n */\n readonly #eventSpent = new WeakMap<object, 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 /**\n * Subscribers by node type, then unfiltered or by key: a change reaches\n * only the subscribers of the types it touches, with its events built\n * once per type.\n */\n readonly #subscribers = new Map<string, SubscriberGroup>();\n #undispatch: (() => unknown) | undefined;\n /** Changed-node reads compiled per subscription context and field node. */\n readonly #byKeyCompiles = new WeakMap<\n object,\n WeakMap<FieldNode, SubscriptionCompile<CompiledRead>>\n >();\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 what each compile read.\n */\n readonly #compiled = new CompileCache();\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 readonly #mutationTransaction: \"field\" | \"operation\";\n readonly #timing: LoraGraphQLOptions[\"timing\"];\n /** Per-request timing collectors, by GraphQL context (see `timing`). */\n readonly #timings = new WeakMap<\n object,\n Map<string, { totalMs: number; databaseMs: number }>\n >();\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(\n options.driver,\n this.model,\n (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 (err) =>\n this.#onError?.({\n id: globalThis.crypto.randomUUID(),\n field: \"changeFeed\",\n message: err instanceof Error ? err.message : String(err),\n error: err,\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 this.#mutationTransaction = options.mutationTransaction ?? \"field\";\n this.#timing = options.timing;\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 maxIntrospectionDepth: 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>(\n info: GraphQLResolveInfo,\n context: unknown,\n fn: () => Promise<T>,\n ) => {\n const traced = () =>\n this.#observer.field(\n {\n field: info.fieldName,\n operationName: info.operation.name?.value,\n },\n fn,\n );\n const timing = this.#timingOf(context);\n if (!timing || info.path.prev !== undefined) return traced();\n const start = performance.now();\n return traced().finally(() => {\n timingEntry(timing, String(info.path.key)).totalMs +=\n performance.now() - start;\n });\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, context, () =>\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, context, () => {\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, context, () =>\n this.#resolveSearch(node, index, info, context, connection),\n ),\n resolveRoot: (kind, node, info, context) =>\n span(info, context, () => this.#resolveRoot(kind, node, info, context)),\n resolveNode: (id, info, context) =>\n span(info, context, () => this.#resolveNode(id, info, context)),\n resolveCypher: (field, info, context) =>\n span(info, context, () => this.#resolveCypher(field, info, context)),\n resolveMutation: (op, node, info, context) =>\n span(info, context, () =>\n this.#resolveMutation(op, node, info, context),\n ),\n });\n checkCustomRequires(this.model, schema);\n // A generated schema graphql-js rejects would fail every request:\n // fail here instead, where the server wires the schema up.\n const invalid = validateSchema(schema);\n if (invalid.length > 0) {\n throw new ModelError(\n invalid.map((e) => ({ message: `generated schema: ${e.message}` })),\n );\n }\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 byName = (r: SchemaRequirement) =>\n indexes!.rows.find((row) => row[\"name\"] === r.name);\n // A named index whose definition differs from the model's: matching by\n // name alone would keep searching the old field list.\n const differs = (r: SchemaRequirement) => {\n if (r.kind !== \"fulltext\" && r.kind !== \"vector\") return false;\n const row = byName(r);\n if (!row) return false;\n const type = r.kind === \"fulltext\" ? \"FULLTEXT\" : \"VECTOR\";\n const wantedProps = r.kind === \"fulltext\" ? r.properties : [r.property];\n const same = (a: unknown, b: readonly string[]) =>\n Array.isArray(a) &&\n a.length === b.length &&\n [...a].map(String).sort().join(\"\\0\") === [...b].sort().join(\"\\0\");\n const analyzer = (\n row[\"options\"] as Record<string, unknown> | undefined\n )?.[\"fulltext.analyzer\"];\n return (\n row[\"type\"] !== type ||\n !same(row[\"labelsOrTypes\"], [r.label]) ||\n !same(row[\"properties\"], wantedProps) ||\n (r.kind === \"fulltext\" &&\n typeof analyzer === \"string\" &&\n analyzer.toUpperCase() !== r.analyzer)\n );\n };\n const present = (r: SchemaRequirement) => {\n if (r.kind === \"fulltext\" || r.kind === \"vector\") {\n return byName(r) !== undefined;\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 mismatched = required.filter(differs);\n const created: SchemaRequirement[] = [];\n const recreated: SchemaRequirement[] = [];\n if (options.create) {\n for (const r of mismatched) {\n await this.#driver.run(\n [\n { text: `DROP INDEX ${quoteName(r.name)}`, params: {} },\n { text: requirementDdl(r), params: {} },\n ],\n { mode: \"write\", timeoutMs: this.#timeoutMs },\n );\n recreated.push(r);\n }\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 mismatched: options.create ? [] : mismatched,\n recreated,\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 /**\n * Who may do what: for every type and guarded field, each operation as\n * each kind of caller (anonymous, authenticated, and each role the rules\n * test), with the verdict and the rules that decide it. Read off the\n * model; stable, so it can be snapshotted and reviewed as a diff.\n */\n accessMatrix(): AccessEntry[] {\n return accessMatrix(this.model, this.getSchema());\n }\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 // An index defined differently from the model is as good as missing.\n missing: await this.assertSchema().then((a) => [\n ...a.missing,\n ...a.mismatched,\n ]),\n unused: await this.#unusedIndexes(),\n lint: [\n ...lintModel(this.model, { statistics: !!this.#statistics }),\n ...accessLints(this.model, this.getSchema()),\n ],\n security: unguardedMutations(this.model),\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 context: op.context,\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.security.length === 0 &&\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, 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 // A constraint's backing index serves the constraint: LoraDB names it\n // in the constraint's `ownedIndex`, not on the index row.\n const owned = new Set(\n constraints!.rows.map((row) => row[\"ownedIndex\"]).filter(Boolean),\n );\n const required = this.requirements();\n return indexes!.rows\n .filter(\n (row) =>\n row[\"type\"] !== \"LOOKUP\" &&\n !row[\"owningConstraint\"] &&\n !owned.has(row[\"name\"]),\n )\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: variableValuesOf(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 a query or mutation against the schema. Parsed and validated\n * documents are cached by source text; persisted ones by id. A\n * subscription runs with {@link LoraGraphQL.subscribe}; given one, this\n * returns a `WRONG_OPERATION_TYPE` error.\n */\n async execute(args: ExecuteArgs): Promise<ExecutionResult> {\n const started = performance.now();\n const document = this.#document(args);\n if (!isDocument(document)) return document;\n if (operationType(document, args.operationName) === \"subscription\") {\n return {\n errors: [\n requestError(\n \"WRONG_OPERATION_TYPE\",\n \"execute() runs queries and mutations; run a subscription with subscribe()\",\n ),\n ],\n };\n }\n let contextValue = args.context ?? {};\n // One transaction for every root field of the mutation, when asked.\n const operation = getOperationAST(document, args.operationName);\n const atomic =\n this.#mutationTransaction === \"operation\" &&\n operation?.operation === \"mutation\" &&\n operation.selectionSet.selections.length +\n (operation.selectionSet.selections.some((s) => s.kind !== Kind.FIELD)\n ? 1\n : 0) >\n 1 &&\n !(contextValue as LoraGraphQLContext).transaction &&\n this.#driver.begin !== undefined;\n let tx: LoraTransaction | undefined;\n if (atomic) {\n tx = await this.begin();\n contextValue = Object.assign(\n Object.create(Object.getPrototypeOf(contextValue) as object) as object,\n contextValue,\n { transaction: tx },\n );\n }\n const timed =\n typeof this.#timing === \"function\"\n ? this.#timing(contextValue)\n : this.#timing === true;\n if (timed && contextValue !== null && typeof contextValue === \"object\") {\n this.#timings.set(contextValue, new Map());\n }\n let result: ExecutionResult;\n try {\n result = (await graphqlExecute({\n schema: this.getSchema(),\n document,\n variableValues: args.variables,\n operationName: args.operationName,\n contextValue,\n })) as ExecutionResult;\n } catch (err) {\n await tx?.rollback();\n throw err;\n }\n // graphql-js reports bad variables without a code; clients branch on it.\n if (result.errors?.some(isVariableError)) {\n result = {\n ...result,\n errors: result.errors.map((e) =>\n isVariableError(e)\n ? new GraphQLError(e.message, {\n ...(e.nodes ? { nodes: e.nodes } : {}),\n extensions: { ...e.extensions, code: \"BAD_USER_INPUT\" },\n })\n : e,\n ),\n };\n }\n if (tx) {\n if (result.errors?.length) {\n // Nothing of the operation was written: say so with the data.\n await tx.rollback();\n result = { ...result, data: null };\n } else {\n try {\n await tx.commit();\n } catch (err) {\n await tx.rollback().catch(() => undefined);\n const error = this.#databaseError(\"commit\", err);\n return {\n data: null,\n errors: [\n error instanceof GraphQLError\n ? error\n : new GraphQLError(\n error instanceof Error ? error.message : String(error),\n ),\n ],\n };\n }\n }\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 result = {\n ...result,\n extensions: { ...result.extensions, cost: Math.ceil(cost) },\n };\n }\n const timing = this.#timingOf(contextValue);\n if (timing) {\n const fields: ExecutionTiming[\"fields\"] = {};\n let databaseMs = 0;\n for (const [key, t] of timing) {\n fields[key] = { totalMs: ms(t.totalMs), databaseMs: ms(t.databaseMs) };\n databaseMs += t.databaseMs;\n }\n const executionTiming: ExecutionTiming = {\n totalMs: ms(performance.now() - started),\n databaseMs: ms(databaseMs),\n fields,\n };\n result = {\n ...result,\n extensions: { ...result.extensions, timing: executionTiming },\n };\n }\n return result;\n }\n\n /**\n * Run a subscription: an async iterable of results, one per event, or a\n * single result with the errors when it cannot start (an unknown id, a\n * validation error, a denied subscribe). Takes the same arguments as\n * {@link LoraGraphQL.execute}, a persisted id included, with the same\n * document cache and guards; a query or mutation gets a\n * `WRONG_OPERATION_TYPE` error. End it with `return()` on the iterator\n * or with an `AbortSignal` passed as `context.signal`: either ends it at\n * once, without waiting for another event, and drops its listener. The\n * cost limit applies to each event on its own.\n */\n async subscribe(\n args: ExecuteArgs,\n ): Promise<AsyncIterableIterator<ExecutionResult> | ExecutionResult> {\n const document = this.#document(args);\n if (!isDocument(document)) return document;\n const type = operationType(document, args.operationName);\n if (type && type !== \"subscription\") {\n return {\n errors: [\n requestError(\n \"WRONG_OPERATION_TYPE\",\n `subscribe() runs subscriptions; run a ${type} with execute()`,\n ),\n ],\n };\n }\n return graphqlSubscribe({\n schema: this.getSchema(),\n document,\n variableValues: args.variables,\n operationName: args.operationName,\n contextValue: args.context ?? {},\n }) as Promise<AsyncIterableIterator<ExecutionResult> | ExecutionResult>;\n }\n\n /**\n * The document `args` names: a persisted one by id, or `source` parsed\n * and validated through the cache. An error result when there is none.\n */\n #document(args: ExecuteArgs): DocumentNode | 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(\"a source or an id is needed\")],\n };\n }\n return document;\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. `return()`\n * or aborting `signal` (already aborted included) ends it at once.\n */\n changes(\n options: { signal?: AbortSignal; maxQueued?: number } = {},\n ): AsyncIterableIterator<WriteChange> {\n return this.#queue<WriteChange>((listener) => {\n if (this.#feed) {\n this.#feedListeners.add(listener);\n return () => this.#feedListeners.delete(listener);\n }\n return this.onWrite(listener);\n }, options);\n }\n\n /**\n * An async iterator over the items a `register`ed listener receives,\n * queued up to `maxQueued`; `register` returns the unregister call.\n */\n #queue<T>(\n register: (listener: (item: T) => void) => () => void,\n options: { signal?: AbortSignal; maxQueued?: number },\n ): AsyncIterableIterator<T> {\n const limit = options.maxQueued ?? this.#maxQueued;\n const queue: T[] = [];\n let wake: (() => void) | undefined;\n let done = false;\n let overflow = false;\n const listener = (change: T) => {\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 const unregister = register(listener);\n const stop = () => void unregister();\n let ready: Promise<void> | undefined;\n if (this.#feed) {\n this.#feedReady ??= this.#feed.start();\n ready = this.#feedReady;\n }\n const finish = () => {\n done = true;\n stop();\n options.signal?.removeEventListener(\"abort\", finish);\n wake?.();\n };\n if (options.signal?.aborted) finish();\n else options.signal?.addEventListener(\"abort\", finish, { once: true });\n const iterator: AsyncIterableIterator<T> = {\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(\n base: SelectionContext,\n context: unknown,\n jwt = this.#jwt(context),\n ): CompileContext {\n return newContext(base, this.model, {\n jwt,\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. A\n * subscription is charged per event.\n */\n #charge(\n field: string,\n cost: number,\n context: unknown,\n info?: GraphQLResolveInfo,\n ) {\n let total = cost;\n const event: unknown =\n info?.operation.operation === \"subscription\" ? info.rootValue : undefined;\n if (event !== null && typeof event === \"object\") {\n total = (this.#eventSpent.get(event) ?? 0) + cost;\n this.#eventSpent.set(event, total);\n } else 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 /** Precomputed key of the statements, from a reused compile. */\n shareKey?: string,\n ): Promise<QueryResult[]> {\n const key = change ? (shareKey ?? 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 shareKey?: string,\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 const timing = this.#timingOf(context);\n const dbStart = timing ? performance.now() : 0;\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(\n change,\n compiled.statements,\n () =>\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 ...(compiled.bounded && { bounded: true }),\n }),\n shareKey,\n ),\n );\n } catch (err) {\n throw this.#databaseError(field, err);\n } finally {\n if (timing) {\n timingEntry(timing, rootKey(info) ?? field).databaseMs +=\n performance.now() - dbStart;\n }\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 * that agrees on what this compile reads: the field node, the variables\n * it references, the claims and `$context` values it looked up (see\n * `CompileCache`).\n */\n #cachedCompile(\n info: GraphQLResolveInfo,\n context: unknown,\n compile: (ctx: CompileContext) => CompiledRead,\n ): CompiledRead {\n const base = infoContext(info);\n return this.#compiled.get(\n {\n fieldNodes: info.fieldNodes,\n fragments: info.fragments,\n variables: coercedVariables(info.variableValues),\n jwt: this.#jwt(context),\n context,\n statistics: this.#statisticsVersion,\n },\n (jwt) => {\n const ctx = this.#context(base, context, jwt);\n return { ctx, compiled: compile(ctx) };\n },\n );\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 ): AsyncIterableIterator<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 // The stream's own signal: ended by `context.signal` or by return().\n // An async generator runs return() only once its pending next()\n // yields, and a quiet or filtered stream may never yield again, so\n // return() aborts the changes() underneath, which wakes that next().\n const stop = new AbortController();\n const outer = (context as LoraGraphQLContext | undefined)?.signal;\n const end = () => {\n outer?.removeEventListener(\"abort\", end);\n stop.abort();\n };\n if (outer?.aborted) end();\n else outer?.addEventListener(\"abort\", end, { once: true });\n const events = this.#events(node, args, context, base, stop.signal);\n const iterator: AsyncIterableIterator<ChangeEvent> = {\n [Symbol.asyncIterator]: () => iterator,\n next: async () => {\n const result = await events.next();\n if (result.done) end();\n return result;\n },\n return: (value?: unknown) => {\n end();\n return events.return(value);\n },\n throw: (error?: unknown) => {\n end();\n return events.throw(error);\n },\n };\n return iterator;\n }\n\n async *#events(\n node: NodeType,\n args: Record<string, unknown>,\n context: unknown,\n base: SelectionContext,\n signal: AbortSignal,\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 visible = check\n ? this.#visibleCheck(node, where, base, context)\n : undefined;\n // Only changes to this type (and this key, when one is followed)\n // arrive, with their events already built.\n const deliveries = this.#queue<SubscriberDelivery>(\n (sink) =>\n this.#addSubscriber(node, key == null ? undefined : keyOf(key), sink),\n { signal },\n );\n for await (const { change, events: all } of deliveries) {\n const events = all.filter((e) => wanted.has(e.operation));\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 seen = visible\n ? await visible(\n live.map((e) => e.key),\n change,\n )\n : undefined;\n for (const event of [...live, ...deletions]) {\n if (\n event.operation !== \"DELETE\" &&\n seen &&\n !seen.has(keyOf(event.key))\n ) {\n continue;\n }\n // Events are built once per change and type: each subscriber gets\n // its own copy, since per-event cost is charged by root value.\n const own = { ...event };\n Object.defineProperty(own, CHANGE, { value: change });\n yield own;\n }\n }\n }\n\n /** Index a subscriber by type and key; returns its removal. */\n #addSubscriber(\n node: NodeType,\n key: string | undefined,\n sink: SubscriberSink,\n ): () => void {\n // One listener serves every subscriber, registered while any exist.\n if (!this.#undispatch) {\n const dispatch = (change: WriteChange) => this.#dispatch(change);\n if (this.#feed) {\n this.#feedListeners.add(dispatch);\n this.#undispatch = () => this.#feedListeners.delete(dispatch);\n } else {\n this.#undispatch = this.onWrite(dispatch);\n }\n }\n let group = this.#subscribers.get(node.name);\n if (!group) {\n group = { node, all: new Set(), byKey: new Map() };\n this.#subscribers.set(node.name, group);\n }\n const g = group;\n let sinks = g.all;\n if (key !== undefined) {\n sinks = g.byKey.get(key) ?? new Set();\n g.byKey.set(key, sinks);\n }\n sinks.add(sink);\n return () => {\n sinks.delete(sink);\n if (key !== undefined && sinks.size === 0) g.byKey.delete(key);\n if (\n g.all.size === 0 &&\n g.byKey.size === 0 &&\n this.#subscribers.get(node.name) === g\n ) {\n this.#subscribers.delete(node.name);\n if (this.#subscribers.size === 0) {\n this.#undispatch?.();\n this.#undispatch = undefined;\n }\n }\n };\n }\n\n /**\n * Hand one change to the subscribers of the types it touches: each\n * type's events are built once, and keyed subscribers get only the\n * events of their key.\n */\n #dispatch(change: WriteChange): void {\n if (this.#subscribers.size === 0) return;\n const types = new Set<string>();\n for (const refs of [change.deleted, change.created, change.entities]) {\n for (const e of refs) types.add(e.type);\n }\n for (const refs of [change.connected, change.disconnected]) {\n for (const r of refs) {\n types.add(r.from.type);\n types.add(r.to.type);\n }\n }\n const deliver = (sinks: Set<SubscriberSink>, events: ChangeEvent[]) => {\n for (const sink of sinks) {\n try {\n sink({ change, events });\n } catch {\n // One subscriber's failure must not stop the others.\n }\n }\n };\n for (const type of types) {\n const group = this.#subscribers.get(type);\n if (!group) continue;\n const events = changeEvents(change, group.node);\n if (events.length === 0) continue;\n if (group.all.size > 0) deliver(group.all, events);\n if (group.byKey.size === 0) continue;\n const byKey = new Map<string, ChangeEvent[]>();\n for (const e of events) {\n const id = keyOf(e.key);\n if (!group.byKey.has(id)) continue;\n const list = byKey.get(id);\n if (list) list.push(e);\n else byKey.set(id, [e]);\n }\n for (const [id, list] of byKey) {\n const sinks = group.byKey.get(id);\n if (sinks) deliver(sinks, list);\n }\n }\n }\n\n /**\n * Whether a subscription may see nodes: which of `keys` it may read\n * (and its `where` matches), in one query per change. The statement is\n * compiled once per subscription, again only when its claims or the\n * `$context` values it read change.\n */\n #visibleCheck(\n node: NodeType,\n where: Record<string, unknown> | null | undefined,\n base: SelectionContext,\n context: unknown,\n ): (keys: unknown[], change: object) => Promise<Set<string>> {\n let cached: SubscriptionCompile<Statement> | undefined;\n return async (keys, change) => {\n if (keys.length === 0) return new Set();\n const claims = stableKey(this.#jwt(context) ?? null);\n let entry = cached;\n if (\n !entry ||\n claims === undefined ||\n entry.claims !== claims ||\n !sameContextReads(entry.contextReads, context)\n ) {\n const ctx = this.#context(base, context);\n const slot: unknown[] = [];\n const text = printClauses([\n { kind: \"unwind\", expr: bind(ctx, slot), 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 // The key list is bound directly, so the slot is always found.\n entry = slotCompile(\n { text, params: ctx.params },\n slot,\n claims,\n 0,\n undefined,\n ctx.contextReads,\n )!;\n cached = claims === undefined ? undefined : entry;\n }\n const statements = [\n {\n text: entry.compiled.text,\n params: { ...entry.compiled.params, [entry.param]: keys },\n },\n ];\n const share =\n entry.share === undefined\n ? undefined\n : `${entry.share}\\0${keys.map(keyOf).join(\"\\0\")}`;\n const [result] = await this.#shared(\n change,\n statements,\n () =>\n this.#driver.run(statements, {\n mode: \"read\",\n timeoutMs: this.#timeoutMs,\n verified: true,\n }),\n share,\n );\n return new Set(result!.rows.map((r) => keyOf(r[\"key\"])));\n };\n }\n\n /**\n * A changed node for a subscriber. The read is compiled once per\n * subscription (context), field node, claims and variables, with the\n * key as its only varying parameter.\n */\n #resolveByKey(\n node: NodeType,\n key: unknown,\n info: GraphQLResolveInfo,\n context: unknown,\n change?: object,\n ): Promise<unknown> {\n const field = info.fieldNodes[0]!;\n const claims = stableKey(this.#jwt(context) ?? null);\n const variables = stableKey(coercedVariables(info.variableValues));\n const byField =\n context !== null && typeof context === \"object\"\n ? (this.#byKeyCompiles.get(context) ??\n this.#byKeyCompiles.set(context, new WeakMap()).get(context)!)\n : undefined;\n let entry = byField?.get(field);\n if (\n !entry ||\n claims === undefined ||\n variables === undefined ||\n entry.claims !== claims ||\n entry.variables !== variables ||\n entry.statistics !== this.#statisticsVersion ||\n !sameContextReads(entry.contextReads, context)\n ) {\n const ctx = this.#context(infoContext(info), context);\n const slot = {};\n const compiled = compileRoot(\n ctx,\n \"single\",\n node,\n { [node.key.name]: slot },\n info.fieldNodes,\n );\n entry =\n compiled.statements.length === 1\n ? slotCompile(\n compiled,\n slot,\n claims,\n this.#statisticsVersion,\n variables,\n ctx.contextReads,\n compiled.statements[0]!,\n )\n : undefined;\n if (!entry) {\n // Not reusable: compile again with the key itself.\n const direct = compileRoot(\n this.#context(infoContext(info), context),\n \"single\",\n node,\n { [node.key.name]: key },\n info.fieldNodes,\n );\n return this.#run(info.fieldName, direct, context, info, change);\n }\n if (claims !== undefined && variables !== undefined) {\n byField?.set(field, entry);\n }\n }\n const statement = entry.compiled.statements[0]!;\n const compiled: CompiledRead = {\n ...entry.compiled,\n statements: [\n {\n text: statement.text,\n params: { ...statement.params, [entry.param]: key },\n },\n ],\n };\n const share =\n entry.share === undefined ? undefined : `${entry.share}\\0${keyOf(key)}`;\n return this.#run(info.fieldName, compiled, context, info, change, share);\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 /**\n * How a mutation's statements are observed: traced and reported when\n * observability is on, timed when the request collects timings.\n */\n #mutationObserve(\n info: GraphQLResolveInfo,\n context: unknown,\n ): MutationEnv[\"observe\"] {\n const timing = this.#timingOf(context);\n if (!this.#observer.active && !timing) return undefined;\n return async (statement, run) => {\n const start = performance.now();\n try {\n return await (this.#observer.active\n ? this.#observer.statements(\n this.#meta(info.fieldName, \"write\", info),\n [statement],\n run,\n )\n : run());\n } finally {\n if (timing) {\n timingEntry(timing, rootKey(info) ?? info.fieldName).databaseMs +=\n performance.now() - start;\n }\n }\n };\n }\n\n /** The request's timing collector, when `timing` asked for one. */\n #timingOf(\n context: unknown,\n ): Map<string, { totalMs: number; databaseMs: number }> | undefined {\n return context !== null && typeof context === \"object\"\n ? this.#timings.get(context)\n : undefined;\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.#mutationObserve(info, context),\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\nfunction isDocument(\n value: DocumentNode | ExecutionResult,\n): value is DocumentNode {\n return (value as DocumentNode).kind === Kind.DOCUMENT;\n}\n\n/**\n * The type of the operation `operationName` selects; undefined when it\n * selects none, which graphql then reports.\n */\n/** A variable graphql-js could not coerce: a request error with no code. */\nfunction isVariableError(e: GraphQLError): boolean {\n return (\n e.extensions?.[\"code\"] === undefined &&\n e.path === undefined &&\n e.message.startsWith('Variable \"$')\n );\n}\n\n/** A request's timing entry for a root field, created on first use. */\nfunction timingEntry(\n timing: Map<string, { totalMs: number; databaseMs: number }>,\n key: string,\n): { totalMs: number; databaseMs: number } {\n let entry = timing.get(key);\n if (!entry) {\n entry = { totalMs: 0, databaseMs: 0 };\n timing.set(key, entry);\n }\n return entry;\n}\n\n/** The response key of the root field `info` belongs to. */\nfunction rootKey(info: GraphQLResolveInfo | undefined): string | undefined {\n let path = info?.path;\n if (!path) return undefined;\n while (path.prev) path = path.prev;\n return String(path.key);\n}\n\n/** Milliseconds, to a hundredth. */\nconst ms = (value: number) => Math.round(value * 100) / 100;\n\n/** An index name as Cypher takes it: backquoted. */\nfunction quoteName(name: string): string {\n return \"`\" + name.replaceAll(\"`\", \"``\") + \"`\";\n}\n\nfunction operationType(\n document: DocumentNode,\n operationName: string | null | undefined,\n): \"query\" | \"mutation\" | \"subscription\" | undefined {\n return getOperationAST(document, operationName)?.operation as\n | \"query\"\n | \"mutation\"\n | \"subscription\"\n | undefined;\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/** A cached compile still holds for these `$context` values. */\nfunction sameContextReads(\n reads: Array<[string, unknown]>,\n context: unknown,\n): boolean {\n return reads.every(\n ([path, value]) =>\n stableKey(lookupPath(context, path)) === stableKey(value),\n );\n}\n\n/**\n * A compile made with `slot` as one parameter's value, reusable with that\n * parameter filled in per run; undefined unless exactly one parameter\n * holds the slot.\n */\nfunction slotCompile<C>(\n compiled: C,\n slot: unknown,\n claims: string | undefined,\n statistics: number,\n variables: string | undefined,\n contextReads: Array<[string, unknown]>,\n statement: Statement = compiled as Statement,\n): SubscriptionCompile<C> | undefined {\n const slots = Object.keys(statement.params).filter(\n (name) => statement.params[name] === slot,\n );\n if (slots.length !== 1) return undefined;\n const param = slots[0]!;\n const rest = { ...statement.params };\n delete rest[param];\n const fixed = stableKey({ text: statement.text, params: rest });\n return {\n claims: claims ?? \"\",\n statistics,\n variables,\n contextReads,\n compiled,\n param,\n share: fixed === undefined ? undefined : `s:${param}\\0${fixed}`,\n };\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 run it outside a\n * read-only transaction.\n */\n verified?: boolean;\n /**\n * A verified read of at most one row, by an exact @key seek, projecting\n * only stored properties. Cheap enough to run synchronously.\n */\n bounded?: 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 execute?(\n query: string,\n params?: never,\n options?: { timeoutMs?: number; signal?: AbortSignal },\n ): Promise<QueryResult>;\n stream?(\n query: string,\n params?: never,\n options?: { timeoutMs?: number; signal?: AbortSignal },\n ): {\n columns(): string[] | Promise<string[]>;\n toArray(): Promise<Array<Record<string, unknown>>>;\n };\n explain?(query: string, params?: never): Promise<QueryPlan>;\n changes?(options?: {\n fromLsn?: number;\n signal?: AbortSignal;\n }): AsyncIterable<DriverChangeBatch> & { ready: Promise<void> };\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 execute =\n typeof db.execute === \"function\" ? db.execute.bind(db) : undefined;\n const stream =\n typeof db.stream === \"function\" ? db.stream.bind(db) : undefined;\n const driver: LoraDriver = {\n async run(statements, options) {\n const single =\n options.mode === \"read\" && options.verified && statements.length === 1\n ? statements[0]!\n : undefined;\n // One keyed row of stored properties: a stream answers it on the JS\n // thread faster (~7 µs) than a hop to a libuv worker. Any other read\n // must not run there: db.stream() runs the whole query on the JS\n // thread, so one slow read would block every other request.\n if (single && options.bounded && stream) {\n const rows = stream(\n single.text,\n single.params as never,\n runLimits(options),\n );\n return [{ columns: await rows.columns(), rows: await rows.toArray() }];\n }\n // A single verified read needs no read-only transaction: execute()\n // runs it on a libuv worker at less than half a transaction's cost,\n // and stops at LIMIT as early.\n if (single && execute) {\n return [\n await execute(\n single.text,\n single.params as never,\n runLimits(options),\n ),\n ];\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","props","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","maskLiterals","close","nl","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","options","kind","SEEK_OPERATORS","checkPlans","compiled","reports","plan","nodes","flatten","outer","flattenOuter","notes","sameColumns","x","scans","seeks","estimates","estimatedRows","SEEKS","BIND_NOTHING","scanExpands","expand","source","sourceScan","children","a","b","lintModel","unguardedMutations","rules","open","ModelError","problems","formatProblem","requestError","code","cause","extensions","GraphQLError","RELATIONSHIP_OPERATIONS","PLACEHOLDER","newContext","base","noteClaim","ctx","path","bound","seen","EXPR","exprValue","bind","freshVar","candidate","toLoraPoint","input","toStored","copies","isPolymorphic","memberFields","list","member","declared","abstractOf","listAggregate","lengths","values","item","init","step","durationSum","distinctCount","keys","SCALAR_OPS","COUNT_OPS","compileNodeWhere","variable","compileWhere","nodeKeys","checkFieldAuthentication","rule","fieldValidate","pred","scalarPredicate","maskedValue","relationshipPredicate","connectionPredicate","compilePropsWhere","checkPropertyAccess","lookup","parts","branches","compile","box","d","lowered","ciOp","ciValue","cypherOp","lower","relationshipPattern","from","targetLabel","to","relVariable","related","projection","authFilter","compileMemberWhere","abstract","mine","typename","rest","members","checkAuthentication","memberWhere","sum","count","distinct","lists","nonEmpty","probe","quantifier","failing","compareCount","aggregatePredicate","total","pairWhere","negate","nonEmptyPair","refuseEdgeRowRules","AGGREGATE_KEYS","side","onEdge","fieldName","aggs","maskSettled","agg","bounds","aggregate","claimsSatisfy","compileRulePart","MissingClaim","bypassed","folded","compileRule","toExpr","foldOr","authValidate","when","validateRules","fieldReadGuard","forbidden","propertyAccess","type","access","bypass","raw","masks","unless","substitute","checkKeyScope","viewerKey","scope","mapping","viewerNode","claim","prefix","ends","underNot","child","foldAnd","viewerTest","inRule","edge","matchClaims","wasInAuth","relationshipRules","vars","mode","flipped","relationshipRuleFields","all","refusedEdgeRead","hasRules","exprs","head","full","lookupPath","root","cur","part","sameValue","ka","kb","viewerString","ok","flush","resolved","built","_","expected","claimOp","accessMatrix","schema","principals","principalsOf","context","byName","typeVerdict","ruleOps","relationshipVerdict","fieldVerdict","by","rulesFor","filter","isFalse","validate","verdict","allowedBy","failed","guard","subject","token","tested","visit","operand","t","claims","accessLints","authenticated","filters","alone","branch","claimFreeBranch","usesClaims","analyze","sample","stats","statements","rels","arrow","degrees","summarize","q","COMPILED_PER_FIELD","COMPILED_TOTAL","CompileCache","#byField","#live","#variableNames","#bindHints","#total","request","variables","#variablesKey","stableKey","claimAt","bindable","rebind","miss","#compileMiss","slots","read","entry","dropped","oldest","jwt","hint","markers","MARKER","marked","withPath","result","findSlots","used","variableNames","picked","paths","copy","copied","slot","st","fieldNodes","fragments","names","visited","exact","walk","ast","Kind","fragment","proto","json","directiveTypeDefs","PRELUDE_TYPES","DIRECTIVE_POSITIONS","HINTS","known","libraryDirectives","parse","checkDirectivePositions","ours","check","directives","position","allowed","dir","typeDirectives","has","isUnionType","isInterfaceType","isObjectType","typePosition","fieldPosition","getNamedType","UNEXPANDED","isRecord","QUANTIFIERS","desugarRule","expandRule","extra","expanded","desugarNode","viewerType","def","withinRule","stack","cycle","reported","id_","expandNodeRule","toNodeFilter","test","isViewer","desugarAbstract","quantified","pair","map","checkViewer","viewer","jwtType","settable","isUpdatable","offersNested","update","allows","hasSettable","DEFAULT_LIMIT","MAX_LIMIT","BUILTIN_SCALARS","ALLOWED_OPS","KEY_TYPES","UNSORTABLE","RELATIONSHIP_TYPE","ROOT_TYPES","buildModel","typeDefs","globalLimit","resolveGlobalLimit","user","buildASTSchema","concatAST","atType","userTypes","defaults","directive","schemaRules","enums","scalars","scalarDescriptions","nodeTypes","propsTypes","plainTypes","rootTypes","interfaceTypes","unionTypes","jwtShape","warnings","isScalarType","stored","storageOf","isEnumType","val","viewerArgs","isNode","isProps","nodeNames","plainNames","objects","named","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","lowerFirst","resolveLimit","abstracts","relationships","declaredRel","declareRelationship","mf","queries","mutationFields","typeRules","namedRules","schemaDesugar","violations","claimsOnlyViolations","checkRuleWhere","WRITES","missing","defaultMatches","abstractsOf","ruleEnds","desugar","isRelationshipRule","typeName","checkAuthorizationWhere","misplaced","unsupported","PROPERTY_OPS","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","scopeArgs","keyScope","timestamp","defaultValue","requested","bad","indexes","vectorQueryNames","readOnlyRules","properties","cardinality","limitArgs","max","global","getDirectiveValues","required","isNonNullType","depth","itemRequired","isListType","STORAGE_TYPES","arg","WRITE_CLAUSES","warn","namedType","object","columnName","inferColumn","cypherArgs","argNamed","argShape","unwrapInput","argumentDefault","computed","valueFromAST","depths","topLevel","re","stop","offset","bare","relationship","SCALAR_WHERE_OPS","JWT_OPS","COUNT_WHERE_OPS","here","nodePart","checkNodeWhere","problem","ruleStringProblems","viewerRefProblems","claimRefs","checkEdgeWhere","connection","checkConnectionWhere","checkAbstractWhere","edgeType","defaultName","fulltext","Plural","upperFirst","snakeCase","vectors","REFERENCE_PATH","inList","refs","_source","hasOwnConnection","connectionTypeNames","K","sha256","data","h","padded","view","bits","off","s0","rotr","s1","hh","t1","t2","outView","hmacSha256","block","constantTimeEqual","diff","SIGNATURE_BYTES","encodeCursor","sort","secret","_k","payload","toBase64Url","bytesToBase64Url","sign","decodeCursor","cursor","arity","encoded","dot","given","base64UrlToBytes","fromBase64Url","encoder","bytes","b64","GRAPHQL_17","versionInfo","coercedVariables","variableValuesOf","collectFields","selectionSets","set","sel","included","applies","frag","subSelections","fieldArgs","getArgumentValues","GraphQLSkipDirective","GraphQLIncludeDirective","condition","cond","isAbstractType","keyExpr","compileRoot","sets","compileList","compileSingle","compileConnection","compileAggregate","compileGrouped","finish","columns","expectation","readSet","resolveSort","rootMatch","projectNode","sortItems","row","objType","signature","backward","resolvePage","connType","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","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","after","keyset","matches","pool","candidates","exclude","coalesceFalse","searchConnectionSelections","searchCount","selections","searchNodeSelections","matchType","compileByKeys","byKey","keyOf","EXACT_OPS","POINT_OPS","anchor","computedFields","carry","computedClauses","projectCypher","predicate","seekFromWhere","findRelatedAnchor","keysetPredicate","leadBound","lead","eq","seek","dedupe","family","argument","tieBreak","one","propName","sortSignature","equal","disjunction","requiresCache","requiresSelection","requires","cached","defs","pre","selected","guarded","connectionOf","masked","guardedValue","nested","projectRelationship","connected","projectRelationshipConnection","fanOut","degree","pattern","userSort","limitParam","typeNames","edgeRead","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","requiredOnCreate","adjustable","buildMutations","resolve","inputs","once","description","GraphQLInputObjectType","scalarInputs","propsCreate","propsUpdate","propsRequired","connectInput","nestedCreateInput","createInput","nestedUpdateInput","updateInput","canCreate","polymorphicFields","byMember","connect","create","GraphQLBoolean","relationFields","GraphQLInt","scalarsOf","upsertInput","numericAdjust","adjustType","GraphQLFloat","adjustInput","info","GraphQLObjectType","listPayload","obj","run","_src","_args","updatable","adjust","updateArgs","runStatement","env","tx","asList","WritePlan","written","storedDefault","satisfied","inverseFields","operation","cb","ownerKey","pick","adding","replace","updates","disconnect","nestedDelete","spec","keep","edgeProps","u","remove","refused","onCreate","onUpdate","propertyError","TEMPORAL_KIND","tag","NOW","timestamps","edgeStamps","now","labelTest","seekThenExpand","orFresh","andText","Runner","task","assertBatch","assertUniqueKeys","visible","moves","placeholderKey","moved","groups","stamped","batch","bKey","matchText","pairs","doomed","relRef","link","links","lctx","onMatch","linked","byPair","error","found","notConnected","ctx0","before","todo","prepared","actx","adjustments","compileAdjust","shapes","sctx","rowsParam","g","removes","touched","add","fresh","memberTest","byField","ownerName","requiredMissing","queue","next","declaredField","isDoomed","keysByNode","restricting","blocking","back","orphan","relIds","pctx","inverse","current","hi","lo","payloadSelections","payloadType","settleClaims","lookupViewerKey","executeMutation","owned","planCtx","authOp","emptyChange","runner","payloadFor","payloadTypeName","done","bulkLimit","upsert","taken","fillChange","kept","entities","addEntity","mapWriteError","executeCypherMutation","LoraTransaction","#tx","#emit","#pending","emit","ID_CACHE","EngineFeed","#driver","#model","#onError","#byLabel","#ids","#controller","#lastLsn","onError","#open","signal","feed","#pump","backoffMs","delay","#toChange","#report","sleep","#entity","#remember","#resolveEnds","#relationship","fill","owners","ms","timer","schemaHash","printSchema","lexicographicSortSchema","buildManifest","operations","doc","errors","specifiedRules","SCALAR_TS","generateTypes","manifest","storage","lines","scalar","enumType","inputNamed","isInputObjectType","optional","inputInner","typeFromAST","output","outputInner","selection","on","conditional","possible","same","types","declarations","usedFragments","spread","DEFAULT_GUARDS","resolveGuards","guards","nodeEnv","validationRules","depthRule","aliasRule","rootFieldRule","noIntrospection","parseOptions","envelopPlugin","parseFn","setParseFn","parseOpts","addValidationRule","guardError","fragmentsOf","depthOf","memo","deepest","INTROSPECTION_ROOTS","introspectionDepthOf","maxIntrospection","rootFields","STATUS_ERROR","Observer","#options","meta","tracer","span","fail","durationMs","countRows","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","assertFieldReadable","byResponseKey","_ctx","vectorByResponseKey","nodesByResponseKey","OPERATOR_FIELDS","OPERATOR_DOCS","buildSchema","hooks","resolveRoot","resolveNode","sortDirection","GraphQLEnumType","pageInfo","GraphQLString","countFilter","point","cartesianPoint","nodeInterface","GraphQLInterfaceType","GraphQLID","customScalars","documented","baseType","scalarType","scalarOutput","pointInput","cartesianPointInput","spatialInputs","cartesian","inputTypeOf","caseInsensitiveFilter","fieldFilter","wheres","whereOf","relationFilter","polymorphic","connectionFilter","implementation","relationAggregateFilter","connectionWheres","connectionWhere","propsWhere","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","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","LoraGraphQL","#timeoutMs","#maxCost","#maxBatch","#maxQueued","#callbacks","#resolvers","#scalars","#spent","#eventSpent","#jwt","#onStatement","#maskErrors","#observer","#budget","#onCost","#persistedIds","#guards","#persistedOnly","#listeners","#feedListeners","#subscribers","#undispatch","#byKeyCompiles","#feed","#feedReady","#documents","#persisted","#degrees","#statisticsVersion","#compiled","#sharedReads","#statistics","#schema","#mutationTransaction","#timing","#timings","#parse","#validate","document","traced","timing","#timingOf","timingEntry","#subscribe","#resolveByKey","CHANGE","#cachedCompile","#args","#run","#resolveSearch","#resolveRoot","#resolveNode","#resolveCypher","#resolveMutation","checkCustomRequires","invalid","validateSchema","constraints","differs","wantedProps","analyzer","sameTarget","mismatched","created","recreated","quoteName","report","#unusedIndexes","findOperation","coerced","getVariableValues","queryType","#context","#rootOf","#searchOf","hash","started","#document","isDocument","operationType","contextValue","getOperationAST","atomic","graphqlExecute","isVariableError","#databaseError","spent","cost","databaseMs","executionTiming","graphqlSubscribe","listener","#queue","register","wake","overflow","unregister","ready","iterator","#charge","byOperation","#shared","shareKey","pending","dbStart","#meta","runInOrder","rootKey","infoContext","mapped","events","#events","offered","ruled","#visibleCheck","deliveries","sink","#addSubscriber","deletions","live","dispatch","#dispatch","sinks","deliver","changeEvents","sameContextReads","slotCompile","share","direct","#mutationEnv","#mutationObserve","operationName","previous","make","self","requiredCustomFields","statistics","contextReads","fixed","loraDriver","db","execute","stream","single","runLimits","begin","limits","explain"],"mappings":";AA2IO,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,GACnDS,IAAQF,EAAE,YAAY,SACxB,KAAKA,EAAE,WAAW,IAAI,CAACV,MAAM,GAAGlC,EAAKkC,EAAE,GAAG,CAAC,KAAKN,EAAUM,EAAE,KAAK,CAAC,EAAE,EAAE,KAAK,IAAI,CAAC,MAChF;AACJ,SAAO,IAAIU,EAAE,WAAW5C,EAAK4C,EAAE,QAAQ,IAAI,EAAE,GAAGC,CAAM,GAAGC,CAAK;AAChE;AAEO,SAASV,GAAaF,GAAoB;AAC/C,MAAIM,IAAIG,GAAUT,EAAE,KAAK;AACzB,aAAW,EAAE,KAAAa,GAAK,MAAAC,EAAA,KAAUd,EAAE,MAAM;AAClC,UAAMe,IAAQ,IAAIF,EAAI,WAAW/C,EAAK+C,EAAI,QAAQ,IAAI,EAAE,IAAI/C,EAAK+C,EAAI,IAAI,CAAC;AAC1E,IAAAP,KACEO,EAAI,cAAc,QACd,IAAIE,CAAK,OACTF,EAAI,cAAc,OAChB,KAAKE,CAAK,MACV,IAAIA,CAAK,KACjBT,KAAKG,GAAUK,CAAI;AAAA,EACrB;AACA,SAAOR;AACT;AAEA,SAASU,GAAWC,GAA6B;AAC/C,SAAOA,EACJ,IAAI,CAACC,MAAM;AACV,UAAMxC,IAAOgB,EAAUwB,EAAE,IAAI;AAE7B,WADIA,EAAE,UAAU,UACZA,EAAE,KAAK,SAAS,SAASA,EAAE,KAAK,SAASA,EAAE,QAAcxC,IACtD,GAAGA,CAAI,OAAOZ,EAAKoD,EAAE,KAAK,CAAC;AAAA,EACpC,CAAC,EACA,KAAK,IAAI;AACd;AAEA,SAASC,GACPC,GACAC,GACQ;AACR,MAAIf,IAAI;AACR,SAAIc,KAAWA,EAAQ,SAAS,MAC9Bd,KACE,eACAc,EAAQ,IAAI,CAACE,MAAM,GAAG5B,EAAU4B,EAAE,IAAI,CAAC,IAAIA,EAAE,SAAS,EAAE,EAAE,KAAK,IAAI,IAEnED,MAAOf,KAAK,UAAUZ,EAAU2B,CAAK,CAAC,KACnCf;AACT;AAEO,SAASiB,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,SAASxB,GAAawB,EAAE,OAAO,CAAC,MAC/BA,EAAE,QAAQ;AAAA,EAAKD,CAAM,SAAS/B,EAAUgC,EAAE,KAAK,CAAC,KAAK;AAAA,IAE1D,KAAK;AACH,aAAO,UAAUhC,EAAUgC,EAAE,IAAI,CAAC,OAAO5D,EAAK4D,EAAE,KAAK,CAAC;AAAA,IACxD,KAAK,aAAa;AAChB,YAAME,IAASF,EAAE,OACd;AAAA,QAAI,CAACG,MACJA,EAAE,SAASA,EAAE,UAAUA,EAAE,OACrB,GAAG/D,EAAK+D,EAAE,IAAI,CAAC,OAAO/D,EAAK+D,EAAE,KAAK,CAAC,KACnC/D,EAAK+D,EAAE,IAAI;AAAA,MAAA,EAEhB,KAAK,IAAI;AACZ,aACE,QAAQH,EAAE,SAAS,IAAIA,EAAE,KAAK,IAAIhC,CAAS,EAAE,KAAK,IAAI,CAAC,WAAWkC,CAAM,MACvEF,EAAE,QAAQ;AAAA,EAAKD,CAAM,SAAS/B,EAAUgC,EAAE,KAAK,CAAC,KAAK;AAAA,IAE1D;AAAA,IACA,KAAK;AACH,aAAOA,EAAE,KACN,KAAA,EACA,MAAM;AAAA,CAAI,EACV,IAAI,CAACI,GAAM,MAAO,MAAM,IAAIA,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,UAAUhC,EAAUgC,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,IAAI5D,CAAI,EAAE,KAAK,IAAI,CAAC;AAAA,IAC9C,EACmB,GAAGyD,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;ACpbO,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,UAAIpD;AACJ,UAAIkE,EAAKd,CAAC,MAAM,KAAK;AACnB,cAAMiB,IAAMH,EAAK,QAAQ,KAAKd,IAAI,CAAC;AACnC,QAAApD,IAAOkE,EAAK,MAAMd,IAAI,GAAGiB,IAAM,IAAIH,EAAK,SAASG,CAAG,GACpDjB,IAAIiB,IAAM,IAAIH,EAAK,SAASG,IAAM;AAAA,MACpC,OAAO;AACL,cAAMrC,IAAI,0BAA0B,KAAKkC,EAAK,MAAMd,CAAC,CAAC;AACtD,QAAApD,IAAOgC,IAAIA,EAAE,CAAC,IAAI,IAClBoB,KAAKpD,EAAK;AAAA,MACZ;AACA,MAAIA,OAAU,KAAK,EAAE,MAAAA,GAAM,OAAAsE,GAAO,KAAKlB,GAAG;AAAA,IAC5C;AACE,MAAAA;AAAA,EAEJ;AACA,SAAOe;AACT;AAEA,SAASC,GAAWF,GAAcI,GAAeC,GAAuB;AACtE,MAAI,IAAID,IAAQ;AAChB,SAAO,IAAIJ,EAAK;AACd,QAAIA,EAAK,CAAC,MAAM,KAAM,MAAK;AAAA,SAAA;AAAA,UAClBA,EAAK,CAAC,MAAMK,UAAc,IAAI;AAClC;AAAA;AAEP,SAAO;AACT;AAGO,SAASC,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;AAOO,SAASU,GAAaX,GAAsB;AACjD,MAAIC,IAAM,IACNf,IAAI;AACR,SAAOA,IAAIc,EAAK,UAAQ;AACtB,UAAMN,IAAIM,EAAKd,CAAC;AAChB,QAAIiB;AACJ,QAAIT,MAAM,OAAOA,MAAM;AACrB,MAAAS,IAAMD,GAAWF,GAAMd,GAAGQ,CAAC,GAC3BO,KAAO,IAAI,OAAOE,IAAMjB,CAAC;AAAA,aAChBQ,MAAM,KAAK;AACpB,YAAMkB,IAAQZ,EAAK,QAAQ,KAAKd,IAAI,CAAC;AACrC,MAAAiB,IAAMS,IAAQ,IAAIZ,EAAK,SAASY,IAAQ,GACxCX,KACE,MAAM,IAAI,OAAO,KAAK,IAAI,GAAGE,IAAMjB,IAAI,CAAC,CAAC,KAAK0B,IAAQ,IAAI,KAAK;AAAA,IACnE,WAAWlB,MAAM,OAAOM,EAAKd,IAAI,CAAC,MAAM,KAAK;AAC3C,YAAM2B,IAAKb,EAAK,QAAQ;AAAA,GAAMd,CAAC;AAC/B,MAAAiB,IAAMU,IAAK,IAAIb,EAAK,SAASa,GAC7BZ,KAAO,IAAI,OAAOE,IAAMjB,CAAC;AAAA,IAC3B,WAAWQ,MAAM,OAAOM,EAAKd,IAAI,CAAC,MAAM,KAAK;AAC3C,YAAM0B,IAAQZ,EAAK,QAAQ,MAAMd,IAAI,CAAC;AACtC,MAAAiB,IAAMS,IAAQ,IAAIZ,EAAK,SAASY,IAAQ,GACxCX,KAAOD,EAAK,MAAMd,GAAGiB,CAAG,EAAE,QAAQ,UAAU,GAAG;AAAA,IACjD;AACE,MAAAA,IAAMjB,IAAI,GACVe,KAAOP;AAET,IAAAR,IAAIiB;AAAA,EACN;AACA,SAAOF;AACT;ACpHA,eAAsBa,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,CAACtC,MACpC,CAAC,GAAGA,EAAE,OAAO,OAAA,CAAQ,EAAE;AAAA,QACrB,CAACyC,MAAwBA,EAAE,SAAS;AAAA,MAAA;AAAA,IACtC;AAAA,EACF;AAEF,aAAWC,KAASF,GAAQ;AAC1B,UAAMG,IAAkC,CAAA,GAClCC,IAAYhB,GAAac,EAAM,WAAW,CAACpD,OAC/CqD,EAAO,KAAKrD,CAAC,EAAE,IAAI,MACZ,KAAKA,CAAC,GACd,GACKuD,IAAQP,EAAM,MAAM,IAAII,EAAM,KAAK,GACnCpB,IAAOuB,IACT,eAAezF,EAAKyF,EAAM,OAAO,CAAC,CAAE,CAAC;AAAA;AAAA;AAAA,EAA6CD,CAAS;AAAA;AAAA,SAAexF,EAAKsF,EAAM,UAAU,CAAC,cAChI;AAAA,EAAWE,CAAS;AAAA;AAAA,SAAexF,EAAKsF,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,MAAAf,GAAM,QAAAqB,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,QAAMf,IAA2B,CAAA;AACjC,aAAWnB,KAAQkC,EAAM,MAAM,OAAA,GAAU;AACvC,UAAMe,IAAQjD,EAAK,OAAO,CAAC;AAC3B,eAAW,KAAKA,EAAK;AACnB,MAAAmB,EAAI;AAAA,QACF,EAAE,SAAS,aACP;AAAA,UACE,MAAM;AAAA,UACN,MAAM,EAAE;AAAA,UACR,OAAA8B;AAAA,UACA,YAAY,EAAE,OAAO,IAAI,CAACZ,MAAMA,EAAE,QAAQ;AAAA,UAC1C,UAAU,EAAE;AAAA,UACZ,QAAQ,GAAGrC,EAAK,IAAI,kBAAkB,EAAE,IAAI,KAAK,EAAE,SAAS;AAAA,QAAA,IAE9D;AAAA,UACE,MAAM;AAAA,UACN,MAAM,EAAE;AAAA,UACR,OAAAiD;AAAA,UACA,UAAU,EAAE,MAAM;AAAA,UAClB,YAAY,EAAE;AAAA,UACd,YAAY,EAAE;AAAA,UACd,QAAQ,GAAGjD,EAAK,IAAI,IAAI,EAAE,MAAM,IAAI,kBAAkB,EAAE,SAAS;AAAA,QAAA;AAAA,MACnE;AAGR,eAAWqC,KAAKrC,EAAK,OAAO,OAAA,GAAU;AACpC,UAAIqC,EAAE,SAAS,SAAU;AACzB,YAAMK,IAAK,GAAG1C,EAAK,IAAI,IAAIqC,EAAE,IAAI;AACjC,UAAIA,EAAE,KAAK;AACT,QAAAlB,EAAI,KAAK;AAAA,UACP,MAAM;AAAA,UACN,YAAY;AAAA,UACZ,MAAM+B,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,KACFhC,EAAI,KAAK;AAAA,QACP,MAAM;AAAA,QACN,YAAY;AAAA,QACZ,MAAM+B,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,QACjClB,EAAI,KAAK;AAAA,QACP,MAAM;AAAA,QACN,YAAY;AAAA,QACZ,MAAM+B,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,CAAC7F,MAAOqF,GAAU,IAAIrF,CAAE,CAAC;AAClD,QAAI8F,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,CAAC7F,MAAOA,MAAO,iBAAiBA,MAAO;AAAA,MAAA;AAEzC,MAAI+F,EAAQ,SAAS,KACnBH,EAAM,IAAI,SAAS,GAAGV,CAAE,sBAAsBa,EAAQ,KAAK,IAAI,CAAC,EAAE;AAEpE,YAAMrC,IAAOmC,EAAI,OAAO,CAAC7F,MAAOuF,GAAS,IAAIvF,CAAE,CAAC;AAChD,MAAI0D,EAAK,SAAS,KAChBkC,EAAM,IAAI,QAAQ,GAAGV,CAAE,sBAAsBxB,EAAK,KAAK,IAAI,CAAC,EAAE;AAEhE,iBAAWsC,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,QAAAjC,EAAI,KAAK;AAAA,UACP,MAAM;AAAA,UACN,OAAAsC;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,SAAOvC;AACT;AAEA,SAAS+B,GAAWD,GAAeU,GAAkBC,GAAwB;AAC3E,SAAO,GAAGC,GAAMZ,CAAK,CAAC,IAAIY,GAAMF,CAAQ,CAAC,IAAIC,CAAM;AACrD;AAEA,SAASC,GAAMrE,GAAmB;AAChC,SAAOA,EACJ,QAAQ,sBAAsB,OAAO,EACrC,QAAQ,kBAAkB,GAAG,EAC7B,YAAA;AACL;AAGO,SAASsE,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,IAAQ1B,GAAMwC,EAAE,KAAK,GACrB/G,IAAOuE,GAAMwC,EAAE,IAAI;AACzB,MAAIA,EAAE,SAAS,YAAY;AACzB,UAAMjE,IAAQiE,EAAE,WAAW,IAAI,CAAC7E,MAAM,KAAKqC,GAAMrC,CAAC,CAAC,EAAE,EAAE,KAAK,IAAI,GAC1DgF,IACJH,EAAE,aAAa,WACX,4DACA;AACN,WAAO,yBAAyB/G,CAAI,yBAAyBiG,CAAK,cAAcnD,CAAK,IAAIoE,CAAO;AAAA,EAClG;AACA,MAAIH,EAAE,SAAS;AACb,WAAO,uBAAuB/G,CAAI,yBAAyBiG,CAAK,WAAW1B,GAAMwC,EAAE,QAAQ,CAAC,mDAAmDA,EAAE,UAAU,sCAAsCA,EAAE,WAAW,aAAa;AAE7N,QAAMJ,IAAWpC,GAAMwC,EAAE,QAAQ;AACjC,MAAIA,EAAE,SAAS,cAAc;AAC3B,UAAMI,IAAO;AAAA,MACX,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,UAAU;AAAA,IAAA,EACVJ,EAAE,UAAU;AACd,WAAO,qBAAqB/G,CAAI,yBAAyBiG,CAAK,eAAeU,CAAQ,IAAIQ,CAAI;AAAA,EAC/F;AAEA,SAAO,UADMJ,EAAE,UAAU,UAAU,KAAK,GAAGA,EAAE,KAAK,GAC7B,SAAS/G,CAAI,yBAAyBiG,CAAK,WAAWU,CAAQ;AACrF;AAEA,SAASpC,GAAM5C,GAAoB;AACjC,SAAO,MAAMA,EAAG,QAAQ,MAAM,IAAI,IAAI;AACxC;AClNA,MAAMyF,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,GACpBpC,GACAqC,GACAJ,IAAkC,CAAA,GACX;AACvB,MAAI,CAACjC,EAAO;AACV,UAAM,IAAI;AAAA,MACR;AAAA,IAAA;AAGJ,QAAMsC,IAAwB,CAAA;AAC9B,aAAW,CAACnE,GAAGoC,CAAS,KAAK8B,EAAS,WAAW,WAAW;AAC1D,UAAME,IAAO,MAAMvC,EAAO,QAAQO,CAAS,GACrCiC,IAAQC,GAAQF,EAAK,IAAI,GAKzBG,IAAQC,GAAaJ,EAAK,IAAI,GAC9BvE,IAAQwE,EAAM,OAAO,CAAC7E,MAAM,CAAC+E,EAAM,SAAS/E,CAAC,CAAC,GAC9CuC,IAA0B,CAAA,GAC1B0C,IAAuB5E,EAC1B,OAAO,CAACL,MAAMA,EAAE,aAAa,iBAAiB,EAC9C,IAAI,CAACA,OAAO;AAAA,MACX,MAAM;AAAA,MACN,SAAS,qBAAqBA,EAAE,QAAQ,UAAa,GAAG;AAAA,MACxD,WAAW4C,EAAU;AAAA,IAAA,EACrB;AACJ,IAAIgC,EAAK,UAAU,cACjBrC,EAAS,KAAK;AAAA,MACZ,MAAM;AAAA,MACN,SAAS;AAAA,MACT,WAAWK,EAAU;AAAA,IAAA,CACtB,GAECpC,MAAM,KAAK,CAAC0E,GAAYN,EAAK,eAAeF,EAAS,OAAO,KAC9DnC,EAAS,KAAK;AAAA,MACZ,MAAM;AAAA,MACN,SAAS,qBAAqBmC,EAAS,QAAQ,KAAK,IAAI,CAAC,oBAAoBE,EAAK,cAAc,KAAK,IAAI,CAAC;AAAA,MAC1G,WAAWhC,EAAU;AAAA,IAAA,CACtB;AAEH,eAAWlE,KAAKgG,EAAS,aAAa,OAAO,CAACS,MAAMA,EAAE,cAAc3E,CAAC,GAAG;AACtE,YAAM4E,IAAQL,EAAM;AAAA,QAClB,CAAC/E,MACCA,EAAE,aAAa,qBACfA,EAAE,QAAQ,QAAW,MAAM,WAAW,EAAE,SAAStB,EAAE,KAAK;AAAA,MAAA,GAEtD2G,IAAQN,EAAM;AAAA,QAClB,CAAC/E,MACCwE,GAAe9F,EAAE,MAAM,EAAE,SAASsB,EAAE,QAAQ,KAC5CA,EAAE,QAAQ,QAAW,MAAM,WAAW,EAAE,SAAStB,EAAE,KAAK;AAAA,MAAA;AAE5D,OAAI0G,EAAM,SAAS,KAAKC,EAAM,WAAW,MACvC9C,EAAS,KAAK;AAAA,QACZ,MAAM;AAAA,QACN,SAAS,qBAAqB7D,EAAE,MAAM,aAAaA,EAAE,KAAK,KAAKA,EAAE,MAAM,gBACrE0G,EAAM,SAAS,IAAI,oBAAoB,SACzC;AAAA,QACA,WAAWxC,EAAU;AAAA,MAAA,CACtB;AAAA,IAEL;AACA,UAAM0C,IAAYT,EACf,OAAO,CAAC7E,MAAMA,EAAE,SAAS,SAAS,MAAM,KAAKA,EAAE,kBAAkB,IAAI,EACrE,IAAI,CAACA,MAAMA,EAAE,aAAc,GACxBuF,IAAgBD,EAAU,SAAS,IAAI,KAAK,IAAI,GAAGA,CAAS,IAAI;AACtE,IACEhB,EAAQ,cAAc,UACtBiB,MAAkB,QAClBA,IAAgBjB,EAAQ,aAExB/B,EAAS,KAAK;AAAA,MACZ,MAAM;AAAA,MACN,SAAS,wBAAwBgD,CAAa,gCAAgCjB,EAAQ,SAAS;AAAA,MAC/F,WAAW1B,EAAU;AAAA,IAAA,CACtB,GAEH+B,EAAQ,KAAK;AAAA,MACX,WAAA/B;AAAA,MACA,MAAAgC;AAAA,MACA,WAAWC,EAAM,IAAI,CAAC7E,MAAMA,EAAE,QAAQ;AAAA,MACtC,eAAAuF;AAAA,MACA,UAAAhD;AAAA,MACA,OAAA0C;AAAA,IAAA,CACD;AAAA,EACH;AACA,SAAON;AACT;AAEA,MAAMa,KAAQ,IAAI,IAAI,OAAO,OAAOhB,EAAc,EAAE,MAAM,GACpDiB,yBAAmB,IAAI,CAAC,YAAY,UAAU,UAAU,YAAY,CAAC;AASpE,SAASC,GACd9C,GACAgC,GACe;AACf,SAAOE,GAAQF,EAAK,IAAI,EACrB,OAAO,CAAC,MAAM,EAAE,aAAa,QAAQ,EACrC,QAAQ,CAACe,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,WAAWhD,EAAU;AAAA,MAAA;AAAA,IACvB,IAEF,CAAA;AAAA,EACN,CAAC;AACL;AAGA,SAASiD,GAAWF,GAAwC;AAC1D,WAAS3F,IAAI2F,EAAO,SAAS,CAAC,GAAG3F,GAAGA,IAAIA,EAAE,SAAS,CAAC,GAAG;AACrD,QAAIwF,GAAM,IAAIxF,EAAE,QAAQ,EAAG;AAI3B,QAHIA,EAAE,aAAa,qBAIjBA,EAAE,aAAa,cACf8E,GAAQ9E,CAAC,EACN,MAAM,CAAC,EACP,MAAM,CAACZ,MAAMqG,GAAa,IAAIrG,EAAE,QAAQ,CAAC;AAE5C,aAAOY;AAAA,EAEX;AAEF;AAEA,SAAS8E,GAAQ1E,GAA4B;AAC3C,SAAO,CAACA,GAAM,GAAGA,EAAK,SAAS,QAAQ0E,EAAO,CAAC;AACjD;AAGA,SAASE,GAAa5E,GAA4B;AAChD,QAAM0F,IACJ1F,EAAK,aAAa,iBACdA,EAAK,SAAS,MAAM,GAAG,CAAC,IACxBA,EAAK;AACX,SAAO,CAACA,GAAM,GAAG0F,EAAS,QAAQd,EAAY,CAAC;AACjD;AAEA,SAASE,GAAYa,GAAaC,GAAsB;AACtD,SAAOD,EAAE,WAAWC,EAAE,UAAUD,EAAE,MAAM,CAACZ,GAAG,MAAMA,MAAMa,EAAE,CAAC,CAAC;AAC9D;AC/LO,SAASC,GACd3D,GACAgC,IAAuB,IACP;AAChB,QAAM/C,IAAsB,CAAA;AAC5B,aAAWnB,KAAQkC,EAAM,MAAM,OAAA;AAC7B,eAAWG,KAAKrC,EAAK,OAAO,OAAA;AAC1B,MAAIqC,EAAE,SAAS,aACTA,EAAE,QAAQ,IAAI,kBAAkB,KAClClB,EAAI,KAAK;AAAA,QACP,MAAMnB,EAAK;AAAA,QACX,OAAOqC,EAAE;AAAA,QACT,SACE;AAAA,MAAA,CACH,GAECA,EAAE,QAAQ,IAAI,SAAS,KACzBlB,EAAI,KAAK;AAAA,QACP,MAAMnB,EAAK;AAAA,QACX,OAAOqC,EAAE;AAAA,QACT,SACE;AAAA,MAAA,CACH,IAIHA,EAAE,SAAS,kBACXA,EAAE,QACFA,EAAE,gBAAgB,UAClB,CAAC6B,EAAQ,cAET/C,EAAI,KAAK;AAAA,QACP,MAAMnB,EAAK;AAAA,QACX,OAAOqC,EAAE;AAAA,QACT,SACE;AAAA,MAAA,CACH;AAIP,SAAOlB;AACT;AAUO,SAAS2E,GAAmB5D,GAAmC;AACpE,QAAMf,IAAsB,CAAA;AAC5B,aAAWnB,KAAQkC,EAAM,MAAM,OAAA,GAAU;AACvC,UAAM6D,IAAQ;AAAA,MACZ,GAAI/F,EAAK,eAAe,UAAU,CAAA;AAAA,MAClC,GAAIA,EAAK,eAAe,YAAY,CAAA;AAAA,IAAC,GAEjCgG,IAAO,CAAC,GAAGhG,EAAK,SAAS,EAAE;AAAA,MAC/B,CAACxC,MACC,CAACwC,EAAK,gBAAgB,IAAIxC,CAAE,KAC5B,CAACuI,EAAM,KAAK,CAAC,MAAM,EAAE,WAAW,IAAIvI,CAAE,CAAC,KACvC,CAACwC,EAAK,eAAe,QAAQ,IAAIxC,CAAE;AAAA,IAAA;AAEvC,IAAIwI,EAAK,SAAS,KAChB7E,EAAI,KAAK;AAAA,MACP,MAAMnB,EAAK;AAAA,MACX,SAAS,GAAGgG,EAAK,KAAK,IAAI,CAAC,IAAIA,EAAK,WAAW,IAAI,QAAQ,MAAM,wFAAwFA,EAAK,WAAW,IAAI,OAAO,MAAM,WAAWA,EAAK,WAAW,IAAI,OAAO,MAAM,wCAAwCA,EAAK,KAAK,IAAI,CAAC;AAAA,IAAA,CAC9R;AAAA,EAEL;AACA,SAAO7E;AACT;ACpEO,MAAM8E,WAAmB,MAAM;AAAA,EAC3B;AAAA,EAET,YAAYC,GAA0B;AACpC;AAAA,MACE,yCAAyCA,EAAS,MAAM,IAAIA,EAAS,WAAW,IAAI,YAAY,UAAU;AAAA,IACxGA,EAAS,IAAI,CAAChH,MAAM,SAASiH,GAAcjH,CAAC,CAAC,EAAE,KAAK;AAAA,CAAI;AAAA,IAAA,GAE5D,KAAK,OAAO,cACZ,KAAK,WAAWgH;AAAA,EAClB;AACF;AAEO,SAASC,GAAcjH,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;AAgBO,SAASkH,EACdC,GACA1D,GACA2D,GACAC,IAAsC,CAAA,GACxB;AACd,SAAO,IAAIC,GAAa7D,GAAS;AAAA,IAC/B,YAAY,EAAE,MAAA0D,GAAM,GAAGE,EAAA;AAAA,IACvB,eAAeD,aAAiB,QAAQA,IAAQ;AAAA,EAAA,CACjD;AACH;ACDO,MAAMG,yBAA0D,IAAI;AAAA,EACzE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC,GA8KYC,KAAc;ACnMpB,SAASC,GACdC,GACA1E,GACAgC,IAII,CAAA,GACY;AAChB,SAAO;AAAA,IACL,GAAG0C;AAAA,IACH,OAAA1E;AAAA,IACA,QAAQ,CAAA;AAAA,IACR,MAAM,oBAAI,IAAI,CAAC,MAAM,CAAC;AAAA,IACtB,OAAO,EAAE,QAAQ,oBAAI,OAAO,eAAe,oBAAI,MAAI;AAAA,IACnD,KAAKgC,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,IACd,gCAAgB,IAAA;AAAA,EAAI;AAExB;AAGO,SAAS2C,GACdC,GACAC,GACA5J,GACA6J,GACM;AACN,QAAMC,IAAOH,EAAI,WAAW,IAAIC,CAAI;AACpC,EAAAD,EAAI,WAAW,IAAIC,GAAM,EAAE,OAAA5J,GAAO,OAAO6J,MAAUC,GAAM,SAAS,IAAA,CAAO;AAC3E;AAQO,MAAMC,KAAO,OAAO,MAAM;AAE1B,SAASC,GAAUvJ,GAA8B;AACtD,SAAO,EAAE,CAACsJ,EAAI,GAAGtJ,EAAA;AACnB;AAEO,SAASwJ,EAAKN,GAAqB3J,GAAsB;AAC9D,MAAIA,MAAU,QAAQ,OAAOA,KAAU,YAAY+J,MAAQ/J;AACzD,WAAQA,EAA2B+J,EAAI;AAEzC,QAAMlK,IAAO,IAAI,OAAO,KAAK8J,EAAI,MAAM,EAAE,MAAM;AAC/C,SAAAA,EAAI,OAAO9J,CAAI,IAAIG,GACZF,GAAMD,CAAI;AACnB;AAGO,SAASqK,GAASP,GAAqBF,GAAsB;AAClE,MAAIU,IAAYV;AAChB,WAAS,IAAI,GAAGE,EAAI,KAAK,IAAIQ,CAAS,GAAG,IAAK,CAAAA,IAAY,GAAGV,CAAI,GAAG,CAAC;AACrE,SAAAE,EAAI,KAAK,IAAIQ,CAAS,GACfA;AACT;ACzFO,SAASC,GAAYC,GAAyB;AACnD,MAAIA,MAAU,QAAQ,OAAOA,KAAU,SAAU,QAAOA;AACxD,QAAMtI,IAAIsI;AACV,MAAI,OAAOtI,EAAE,aAAc,YAAY,OAAOA,EAAE,YAAa,UAAU;AACrE,UAAM0H,IAAO;AAAA,MACX,GAAG1H,EAAE;AAAA,MACL,GAAGA,EAAE;AAAA,MACL,WAAWA,EAAE;AAAA,MACb,UAAUA,EAAE;AAAA,IAAA;AAEd,WAAO,OAAOA,EAAE,UAAW,WACvB;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,KAAK;AAAA,MACL,GAAG0H;AAAA,MACH,GAAG1H,EAAE;AAAA,MACL,QAAQA,EAAE;AAAA,IAAA,IAEZ,EAAE,MAAM,SAAS,MAAM,MAAM,KAAK,aAAa,GAAG0H,EAAA;AAAA,EACxD;AACA,SAAI,OAAO1H,EAAE,KAAM,YAAY,OAAOA,EAAE,KAAM,WACrC,OAAOA,EAAE,KAAM,WAClB;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,KAAK;AAAA,IACL,GAAGA,EAAE;AAAA,IACL,GAAGA,EAAE;AAAA,IACL,GAAGA,EAAE;AAAA,EAAA,IAEP,EAAE,MAAM,SAAS,MAAM,MAAM,KAAK,aAAa,GAAGA,EAAE,GAAG,GAAGA,EAAE,EAAA,IAE3DsI;AACT;AAMO,SAASC,GACdnF,GAKAnF,GACS;AACT,MAAImF,EAAM,UAAU,MAAM,QAAQnF,CAAK,GAAG;AACxC,QAAIA,EAAM,WAAWmF,EAAM,OAAO;AAChC,YAAM8D;AAAA,QACJ;AAAA,QACA,GAAG9D,EAAM,IAAI,QAAQnF,EAAM,MAAM,yBAAyBmF,EAAM,OAAO,UAAU;AAAA,MAAA;AAGrF,WAAO;AAAA,MACL,MAAM;AAAA,MACN,WAAWnF,EAAM;AAAA,MACjB,gBAAgB;AAAA,MAChB,QAAQA;AAAA,IAAA;AAAA,EAEZ;AACA,SAAImF,EAAM,SAAS,WAAWA,EAAM,SAAS,mBAAyBnF,IAC/D,MAAM,QAAQA,CAAK,IAAIA,EAAM,IAAIoK,EAAW,IAAIA,GAAYpK,CAAK;AAC1E;ACxEA,MAAMuK,yBAAa,QAAA;AAEZ,SAASC,GACdzF,GACAnC,GACS;AACT,SAAOmC,EAAM,UAAU,IAAInC,EAAI,MAAM;AACvC;AAGO,SAAS6H,GACd1F,GACAnC,GACqB;AACrB,MAAI,CAAC4H,GAAczF,GAAOnC,CAAG,EAAG,QAAO,CAACA,CAAG;AAC3C,MAAI8H,IAAOH,GAAO,IAAI3H,CAAG;AACzB,SAAK8H,MACHA,IAAO9H,EAAI,QAAQ,IAAI,CAAC+H,OAAY;AAAA,IAClC,GAAG/H;AAAA,IACH,QAAQ+H;AAAA,IACR,SAAS,CAACA,CAAM;AAAA,IAChB,KAAK/H;AAAA,EAAA,EACL,GACF2H,GAAO,IAAI3H,GAAK8H,CAAI,IAEfA;AACT;AAGO,SAASE,GAAShI,GAA2C;AAClE,SAAOA,EAAI,OAAOA;AACpB;AAEO,SAASiI,GACd9F,GACAnC,GAC0B;AAC1B,SAAOmC,EAAM,UAAU,IAAInC,EAAI,MAAM;AACvC;ACfO,SAASkI,GACdnB,GACA3C,GACA0D,GACA3D,IAA4B,CAAA,GACtB;AACN,MACEC,MAAS,oBACTA,MAAS,mBACTA,MAAS,iBACT;AACA,UAAM3E,IAAI6H,GAASP,GAAK,OAAO,GACzBoB,IAAgB;AAAA,MACpB,MAAM;AAAA,MACN,UAAU1I;AAAA,MACV,MAAAqI;AAAA,MACA,OAAOhK,GAAOd,EAAEyC,CAAC,GAAG,EAAI;AAAA,MACxB,YAAYzB,GAAG,QAAQhB,EAAEyC,CAAC,CAAC;AAAA,IAAA;AAO7B,WAAOyI,GAAcnB,GALV;AAAA,MACT,gBAAgB;AAAA,MAChB,eAAe;AAAA,MACf,eAAe;AAAA,IAAA,EAEY3C,CAAI,GAAG+D,CAAO;AAAA,EAC7C;AACA,QAAMnD,IAAIsC,GAASP,GAAK,OAAO,GAEzBqB,IAAe;AAAA,IACnB,MAAM;AAAA,IACN,UAAUpD;AAAA,IACV,MAAA8C;AAAA,IACA,OAAOhK,GAAOd,EAAEgI,CAAC,GAAG,EAAI;AAAA,IACxB,YAAY;AAAA,EAAA,GAERxG,IAAM8I,GAASP,GAAK,SAAS,GAC7BsB,IAAOf,GAASP,GAAK,UAAU,GAC/B3I,IAAO,CAACkK,GAAYC,OAAsB;AAAA,IAC9C,MAAM;AAAA,IACN,aAAa/J;AAAA,IACb,MAAA8J;AAAA,IACA,UAAUD;AAAA,IACV,MAAMD;AAAA,IACN,MAAAG;AAAA,EAAA;AAEF,UAAQnE,GAAA;AAAA,IACN,KAAK;AACH,aAAOpG,GAAG,QAAQoK,CAAM;AAAA,IAC1B,KAAK;AAAA,IACL,KAAK;AACH,aAAOhK,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,EAAI4G,MAAS,QAAQ,MAAM,KAAKpH,EAAEqL,CAAI,GAAGrL,EAAEwB,CAAG,CAAC;AAAA,QAAA;AAAA,QAExD,MAAMxB,EAAEqL,CAAI;AAAA,QACZ,MAAMrL,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,YACL4G,MAAS,aAAa,MAAM;AAAA,YAC5BpG,GAAG,QAAQhB,EAAEqL,CAAI,CAAC;AAAA,YAClBrK,GAAG,QAAQhB,EAAEwB,CAAG,CAAC;AAAA,UAAA;AAAA,QACnB;AAAA,QAEF,MAAMxB,EAAEqL,CAAI;AAAA,QACZ,MAAMrL,EAAEwB,CAAG;AAAA,MAAA,CACZ;AAAA,IACH,KAAK;AACH,aAAO2F,EAAQ,WACXqE,EAAA,IACApK,EAAKjB,EAAI,CAAC,GAAGK,EAAI,KAAKR,EAAEwB,CAAG,GAAGxB,EAAEqL,CAAI,CAAC,CAAC;AAAA,IAC5C,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,MAAM7K,EAAI,KAAKQ,GAAG,QAAQoK,CAAM,GAAGjL,EAAI,CAAC,CAAC;AAAA,QACzC,MAAMA,EAAI,IAAI;AAAA,QACd,MAAMK;AAAA,UACJ;AAAA,UACA2G,EAAQ,WACJqE,EAAA,IACAxK,GAAG,WAAWI,EAAKjB,EAAI,CAAC,GAAGK,EAAI,KAAKR,EAAEwB,CAAG,GAAGxB,EAAEqL,CAAI,CAAC,CAAC,CAAC;AAAA,UACzDrK,GAAG,QAAQoK,CAAM;AAAA,QAAA;AAAA,MACnB;AAAA,EACF;AAGJ,WAASI,IAAoB;AAC3B,WAAOpK,EAAKjB,EAAI,IAAI,GAAG;AAAA,MACrB,MAAM;AAAA,MACN,MAAMW,GAAOd,EAAEwB,CAAG,CAAC;AAAA,MACnB,MAAMxB,EAAEqL,CAAI;AAAA,MACZ,MAAM7K,EAAI,KAAKR,EAAEwB,CAAG,GAAGxB,EAAEqL,CAAI,CAAC;AAAA,IAAA,CAC/B;AAAA,EACH;AACF;AAMO,SAASI,GAAc1B,GAAqB2B,GAAkB;AACnE,QAAMlK,IAAM8I,GAASP,GAAK,MAAM,GAC1BtD,IAAI6D,GAASP,GAAK,UAAU;AAClC,SAAO/I,GAAG,QAAQ;AAAA,IAChB,MAAM;AAAA,IACN,aAAaQ;AAAA,IACb,MAAM,EAAE,MAAM,QAAQ,OAAO,CAAA,EAAC;AAAA,IAC9B,UAAUiF;AAAA,IACV,MAAMiF;AAAA,IACN,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,MAAMlL,EAAI,MAAMR,EAAEyG,CAAC,GAAGzG,EAAEwB,CAAG,CAAC;AAAA,MAC5B,MAAMxB,EAAEwB,CAAG;AAAA,MACX,MAAMhB,EAAI,KAAKR,EAAEwB,CAAG,GAAG,EAAE,MAAM,QAAQ,OAAO,CAACxB,EAAEyG,CAAC,CAAC,GAAG;AAAA,IAAA;AAAA,EACxD,CACD;AACH;AC9GA,MAAMkF,KAAuC;AAAA,EAC3C,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,KAAK;AAAA,EACL,IAAI;AAAA,EACJ,KAAK;AAAA,EACL,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,UAAU;AACZ,GAEMC,KAAsC;AAAA,EAC1C,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,KAAK;AAAA,EACL,IAAI;AAAA,EACJ,KAAK;AACP;AAKO,SAASC,GACd9B,GACA9G,GACA6I,GACA1J,GACkB;AAClB,SAAO2J,GAAahC,GAAK3H,GAAO4J,GAASjC,GAAK9G,GAAM6I,CAAQ,CAAC;AAC/D;AAEA,SAASE,GACPjC,GACA9G,GACA6I,GAC0C;AAC1C,SAAO,CAACvL,MAAQ;AACd,UAAM+E,IAAIrC,EAAK,OAAO,IAAI1C,CAAG;AAC7B,QAAI+E,GAAG,SAAS,UAAU;AAExB,MAAA2G,GAAyBlC,GAAK9G,EAAK,MAAMqC,CAAC;AAC1C,YAAM4G,IAAOC,GAAcpC,GAAK9G,GAAMqC,GAAGwG,GAAU,MAAM;AACzD,aAAO,CAAC1L,MAAU;AAEhB,cAAMgM,IAAOC;AAAA,UACXtC;AAAA,UACAuC,GAAYvC,GAAK9G,GAAMqC,GAAGwG,GAAUzL,GAAKL,EAAE8L,CAAQ,GAAGxG,EAAE,QAAQ,CAAC;AAAA,UACjElF;AAAA,QAAA;AAEF,eAAOgM,KAAQlL,GAAIgL,GAAME,CAAI;AAAA,MAC/B;AAAA,IACF;AACA,QAAI9G,GAAG,SAAS,gBAAgB;AAC9B,MAAA2G,GAAyBlC,GAAK9G,EAAK,MAAMqC,CAAC;AAE1C,YAAM4G,IAAOC,GAAcpC,GAAK9G,GAAMqC,GAAGwG,GAAU,MAAM;AACzD,aAAO,CAAC1L,MAAU;AAChB,cAAMgM,IAAOG,GAAsBxC,GAAK+B,GAAUxG,GAAGlF,CAAc;AACnE,eAAOgM,KAAQlL,GAAIgL,GAAME,CAAI;AAAA,MAC/B;AAAA,IACF;AACA,QAAI9G,GAAG,SAAS,YAAYA,EAAE,UAAU;AACtC,MAAA2G,GAAyBlC,GAAK9G,EAAK,MAAMqC,CAAC;AAC1C,YAAM2E,IAAQF,EAAI,SAAS,IAAI,GAAG+B,CAAQ,KAAKxG,EAAE,IAAI,EAAE;AACvD,UAAI,CAAC2E;AACH,cAAMZ;AAAA,UACJ;AAAA,UACA,GAAGpG,EAAK,IAAI,IAAIqC,EAAE,IAAI;AAAA,QAAA;AAG1B,YAAM4G,IAAOC,GAAcpC,GAAK9G,GAAMqC,GAAGwG,GAAU,MAAM;AACzD,aAAO,CAAC1L,MAAU;AAChB,cAAMgM,IAAOC,GAAgBtC,GAAK/J,EAAEiK,CAAK,GAAG7J,CAAc;AAC1D,eAAOgM,KAAQlL,GAAIgL,GAAME,CAAI;AAAA,MAC/B;AAAA,IACF;AAGA,QAAI7L,EAAI,SAAS,YAAY,GAAG;AAC9B,YAAMyC,IAAMC,EAAK,OAAO,IAAI1C,EAAI,MAAM,GAAG,GAAoB,CAAC;AAC9D,UAAIyC,GAAK,SAAS,kBAAkBA,EAAI,QAAQA,EAAI,YAAY;AAC9D,QAAAiJ,GAAyBlC,GAAK9G,EAAK,MAAMD,CAAG;AAC5C,cAAMkJ,IAAOC,GAAcpC,GAAK9G,GAAMD,GAAK8I,GAAU,MAAM;AAC3D,eAAO,CAAC1L,MAAU;AAChB,gBAAMgM,IAAOI,GAAoBzC,GAAK+B,GAAU9I,GAAK5C,CAAc;AACnE,iBAAOgM,KAAQlL,GAAIgL,GAAME,CAAI;AAAA,QAC/B;AAAA,MACF;AAAA,IACF;AAAA,EAEF;AACF;AAEO,SAASK,GACd1C,GACAhH,GACA+I,GACA1J,GACkB;AAClB,SAAO2J,GAAahC,GAAK3H,GAAO,CAAC7B,MAAQ;AACvC,UAAM+E,IAAIvC,EAAM,OAAO,IAAIxC,CAAG;AAE9B,WAAI+E,KAAGoH,GAAoB3C,GAAKhH,EAAM,MAAMuC,GAAG,MAAM,GAC9CA,IACH,CAAClF,MACCiM,GAAgBtC,GAAK1J,GAAKL,EAAE8L,CAAQ,GAAGxG,EAAE,QAAQ,GAAGlF,CAAc,IACpE;AAAA,EACN,CAAC;AACH;AAEA,SAAS2L,GACPhC,GACA3H,GACAuK,GACkB;AAClB,MAAI,CAACvK,EAAO;AACZ,QAAMwK,IAAiC,CAAA;AACvC,aAAW,CAACrM,GAAKH,CAAK,KAAK,OAAO,QAAQgC,CAAK;AAC7C,QAAIhC,KAAU;AACd,UAAIG,MAAQ;AACV,mBAAWoB,KAAKvB;AACd,UAAAwM,EAAM,KAAKb,GAAahC,GAAKpI,GAAGgL,CAAM,CAAC;AAAA,eAEhCpM,MAAQ,MAAM;AACvB,cAAMuK,IAAO1K;AAKb,YAAI0K,EAAK,WAAW,GAAG;AACrB,UAAA8B,EAAM,KAAKzM,EAAI,EAAK,CAAC;AACrB;AAAA,QACF;AACA,cAAM0M,IAAW/B,EACd,IAAI,CAACnJ,MAAMoK,GAAahC,GAAKpI,GAAGgL,CAAM,CAAC,EACvC,OAAO,CAAC9D,MAAiBA,MAAM,MAAS;AAC3C,QAAIgE,EAAS,SAAS,KAAGD,EAAM,KAAKvL,GAAG,GAAGwL,CAAQ,CAAC;AAAA,MACrD,WAAWtM,MAAQ,OAAO;AAGxB,cAAM2C,IAAQ6I,GAAahC,GAAK3J,GAAgBuM,CAAM;AACtD,QAAIzJ,IAAO0J,EAAM,KAAKhM,GAAIsC,CAAK,CAAC,IACvB6G,EAAI,UAAQ6C,EAAM,KAAKzM,EAAI,EAAK,CAAC;AAAA,MAC5C,OAAO;AACL,cAAM2M,IAAUH,EAAOpM,CAAG;AAG1B,QAAI,CAACuM,KAAW/C,EAAI,WAAc,KAAK5J,EAAI,EAAK,CAAC,IAC5CyM,EAAM,KAAKE,IAAU1M,CAAK,CAAC;AAAA,MAClC;AAEF,SAAOc,GAAI,GAAG0L,CAAK;AACrB;AAEA,SAASP,GACPtC,GACAzJ,GACAgG,GACkB;AAClB,QAAMsG,IAAgB,CAAA;AACtB,aAAW,CAACnM,GAAIL,CAAK,KAAK,OAAO,QAAQkG,CAAG,GAAG;AAC7C,QAAIlG,KAAU,KAA6B;AAC3C,YAAQK,GAAA;AAAA,MACN,KAAK,cAAc;AACjB,cAAMsM,IAAM3M;AACZ,QAAAwM,EAAM;AAAA,UACJ5L;AAAA,YACE;AAAA,YACAV;AAAA,YACA+J,EAAKN,GAAKS,GAAYuC,EAAI,SAAS,CAAC;AAAA,YACpC1C,EAAKN,GAAKS,GAAYuC,EAAI,UAAU,CAAC;AAAA,UAAA;AAAA,QACvC;AAEF;AAAA,MACF;AAAA,MACA,KAAK,YAAY;AACf,cAAMC,IAAI5M;AACV,QAAAwM,EAAM;AAAA,UACJpM;AAAA,YACE;AAAA,YACAQ,GAAG,gBAAgBV,GAAQ+J,EAAKN,GAAKS,GAAYwC,EAAE,IAAI,CAAC,CAAC;AAAA,YACzD3C,EAAKN,GAAKiD,EAAE,GAAG;AAAA,UAAA;AAAA,QACjB;AAEF;AAAA,MACF;AAAA,MACA,KAAK;AACH,QAAAJ,EAAM,KAAKpM,EAAI,MAAM6J,EAAKN,GAAK3J,CAAK,GAAGE,CAAM,CAAC;AAC9C;AAAA,MACF,KAAK;AACH,QAAAsM,EAAM,KAAK9L,GAAOR,GAAQF,MAAU,EAAK,CAAC;AAC1C;AAAA,MACF,KAAK,mBAAmB;AACtB,cAAM6M,IAAUjM,GAAG,WAAWV,CAAM;AACpC,mBAAW,CAAC4M,GAAMC,CAAO,KAAK,OAAO,QAAQ/M,CAAc,GAAG;AAC5D,cAAI+M,KAAY,KAA+B;AAC/C,gBAAMC,IAAWzB,GAAWuB,CAAI;AAChC,cAAI,CAACE,EAAU;AACf,gBAAMC,IAAQ,MAAM,QAAQF,CAAO,IAC/BA,EAAQ,IAAI,CAAC1K,MAAM,OAAOA,CAAC,EAAE,YAAA,CAAa,IAC1C,OAAO0K,CAAO,EAAE,YAAA;AACpB,UAAAP,EAAM,KAAKpM,EAAI4M,GAAUH,GAAS5C,EAAKN,GAAKsD,CAAK,CAAC,CAAC;AAAA,QACrD;AACA;AAAA,MACF;AAAA,IAAA;AAEF,UAAMD,IAAWzB,GAAWlL,CAAE;AAC9B,IAAK2M,KACLR,EAAM,KAAKpM,EAAI4M,GAAU9M,GAAQ+J,EAAKN,GAAK3J,CAAK,CAAC,CAAC;AAAA,EACpD;AACA,SAAOc,GAAI,GAAG0L,CAAK;AACrB;AAMO,SAASU,GACdC,GACAvK,GACAwK,GACAC,GACAC,GACS;AACT,SAAO;AAAA,IACL,OAAO,EAAE,UAAUH,GAAM,QAAQ,CAAA,EAAC;AAAA,IAClC,MAAM;AAAA,MACJ;AAAA,QACE,KAAK;AAAA,UACH,GAAIG,MAAgB,SAAY,EAAE,UAAUA,EAAA,IAAgB,CAAA;AAAA,UAC5D,MAAM1K,EAAI;AAAA,UACV,WACEA,EAAI,mBAAmB,eAAe,SAASA,EAAI;AAAA,QAAA;AAAA,QAEvD,MAAM,EAAE,UAAUyK,GAAI,QAAQ,CAACD,CAAW,EAAA;AAAA,MAAE;AAAA,IAC9C;AAAA,EACF;AAEJ;AAMA,SAASG,GACP5D,GACAwD,GACAvK,GACAZ,GACAwL,GACM;AACN,QAAMtN,IAASyJ,EAAI,MAAM,MAAM,IAAI/G,EAAI,MAAM,GACvCgF,IAAIsC,GAASP,GAAK,GAAGwD,CAAI,IAAIvK,EAAI,IAAI,EAAE,GACvCgE,IAAIsD,GAASP,GAAK,GAAG/B,CAAC,MAAM;AAClC,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAASsF,GAAoBC,GAAMvK,GAAK1C,EAAO,OAAO,CAAC,GAAI0H,GAAGhB,CAAC;AAAA;AAAA,IAE/D,OAAO9F,GAAI2M,GAAW9D,GAAKzJ,GAAQ0H,GAAG,MAAM,GAAG5F,EAAM4F,GAAGhB,CAAC,CAAC;AAAA,IAC1D,YAAY4G,EAAW5F,GAAGhB,CAAC;AAAA,EAAA;AAE/B;AAQO,SAAS8G,GACd/D,GACAgE,GACAhD,GACAe,GACA1J,GAC0B;AAC1B,MAAI,CAAC2L,EAAU,QAAOlC,GAAiB9B,GAAKgB,GAAQe,GAAU1J,CAAK;AACnE,MAAI,CAACA,EAAO;AACZ,MAAI2L,EAAS,SAAS,SAAS;AAE7B,QADc,OAAO,QAAQ3L,CAAK,EAAE,OAAO,CAAC,GAAGT,CAAC,MAAMA,KAAK,IAAI,EACrD,WAAW,EAAG;AACxB,UAAMqM,IAAO5L,EAAM2I,EAAO,IAAI;AAC9B,WAAIiD,KAAQ,OAAa,KAClBnC,GAAiB9B,GAAKgB,GAAQe,GAAUkC,CAAI;AAAA,EACrD;AACA,QAAM,EAAE,UAAAC,GAAU,GAAGC,EAAA,IAAS9L;AAC9B,MAAI,MAAM,QAAQ6L,CAAQ,KAAK,CAACA,EAAS,SAASlD,EAAO,IAAI,EAAG,QAAO;AAGvE,QAAMW,IAAOM,GAASjC,GAAKgB,GAAQe,CAAQ;AAC3C,SAAOC;AAAA,IAAahC;AAAA,IAAKmE;AAAA,IAAM,CAAC3N,MAC9BA,MAAQ,aACJ,CAACH,MACC,MAAM,QAAQA,CAAK,IAAID,EAAIC,EAAM,SAAS2K,EAAO,IAAI,CAAC,IAAI,SAC5DW,EAAKnL,CAAG;AAAA,EAAA;AAEhB;AAEA,SAASgM,GACPxC,GACA+B,GACA9I,GACA5C,GACkB;AAClB,QAAM2N,IAAW9C,GAAWlB,EAAI,OAAO/G,CAAG,GACpCmL,IAAUtD,GAAad,EAAI,OAAO/G,CAAG,EAAE,IAAI,CAACuC,MAAU;AAC1D,UAAMtC,IAAO8G,EAAI,MAAM,MAAM,IAAIxE,EAAM,MAAM;AAC7C,WAAA6I,GAAoBrE,GAAK9G,GAAM,MAAM,GACrC8G,EAAI,MAAM,OAAO,IAAI9G,EAAK,OAAO,CAAC,CAAE,GAC7B,EAAE,OAAAsC,GAAO,MAAAtC,EAAA;AAAA,EAClB,CAAC;AACD,EAAA8G,EAAI,MAAM,cAAc,IAAI/G,EAAI,IAAI;AACpC,QAAMqL,IAAc,CAACpL,GAAgB+E,GAAW5F,MAC9C0L,GAAmB/D,GAAKgE,GAAU9K,GAAM+E,GAAG5F,CAAK,GAC5CkM,IAAM,CAAC1B,MACXA,EAAM,WAAW,IAAIzM,EAAI,CAAC,IAAIyM,EAAM,OAAO,CAAChE,GAAGC,MAAMrI,EAAI,KAAKoI,GAAGC,CAAC,CAAC,GAK/D0F,IAAQ,CAACnM,MACbkM;AAAA,IACEH,EAAQ,QAAQ,CAAC,EAAE,OAAA5I,GAAO,MAAAtC,QACVoL,EAAYpL,GAAM,SAASb,CAAK,MAChC,KAAc,CAAA,IACrB;AAAA,MACLpB;AAAA,QACE;AAAA,QACA2M;AAAA,UACE5D;AAAA,UACA+B;AAAA,UACAvG;AAAA,UACA,CAACyC,MAAMqG,EAAYpL,GAAM+E,GAAG5F,CAAK,KAAK;AAAA,UACtC,MAAMjC,EAAI,CAAC;AAAA,QAAA;AAAA,MACb;AAAA,IACF,CAEH;AAAA,EAAA,GAICqO,IAAW,CAACpM,MAA6B;AAC7C,UAAMqM,IAAQN,EAAQ,QAAQ,CAAC,EAAE,OAAA5I,GAAO,MAAAtC,QAClCoL,EAAYpL,GAAM,SAASb,CAAK,MAAM,KAAc,CAAA,IACjD;AAAA,MACLuL;AAAA,QACE5D;AAAA,QACA+B;AAAA,QACAvG;AAAA,QACA,CAACyC,MAAMqG,EAAYpL,GAAM+E,GAAG5F,CAAK,KAAK;AAAA,QACtC,CAAC4F,OAAO;AAAA,UACN,MAAM;AAAA,UACN,OAAO,CAAC7H,EAAI8C,EAAK,IAAI,GAAG5C,GAAKL,EAAEgI,CAAC,GAAG/E,EAAK,IAAI,QAAQ,CAAC;AAAA,QAAA;AAAA,MACvD;AAAA,IACF,CAEH;AACD,WAAIwL,EAAM,WAAW,IAAUtO,EAAI,CAAC,IAC7BsL;AAAA,MACL1B;AAAA,MACA0E,EAAM,OAAO,CAAC7F,GAAGC,MAAMrI,EAAI,KAAKoI,GAAGC,CAAC,CAAC;AAAA,IAAA;AAAA,EAEzC,GAGM6F,IAAW,CAACtM,MAChB+L,EAAQ,KAAK,CAAC,EAAE,MAAAlL,QAAW;AACzB,UAAM0L,IAAQ,EAAE,GAAG5E,GAAK,QAAQ,CAAA,GAAI,MAAM,IAAI,IAAIA,EAAI,IAAI,EAAA;AAE1D,WADU+D,GAAmBa,GAAOZ,GAAU9K,GAAM,SAASb,CAAK,MACrD;AAAA,EACf,CAAC;AAEH,MAAI,CAACY,EAAI;AAEP,WAAO0L,EAAStO,CAAK,IAAII,EAAI,KAAK+N,EAAMnO,CAAK,GAAGD,EAAI,CAAC,CAAC,IAAI;AAG5D,QAAMyM,IAAiC,CAAA;AACvC,aAAW,CAACgC,GAAY1L,CAAK,KAAK,OAAO,QAAQ9C,CAAK,GAAG;AACvD,QAAI8C,KAAU,KAA6B;AAC3C,UAAMvB,IAAIuB;AACV,YAAQ0L,GAAA;AAAA,MACN,KAAK;AACH,QAAIF,EAAS/M,CAAC,KAAGiL,EAAM,KAAKpM,EAAI,KAAK+N,EAAM5M,CAAC,GAAGxB,EAAI,CAAC,CAAC,CAAC;AACtD;AAAA,MACF,KAAK;AACH,QAAIuO,EAAS/M,CAAC,KAAGiL,EAAM,KAAKpM,EAAI,KAAK+N,EAAM5M,CAAC,GAAGxB,EAAI,CAAC,CAAC,CAAC;AACtD;AAAA,MACF,KAAK;AACH,QAAIuO,EAAS/M,CAAC,KAAGiL,EAAM,KAAKpM,EAAI,KAAKgO,EAAS7M,CAAC,GAAGxB,EAAI,CAAC,CAAC,CAAC;AACzD;AAAA,MACF,KAAK,OAAO;AAKV,YAAI,CAACuO,EAAS/M,CAAC,EAAG;AAClB,cAAMkN,IAAUP;AAAA,UACdH,EAAQ;AAAA,YAAI,CAAC,EAAE,OAAA5I,GAAO,MAAAtC,EAAA,MACpBjC;AAAA,cACE;AAAA,cACA2M;AAAA,gBACE5D;AAAA,gBACA+B;AAAA,gBACAvG;AAAA,gBACA,CAACyC,MAAM;AACL,wBAAMoE,IAAOiC,EAAYpL,GAAM+E,GAAGrG,CAAC;AACnC,sBAAIyK,MAAS;AACb,2BAAOA,IACHxL,GAAII,GAAG,YAAYoL,GAAMjM,EAAI,EAAK,CAAC,CAAC,IACpCA,EAAI,EAAK;AAAA,gBACf;AAAA,gBACA,MAAMA,EAAI,CAAC;AAAA,cAAA;AAAA,YACb;AAAA,UACF;AAAA,QACF;AAEF,QAAAyM,EAAM,KAAKpM,EAAI,KAAKqO,GAAS1O,EAAI,CAAC,CAAC,CAAC;AACpC;AAAA,MACF;AAAA,MACA,KAAK;AACH,QAAAyM,EAAM,KAAKkC,GAAa/E,GAAK/G,GAAKwL,EAAS,MAAS,GAAG7M,CAAC,CAAC;AACzD;AAAA,MACF,KAAK;AACH,QAAKoM,KAAUnB,EAAM,KAAKmC,GAAmBhF,GAAK+B,GAAU9I,GAAKrB,CAAC,CAAC;AACnE;AAAA,IAAA;AAAA,EAEN;AACA,SAAOT,GAAI,GAAG0L,CAAK;AACrB;AAEA,SAASkC,GACP/E,GACA/G,GACAgM,GACA1I,GACkB;AAClB,QAAMsG,IAAgB,CAAA;AACtB,aAAW,CAACnM,GAAIoC,CAAC,KAAK,OAAO,QAAQyD,CAAG,GAAG;AACzC,QAAIzD,KAAM,KAAyB;AACnC,UAAMuK,IAAWxB,GAAUnL,CAAE;AAC7B,QAAK2M,GACL;AAAA,UAAI,CAAC,OAAO,UAAUvK,CAAC,KAAMA,IAAe;AAC1C,cAAMwG;AAAA,UACJ;AAAA,UACA,GAAGrG,EAAI,IAAI,UAAUvC,CAAE;AAAA,QAAA;AAG3B,MAAAmM,EAAM,KAAKpM,EAAI4M,GAAU4B,GAAO3E,EAAKN,GAAKlH,CAAC,CAAC,CAAC;AAAA;AAAA,EAC/C;AACA,SAAO3B,GAAI,GAAG0L,CAAK;AACrB;AAMA,SAASJ,GACPzC,GACA+B,GACA9I,GACA5C,GACkB;AAClB,QAAME,IAASyJ,EAAI,MAAM,MAAM,IAAI/G,EAAI,MAAM,GACvCD,IAAQgH,EAAI,MAAM,uBAAuB,IAAI/G,EAAI,UAAW;AAClE,EAAAoL,GAAoBrE,GAAKzJ,GAAQ,MAAM,GACvCyJ,EAAI,MAAM,OAAO,IAAIzJ,EAAO,OAAO,CAAC,CAAE,GACtCyJ,EAAI,MAAM,cAAc,IAAI/G,EAAI,IAAI;AACpC,QAAMiM,IAAY,CAACtN,MAAa,CAACqG,GAAWhB,MAC1C9F;AAAA,IACE2K,GAAiB9B,GAAKzJ,GAAQ0H,GAAGrG,EAAE,IAA4B;AAAA,IAC/D8K,GAAkB1C,GAAKhH,GAAOiE,GAAGrF,EAAE,IAA4B;AAAA,EAAA,GAE7D4M,IAAQ,CAAC5M,GAAUuN,MACvBlO;AAAA,IACE;AAAA,IACA2M;AAAA,MACE5D;AAAA,MACA+B;AAAA,MACA9I;AAAA,MACA,CAACgF,GAAGhB,MAAM;AACR,cAAM,IAAIiI,EAAUtN,CAAC,EAAEqG,GAAGhB,CAAC;AAC3B,eAAOkI,IAAStO,GAAII,GAAG,YAAY,GAAGb,EAAI,EAAK,CAAC,CAAC,IAAI;AAAA,MACvD;AAAA,MACA,MAAMA,EAAI,CAAC;AAAA,IAAA;AAAA,EACb,GAEEyM,IAAgB,CAAA;AACtB,aAAW,CAACgC,GAAY1L,CAAK,KAAK,OAAO,QAAQ9C,CAAK,GAAG;AACvD,QAAI8C,KAAU,KAA6B;AAC3C,UAAMvB,IAAIuB;AACV,QAAKiM,GAAapF,GAAKzJ,GAAQyC,GAAOpB,CAAC;AAEvC,cADIA,EAAE,QAAW,QAAMyN,GAAmBrF,GAAK/G,CAAG,GAC1C4L,GAAA;AAAA,QACN,KAAK;AACH,UAAAhC,EAAM,KAAKpM,EAAI,KAAK+N,EAAM5M,GAAG,EAAK,GAAGxB,EAAI,CAAC,CAAC,CAAC;AAC5C;AAAA,QACF,KAAK;AACH,UAAAyM,EAAM,KAAKpM,EAAI,KAAK+N,EAAM5M,GAAG,EAAK,GAAGxB,EAAI,CAAC,CAAC,CAAC;AAC5C;AAAA,QACF,KAAK;AACH,UAAAyM,EAAM,KAAKpM,EAAI,KAAK+N,EAAM5M,GAAG,EAAK,GAAGxB,EAAI,CAAC,CAAC,CAAC;AAC5C;AAAA,QACF,KAAK;AACH,UAAAyM,EAAM,KAAKpM,EAAI,KAAK+N,EAAM5M,GAAG,EAAI,GAAGxB,EAAI,CAAC,CAAC,CAAC;AAC3C;AAAA,MAAA;AAAA,EAEN;AACA,SAAOe,GAAI,GAAG0L,CAAK;AACrB;AAEA,SAASuC,GACPpF,GACAzJ,GACAyC,GACApB,GACS;AACT,QAAMgN,IAAQ,EAAE,GAAG5E,GAAK,QAAQ,CAAA,GAAI,MAAM,IAAI,IAAIA,EAAI,IAAI,EAAA;AAC1D,SACE7I;AAAA,IACE2K,GAAiB8C,GAAOrO,GAAQ,KAAKqB,EAAE,IAA4B;AAAA,IACnE8K,GAAkBkC,GAAO5L,GAAO,KAAKpB,EAAE,IAA4B;AAAA,EAAA,MAC/D;AAEV;AAEA,MAAM0N,yBAAqB,IAAmB;AAAA,EAC5C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAMD,SAASN,GACPhF,GACA+B,GACA9I,GACA5C,GACkB;AAClB,QAAME,IAASyJ,EAAI,MAAM,MAAM,IAAI/G,EAAI,MAAM,GACvCD,IAAQC,EAAI,aACd+G,EAAI,MAAM,uBAAuB,IAAI/G,EAAI,UAAU,IACnD,QACE4J,IAAiC,CAAA,GACjC0C,IAAO,CACXlN,GACAuK,GACA4C,MACG;AACH,eAAW,CAACC,GAAWC,CAAI,KAAK,OAAO,QAAQrN,KAAS,CAAA,CAAE,GAAG;AAC3D,YAAMmD,IAAQoH,EAAO6C,CAAS;AAC9B,UAAI,GAACjK,KAASkK,MAAS,QAAQA,MAAS,SACxC;AAAA,YAAIF,EAAQ,CAAA7C,GAAoB3C,GAAKhH,EAAO,MAAMwC,GAAO,MAAM;AAAA,aAC1D;AACH,UAAA0G,GAAyBlC,GAAKzJ,EAAO,MAAMiF,CAAK;AAGhD,gBAAMoJ,IAAQ,EAAE,GAAG5E,GAAK,QAAQ,CAAA,GAAI,MAAM,IAAI,IAAIA,EAAI,IAAI,EAAA;AAC1D,cAAIoC,GAAcwC,GAAOrO,GAAQiF,GAAO,SAAS,MAAM;AACrD,kBAAM8D;AAAA,cACJ;AAAA,cACA,oBAAoB/I,EAAO,IAAI,IAAIiF,EAAM,IAAI;AAAA,YAAA;AAGjD,cAAI,CAACmK,GAAY3F,GAAKzJ,GAAQiF,CAAK;AACjC,kBAAM8D;AAAA,cACJ;AAAA,cACA,oBAAoB/I,EAAO,IAAI,IAAIiF,EAAM,IAAI;AAAA,YAAA;AAAA,QAGnD;AACA,mBAAW,CAACoK,GAAKC,CAAM,KAAK,OAAO,QAAQH,CAAa,GAAG;AAEzD,cADIG,KAAW,QACX,CAACP,GAAe,IAAIM,CAAoB,EAAG;AAC/C,gBAAMvE,IAASuC;AAAA,YACb5D;AAAA,YACA+B;AAAA,YACA9I;AAAA,YACA;;YACA,CAACgF,GAAGhB,MAAM3G,GAAKL,EAAEuP,IAASvI,IAAIgB,CAAC,GAAGzC,EAAM,QAAQ;AAAA,UAAA,GAE5CsK,IAAY3E,GAAcnB,GAAK4F,GAAsBvE,GAAQ;AAAA,YACjE,UAAU7F,EAAM,SAAS;AAAA,UAAA,CAC1B;AACD,UAAAqH,EAAM,KAAKP,GAAgBtC,GAAK8F,GAAWD,CAAe,CAAC;AAAA,QAC7D;AAAA;AAAA,IACF;AAAA,EACF;AAaA,MAZAN;AAAA,IACElP,EAAM;AAAA,IACN,CAACyC,MAAM;AACL,YAAMyC,IAAIhF,EAAO,OAAO,IAAIuC,CAAC;AAC7B,aAAOyC,GAAG,SAAS,WAAWA,IAAI;AAAA,IACpC;AAAA,IACA;AAAA,EAAA,GAEEvC,MACE3C,EAAM,QAAW,QAAMgP,GAAmBrF,GAAK/G,CAAG,GACtDsM,EAAKlP,EAAM,MAA8B,CAACyC,MAAME,EAAM,OAAO,IAAIF,CAAC,GAAG,EAAI,IAEvEzC,EAAM,OAAU;AAClB,UAAM4O,IAAQvD;AAAA,MACZ1B;AAAA,MACA4D;AAAA,QACE5D;AAAA,QACA+B;AAAA,QACA9I;AAAA,QACA;;QACA,CAACgF,MAAM3H,GAAKL,EAAEgI,CAAC,GAAG1H,EAAO,IAAI,QAAQ;AAAA,MAAA;AAAA,IACvC;AAEF,IAAAsM,EAAM,KAAKkC,GAAa/E,GAAK/G,GAAKgM,GAAO5O,EAAM,KAAiB,CAAC;AAAA,EACnE;AACA,SAAOc,GAAI,GAAG0L,CAAK;AACrB;AC3nBO,SAASX,GACdlC,GACArE,GACAH,GAKA9E,IAAoB,QACd;AACN,MAAI,EAAAsJ,EAAI,UAAU,CAACxE,EAAM,gBAAgB,IAAI9E,CAAE,OAC3C,CAACsJ,EAAI,OAAO,CAAC+F,GAAc/F,GAAKxE,EAAM,iBAAiB;AACzD,UAAM8D;AAAA,MACJ;AAAA,MACA,GAAG3D,CAAK,IAAIH,EAAM,IAAI;AAAA,IAAA;AAG5B;AAGA,SAASuK,GACP/F,GACA3H,GACS;AACT,MAAI,CAACA,EAAO,QAAO;AACnB,MAAI;AACF,WAAO2N,GAAgBhG,GAAK,QAAW,IAAI,EAAE,KAAK3H,EAAA,CAAO,MAAM;AAAA,EACjE,SAASyD,GAAK;AACZ,QAAIA,aAAemK,GAAc,QAAO;AACxC,UAAMnK;AAAA,EACR;AACF;AAGO,SAASuI,GACdrE,GACA9G,GACAxC,GACM;AACN,MACE,CAACsJ,EAAI,UACL9G,EAAK,gBAAgB,IAAIxC,CAAE,MAC1B,CAACsJ,EAAI,OAAO,CAAC+F,GAAc/F,GAAK9G,EAAK,iBAAiB;AAEvD,UAAMoG;AAAA,MACJ;AAAA,MACA,GAAG5I,EAAG,YAAA,CAAa,OAAOwC,EAAK,IAAI;AAAA,IAAA;AAGzC;AAOO,SAAS4K,GACd9D,GACA9G,GACA6I,GACArL,GACkB;AAClB,MAAIsJ,EAAI,UAAUkG,GAASlG,GAAK9G,CAAI,EAAG;AACvC,QAAM+F,KAAS/F,EAAK,eAAe,UAAU,CAAA,GAAI;AAAA,IAAO,CAAC,MACvD,EAAE,WAAW,IAAIxC,CAAE;AAAA,EAAA;AAErB,MAAIuI,EAAM,WAAW,EAAG;AACxB,QAAMkH,IAASlH,EAAM;AAAA,IAAI,CAAC,MACxB,EAAE,yBAAyB,CAACe,EAAI,MAC5B,KACAoG,GAAYpG,GAAK9G,GAAM6I,GAAU,EAAE,KAAK;AAAA,EAAA;AAE9C,SAAOsE,GAAOC,GAAOH,CAAM,CAAC;AAC9B;AAOO,SAASI,GACdvG,GACA9G,GACA6I,GACArL,GACA8P,GACkB;AAClB,SAAOC;AAAA,IACLzG;AAAA,IACA9G;AAAA,IACA6I;AAAA,IACArL;AAAA,KACCwC,EAAK,eAAe,YAAY,CAAA,GAAI;AAAA,MACnC,CAAC+D,MAAMA,EAAE,WAAW,IAAIvG,CAAE,KAAKuG,EAAE,KAAK,IAAIuJ,CAAI;AAAA,IAAA;AAAA,EAChD;AAEJ;AAMO,SAASpE,GACdpC,GACA9G,GACAsC,GACAuG,GACArL,GACA8P,IAA2B,UACT;AAClB,SAAOC;AAAA,IACLzG;AAAA,IACA9G;AAAA,IACA6I;AAAA,IACArL;AAAA,KACC8E,EAAM,eAAe,YAAY,CAAA,GAAI;AAAA,MACpC,CAAC,MAAM,EAAE,WAAW,IAAI9E,CAAE,KAAK,EAAE,KAAK,IAAI8P,CAAI;AAAA,IAAA;AAAA,EAChD;AAEJ;AAUO,SAASE,GACd1G,GACA9G,GACAsC,GAKAuG,GACmE;AACnE,MAAI/B,EAAI,OAAQ;AAChB,MACExE,EAAM,gBAAgB,IAAI,MAAM,MAC/B,CAACwE,EAAI,OAAO,CAAC+F,GAAc/F,GAAKxE,EAAM,iBAAiB;AAExD,WAAO,EAAE,MAAMpF,EAAI,EAAK,GAAG,MAAM,kBAAA;AAEnC,QAAM6I,KAASzD,EAAM,eAAe,YAAY,CAAA,GAAI;AAAA,IAClD,CAAC,MAAM,EAAE,WAAW,IAAI,MAAM,KAAK,EAAE,KAAK,IAAI,QAAQ;AAAA,EAAA;AAExD,MAAIyD,EAAM,WAAW,KAAKiH,GAASlG,GAAK9G,CAAI,EAAG;AAC/C,MAAI+F,EAAM,MAAM,CAAC,MAAM,EAAE,qBAAqB,KAAK,CAACe,EAAI;AACtD,WAAO,EAAE,MAAM5J,EAAI,EAAK,GAAG,MAAM,kBAAA;AAEnC,QAAM+P,IAASG;AAAA,IACbrH,EAAM;AAAA,MAAI,CAAC,MACT,EAAE,yBAAyB,CAACe,EAAI,MAC5B,KACAoG,GAAYpG,GAAK9G,GAAM6I,GAAU,EAAE,KAAK;AAAA,IAAA;AAAA,EAC9C;AAEF,MAAIoE,MAAW;AACf,WAAO,EAAE,MAAMA,MAAW,KAAQ/P,EAAI,EAAK,IAAI+P,GAAQ,MAAM,YAAA;AAC/D;AAEA,SAASM,GACPzG,GACA9G,GACA6I,GACArL,GACAuI,GACkB;AAClB,MAAIe,EAAI,UAAUf,EAAM,WAAW,KAAKiH,GAASlG,GAAK9G,CAAI;AACxD;AAEF,MAAI+F,EAAM,MAAM,CAAC,MAAM,EAAE,qBAAqB,KAAK,CAACe,EAAI;AACtD,UAAMV;AAAA,MACJ;AAAA,MACA,GAAG5I,EAAG,YAAA,CAAa,OAAOwC,EAAK,IAAI;AAAA,IAAA;AAGvC,QAAMiN,IAASG;AAAA,IACbrH,EAAM;AAAA,MAAI,CAAC,MACT,EAAE,yBAAyB,CAACe,EAAI,MAC5B,KACAoG,GAAYpG,GAAK9G,GAAM6I,GAAU,EAAE,KAAK;AAAA,IAAA;AAAA,EAC9C;AAEF,MAAIoE,MAAW,GAAO,OAAMQ,GAAUzN,GAAMxC,CAAE;AAC9C,SAAO2P,GAAOF,CAAM;AACtB;AASO,SAASS,GACd5G,GACAxE,GAKA9E,GAC6C;AAC7C,MAAIsJ,EAAI,OAAQ,QAAO;AACvB,MACExE,EAAM,gBAAgB,IAAI9E,CAAE,MAC3B,CAACsJ,EAAI,OAAO,CAAC+F,GAAc/F,GAAKxE,EAAM,iBAAiB;AAExD,WAAO;AAET,QAAMyD,KAASzD,EAAM,eAAe,YAAY,CAAA,GAAI;AAAA,IAAO,CAACyB,MAC1DA,EAAE,WAAW,IAAIvG,CAAE;AAAA,EAAA;AAErB,SAAIuI,EAAM,WAAW,KAAKiH,GAASlG,GAAK,MAAS,IAAU,YACvDf,EAAM,MAAM,CAAChC,MAAMA,EAAE,qBAAqB,KAAK,CAAC+C,EAAI,MAC/C,oBAEOf,EAAM;AAAA,IACpB,CAAChC,MACC,EAAEA,EAAE,yBAAyB,CAAC+C,EAAI,QAClCoG,GAAYpG,GAAK,QAAW,IAAI/C,EAAE,KAAK,MAAM;AAAA,EAAA,IAEhC,YAAY;AAC/B;AAGO,SAAS0F,GACd3C,GACA6G,GACArL,GACA9E,GACM;AACN,QAAMoQ,IAASF,GAAe5G,GAAKxE,GAAO9E,CAAE;AAC5C,MAAIoQ,MAAW;AACb,UAAMxH;AAAA,MACJ;AAAA,MACA,GAAGuH,CAAI,IAAIrL,EAAM,IAAI;AAAA,IAAA;AAGzB,MAAIsL,MAAW;AACb,UAAMxH;AAAA,MACJ;AAAA,MACA,kBAAkB5I,EAAG,YAAA,CAAa,IAAImQ,CAAI,IAAIrL,EAAM,IAAI;AAAA,IAAA;AAG9D;AAEO,SAASmL,GAAUzN,GAAgBxC,GAAmB;AAC3D,SAAO4I;AAAA,IACL;AAAA,IACA,kBAAkB5I,EAAG,YAAA,CAAa,SAASwC,EAAK,IAAI;AAAA,EAAA;AAExD;AAOO,SAASgN,GACdlG,GACA9G,GACS;AACT,QAAM6N,IAAS/G,EAAI,MAAM;AACzB,MAAI,CAAC+G,KAAU,CAAC/G,EAAI,OAAO9G,GAAM,eAAe,WAAW;AACzD,WAAO;AAET,MAAI;AACF,WAAO8M,GAAgBhG,GAAK,QAAW,IAAI+G,CAAM,MAAM;AAAA,EACzD,SAASjL,GAAK;AACZ,QAAIA,aAAemK,GAAc,QAAO;AACxC,UAAMnK;AAAA,EACR;AACF;AAQO,SAASyG,GACdvC,GACA9G,GACAsC,GACAuG,GACAiF,GACM;AACN,QAAMC,IAAQzL,EAAM,eAAe;AACnC,MAAI,CAACyL,GAAO,UAAUjH,EAAI,UAAUkG,GAASlG,GAAK9G,CAAI,EAAG,QAAO8N;AAChE,MAAI3Q,IAAQ2Q;AAEZ,aAAW9O,KAAK,CAAC,GAAG+O,CAAK,EAAE,WAAW;AACpC,UAAMC,IAASd,GAAYpG,GAAK9G,GAAM6I,GAAU7J,EAAE,MAAM;AACxD,QAAIgP,MAAW,GAAM;AACrB,UAAMC,IAAa7G,EAAKN,GAAK9H,EAAE,KAAK;AACpC,IAAA7B,IACE6Q,MAAW,KACPC,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAMlQ,GAAG,YAAYiQ,GAAQ9Q,EAAI,EAAK,CAAC;AAAA,MACvC,MAAMC;AAAA,MACN,MAAM8Q;AAAAA,IAAA;AAAA,EAEhB;AACA,SAAO9Q;AACT;AAQO,SAASsP,GACd3F,GACA9G,GACAsC,GACS;AACT,QAAMyL,IAAQzL,EAAM,eAAe;AACnC,MAAI,CAACyL,GAAO,UAAUjH,EAAI,UAAUkG,GAASlG,GAAK9G,CAAI,EAAG,QAAO;AAChE,QAAM0L,IAAQ,EAAE,GAAG5E,GAAK,QAAQ,CAAA,GAAI,MAAM,IAAI,IAAIA,EAAI,IAAI,EAAA;AAC1D,SAAOiH,EAAM;AAAA,IACX,CAAC/O,MAAMkO,GAAYxB,GAAO1L,GAAM,SAAShB,EAAE,MAAM,MAAM;AAAA,EAAA;AAE3D;AASO,SAASkP,GACdpH,GACA9G,GACA1C,GAKA6Q,GACM;AACN,QAAMC,IAAQpO,EAAK,IAAI,UACjBqO,IAAUvH,EAAI,MAAM;AAC1B,MAAI,CAACsH,KAAS,CAACC,KAAWvH,EAAI,UAAUkG,GAASlG,GAAK9G,CAAI,EAAG;AAC7D,MAAI,CAAC8G,EAAI;AACP,UAAMV;AAAA,MACJ;AAAA,MACA,aAAapG,EAAK,IAAI;AAAA,IAAA;AAG1B,QAAMsO,IAAaxH,EAAI,MAAM,MAAM,IAAIuH,EAAQ,IAAI,GAG7C5L,IACJ6L,KAAcD,EAAQ,UAAUC,EAAW,IAAI,OAC3CH,IACAI,GAAMzH,GAAKuH,EAAQ,KAAK,GACxBG,IACJ,OAAO/L,KAAU,YAAY,OAAOA,KAAU,WAC1C,GAAGA,CAAK,GAAG2L,EAAM,SAAS,KAC1B;AACN,MACEI,MAAW,UACX,OAAO/L,CAAK,EAAE,SAAS2L,EAAM,SAAS,KACtC,OAAO9Q,KAAQ,YACf,CAACA,EAAI,WAAWkR,CAAM,KACtBlR,EAAI,WAAWkR,EAAO;AAEtB,UAAMf,GAAUzN,GAAM,QAAQ;AAElC;AAGA,MAAM+M,WAAqB,MAAM;AAAC;AAElC,SAASG,GACPpG,GACA9G,GACA6I,GACA1J,GACAsP,GACQ;AACR,MAAI;AACF,WAAO3B,GAAgBhG,GAAK9G,GAAM6I,GAAU1J,GAAO,IAAOsP,CAAI;AAAA,EAChE,SAAS7L,GAAK;AAGZ,QAAIA,aAAemK,GAAc,QAAO;AACxC,UAAMnK;AAAA,EACR;AACF;AAQA,SAASkK,GACPhG,GACA9G,GACA6I,GACA1J,GACAuP,IAAW,IACXD,GACQ;AACR,QAAME,IAAQ,CAACjQ,GAAUZ,IAAU4Q,MAAqB;AACtD,QAAI5Q,UAAgBgP,GAAgBhG,GAAK9G,GAAM6I,GAAUnK,GAAG,IAAM+P,CAAI;AACtE,QAAI;AACF,aAAO3B,GAAgBhG,GAAK9G,GAAM6I,GAAUnK,GAAG,IAAO+P,CAAI;AAAA,IAC5D,SAAS7L,GAAK;AACZ,UAAIA,aAAemK,GAAc,QAAO;AACxC,YAAMnK;AAAA,IACR;AAAA,EACF,GACM+G,IAAkB,CAAA;AACxB,aAAW,CAACrM,GAAKH,CAAK,KAAK,OAAO,QAAQgC,CAAK;AAC7C,QAAIhC,KAAU;AACd,UAAIG,MAAQ;AACV,QAAAqM,EAAM,KAAKiF,GAASzR,EAAkB,IAAI,CAACuB,MAAMiQ,EAAMjQ,CAAC,CAAC,CAAC,CAAC;AAAA,eAClDpB,MAAQ;AACjB,QAAAqM,EAAM,KAAKyD,GAAQjQ,EAAkB,IAAI,CAACuB,MAAMiQ,EAAMjQ,CAAC,CAAC,CAAC,CAAC;AAAA,eACjDpB,MAAQ,OAAO;AACxB,cAAM2C,IAAQ6M;AAAA,UACZhG;AAAA,UACA9G;AAAA,UACA6I;AAAA,UACA1L;AAAA,UACA;AAAA,UACAsR;AAAA,QAAA;AAEF,QAAA9E,EAAM,KAAK,OAAO1J,KAAU,YAAY,CAACA,IAAQtC,GAAIsC,CAAK,CAAC;AAAA,MAC7D,WAAW3C,MAAQ;AACjB,QAAAqM,EAAM,KAAKkF,GAAW/H,GAAK3J,CAAK,CAAC;AAAA,eACxBsR,MAASnR,MAAQ,YAAYA,MAAQ,WAAW;AACzD,cAAM+D,IAAMoN,EAAKnR,CAAG;AACpB,QAAAqM,EAAM;AAAA,UACJmF;AAAA,YAAOhI;AAAA,YAAK3J;AAAA,YAAO,CAACuB,MAClBkK,GAAiB9B,GAAKzF,EAAI,MAAMA,EAAI,UAAU3C,CAAC;AAAA,UAAA;AAAA,QACjD;AAAA,MAEJ,WAAW+P,KAAQnR,MAAQ,QAAQ;AACjC,cAAMyR,IAAON,EAAK;AAClB,QAAA9E,EAAM;AAAA,UACJoF,IACID;AAAA,YAAOhI;AAAA,YAAK3J;AAAA,YAAO,CAACuB,MAClB8K,GAAkB1C,GAAKiI,EAAK,OAAOA,EAAK,UAAUrQ,CAAC;AAAA,UAAA,IAErD;AAAA,QAAA;AAAA,MAER,WAAWpB,MAAQ;AACjB,QAAAqM,EAAM,KAAKqF,GAAYlI,GAAK3J,CAAc,CAAC;AAAA,eAClCG,MAAQ,UAAU0C,GAAM;AACjC,cAAMgH,IAAQiH,GAAW9Q,GAAO2J,CAAG;AACnC,YAAI,CAACE,EAAM,GAAI,OAAM,IAAI+F,GAAA;AACzB,cAAMkC,IAAYnI,EAAI;AACtB,QAAAA,EAAI,SAAS;AACb,YAAI;AACF,gBAAMqC,IAAOP;AAAA,YACX9B;AAAA,YACA9G;AAAA,YACA6I;AAAA,YACA7B,EAAM;AAAA,UAAA;AAIR,UAAA2C,EAAM,KAAKR,KAAQ,EAAK;AAAA,QAC1B,UAAA;AACE,UAAArC,EAAI,SAASmI;AAAA,QACf;AAAA,MACF;AAAA;AAEF,SAAOL,GAAQjF,CAAK;AACtB;AAMA,SAASmF,GACPhI,GACA3J,GACA0M,GACQ;AACR,QAAM7C,IAAQiH,GAAW9Q,GAAO2J,CAAG;AACnC,MAAI,CAACE,EAAM,GAAI,OAAM,IAAI+F,GAAA;AACzB,QAAMkC,IAAYnI,EAAI;AACtB,EAAAA,EAAI,SAAS;AACb,MAAI;AACF,WAAO+C,EAAQ7C,EAAM,KAAc,KAAK;AAAA,EAC1C,UAAA;AACE,IAAAF,EAAI,SAASmI;AAAA,EACf;AACF;AAqBO,SAASC,GACdpI,GACA/G,GACAvC,GACA2R,GACAC,IAAyB,SACC;AAC1B,MAAItI,EAAI,OAAQ;AAChB,QAAM6C,IAAkB,CAAA;AACxB,aAAW,EAAE,OAAArH,GAAO,SAAA+M,EAAA,KAAaC,GAAuBxI,GAAK/G,CAAG,GAAG;AACjE,UAAMgG,KAASzD,EAAM,eAAe,YAAY,CAAA,GAAI;AAAA,MAAO,CAACyB,MAC1DA,EAAE,WAAW,IAAIvG,CAAE;AAAA,IAAA;AAGrB,QADIuI,EAAM,WAAW,KACjBiH,GAASlG,GAAKA,EAAI,MAAM,MAAM,IAAIxE,EAAM,KAAK,CAAC,EAAG;AACrD,UAAMW,IAAQ,GAAGzF,EAAG,YAAA,EAAc,QAAQ,KAAK,GAAG,CAAC,IAAI8E,EAAM,KAAK,IAAIA,EAAM,IAAI;AAChF,QAAIyD,EAAM,MAAM,CAAChC,MAAMA,EAAE,qBAAqB,KAAK,CAAC+C,EAAI,KAAK;AAC3D,UAAIsI,MAAS,OAAQ,QAAO;AAC5B,YAAMhJ;AAAA,QACJ;AAAA,QACA,GAAGnD,CAAK;AAAA,MAAA;AAAA,IAEZ;AACA,UAAMuC,IAASsB,EAAI,MAAM,MAAM,IAAIxE,EAAM,KAAK,GACxCjF,IAASyJ,EAAI,MAAM,MAAM,IAAIxE,EAAM,MAAM,GACzCxC,IAAQwC,EAAM,aAChBwE,EAAI,MAAM,uBAAuB,IAAIxE,EAAM,UAAU,IACrD,QACEmM,IAAiB;AAAA,MACrB,QAAQ,EAAE,MAAMjJ,GAAQ,UAAU6J,IAAUF,EAAK,SAASA,EAAK,MAAA;AAAA,MAC/D,QAAQ,EAAE,MAAM9R,GAAQ,UAAUgS,IAAUF,EAAK,QAAQA,EAAK,OAAA;AAAA,MAC9D,MAAMrP,IAAQ,EAAE,OAAAA,GAAO,UAAUqP,EAAK,QAAQ;AAAA,IAAA,GAE1ClC,IAASG;AAAA,MACbrH,EAAM;AAAA,QAAI,CAAChC,MACTA,EAAE,yBAAyB,CAAC+C,EAAI,MAC5B,KACAoG,GAAYpG,GAAK,QAAW,IAAI/C,EAAE,OAAO0K,CAAI;AAAA,MAAA;AAAA,IACnD;AAEF,QAAIxB,MAAW,MAASmC,MAAS;AAC/B,YAAMhJ,EAAa,aAAa,kBAAkBnD,CAAK,EAAE;AAE3D,IAAA0G,EAAM,KAAKsD,CAAM;AAAA,EACnB;AACA,QAAMsC,IAAMX,GAAQjF,CAAK;AACzB,SAAO4F,MAAQ,KAAO,SAAYA,MAAQ,KAAQ,KAAQA;AAC5D;AAGO,SAASC,GAAgBzP,GAA+B;AAC7D,SAAOqG;AAAA,IACL;AAAA,IACA,GAAGrG,EAAI,KAAK,IAAIA,EAAI,IAAI;AAAA,EAAA;AAE5B;AAOO,SAASoM,GACdrF,GACA/G,GACM;AACN,MAAI+G,EAAI,OAAQ;AAChB,QAAM4E,IAAQ,EAAE,GAAG5E,GAAK,QAAQ,CAAA,GAAI,MAAM,IAAI,IAAIA,EAAI,IAAI,EAAA;AAQ1D,MAPaoI;AAAA,IACXxD;AAAA,IACA3L;AAAA,IACA;AAAA,IACA,EAAE,OAAO,KAAK,QAAQ,KAAK,KAAK,IAAA;AAAA,IAChC;AAAA,EAAA,MAEW,OAAW,OAAMyP,GAAgBzP,CAAG;AACnD;AAGO,SAASuP,GACdxI,GACA/G,GACuD;AACvD,QAAMoB,IAA6D,CAAA,GAC7DsO,IAAW,CAACpN,MAChBA,EAAE,eAAe,SAAS;AAAA,IAAK,CAAC,MAC9B,CAAC,GAAG,EAAE,UAAU,EAAE;AAAA,MAAK,CAAC7E,MACtB,CAAC,WAAW,cAAc,eAAe,WAAW,EAAE,SAASA,CAAE;AAAA,IAAA;AAAA,EACnE,KACG;AACP,EAAIiS,EAAS1P,CAAG,KAAGoB,EAAI,KAAK,EAAE,OAAOpB,GAAK,SAAS,IAAO;AAC1D,QAAM1C,IAASyJ,EAAI,MAAM,MAAM,IAAI/G,EAAI,MAAM;AAC7C,aAAWsC,KAAKhF,GAAQ,OAAO,OAAA,KAAY,CAAA;AACzC,IACEgF,EAAE,SAAS,kBACXA,MAAMtC,KACNsC,EAAE,SAAStC,EAAI,QACfsC,EAAE,WAAWtC,EAAI,SACjBsC,EAAE,cAActC,EAAI,aACpB0P,EAASpN,CAAC,KAEVlB,EAAI,KAAK,EAAE,OAAOkB,GAAG,SAAS,IAAM;AAGxC,SAAOlB;AACT;AASA,SAAS0N,GAAW/H,GAAqB3H,GAAwB;AAC/D,QAAMkP,IAAUvH,EAAI,MAAM,QACpB9G,IAAOqO,KAAWvH,EAAI,MAAM,MAAM,IAAIuH,EAAQ,IAAI;AAExD,MAAI,CAACA,KAAW,CAACrO,EAAM,QAAO;AAC9B,QAAMrB,IAAKsP,GAAW,QAAQI,EAAQ,KAAK,IAAIvH,CAAG,GAC5CE,IAAQiH,GAAW9O,GAAO2H,CAAG;AACnC,MAAI,CAACnI,EAAG,MAAM,CAACqI,EAAM,GAAI,OAAM,IAAI+F,GAAA;AACnC,QAAMzK,IAAQtC,EAAK,OAAO,IAAIqO,EAAQ,KAAK,GACrC1K,IAAWrB,GAAO,SAAS,WAAWA,EAAM,WAAW+L,EAAQ,OAC/DtJ,IAAIsC,GAASP,GAAK,QAAQ,GAC1BmI,IAAYnI,EAAI;AACtB,EAAAA,EAAI,SAAS;AACb,MAAI;AACF,UAAMqC,IAAOP,GAAiB9B,GAAK9G,GAAM+E,GAAGiC,EAAM,KAAc;AAChE,WAAOzJ;AAAA,MACL;AAAA,MACAQ,GAAG,QAAQ;AAAA,QACT,MAAM;AAAA,QACN,SAAS;AAAA,UACP,OAAO;AAAA,YACL,UAAUgH;AAAA,YACV,QAAQ,CAAC/E,EAAK,OAAO,CAAC,CAAE;AAAA,YACxB,YAAY,CAAC,EAAE,KAAK2D,GAAU,OAAOyD,EAAKN,GAAKnI,EAAG,KAAK,EAAA,CAAG;AAAA,UAAA;AAAA,UAE5D,MAAM,CAAA;AAAA,QAAC;AAAA,QAET,OAAOwK;AAAA,QACP,YAAYjM,EAAI,CAAC;AAAA,MAAA,CAClB;AAAA,MACDA,EAAI,CAAC;AAAA,IAAA;AAAA,EAET,UAAA;AACE,IAAA4J,EAAI,SAASmI;AAAA,EACf;AACF;AAEA,SAASL,GAAQjF,GAAyB;AACxC,MAAIA,EAAM,KAAK,CAACzK,MAAMA,MAAM,EAAK,EAAG,QAAO;AAC3C,QAAMwQ,IAAQ/F,EAAM,OAAO,CAACzK,MAAiB,OAAOA,KAAM,SAAS;AACnE,SAAOjB,GAAI,GAAGyR,CAAK,KAAK;AAC1B;AAEA,SAAStC,GAAOzD,GAAyB;AACvC,MAAIA,EAAM,KAAK,CAACzK,MAAMA,MAAM,EAAI,EAAG,QAAO;AAC1C,QAAMwQ,IAAQ/F,EAAM,OAAO,CAACzK,MAAiB,OAAOA,KAAM,SAAS;AACnE,SAAOd,GAAG,GAAGsR,CAAK,KAAK;AACzB;AAEA,SAASvC,GAAO9K,GAA6B;AAC3C,MAAIA,MAAM;AACV,WAAIA,MAAM,KAAcnF,EAAI,EAAK,IAC1BmF;AACT;AAUO,SAASkM,GACdzH,GACAC,GACAC,IAAQ,IACC;AACT,QAAM,CAAC2I,GAAM,GAAG1E,CAAI,IAAIlE,EAAK,MAAM,GAAG,GAEhC6I,IAAO,CADE9I,EAAI,MAAM,KAAK,IAAI6I,CAAK,KAAKA,GACtB,GAAG1E,CAAI,EAAE,KAAK,GAAG,GACjC9N,IAAQ0S,GAAW/I,EAAI,KAAK8I,CAAI;AACtC,SAAA/I,GAAUC,GAAK8I,GAAMzS,GAAO6J,CAAK,GAC1B7J;AACT;AAMO,SAAS0S,GAAWC,GAAe/I,GAAuB;AAC/D,MAAIgJ,IAAeD;AACnB,aAAWE,KAAQjJ,EAAK,MAAM,GAAG,GAAG;AAClC,QAAIgJ,MAAQ,QAAQ,OAAOA,KAAQ,YAAY,CAAC,OAAO,OAAOA,GAAKC,CAAI;AACrE;AAEF,IAAAD,IAAOA,EAAgCC,CAAI;AAAA,EAC7C;AACA,SAAOD;AACT;AAMO,SAASE,GAAUtK,GAAYC,GAAqB;AACzD,MAAI,OAAOD,KAAM,YAAY,OAAOC,KAAM;AACxC,YACG,OAAOD,KAAM,YAAY,OAAOA,KAAM,cACtC,OAAOC,KAAM,YAAY,OAAOA,KAAM,aACvCD,KAAKC;AAGT,MAAID,MAAMC,EAAG,QAAO;AACpB,MACED,MAAM,QACNC,MAAM,QACN,OAAOD,KAAM,YACb,OAAOC,KAAM;AAEb,WAAO;AAET,MAAI,MAAM,QAAQD,CAAC,KAAK,MAAM,QAAQC,CAAC;AACrC,WACE,MAAM,QAAQD,CAAC,KACf,MAAM,QAAQC,CAAC,KACfD,EAAE,WAAWC,EAAE,UACfD,EAAE,MAAM,CAACZ,GAAG3E,MAAM6P,GAAUlL,GAAGa,EAAExF,CAAC,CAAC,CAAC;AAGxC,QAAM8P,IAAK,OAAO,KAAKvK,CAAC,GAClBwK,IAAK,OAAO,KAAKvK,CAAC;AACxB,SACEsK,EAAG,WAAWC,EAAG,UACjBD,EAAG;AAAA,IACD,CAAC1M,MACC,OAAO,OAAOoC,GAAGpC,CAAC,KAClByM;AAAA,MACGtK,EAA8BnC,CAAC;AAAA,MAC/BoC,EAA8BpC,CAAC;AAAA,IAAA;AAAA,EAClC;AAGR;AAaA,SAAS4M,GACPtJ,GACA3J,GACiC;AACjC,QAAMkR,IAAUvH,EAAI,MAAM,QACpB9G,IAAOqO,KAAWvH,EAAI,MAAM,MAAM,IAAIuH,EAAQ,IAAI;AACxD,MAAI,CAACA,KAAW,CAACrO,UAAa,EAAE,IAAI,IAAO,OAAO,OAAA;AAClD,QAAMrB,IAAK4P,GAAMzH,GAAKuH,EAAQ,OAAO,EAAI;AACzC,MAAI,OAAO1P,KAAO,YAAY,OAAOA,KAAO;AAC1C,WAAO,EAAE,IAAI,IAAO,OAAO,OAAA;AAE7B,QAAMgL,IAAgB,CAAA;AACtB,MAAIzI,IAAO,IACPmP,IAAK,IACL3O,IAAO;AACX,QAAM4O,IAAQ,MAAM;AAClB,IAAIpP,KAAMyI,EAAM,KAAKvC,EAAKN,GAAK5F,CAAI,CAAC,GACpCA,IAAO;AAAA,EACT;AACA,aAAWlC,KAAK7B,EAAM,SAASuJ,EAAW,GAAG;AAC3C,IAAAxF,KAAQ/D,EAAM,MAAMuE,GAAM1C,EAAE,KAAK,GACjC0C,IAAO1C,EAAE,QAASA,EAAE,CAAC,EAAE;AACvB,UAAM,CAAA,EAAGwG,GAAQuB,CAAI,IAAI/H;AACzB,QAAIwG,MAAW,UAAU;AACvB,UAAIuB,MAASsH,EAAQ,OAAO;AAC1B,QAAAnN,KAAQ,OAAOvC,CAAE;AACjB;AAAA,MACF;AACA,YAAM2D,IAAQtC,EAAK,OAAO,IAAI+G,CAAI,GAC5BpD,IAAWrB,GAAO,SAAS,WAAWA,EAAM,WAAWyE,GACvDhK,IAAIsK,GAASP,GAAK,QAAQ;AAChC,MAAAwJ,EAAA,GACA3G,EAAM;AAAA,QACJ5L,GAAG,QAAQ;AAAA,UACT,MAAM;AAAA,UACN,SAAS;AAAA,YACP,OAAO;AAAA,cACL,UAAUhB;AAAA,cACV,QAAQ,CAACiD,EAAK,OAAO,CAAC,CAAE;AAAA,cACxB,YAAY;AAAA,gBACV;AAAA,kBACE,KACGA,EAAK,OAAO,IAAIqO,EAAQ,KAAK,GAC1B,YAAYA,EAAQ;AAAA,kBAC1B,OAAOjH,EAAKN,GAAKnI,CAAE;AAAA,gBAAA;AAAA,cACrB;AAAA,YACF;AAAA,YAEF,MAAM,CAAA;AAAA,UAAC;AAAA,UAET,OAAO;AAAA,UACP,YAAY;AAAA,YACV,MAAM;AAAA,YACN,QAAQ,EAAE,MAAM,OAAO,MAAM5B,EAAA;AAAA,YAC7B,KAAK4G;AAAA,UAAA;AAAA,QACP,CACD;AAAA,MAAA;AAEH;AAAA,IACF;AACA,UAAM4M,IACJ/K,MAAW,QACP+I,GAAMzH,GAAKC,CAAI,IACf8I,GAAW/I,EAAI,gBAAgBC,CAAI;AACzC,IAAIvB,MAAW,aAAWsB,EAAI,aAAa,KAAK,CAACC,GAAMwJ,CAAQ,CAAC,GAE9D,OAAOA,KAAa,YACpB,OAAOA,KAAa,YACpB,OAAOA,KAAa,YAEpBrP,KAAQ,OAAOqP,CAAQ,IAClBF,IAAK;AAAA,EACd;AAEA,SADAnP,KAAQ/D,EAAM,MAAMuE,CAAI,GACnB2O,IACD1G,EAAM,WAAW,IAAU,EAAE,IAAI,IAAM,OAAOzI,EAAA,KAClDoP,EAAA,GACO;AAAA,IACL,IAAI;AAAA,IACJ,OAAOnJ,GAAUwC,EAAM,OAAO,CAAChE,GAAGC,MAAMrI,EAAI,KAAKoI,GAAGC,CAAC,CAAC,CAAC;AAAA,EAAA,KALzC,EAAE,IAAI,IAAO,OAAO,OAAA;AAOtC;AAEA,SAASqI,GACP9Q,GACA2J,GACiC;AAEjC,MAAI,OAAO3J,KAAU,YAAYA,EAAM,WAAW,KAAK;AACrD,WAAO,EAAE,IAAI,IAAM,OAAOA,EAAM,MAAM,CAAC,EAAA;AAEzC,MAAI,OAAOA,KAAU,YAAYA,EAAM,SAAS,WAAW;AACzD,WAAOiT,GAAatJ,GAAK3J,CAAK;AAEhC,MAAI,OAAOA,KAAU,YAAYA,EAAM,SAAS,IAAI,GAAG;AACrD,QAAIkT,IAAK;AACT,UAAMG,IAAQrT,EAAM;AAAA,MAClBuJ;AAAA,MACA,CAAC+J,GAAGjL,GAAgBuB,MAAiB;AACnC,YAAIhK;AAMJ,eALIyI,MAAW,QAAOzI,IAAIwR,GAAMzH,GAAKC,CAAI,KAEvChK,IAAI8S,GAAW/I,EAAI,gBAAgBC,CAAI,GACvCD,EAAI,aAAa,KAAK,CAACC,GAAMhK,CAAC,CAAC,IAG/B,OAAOA,KAAM,YACb,OAAOA,KAAM,YACb,OAAOA,KAAM,YACb,OAAOA,KAAM,YAEN,OAAOA,CAAC,KAEjBsT,IAAK,IACE;AAAA,MACT;AAAA,IAAA;AAEF,WAAOA,IAAK,EAAE,IAAAA,GAAI,OAAOG,MAAU,EAAE,IAAAH,GAAI,OAAO,OAAA;AAAA,EAClD;AACA,MACE,OAAOlT,KAAU,aAChBA,EAAM,WAAW,OAAO,KAAKA,EAAM,WAAW,WAAW,IAC1D;AACA,QAAIJ;AAEJ,WAAII,EAAM,WAAW,OAAO,IAAGJ,IAAIwR,GAAMzH,GAAK3J,EAAM,MAAM,CAAC,GAAG,EAAI,KAEhEJ,IAAI8S,GAAW/I,EAAI,gBAAgB3J,EAAM,MAAM,CAAC,CAAC,GACjD2J,EAAI,aAAa,KAAK,CAAC3J,EAAM,MAAM,CAAC,GAAGJ,CAAC,CAAC,IAEjBA,KAAM,OAC5B,EAAE,IAAI,IAAO,OAAO,OAAA,IACpB,EAAE,IAAI,IAAM,OAAOA,EAAA;AAAA,EACzB;AACA,MAAI,MAAM,QAAQI,CAAK,GAAG;AACxB,UAAMgD,IAAQhD,EAAM,IAAI,CAAC4H,MAAMkJ,GAAWlJ,GAAG+B,CAAG,CAAC;AACjD,WAAO;AAAA,MACL,IAAI3G,EAAM,MAAM,CAAC,MAAM,EAAE,EAAE;AAAA,MAC3B,OAAOA,EAAM,IAAI,CAAC,MAAM,EAAE,KAAK;AAAA,IAAA;AAAA,EAEnC;AACA,MAAIhD,MAAU,QAAQ,OAAOA,KAAU,UAAU;AAC/C,UAAMgE,IAA+B,CAAA;AACrC,eAAW,CAACqC,GAAGzG,CAAC,KAAK,OAAO,QAAQI,CAAK,GAAG;AAC1C,YAAM4G,IAAIkK,GAAWlR,GAAG+J,CAAG;AAC3B,UAAI,CAAC/C,EAAE,GAAI,QAAO,EAAE,IAAI,IAAO,OAAO,OAAA;AACtC,MAAA5C,EAAIqC,CAAC,IAAIO,EAAE;AAAA,IACb;AACA,WAAO,EAAE,IAAI,IAAM,OAAO5C,EAAA;AAAA,EAC5B;AACA,SAAO,EAAE,IAAI,IAAM,OAAAhE,EAAA;AACrB;AAEA,SAAS6R,GAAYlI,GAAqB3H,GAAuB;AAC/D,MAAI,CAAC2H,EAAI,IAAK,OAAM,IAAIiG,GAAA;AACxB,SAAO,OAAO,QAAQ5N,CAAK,EAAE,MAAM,CAAC,CAAC4H,GAAM1D,CAAG,MAAM;AAClD,UAAMtG,IAAIwR,GAAMzH,GAAKC,CAAI;AACzB,WAAO,OAAO,QAAQ1D,CAAY,EAAE,MAAM,CAAC,CAAC7F,GAAIkT,CAAQ,MAAM;AAG5D,UAAIlT,MAAO,YAAgCT,KAAM;AAC/C,cAAM,IAAIgQ,GAAA;AAEZ,aAAO4D,GAAQ5T,GAAGS,GAAIkT,CAAQ;AAAA,IAChC,CAAC;AAAA,EACH,CAAC;AACH;AAEA,SAASC,GAAQ5T,GAAYS,GAAYkT,GAA4B;AACnE,UAAQlT,GAAA;AAAA,IACN,KAAK;AACH,aAA2BT,KAAM,SAAU2T;AAAA,IAC7C,KAAK;AACH,aAAO3T,MAAM,UAAakT,GAAUlT,GAAG2T,CAAQ;AAAA,IACjD,KAAK;AACH,aAAO,MAAM,QAAQA,CAAQ,KAAKA,EAAS,KAAK,CAACpS,MAAM2R,GAAU3R,GAAGvB,CAAC,CAAC;AAAA,IACxE,KAAK;AACH,aAAO,MAAM,QAAQA,CAAC,KAAKA,EAAE,KAAK,CAACgI,MAAMkL,GAAUlL,GAAG2L,CAAQ,CAAC;AAAA,IACjE,KAAK;AACH,aAAO,OAAO3T,KAAM,YAAYA,EAAE,SAAS,OAAO2T,CAAQ,CAAC;AAAA,IAC7D,KAAK;AACH,aAAO,OAAO3T,KAAM,YAAYA,EAAE,WAAW,OAAO2T,CAAQ,CAAC;AAAA,IAC/D,KAAK;AACH,aAAO,OAAO3T,KAAM,YAAYA,EAAE,SAAS,OAAO2T,CAAQ,CAAC;AAAA,IAC7D,KAAK;AACH,aAAO,OAAO3T,KAAM,YAAYA,IAAK2T;AAAA,IACvC,KAAK;AACH,aAAO,OAAO3T,KAAM,YAAYA,KAAM2T;AAAA,IACxC,KAAK;AACH,aAAO,OAAO3T,KAAM,YAAYA,IAAK2T;AAAA,IACvC,KAAK;AACH,aAAO,OAAO3T,KAAM,YAAYA,KAAM2T;AAAA,IACxC;AACE,aAAO;AAAA,EAAA;AAEb;ACz7BO,SAASE,GACd1O,GACA2O,GACe;AACf,QAAMC,IAAaC,GAAa7O,CAAK,GAC/Bf,IAAqB,CAAA,GACrB6P,IAAU,CAAC9R,MACfyH,GAAW,EAAE,QAAAkK,GAAQ,WAAW,IAAI,WAAW,CAAA,EAAC,GAAK3O,GAAO;AAAA,IAC1D,KAAKhD,EAAE;AAAA,EAAA,CACR;AACH,aAAWc,KAAQ,CAAC,GAAGkC,EAAM,MAAM,QAAQ,EAAE,KAAK+O,EAAM,GAAG;AACzD,UAAM5N,IAAuB;AAAA,MAC3B,GAAIrD,EAAK,OAAQ,CAAC,MAAM,IAAc,CAAA;AAAA,MACtC,GAAI,CAAC,UAAU,UAAU,QAAQ,EAAY;AAAA,QAAO,CAACxC,MACnDwC,EAAK,UAAU,IAAIxC,CAAE;AAAA,MAAA;AAAA,IACvB;AAEF,eAAWA,KAAM6F;AACf,iBAAWnE,KAAK4R;AACd,QAAA3P,EAAI,KAAK;AAAA,UACP,MAAMnB,EAAK;AAAA,UACX,WAAWxC;AAAA,UACX,WAAW0B,EAAE;AAAA,UACb,GAAGgS,GAAYF,EAAQ9R,CAAC,GAAGc,GAAMxC,CAAE;AAAA,QAAA,CACpC;AAGL,eAAW6E,KAAK,CAAC,GAAGrC,EAAK,OAAO,QAAQ,EAAE,KAAKiR,EAAM,GAAG;AACtD,UAAI5O,EAAE,SAAS,gBAAgB;AAC7B,cAAM8O,wBAAc,IAAA;AACpB,mBAAWpN,KAAK1B,EAAE,eAAe,YAAY,CAAA;AAC3C,qBAAW7E,KAAMuG,EAAE;AACjB,aACEvG,MAAO,aACPA,MAAO,gBACPA,MAAO,iBACPA,MAAO,gBAEP2T,EAAQ,IAAI3T,CAAE;AAIpB,mBAAWA,KAAM,CAAC,GAAG2T,CAAO,EAAE;AAC5B,qBAAWjS,KAAK4R;AACd,YAAA3P,EAAI,KAAK;AAAA,cACP,MAAMnB,EAAK;AAAA,cACX,OAAOqC,EAAE;AAAA,cACT,WAAW7E;AAAA,cACX,WAAW0B,EAAE;AAAA,cACb,GAAGkS,GAAoBJ,EAAQ9R,CAAC,GAAGc,GAAMqC,GAAG7E,CAAE;AAAA,YAAA,CAC/C;AAAA,MAGP;AAMA,UAJE6E,EAAE,SAAS,aACVA,EAAE,gBAAgB,IAAI,MAAM,KAC3BA,EAAE,eAAe,SAAS,KAAK,CAAC0B,MAAMA,EAAE,WAAW,IAAI,MAAM,CAAC,MAC7D1B,EAAE,eAAe,MAAM,UAAU,KAAK;AAE3C,mBAAWnD,KAAK4R;AACd,UAAA3P,EAAI,KAAK;AAAA,YACP,MAAMnB,EAAK;AAAA,YACX,OAAOqC,EAAE;AAAA,YACT,WAAW;AAAA,YACX,WAAWnD,EAAE;AAAA,YACb,GAAGmS,GAAaL,EAAQ9R,CAAC,GAAGc,GAAMqC,CAAC;AAAA,UAAA,CACpC;AAAA,IAEL;AAAA,EACF;AACA,SAAOlB;AACT;AAEA,SAAS+P,GACPpK,GACA9G,GACAxC,GACqC;AACrC,QAAM8T,IAAKC,GAASvR,GAAMxC,CAAE;AAC5B,MAAI;AAEF,QADA2N,GAAoBrE,GAAK9G,GAAMxC,CAAE,GAC7BwP,GAASlG,GAAK9G,CAAI,EAAG,QAAO,EAAE,SAAS,WAAW,IAAI,CAAC,QAAQ,EAAA;AACnE,UAAMwR,IAAShU,MAAO,WAAW,SAAYoN,GAAW9D,GAAK9G,GAAM,KAAKxC,CAAE;AAC1E,QAAIgU,KAAUC,GAAQD,CAAM,UAAU,EAAE,SAAS,UAAU,IAAAF,EAAA;AAC3D,UAAMI,IACJrE,GAAavG,GAAK9G,GAAM,KAAKxC,GAAI,QAAQ,MACxCA,MAAO,SAAS,SAAY6P,GAAavG,GAAK9G,GAAM,KAAKxC,GAAI,OAAO,IACjEmU,IAAyBH,IAC3B,aACAE,IACE,cACA;AACN,WAAO,EAAE,SAAAC,GAAS,IAAIA,MAAY,YAAYC,GAAUN,CAAE,IAAIA,EAAA;AAAA,EAChE,SAAS1O,GAAK;AACZ,WAAOiP,GAAOjP,GAAK0O,CAAE;AAAA,EACvB;AACF;AAEA,SAASD,GACPvK,GACA9G,GACAsC,GAKqC;AACrC,QAAMgP,IAAK;AAAA,IACT,GAAIhP,EAAM,gBAAgB,IAAI,MAAM,IAAI,CAAC,iBAAiB,IAAI,CAAA;AAAA,IAC9D,IAAIA,EAAM,eAAe,YAAY,CAAA,GAAI;AAAA,MAAQ,CAACyB,GAAG3D,MACnD2D,EAAE,WAAW,IAAI,MAAM,IAAI,CAAC,YAAY3D,CAAC,GAAG,IAAI,CAAA;AAAA,IAAC;AAAA,IAEnD,IAAIkC,EAAM,eAAe,QAAQ,CAAA,GAAI,IAAI,CAACmO,GAAGrQ,MAAM,QAAQA,CAAC,GAAG;AAAA,EAAA;AAEjE,MAAI4M,GAASlG,GAAK9G,CAAI,KAAK,CAACsC,EAAM,gBAAgB,IAAI,MAAM;AAC1D,WAAO,EAAE,SAAS,WAAW,IAAI,CAAC,QAAQ,EAAA;AAE5C,QAAMwP,IAAQtE,GAAe1G,GAAK9G,GAAMsC,GAAO,GAAG;AAClD,SAAIwP,GAAO,SAAS,oBACX,EAAE,SAAS,mBAAmB,IAAAR,EAAA,IAEnCQ,KAASL,GAAQK,EAAM,IAAI,IAAU,EAAE,SAAS,UAAU,IAAAR,EAAA,IAC1DQ,IAAc,EAAE,SAAS,aAAa,IAAAR,EAAA,IACtChP,EAAM,SAAS,YAAY,CAACmK,GAAY3F,GAAK9G,GAAMsC,CAAK,IACnD,EAAE,SAAS,UAAU,IAAAgP,EAAA,IAEvB,EAAE,SAAS,WAAW,IAAAA,EAAA;AAC/B;AAEA,SAASF,GACPtK,GACA9G,GACAsC,GACA9E,GACqC;AACrC,QAAM8T,KAAMhP,EAAM,eAAe,YAAY,CAAA,GAAI;AAAA,IAAQ,CAACyB,GAAG3D,MAC3D2D,EAAE,WAAW,IAAIvG,CAAE,IAAI,CAAC,YAAY4C,CAAC,GAAG,IAAI,CAAA;AAAA,EAAC;AAE/C,MAAI4M,GAASlG,GAAK9G,CAAI,EAAG,QAAO,EAAE,SAAS,WAAW,IAAI,CAAC,QAAQ,EAAA;AACnE,MAAI;AACF,UAAMiJ,IAAOiG,GAAkBpI,GAAKxE,GAAO9E,GAAI;AAAA,MAC7C,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,KAAK;AAAA,IAAA,CACN;AACD,WAAIyL,MAAS,KAAc,EAAE,SAAS,UAAU,IAAAqI,EAAA,IACzC,EAAE,SAASrI,IAAO,cAAc,WAAW,IAAAqI,EAAA;AAAA,EACpD,SAAS1O,GAAK;AACZ,WAAOiP,GAAOjP,GAAK0O,CAAE;AAAA,EACvB;AACF;AAEA,SAASC,GAASvR,GAAgBxC,GAA6B;AAC7D,SAAO;AAAA,IACL,GAAIwC,EAAK,gBAAgB,IAAIxC,CAAE,IAAI,CAAC,iBAAiB,IAAI,CAAA;AAAA,IACzD,IAAIwC,EAAK,eAAe,UAAU,CAAA,GAAI;AAAA,MAAQ,CAAC+D,GAAG,MAChDA,EAAE,WAAW,IAAIvG,CAAE,IAAI,CAAC,UAAU,CAAC,GAAG,IAAI,CAAA;AAAA,IAAC;AAAA,IAE7C,IAAIwC,EAAK,eAAe,YAAY,CAAA,GAAI;AAAA,MAAQ,CAAC+D,GAAG,MAClDA,EAAE,WAAW,IAAIvG,CAAE,IAAI,CAAC,YAAY,CAAC,GAAG,IAAI,CAAA;AAAA,IAAC;AAAA,IAE/C,GAAIwC,EAAK,eAAe,QAAQ,IAAIxC,CAAE,IAAI,CAAC,QAAQ,IAAI,CAAA;AAAA,EAAC;AAE5D;AAGA,SAASoU,GAAUN,GAAwB;AACzC,SAAOA,EAAG,SAAS,IAAIA,IAAK,CAAC,SAAS;AACxC;AAEA,SAASO,GACPjP,GACA0O,GACqC;AACrC,QAAMjL,IAAQzD,EAA4C,YAAY;AACtE,MAAIyD,MAAS,kBAAmB,QAAO,EAAE,SAAS,mBAAmB,IAAAiL,EAAA;AACrE,MAAIjL,MAAS,YAAa,QAAO,EAAE,SAAS,UAAU,IAAAiL,EAAA;AACtD,QAAM1O;AACR;AAEA,MAAM6O,KAAU,CAAC,MAAY7S,EAAU,CAAC,MAAM,SAExCqS,KAAS,CAACtL,GAAqBC,MACnCD,EAAE,OAAOC,EAAE,OAAO,KAAKD,EAAE,OAAOC,EAAE,OAAO,IAAI;AAM/C,SAASmL,GAAa7O,GAAgC;AACpD,QAAM6P,IAAU7P,EAAM,QAAQ,SAAS,OACjC0E,IAAOoL,GAAM9P,GAAO,EAAE,CAAC6P,CAAO,GAAG,WAAW,GAC5CE,wBAAa,IAAA,GAIbC,IAAQ,CAAC/S,MAAmB;AAChC,QAAI,MAAM,QAAQA,CAAK,EAAG,QAAOA,EAAM,QAAQ+S,CAAK;AACpD,QAAI,EAAA/S,MAAU,QAAQ,OAAOA,KAAU;AACvC,iBAAW,CAAC7B,GAAKH,CAAK,KAAK,OAAO,QAAQgC,CAAK;AAC7C,YAAI7B,MAAQ,SAASH,KAAS,OAAOA,KAAU;AAC7C,qBAAW,CAACoR,GAAOlL,CAAG,KAAK,OAAO,QAAQlG,CAAK;AAC7C,uBAAW,CAACK,GAAI2U,CAAO,KAAK,OAAO;AAAA,cAChC9O,KAAO,CAAA;AAAA,YAAC,GACR;AACD,oBAAM8E,IACJ3K,MAAO,QAAQ,MAAM,QAAQ2U,CAAO,IAChCA,IACA3U,MAAO,cAAcA,MAAO,OAC1B,CAAC2U,CAAO,IACR,CAAA;AACR,yBAAWpV,KAAKoL;AACd,gBAAI,OAAOpL,KAAM,YAAYwR,MAAUwD,KACvCE,EAAO,IAAI,GAAG1D,CAAK,IAAIxR,CAAC,IAAI;AAAA,kBAC1B,OAAAwR;AAAA,kBACA,OAAOxR;AAAA,kBACP,MAAMS,MAAO;AAAA,gBAAA,CACd;AAAA,YAEL;AAAA,eAESL,CAAK;AAAA,EAEtB,GACM4I,IAAQ,CAACJ,MAAiC;AAAA,IAC9C,IAAIA,GAAG,UAAU,CAAA,GAAI,IAAI,CAAC5B,MAAMA,EAAE,KAAK;AAAA,IACvC,IAAI4B,GAAG,YAAY,CAAA,GAAI,IAAI,CAAC5B,MAAMA,EAAE,KAAK;AAAA,IACzC,IAAI4B,GAAG,QAAQ,CAAA,GAAI,IAAI,CAAC3G,MAAMA,EAAE,MAAM;AAAA,EAAA;AAExC,EAAAkT,EAAMhQ,EAAM,MAAM;AAClB,aAAWlC,KAAQkC,EAAM,MAAM,OAAA,GAAU;AACvC,IAAAgQ,EAAMnM,EAAM/F,EAAK,aAAa,CAAC,GAC/BkS,EAAMlS,EAAK,iBAAiB;AAC5B,eAAWqC,KAAKrC,EAAK,OAAO,OAAA;AAC1B,MAAAkS,EAAMnM,EAAM1D,EAAE,aAAa,CAAC,GAC5B6P,EAAM7P,EAAE,iBAAiB;AAAA,EAE7B;AACA,aAAWvC,KAASoC,EAAM,uBAAuB,OAAA;AAC/C,eAAWG,KAAKvC,EAAM,OAAO,SAAU,CAAAoS,EAAMnM,EAAM1D,EAAE,aAAa,CAAC;AAErE,SAAO;AAAA,IACL,EAAE,MAAM,aAAa,KAAK,OAAA;AAAA,IAC1B,EAAE,MAAM,iBAAiB,KAAKuE,EAAA;AAAA,IAC9B,GAAG,CAAC,GAAGqL,EAAO,SAAS,EACpB,KAAK,CAAC,CAACtM,CAAC,GAAG,CAACC,CAAC,MAAOD,IAAIC,IAAI,KAAKD,IAAIC,IAAI,IAAI,CAAE,EAC/C,IAAI,CAAC,CAAC5I,GAAMoV,CAAC,OAAO;AAAA,MACnB,MAAApV;AAAA,MACA,KAAKgV,GAAM9P,GAAO;AAAA,QAChB,CAAC6P,CAAO,GAAG;AAAA,QACX,CAACK,EAAE,KAAK,GAAGA,EAAE,OAAO,CAACA,EAAE,KAAK,IAAIA,EAAE;AAAA,MAAA,CACnC;AAAA,IAAA,EACD;AAAA,EAAA;AAER;AAMA,SAASJ,GACP9P,GACAmQ,GACyB;AACzB,QAAMlR,IAA+B,CAAA;AACrC,aAAW,CAACoN,GAAOpR,CAAK,KAAK,OAAO,QAAQkV,CAAM,GAAG;AACnD,UAAMtL,KAAQ7E,EAAM,KAAK,IAAIqM,CAAK,KAAKA,GAAO,MAAM,GAAG;AACvD,QAAI7L,IAAKvB;AACT,eAAW6O,KAAQjJ,EAAK,MAAM,GAAG,EAAE;AACjC,MAAArE,IAAMA,EAAGsN,CAAI,MAAM,CAAA;AAErB,IAAAtN,EAAGqE,EAAKA,EAAK,SAAS,CAAC,CAAE,IAAI5J;AAAA,EAC/B;AACA,SAAOgE;AACT;AAMO,SAASmR,GACdpQ,GACA2O,GACgB;AAChB,QAAM1P,IAAsB,CAAA,GACtB4Q,IAAU7P,EAAM,QAAQ,SAAS,OACjCqQ,IAAgB5L;AAAA,IACpB,EAAE,QAAAkK,GAAQ,WAAW,IAAI,WAAW,CAAA,EAAC;AAAA,IACrC3O;AAAA,IACA,EAAE,KAAK8P,GAAM9P,GAAO,EAAE,CAAC6P,CAAO,GAAG,WAAW,EAAA;AAAA,EAAE;AAEhD,aAAW/R,KAAQkC,EAAM,MAAM,OAAA,GAAU;AACvC,UAAMsQ,IAAUxS,EAAK,eAAe,UAAU,CAAA;AAC9C,IAAAwS,EAAQ,QAAQ,CAACvJ,GAAM7I,MAAM;AAE3B,YAAMsL,IAAQ,EAAE,GAAG6G,GAAe,QAAQ,CAAA,GAAI,MAAM,oBAAI,IAAI,CAAC,GAAG,CAAC,EAAA,GAC3DE,IAAQ;AAAA,QACZ,GAAGzS;AAAA,QACH,eAAe,EAAE,QAAQ,CAACiJ,CAAI,GAAG,UAAU,CAAA,EAAC;AAAA,MAAE;AAEhD,MACE2B,GAAWc,GAAO+G,GAAO,KAAK,CAAC,GAAGxJ,EAAK,UAAU,EAAE,CAAC,CAAE,MAAM,UAE5D9H,EAAI,KAAK;AAAA,QACP,MAAMnB,EAAK;AAAA,QACX,SAAS,UAAUI,CAAC;AAAA,MAAA,CACrB;AAAA,IAEL,CAAC;AACD,UAAM2F,IAAQ;AAAA,MACZ,GAAGyM,EAAQ,IAAI,CAACzO,GAAG3D,OAAO,EAAE,GAAA2D,GAAG,OAAO,UAAU3D,CAAC,IAAA,EAAM;AAAA,MACvD,IAAIJ,EAAK,eAAe,YAAY,CAAA,GAAI,IAAI,CAAC+D,GAAG3D,OAAO;AAAA,QACrD,GAAA2D;AAAA,QACA,OAAO,YAAY3D,CAAC;AAAA,MAAA,EACpB;AAAA,IAAA;AAEJ,eAAW,EAAE,GAAA2D,GAAG,OAAAd,EAAA,KAAW8C,GAAO;AAChC,UAAI,CAAChC,EAAE,+BAAgC;AACvC,YAAM2O,IAASC,GAAgB5O,EAAE,KAAK;AACtC,MAAI2O,MAAW,UACbvR,EAAI,KAAK;AAAA,QACP,MAAMnB,EAAK;AAAA,QACX,SAAS,GAAGiD,CAAK,uCAAuCyP,CAAM;AAAA,MAAA,CAC/D;AAAA,IAEL;AACA,QAAIxQ,EAAM,UAAUlC,EAAK,eAAe,WAAW;AACjD,iBAAWqC,KAAKrC,EAAK,OAAO,OAAA;AAC1B,QACEqC,EAAE,SAAS,cACTA,EAAE,eAAe,SAAS,UAAU,KAAK,MACxCA,EAAE,eAAe,MAAM,UAAU,KAAK,MAEzClB,EAAI,KAAK;AAAA,UACP,MAAMnB,EAAK;AAAA,UACX,OAAOqC,EAAE;AAAA,UACT,SAAS,0CAA0CrC,EAAK,IAAI,IAAIqC,EAAE,IAAI,iEAAiErC,EAAK,IAAI;AAAA,QAAA,CACjJ;AAAA,EAIT;AACA,SAAOmB;AACT;AAGA,SAASwR,GAAgBxT,GAA+C;AACtE,QAAMf,IAAKe,EAAM;AACjB,MAAI,CAAC,MAAM,QAAQf,CAAE,EAAG;AACxB,QAAMgC,IAAIhC,EAAG,UAAU,CAACwH,MAAM,CAACgN,GAAWhN,CAAC,CAAC;AAC5C,SAAOxF,KAAK,IAAI,MAAMA,CAAC,MAAM;AAC/B;AAEA,SAASwS,GAAWzT,GAAyB;AAC3C,SAAI,OAAOA,KAAU,WACZA,EAAM,WAAW,OAAO,KAAKA,EAAM,SAAS,QAAQ,IAEzD,MAAM,QAAQA,CAAK,IAAUA,EAAM,KAAKyT,EAAU,IAClDzT,MAAU,QAAQ,OAAOA,KAAU,WAAiB,KACjD,OAAO,QAAQA,CAAK,EAAE;AAAA,IAC3B,CAAC,CAACqE,GAAGzG,CAAC,MACJyG,MAAM,SAASA,MAAM,YAAYA,MAAM,cAAcoP,GAAW7V,CAAC;AAAA,EAAA;AAEvE;AC9YA,eAAsB8V,GACpB5Q,GACAC,GACAgC,IAAmD,CAAA,GAC9B;AACrB,QAAM4O,IAAS5O,EAAQ,UAAU,KAC3B6O,IAAoB,EAAE,OAAO,CAAA,GAAI,SAAS,CAAA,EAAC;AACjD,aAAW/S,KAAQkC,EAAM,MAAM,OAAA,GAAU;AACvC,UAAMe,IAAQjG,EAAKgD,EAAK,OAAO,CAAC,CAAE,GAC5BgT,IAAa;AAAA,MACjB,EAAE,MAAM,YAAY/P,CAAK,0BAA0B,QAAQ,CAAA,EAAC;AAAA,IAAE,GAE1DgQ,IAAO,CAAC,GAAGjT,EAAK,OAAO,OAAA,CAAQ,EAAE;AAAA,MACrC,CAACqC,MAAMA,EAAE,SAAS,kBAAkBA,EAAE;AAAA,IAAA;AAExC,eAAWA,KAAK4Q,GAAM;AACpB,UAAI5Q,EAAE,SAAS,eAAgB;AAE/B,YAAMxC,IAASwC,EAAE,QACd,IAAI,CAACrD,MAAMkD,EAAM,MAAM,IAAIlD,CAAC,EAAG,OAAO,CAAC,CAAE,EACzC,IAAI,CAACK,MAAM,KAAKrC,EAAKqC,CAAC,CAAC,EAAE,EACzB,KAAK,MAAM,GACRY,IAAQ,KAAKjD,EAAKqF,EAAE,IAAI,CAAC,KACzB6Q,KACH7Q,EAAE,cAAc,QAAQ,IAAIpC,CAAK,UAAU,KAAKA,CAAK,UACtD,UAAUJ,CAAM;AAClB,MAAAmT,EAAW,KAAK;AAAA,QACd,MAAM,YAAY/P,CAAK,0CAA0CiQ,CAAK;AAAA,QACtE,QAAQ,EAAE,QAAAJ,EAAA;AAAA,MAAO,CAClB;AAAA,IACH;AACA,UAAM,CAACxH,GAAO,GAAG6H,CAAO,IAAI,MAAMlR,EAAO,IAAI+Q,GAAY;AAAA,MACvD,MAAM;AAAA,MACN,WAAW9O,EAAQ;AAAA,IAAA,CACpB;AACD,IAAA6O,EAAM,MAAM/S,EAAK,IAAI,IAAI,OAAOsL,EAAO,KAAK,CAAC,GAAI,KAAQ,CAAC,GAC1D2H,EAAK,QAAQ,CAAC5Q,GAAGjC,MAAM;AACrB,YAAM+H,IAASgL,EAAQ/S,CAAC,EAAG,KAAK,IAAI,CAAC2D,MAAM,OAAOA,EAAE,CAAI,CAAC,EAAE;AAAA,QACzD,CAAC4B,GAAGC,MAAMD,IAAIC;AAAA,MAAA;AAEhB,MAAAmN,EAAM,QAAQ,GAAG/S,EAAK,IAAI,IAAIqC,EAAE,IAAI,EAAE,IAAI+Q,GAAUjL,CAAM;AAAA,IAC5D,CAAC;AAAA,EACH;AACA,SAAO4K;AACT;AAEA,SAASK,GAAUjL,GAA+B;AAChD,QAAMzF,IAAK,CAAC2Q,MACVlL,EAAO,WAAW,IACd,IACAA,EAAO,KAAK,IAAIA,EAAO,SAAS,GAAG,KAAK,MAAMkL,IAAIlL,EAAO,MAAM,CAAC,CAAC;AACvE,SAAO;AAAA,IACL,SAASA,EAAO;AAAA,IAChB,MACEA,EAAO,WAAW,IACd,IACAA,EAAO,OAAO,CAACxC,GAAGC,MAAMD,IAAIC,GAAG,CAAC,IAAIuC,EAAO;AAAA,IACjD,QAAQzF,EAAG,GAAG;AAAA,IACd,KAAKA,EAAG,IAAI;AAAA,IACZ,KAAKyF,EAAO,WAAW,IAAI,IAAIA,EAAOA,EAAO,SAAS,CAAC;AAAA,EAAA;AAE3D;AC/DO,MAAMmL,KAAqB,IAErBC,KAAiB;AAsCvB,MAAMC,GAAa;AAAA,EACfC,yBAAe,QAAA;AAAA;AAAA,EAEfC,yBAAY,IAAA;AAAA,EACZC,yBAAqB,QAAA;AAAA;AAAA,EAErBC,yBAAiB,QAAA;AAAA,EACjBC;AAAA,EAET,YAAY9H,IAAQwH,IAAgB;AAClC,SAAKM,KAAS9H;AAAA,EAChB;AAAA,EAEA,IAAI,OAAe;AACjB,WAAO,KAAK2H,GAAM;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAII,GAAuBjK,GAAgC;AACzD,UAAMvH,IAAQwR,EAAQ,WAAW,CAAC,GAC5BC,IAAY,KAAKC,GAAcF,CAAO;AAC5C,QAAIC,MAAc,OAAW,QAAOlK,EAAQiK,EAAQ,GAAG,EAAE;AACzD,UAAMvB,IAAgB,CAAC,CAACuB,EAAQ,KAC1B7U,IAAU,KAAKwU,GAAS,IAAInR,CAAK,KAAK,CAAA;AAC5C,eAAWhE,KAAKW;AACd,UACE,EAAAX,EAAE,cAAcyV,KAChBzV,EAAE,kBAAkBiU,KACpBjU,EAAE,eAAewV,EAAQ,cACzB,CAACxV,EAAE,OAAO;AAAA,QACR,CAAC,CAACyI,GAAMzJ,CAAG,MAAM2W,GAAUC,GAAQJ,EAAQ,KAAK/M,CAAI,CAAC,MAAMzJ;AAAA,MAAA,KAE7D,CAACgB,EAAE,UAAU,MAAM,CAACyI,MAASoN,GAASD,GAAQJ,EAAQ,KAAK/M,CAAI,CAAC,CAAC,KACjE,CAACzI,EAAE,aAAa;AAAA,QACd,CAAC,CAACyI,GAAM5J,CAAK,MACX8W,GAAUpE,GAAWiE,EAAQ,SAAS/M,CAAI,CAAC,MAAMkN,GAAU9W,CAAK;AAAA,MAAA;AAKtE,eAAOmB,EAAE,MAAM,WAAW,IAAIA,EAAE,WAAW8V,GAAO9V,GAAGwV,EAAQ,GAAG;AAGlE,UAAMO,IAAO,KAAKC,GAAahS,GAAOwR,EAAQ,KAAKjK,CAAO,GACpD,EAAE,KAAA/C,GAAK,UAAAxC,GAAU,OAAAiQ,EAAA,IAAUF,GAC3BhC,IAAkC,CAAA;AACxC,eAAW,CAACtL,GAAMyN,CAAI,KAAK1N,EAAI,YAAY;AACzC,UAAIyN,EAAM,KAAK,CAAC/U,MAAMA,EAAE,SAASuH,CAAI,EAAG;AACxC,YAAMzJ,IAAM2W,GAAUO,EAAK,KAAK;AAChC,UAAIlX,MAAQ,OAAW,QAAOgH;AAC9B,MAAA+N,EAAO,KAAK,CAACtL,GAAMzJ,CAAG,CAAC;AAAA,IACzB;AACA,UAAMmX,IAAe;AAAA,MACnB,WAAAV;AAAA,MACA,eAAAxB;AAAA,MACA,YAAYuB,EAAQ;AAAA,MACpB,QAAAzB;AAAA,MACA,OAAAkC;AAAA,MACA,WAAW,CAAC,GAAG,IAAI,IAAIA,EAAM,IAAI,CAAC/U,MAAMA,EAAE,IAAI,CAAC,CAAC;AAAA,MAChD,cAAcsH,EAAI;AAAA,MAClB,UAAAxC;AAAA,IAAA;AAEF,IAAArF,EAAQ,QAAQwV,CAAK,GACrB,KAAKf,GAAM,IAAIe,GAAOnS,CAAK;AAC3B,eAAWoS,KAAWzV,EAAQ,OAAOqU,EAAkB;AACrD,WAAKI,GAAM,OAAOgB,CAAO;AAG3B,QADA,KAAKjB,GAAS,IAAInR,GAAOrD,CAAO,GAC5B,KAAKyU,GAAM,OAAO,KAAKG,IAAQ;AACjC,YAAM,CAACc,GAAQlS,CAAK,IAAI,KAAKiR,GAAM,QAAA,EAAU,KAAA,EAAO;AACpD,WAAKA,GAAM,OAAOiB,CAAM;AACxB,YAAM9M,IAAO,KAAK4L,GAAS,IAAIhR,CAAK,GAC9BC,IAAKmF,GAAM,QAAQ8M,CAAM,KAAK;AACpC,MAAIjS,KAAM,KAAGmF,EAAM,OAAOnF,GAAI,CAAC;AAAA,IACjC;AACA,WAAO4B;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASAgQ,GACEhS,GACAsS,GACA/K,GACgE;AAChE,UAAMgL,IAAO,KAAKjB,GAAW,IAAItR,CAAK;AACtC,QAAIsS,KAAOC,KAAQA,EAAK,SAAS,KAChBA,EAAK,IAAI,CAAC9N,MAAS8I,GAAW+E,GAAK7N,CAAI,CAAC,EAC5C,MAAMoN,EAAQ,GAAG;AAC1B,YAAMW,IAAUD,EAAK,IAAI,CAACpE,GAAGrQ,MAAM,GAAG2U,EAAM,GAAG3U,CAAC,GAAG;AACnD,UAAI4U,IAAkBJ;AACtB,MAAAC,EAAK,QAAQ,CAAC9N,GAAM3G,MAAM;AACxB,QAAA4U,IAASC,GAASD,GAAQjO,EAAK,MAAM,GAAG,GAAG+N,EAAQ1U,CAAC,CAAC;AAAA,MACvD,CAAC;AACD,UAAI8U;AACJ,UAAI;AACF,QAAAA,IAASrL,EAAQmL,CAAiC;AAAA,MACpD,QAAQ;AACN,QAAAE,IAAS;AAAA,MACX;AACA,YAAMX,IAAQW,KAAUC,GAAUD,GAAQL,GAAMC,CAAO;AACvD,UAAII,KAAUX,GAAO;AACnB,cAAME,IAAQ,EAAE,UAAUS,EAAO,UAAU,OAAAX,EAAA;AAC3C,eAAO;AAAA,UACL,KAAKW,EAAO;AAAA,UACZ,UAAUd,GAAOK,GAAOG,CAAG;AAAA,UAC3B,OAAAL;AAAA,QAAA;AAAA,MAEJ;AACA,WAAKX,GAAW,IAAItR,GAAO,CAAA,CAAE;AAAA,IAC/B;AAEF,UAAM,EAAE,KAAAwE,GAAK,UAAAxC,MAAauF,EAAQ+K,CAAG;AAErC,WAAIC,MAAS,UAAaD,KACxB,KAAKhB,GAAW;AAAA,MACdtR;AAAA,MACA,CAAC,GAAGwE,EAAI,UAAU,EACf,OAAO,CAAC,CAAA,EAAG0N,CAAI,MAAMA,EAAK,SAASL,GAASK,EAAK,KAAK,CAAC,EACvD,IAAI,CAAC,CAACzN,CAAI,MAAMA,CAAI;AAAA,IAAA,GAGpB,EAAE,KAAAD,GAAK,UAAAxC,GAAU,OAAO,CAAA,EAAC;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA0P,GAAcF,GAA2C;AACvD,UAAMxR,IAAQwR,EAAQ,WAAW,CAAC;AAClC,QAAIsB,IAAO,KAAKzB,GAAe,IAAIrR,CAAK;AACxC,IAAI8S,MAAS,WACXA,IAAOC,GAAcvB,EAAQ,YAAYA,EAAQ,SAAS,GAC1D,KAAKH,GAAe,IAAIrR,GAAO8S,CAAI;AAErC,UAAMjN,IAAS2L,EAAQ;AACvB,QAAI,CAAC3L,EAAQ,QAAO;AACpB,QAAIiN,MAAS,KAAM,QAAOnB,GAAU9L,CAAM;AAC1C,UAAMmN,IAAkC,CAAA;AACxC,eAAWtY,KAAQoY;AACjB,MAAI,OAAO,OAAOjN,GAAQnL,CAAI,MAAGsY,EAAOtY,CAAI,IAAImL,EAAOnL,CAAI;AAE7D,WAAOiX,GAAUqB,CAAM;AAAA,EACzB;AACF;AAGA,SAASnB,GAAShX,GAAiC;AACjD,SAAO,OAAOA,KAAU,YAAYA,EAAM,SAAS;AACrD;AAEA,SAAS+W,GACPU,GACA7N,GACS;AACT,SAAOA,MAAS,KAAK6N,IAAM/E,GAAW+E,GAAK7N,CAAI;AACjD;AAGA,MAAMgO,KAAS;AAOf,SAASI,GACPD,GACAK,GACAT,GACoB;AACpB,aAAW/N,KAAQwO;AACjB,QAAI,CAACL,EAAO,IAAI,WAAW,IAAInO,CAAI,GAAG,MAAO;AAE/C,QAAMwN,IAAgB,CAAA,GAChBvB,IAAakC,EAAO,SAAS;AACnC,WAAS1V,IAAI,GAAGA,IAAIwT,EAAW,QAAQxT,KAAK;AAC1C,UAAM,EAAE,MAAA0B,GAAM,QAAAqB,MAAWyQ,EAAWxT,CAAC;AACrC,QAAI0B,EAAK,SAAS6T,EAAM,EAAG;AAC3B,eAAW,CAAC9X,GAAOE,CAAK,KAAK,OAAO,QAAQoF,CAAM,GAAG;AACnD,YAAMnC,IAAI0U,EAAQ,QAAQ3X,CAAe;AACzC,UAAIiD,KAAK,EAAG,CAAAmU,EAAM,KAAK,EAAE,WAAW/U,GAAG,OAAAvC,GAAO,MAAMsY,EAAMnV,CAAC,EAAA,CAAI;AAAA,WAAA;AAAA,YACtD,OAAOjD,KAAU,YAAYA,EAAM,SAAS4X,EAAM;AACzD;AACF,YAAW5X,MAAU,QAAQ,OAAOA,KAAU,aACvC8W,GAAU9W,CAAK,KAAK4X,IAAQ,SAAS,aAAa;AACrD;AAAA;AAAA,IAGN;AAAA,EACF;AACA,MAAKQ,EAAM,MAAM,CAACxO,MAASwN,EAAM,KAAK,CAAC/U,MAAMA,EAAE,SAASuH,CAAI,CAAC;AAG7D,WAAOwN;AACT;AAGA,SAASU,GAASnF,GAAe/I,GAAgB5J,GAAyB;AACxE,QAAM,CAACwS,GAAM,GAAG1E,CAAI,IAAIlE,GAClByO,IAAgC,MAAM,QAAQ1F,CAAI,IACnD,CAAC,GAAGA,CAAI,IACT,EAAE,GAAIA,EAAA;AACV,SAAA0F,EAAK7F,CAAK,IACR1E,EAAK,WAAW,IACZ9N,IACA8X,GAAUnF,EAAiCH,CAAK,GAAG1E,GAAM9N,CAAK,GAC7DqY;AACT;AAGA,SAASpB,GACPK,GACAG,GACc;AACd,QAAM5B,IAAayB,EAAM,SAAS,WAAW,IAAI,CAAC,OAAO;AAAA,IACvD,MAAM,EAAE;AAAA,IACR,QAAQ,EAAE;AAAA,EAAA,EACV,GACIgB,wBAAa,IAAA;AACnB,aAAWC,KAAQjB,EAAM,OAAO;AAC9B,UAAMkB,IAAK3C,EAAW0C,EAAK,SAAS;AACpC,IAAKD,EAAO,IAAIC,EAAK,SAAS,MAC5BC,EAAG,SAAS,EAAE,GAAGA,EAAG,OAAA,GACpBF,EAAO,IAAIC,EAAK,SAAS,IAE3BC,EAAG,OAAOD,EAAK,KAAK,IAAIxB,GAAQU,GAAKc,EAAK,IAAI;AAAA,EAChD;AACA,SAAO,EAAE,GAAGjB,EAAM,UAAU,YAAAzB,EAAA;AAC9B;AAOA,SAASqC,GACPO,GACAC,GACiB;AACjB,QAAMC,wBAAY,IAAA,GACZC,wBAAc,IAAA;AACpB,MAAIC,IAAQ;AACZ,QAAMC,IAAO,CAACjW,MAAwB;AACpC,QAAI,MAAM,QAAQA,CAAI,GAAG;AACvB,iBAAWJ,KAAKI,EAAM,CAAAiW,EAAKrW,CAAC;AAC5B;AAAA,IACF;AACA,QAAII,MAAS,QAAQ,OAAOA,KAAS,SAAU;AAC/C,UAAMkW,IAAMlW;AACZ,QAAIkW,EAAI,SAASC,GAAK,UAAU;AAC9B,MAAAL,EAAM,IAAII,EAAI,KAAK,KAAK;AACxB;AAAA,IACF;AACA,QAAIA,EAAI,SAASC,GAAK,iBAAiB;AACrC,YAAMnZ,IAAOkZ,EAAI,KAAK;AACtB,UAAI,CAACH,EAAQ,IAAI/Y,CAAI,GAAG;AACtB,QAAA+Y,EAAQ,IAAI/Y,CAAI;AAChB,cAAMoZ,IAAWP,EAAU7Y,CAAI;AAC/B,QAAIoZ,MACEA,EAAS,qBAAqB,WAAQJ,IAAQ,KAClDC,EAAKG,CAAQ;AAAA,MAEjB;AAAA,IACF;AACA,eAAW,CAAC5S,GAAGzG,CAAC,KAAK,OAAO,QAAQmZ,CAAG;AACrC,MAAI1S,MAAM,SACNzG,MAAM,QAAQ,OAAOA,KAAM,cAAeA,CAAC;AAAA,EAEnD;AACA,SAAAkZ,EAAKL,CAAU,GACRI,IAAQ,CAAC,GAAGF,CAAK,EAAE,SAAS;AACrC;AAOO,SAAS7B,GAAU9W,GAAoC;AAC5D,QAAM8J,wBAAW,IAAA;AACjB,MAAIoJ,IAAK;AACT,QAAM4F,IAAO,CAAClZ,MAAwB;AACpC,QAAI,OAAOA,KAAM,SAAU,QAAO,EAAE,SAASA,EAAE,WAAS;AACxD,QAAI,OAAOA,KAAM,cAAc,OAAOA,KAAM;AAC1C,aAAAsT,IAAK,IACE;AAET,QAAItT,MAAM,QAAQ,OAAOA,KAAM,SAAU,QAAOA;AAChD,QAAIkK,EAAK,IAAIlK,CAAC;AACZ,aAAAsT,IAAK,IACE;AAGT,QADApJ,EAAK,IAAIlK,CAAC,GACN,MAAM,QAAQA,CAAC,EAAG,QAAOA,EAAE,IAAIkZ,CAAI;AACvC,UAAMI,IAAQ,OAAO,eAAetZ,CAAC;AACrC,QAAIsZ,MAAU,OAAO,aAAaA,MAAU;AAC1C,aAAAhG,IAAK,IACE;AAET,UAAMlP,IAA+B,CAAA;AACrC,eAAWqC,KAAK,OAAO,KAAKzG,CAAC,EAAE;AAC7B,MAAAoE,EAAIqC,CAAC,IAAIyS,EAAMlZ,EAA8ByG,CAAC,CAAC;AAEjD,WAAOrC;AAAA,EACT,GACMmV,IAAO,KAAK,UAAUL,EAAK9Y,CAAK,CAAC;AACvC,SAAOkT,IAAMiG,KAAQ,cAAe;AACtC;ACtXO,MAAMC;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;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAiXlCC,yBAAoB,IAAI;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC,GCtWYC,KAET;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"}
|