@loradb/lora-graphql 0.34.0 → 0.34.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -2
- package/dist/cli.js +2 -2
- package/dist/compile/cypher.d.ts +2 -0
- package/dist/compile/read/sort.d.ts +14 -2
- package/dist/{diff-B6CwL0qT.js → diff-BnwuROV5.js} +2 -2
- package/dist/{diff-B6CwL0qT.js.map → diff-BnwuROV5.js.map} +1 -1
- package/dist/index.js +2 -2
- package/dist/{lora-graphql-DVs4_koK.js → lora-graphql-CplYvRoG.js} +3387 -3314
- package/dist/lora-graphql-CplYvRoG.js.map +1 -0
- package/dist/model/directives.d.ts +1 -1
- package/dist/model/types.d.ts +6 -0
- package/dist/testing.js +1 -1
- package/package.json +2 -2
- package/dist/lora-graphql-DVs4_koK.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"lora-graphql-DVs4_koK.js","sources":["../src/events/outbox.ts","../src/analyze/indexes.ts","../src/analyze/assert-schema.ts","../src/compile/cypher.ts","../src/errors.ts","../src/model/types.ts","../src/model/desugar.ts","../src/model/relations.ts","../src/compile/context.ts","../src/model/points.ts","../src/compile/aggregate.ts","../src/analyze/statistics.ts","../src/compile/cost.ts","../src/compile/filter.ts","../src/compile/auth.ts","../src/compile/read/common.ts","../src/quantifier-rule.ts","../src/compile/selection.ts","../src/compile/hmac.ts","../src/compile/cursor.ts","../src/compile/read/sort.ts","../src/model/constraints.ts","../src/model/cypher-lexer.ts","../src/model/inputs.ts","../src/compile/read/abstract.ts","../src/compile/read/cypher-field.ts","../src/model/build/directive-args.ts","../src/model/build/shapes.ts","../src/schema/names.ts","../src/compile/read/match.ts","../src/compile/read/aggregates.ts","../src/compile/read/connection.ts","../src/compile/read/project.ts","../src/compile/read/by-keys.ts","../src/model/unique-together.ts","../src/execute/changes.ts","../src/execute/transaction.ts","../src/execute/mutate/reported.ts","../src/execute/mutate/env.ts","../src/execute/mutate/fragments.ts","../src/execute/mutate/unique-together.ts","../src/execute/mutate/triggers.ts","../src/analyze/cypher-check.ts","../src/analyze/plans.ts","../src/analyze/lint.ts","../src/model/build/authorization.ts","../src/analyze/principals.ts","../src/analyze/verdicts.ts","../src/analyze/access-lint.ts","../src/schema/mutations.ts","../src/analyze/access.ts","../src/compile/cache.ts","../src/compile/read/root.ts","../src/compile/read/search.ts","../src/driver.ts","../src/schema/guard.ts","../src/execute/cypher-mutation.ts","../src/execute/budget.ts","../src/execute/mutate/errors.ts","../src/execute/mutate/checks.ts","../src/execute/mutate/delete.ts","../src/execute/mutate/adjust.ts","../src/execute/mutate/single-call.ts","../src/execute/mutate/links.ts","../src/execute/mutate/plan.ts","../src/execute/mutate/runner.ts","../src/execute/mutate/unchanged.ts","../src/standard-schema.ts","../src/execute/mutate/validate.ts","../src/execute/mutate.ts","../src/events/worker.ts","../src/analyze/input-schemas.ts","../src/analyze/stored.ts","../src/codegen.ts","../src/guards.ts","../src/model/directives.ts","../src/model/positions.ts","../src/model/build/limits.ts","../src/model/build/constraints.ts","../src/model/build/search.ts","../src/model/build/scalar-field.ts","../src/model/build/relationship-field.ts","../src/model/build/trigger.ts","../src/model/build/cypher-field.ts","../src/model/build/rule-references.ts","../src/model/build/rule-checks.ts","../src/model/build/cache-control.ts","../src/model/build/unique-together.ts","../src/model/build.ts","../src/observe.ts","../src/runtime/custom-requires.ts","../src/runtime/database-error.ts","../src/execute/cache-policy.ts","../src/runtime/documents.ts","../src/runtime/limits.ts","../src/runtime/request.ts","../src/runtime/timing.ts","../src/schema/scalars.ts","../src/schema/base.ts","../src/schema/aggregates.ts","../src/schema/filters.ts","../src/schema/global-id.ts","../src/schema/resolvers.ts","../src/schema/objects.ts","../src/schema/query.ts","../src/schema/sorts.ts","../src/schema/subscriptions.ts","../src/schema/build.ts","../src/execute/feed.ts","../src/subscriptions/change-hub.ts","../src/subscriptions/events.ts","../src/subscriptions/compiles.ts","../src/subscriptions/filter-cost.ts","../src/subscriptions/subscriptions.ts","../src/lora-graphql.ts"],"sourcesContent":["// The delivery state of an `@outbox` node: stored properties the library\n// owns, on the node itself, so the work is exactly as durable as the data\n// and commits or rolls back with the write that made it. None is a field\n// of the API.\n\nexport const OUTBOX = {\n /** `PENDING`, `CLAIMED`, `DONE` or `FAILED`. */\n state: \"_outbox\",\n /** Handler calls that failed so far. */\n attempts: \"_outboxAttempts\",\n /** Not before this time (epoch ms): the backoff after a failure. */\n at: \"_outboxAt\",\n /** A claim is void past this time (epoch ms): its worker died. */\n lease: \"_outboxLease\",\n /** The message of the last failure. */\n error: \"_outboxError\",\n} as const;\n\n/** Whether `property` is one of the delivery-state properties. */\nexport function isOutboxProperty(property: string): boolean {\n return property.startsWith(\"_outbox\");\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 NodeType,\n ScalarField,\n ScalarType,\n} from \"../model/types.js\";\nimport { OUTBOX } from \"../events/outbox.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 * - `INCLUDES` on a list → RANGE: it keeps each list's elements, so\n * `$v IN n.list` seeks them instead of scanning the label (G-63).\n * - `LT` / `LTE` / `GT` / `GTE` → RANGE; `@sortable` too, when a root list\n * or connection can sort by it (see `rootSortable`).\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.list && ops.includes(\"INCLUDES\")) {\n kinds.set(\"RANGE\", `${at} is @filterable by INCLUDES`);\n } else if (rootSortable(model, node, f)) {\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 // An @outbox type's worker finds its pending nodes by their state.\n for (const node of model.nodes.values()) {\n if (!node.outbox) continue;\n const label = node.labels[0]!;\n out.push({\n kind: \"index\",\n index: \"RANGE\",\n name: schemaName(label, OUTBOX.state, \"range\"),\n label,\n property: OUTBOX.state,\n reason: `${node.name} is an @outbox: its worker seeks pending nodes by state`,\n });\n }\n return out;\n}\n\n/**\n * Whether a root list or connection can sort by a `@sortable` field: the\n * type's own, or an interface's or union's that sorts its members by it.\n * Only those plans seek the index (a keyset bound, an ordered walk). A\n * nested list sorts each parent's few related nodes after the expand, so a\n * field only nested lists sort by needs no index (G-56).\n */\nexport function rootSortable(\n model: GraphModel,\n node: NodeType,\n field: ScalarField,\n): boolean {\n if (!field.sortable) return false;\n if (node.read) return true;\n for (const abstract of model.abstracts.values()) {\n if (\n abstract.read &&\n abstract.members.includes(node.name) &&\n abstract.fields.get(field.name)?.sortable\n ) {\n return true;\n }\n }\n return false;\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","// The database side of S1: whether the database has every constraint and\n// index the API needs (creating what is missing on request), and which\n// of its indexes no part of the API uses.\n\nimport type { LoraDriver } from \"../driver.js\";\nimport type { AssertSchemaOptions } from \"../options.js\";\nimport type { CheckReport, SchemaAssertion } from \"../results.js\";\nimport { requirementDdl, type SchemaRequirement } from \"./indexes.js\";\n\nexport interface SchemaEnv {\n driver: LoraDriver;\n /** Timeout for every statement, in milliseconds. */\n timeoutMs: number;\n /** Constraints and indexes the API needs. */\n requirements(): SchemaRequirement[];\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 */\nexport async function assertSchema(\n env: SchemaEnv,\n options: AssertSchemaOptions,\n): Promise<SchemaAssertion> {\n const required = env.requirements();\n const [indexes, constraints] = await env.driver.run(\n [\n { text: \"SHOW INDEXES\", params: {} },\n { text: \"SHOW CONSTRAINTS\", params: {} },\n ],\n { mode: \"read\", timeoutMs: env.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 = (row[\"options\"] as Record<string, unknown> | undefined)?.[\n \"fulltext.analyzer\"\n ];\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) => 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 env.driver.run(\n [\n { text: `DROP INDEX ${quoteName(r.name)}`, params: {} },\n { text: requirementDdl(r), params: {} },\n ],\n { mode: \"write\", timeoutMs: env.timeoutMs },\n );\n recreated.push(r);\n }\n for (const r of missing) {\n await env.driver.run([{ text: requirementDdl(r), params: {} }], {\n mode: \"write\",\n timeoutMs: env.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/** Indexes in the database that no requirement of the API matches. */\nexport async function unusedIndexes(\n env: SchemaEnv,\n): Promise<CheckReport[\"unused\"]> {\n const [indexes, constraints] = await env.driver.run(\n [\n { text: \"SHOW INDEXES\", params: {} },\n { text: \"SHOW CONSTRAINTS\", params: {} },\n ],\n { mode: \"read\", timeoutMs: env.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 = env.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/** An index name as Cypher takes it: backquoted. */\nfunction quoteName(name: string): string {\n return \"`\" + name.replaceAll(\"`\", \"``\") + \"`\";\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","// 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 /** `any(v IN list WHERE …)` */\n | { kind: \"any\"; variable: string; list: Expr; where: Expr }\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 \"any\":\n return `any(${name(e.variable)} IN ${printExpr(e.list)} WHERE ${printExpr(e.where)})`;\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","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\n/**\n * Every `extensions.code` a request-time error of this library carries, in\n * a stable order. Use it to exhaustively map codes (HTTP status, client\n * copy) or to test membership at runtime.\n */\nexport const LORA_GRAPHQL_ERROR_CODES = Object.freeze([\n \"BAD_USER_INPUT\",\n \"INVALID_CURSOR\",\n \"LIMIT_EXCEEDED\",\n \"COST_EXCEEDED\",\n \"OVERLOADED\",\n \"TIMEOUT\",\n \"UNAUTHENTICATED\",\n \"FORBIDDEN\",\n \"NOT_FOUND\",\n \"CONSTRAINT_VIOLATION\",\n \"DATABASE_ERROR\",\n \"PERSISTED_QUERY_ONLY\",\n \"WRONG_OPERATION_TYPE\",\n] as const);\n\nexport type LoraGraphQLErrorCode = (typeof LORA_GRAPHQL_ERROR_CODES)[number];\n\nconst ERROR_CODES: ReadonlySet<string> = new Set(LORA_GRAPHQL_ERROR_CODES);\n\n/**\n * Whether `err` is a request-time error raised by this library: a\n * GraphQL error (or a plain `{ extensions: { code } }` from a serialized\n * response) whose `extensions.code` is one of `LORA_GRAPHQL_ERROR_CODES`.\n * Duck-typed, so it also recognizes errors built by another copy of\n * `graphql`.\n */\nexport function isLoraGraphQLError(\n err: unknown,\n): err is { message: string; extensions: { code: LoraGraphQLErrorCode } } {\n if (typeof err !== \"object\" || err === null) return false;\n const ext = (err as { extensions?: unknown }).extensions;\n if (typeof ext !== \"object\" || ext === null) return false;\n const code = (ext as { code?: unknown }).code;\n return typeof code === \"string\" && ERROR_CODES.has(code);\n}\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\n/** One value a mutation was given, or computed, that breaks a field's rule. */\nexport interface Violation {\n /** Where the value is in the mutation's arguments: keys and list indices. */\n path: Array<string | number>;\n /** The model field whose rule it is, as `Type.field`. */\n coordinate: string;\n /** The rule, named as its JSON Schema keyword (`maxLength`, `format`, ...). */\n rule: string;\n /** The rule's own numbers and names, enough to localise the message. */\n params: Record<string, unknown>;\n message: string;\n}\n\n/** The most violations one error lists; a batch can hold thousands. */\nexport const MAX_VIOLATIONS = 100;\n\nconst pathText = (path: ReadonlyArray<string | number>): string =>\n path.reduce<string>(\n (text, part) =>\n typeof part === \"number\"\n ? `${text}[${part}]`\n : text === \"\"\n ? part\n : `${text}.${part}`,\n \"\",\n );\n\n/**\n * Every value a mutation got wrong, in one error: `extensions.violations`\n * lists each with its path, rule and parameters. The values themselves\n * are never included: a rule is often on a password or an address.\n */\nexport function validationError(\n code: \"BAD_USER_INPUT\" | \"CONSTRAINT_VIOLATION\",\n violations: readonly Violation[],\n total: number = violations.length,\n): GraphQLError {\n const shown = violations\n .slice(0, 3)\n .map((v) => `${pathText(v.path) || v.coordinate} ${v.message}`);\n const more = total - shown.length;\n return requestError(\n code,\n `${total === 1 ? \"1 value is\" : `${total} values are`} not valid: ${shown.join(\"; \")}${more > 0 ? `; and ${more} more` : \"\"}`,\n undefined,\n {\n violations,\n ...(total > violations.length ? { violationCount: total } : {}),\n },\n );\n}\n\n/**\n * One error per field path pattern: errors with the same message and code\n * at paths that differ only in list indices (a field every row of a list\n * refuses, such as an @authentication field read anonymously) become one\n * error at the first path, with `extensions.count` and\n * `extensions.pathPattern` (indices as `\"*\"`). A page of 100 x 100 rows\n * otherwise answers with 10 000 copies of one error.\n */\nexport function collapseErrors(\n errors: readonly GraphQLError[],\n): GraphQLError[] {\n const groups = new Map<string, { first: GraphQLError; count: number }>();\n const out: Array<GraphQLError | { group: string }> = [];\n for (const error of errors) {\n const path = error.path;\n if (!path?.some((p) => typeof p === \"number\")) {\n out.push(error);\n continue;\n }\n const pattern = path.map((p) => (typeof p === \"number\" ? \"*\" : p));\n const key = JSON.stringify([\n error.message,\n error.extensions[\"code\"] ?? null,\n pattern,\n ]);\n const group = groups.get(key);\n if (group) group.count++;\n else {\n groups.set(key, { first: error, count: 1 });\n out.push({ group: key });\n }\n }\n return out.map((item) => {\n if (item instanceof GraphQLError) return item;\n const { first, count } = groups.get(item.group)!;\n if (count === 1) return first;\n return new GraphQLError(first.message, {\n ...(first.nodes ? { nodes: first.nodes } : {}),\n ...(first.source ? { source: first.source } : {}),\n ...(first.positions ? { positions: first.positions } : {}),\n path: first.path!,\n ...(first.originalError ? { originalError: first.originalError } : {}),\n extensions: {\n ...first.extensions,\n count,\n pathPattern: first.path!.map((p) => (typeof p === \"number\" ? \"*\" : p)),\n },\n });\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\nimport type { FieldConstraints } from \"./constraints.js\";\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 TriggerOperation = MutationOperation | \"CONNECT\" | \"DISCONNECT\";\n\n/**\n * `@trigger(on:, statement:, fields:)`: a statement run for the nodes of\n * a type that a generated mutation wrote, inside its transaction.\n */\nexport interface Trigger {\n operations: ReadonlySet<TriggerOperation>;\n /**\n * The relationship field of a CONNECT or DISCONNECT trigger: it fires\n * per relationship written, with `this` and `target` bound.\n */\n field?: string | undefined;\n statement: string;\n /** `UPDATE` fires only for nodes whose update set one of these. */\n fields: readonly string[] | undefined;\n /** The `$parameters` the statement uses: `jwt`, `viewer`, `operation`. */\n params: readonly string[];\n /** Whether the statement has a write clause. */\n writes: boolean;\n /** Whether it returns a `created` or `updated` column. */\n reports: boolean;\n}\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 /** `@length`, `@pattern`, `@format`, `@range`, `@multipleOf`, `@size`. */\n constraints?: FieldConstraints | 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: [{ key, edge, node }]`: the connected node and the properties. */\n | \"UPDATE\"\n /** `update: [{ key, edge }]`: the relationship's properties only. */\n | \"UPDATE_EDGE\"\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 /**\n * For a field to an interface or union with relationship rules (CONNECT,\n * DISCONNECT, UPDATE_EDGE, READ_EDGE): the field's authorization per\n * member, its rules expanded and checked with that member as their\n * `target`. A member copy carries its own.\n */\n memberAuthorization?: ReadonlyMap<string, Authorization> | 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 /**\n * `@size(max:)`: the most items each nested `connect`, `create`,\n * `disconnect` and `update` list of one input takes.\n */\n maxItems?: { max: number; message?: string } | 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 /** `@size(max:)`: the most items a list argument takes. */\n maxItems?: number | undefined;\n /** `@range(min:, max:)`: bounds of an Int or Float argument. */\n range?: { min?: number | undefined; max?: number | undefined } | undefined;\n /** The other value rules of the argument, as on a field. */\n constraints?: FieldConstraints | 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 /** `@cypher(cost:)`: rows the statement examines per run; 0 without. */\n cost: number;\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 /** Whether the statement has a write clause (a Mutation field's may). */\n writes: boolean;\n /**\n * Whether a Mutation field's statement returns a `created` or `updated`\n * column: the nodes in them are its write-set.\n */\n reports: boolean;\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/**\n * A placeholder inside a rule string: `${jwt.path}`, `${context.path}`,\n * `${viewer.field}`, or a value of the node the rule is about:\n * `${node.path}` in a type's rules, `${source.path}` / `${target.path}` /\n * `${edge.property}` in a relationship field's rules.\n */\nexport const PLACEHOLDER =\n /\\$\\{(jwt|context|viewer|node|source|target|edge)\\.([A-Za-z0-9_.]+)\\}/g;\n\n/** The placeholder sources that name a node (or edge) of the rule itself. */\nexport const RULE_REFERENCES = new Set([\"node\", \"source\", \"target\", \"edge\"]);\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 /**\n * Without a token the rule denies: the schema's\n * `@authorizationDefaults(requireAuthentication:)`, and always true for\n * a rule no anonymous request could pass.\n */\n requireAuthentication: boolean;\n /** The schema left `requireAuthentication` 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 /**\n * Without a token the rule denies: the schema's\n * `@authorizationDefaults(requireAuthentication:)`, and always true for\n * a rule no anonymous request could pass.\n */\n requireAuthentication: boolean;\n /** The schema left `requireAuthentication` to its default (true). */\n requireAuthenticationDefaulted?: boolean;\n where: AuthorizationWhere;\n}\n\nexport interface Authorization {\n filter: readonly AuthorizationFilterRule[];\n validate: readonly AuthorizationValidateRule[];\n /**\n * `bypass: false`: the schema's bypass does not skip these rules.\n * `true`: it does, as when left out, and `check()` does not note it.\n */\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 /** `@uniqueTogether`: combinations no two nodes of the type may share. */\n uniqueTogether: readonly UniqueTogether[];\n /** `@outbox`: nodes of the type are work for `lora.worker()`. */\n outbox: boolean;\n /** `@trigger`: statements run in the transaction of a mutation, in SDL order. */\n triggers: readonly Trigger[];\n description: string | undefined;\n}\n\n/**\n * `@uniqueTogether(fields:, where:)`: no two nodes of the type (among those\n * matching `where`) hold the same value of every field. A combination\n * with a null scalar, a missing single relationship or an empty set is\n * exempt, as a null is in a unique index.\n */\nexport interface UniqueTogether {\n /** The fields as declared, for messages. */\n fields: readonly string[];\n /** Scalar fields, compared by stored value. */\n scalars: readonly ScalarField[];\n /** Single relationships, compared by the target's @key. */\n singles: readonly RelationshipField[];\n /** At most one list relationship, compared as the set of target keys. */\n set: RelationshipField | undefined;\n /** A `<Type>Where`-shaped filter: only nodes matching it are compared. */\n where: Record<string, unknown> | 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 /** `*` words shorter than this match whole (`minPrefixLength:`). */\n minPrefixLength: number | undefined;\n /** The most matches a query ranks (`maxMatches:`). */\n maxMatches: number | undefined;\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 /** The global page-size cap (`maxLimit`); also caps `nodes(ids:)`. */\n maxLimit?: number | undefined;\n /** `@cacheControl` hints, by type and by `Type.field`. */\n cacheHints?: CacheHints;\n}\n\n/** A `@cacheControl` hint. */\nexport interface CacheHint {\n /** Seconds a result may be served from a cache. */\n maxAge: number;\n scope: \"PUBLIC\" | \"PRIVATE\";\n}\n\nexport interface CacheHints {\n types: ReadonlyMap<string, CacheHint>;\n /** By `Type.field`. */\n fields: ReadonlyMap<string, CacheHint>;\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","// 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 /**\n * The member of an interface or union a relationship rule is expanded\n * for, as its `target`. `isViewer` on a member that is not the viewer\n * type is then never true, where elsewhere it is a mistake: the rule is\n * written once for every member.\n */\n member?: NodeType;\n at: (message: string) => void;\n}\n\ntype Where = Record<string, unknown>;\n\n/**\n * Marks the operator object `isViewer` expands to (`{ eq: \"$jwt.<claim>\" }`\n * on the viewer field). With a claim to compare, it compiles like the\n * hand-written test. Without one (a signed-out caller, or a token without\n * the claim) there is no viewer, so no node is the viewer: the test is\n * false for every node, rather than unknown like a test of a missing claim.\n * `none` and `NOT … some` then hold, while `some` and a bare `isViewer`\n * fail. A symbol key, so operator walks (`Object.entries`) never see it.\n */\nexport const VIEWER_TEST: unique symbol = Symbol(\"isViewer\");\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\" && JSON.stringify(value).includes(\"${node.\")) {\n // Inside another node's filter, `${node.…}` would read the outer node.\n ctx.at(\n `rule ${node.name}.${name} reads \\${node.…}; such a rule can't be used inside a node filter, where it would read the outer node`,\n );\n } else 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 if (\n ctx.viewer &&\n node.name === ctx.viewer.type &&\n key === ctx.viewer.field &&\n isRecord(value) &&\n value[\"eq\"] === `$jwt.${ctx.viewer.claim}`\n ) {\n // One way to name the caller: the claim mapping lives in @viewer.\n ctx.at(\n `${node.name}.${key}: { eq: \"$jwt.${ctx.viewer.claim}\" } spells out the @viewer mapping; write isViewer: true`,\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 // No node of this member is the viewer: a test nothing passes.\n if (ctx.member === node) return [node.key.name, { in: [] }];\n ctx.at(\n `isViewer applies to ${ctx.viewer.type} (the @viewer type), not ${node.name}`,\n );\n return undefined;\n }\n return [\n ctx.viewer.field,\n { eq: `$jwt.${ctx.viewer.claim}`, [VIEWER_TEST]: true },\n ];\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\n/**\n * The parts a rule tests at its top level, through AND, OR and NOT:\n * `node`, `jwt`, `viewer`, `source`, `target`, `edge`.\n */\nexport function ruleParts(\n where: unknown,\n out = new Set<string>(),\n): Set<string> {\n if (Array.isArray(where)) {\n for (const w of where) ruleParts(w, out);\n return out;\n }\n if (where === null || typeof where !== \"object\") return out;\n for (const [key, value] of Object.entries(where)) {\n if (key === \"AND\" || key === \"OR\" || key === \"NOT\") ruleParts(value, out);\n else out.add(key);\n }\n return out;\n}\n\n/**\n * A relationship property's rule that tests the relationship's ends or\n * edge (`source`, `target`, `edge`): decided per relationship.\n */\nexport function testsRelationshipEnds(where: unknown): boolean {\n const parts = ruleParts(where);\n return parts.has(\"source\") || parts.has(\"target\") || parts.has(\"edge\");\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 // Relationship rules test the member as their target.\n authorization: rel.memberAuthorization?.get(member) ?? rel.authorization,\n memberAuthorization: undefined,\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","import type { Statistics } from \"../analyze/statistics.js\";\nimport 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: {\n labels: Set<string>;\n relationships: Set<string>;\n /** A `@cypher` statement ran: what it reads is unknown. */\n opaque?: boolean;\n };\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 /** Node counts and degrees from `analyze()`, for filter costs. */\n statistics?: Statistics | undefined;\n /** Relationship levels one `where` may nest (`maxFilterDepth`). */\n maxFilterDepth?: number | undefined;\n /** Items an `in` filter operand may hold (`maxListFilter`). */\n maxListFilter?: number | undefined;\n /** Characters a string filter operand may hold (`maxStringFilter`). */\n maxStringFilter?: number | undefined;\n /** Most matches a root connection's `totalCount` counts (`maxTotalCount`). */\n maxTotalCount?: number | undefined;\n /** Relationship levels of the `where` being compiled, so far. */\n filterDepth?: number | undefined;\n /** The GraphQL context, for `\"$context.path\"` values in rules. */\n requestContext: unknown;\n /**\n * The access analyses: no request context exists, so a `$context` value\n * is unknown, not absent. A rule testing one compiles with a stand-in\n * (it may hold for a row) instead of denying.\n */\n unknownContext?: boolean | undefined;\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 /** The most items a @cypher list argument takes without `@size(max:)`. */\n maxListArgument?: number | undefined;\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 statistics?: Statistics | undefined;\n requestContext?: unknown;\n unknownContext?: boolean | undefined;\n maxListArgument?: number | undefined;\n maxFilterDepth?: number | undefined;\n maxListFilter?: number | undefined;\n maxStringFilter?: number | undefined;\n maxTotalCount?: number | undefined;\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 statistics: options.statistics,\n maxFilterDepth: options.maxFilterDepth,\n maxListFilter: options.maxListFilter,\n maxStringFilter: options.maxStringFilter,\n maxTotalCount: options.maxTotalCount,\n requestContext: options.requestContext,\n unknownContext: options.unknownContext,\n computed: new Map(),\n contextReads: [],\n claimReads: new Map(),\n maxListArgument: options.maxListArgument,\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","// 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. Node ids dedupe\n * in linear time.\n */\nexport function distinctCount(keys: Expr): Expr {\n return fn(\"size\", fn(\"list.unique\", keys));\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//\n// The estimate uses the maximum degree, measured over every node, not a\n// percentile of the sample: callers pick the parents of a nested list\n// (by key, or by traversing into a hub), so any lower percentile is a\n// bound they can exceed at will. A hub-rooted four-level query estimated\n// from the p99 came to 22 621 rows and returned 537 790 objects. The\n// page limit still caps each level, so the maximum only lowers an\n// estimate where every node stays under the limit.\n\n//\n// G-73: a filter an index answers is charged the nodes holding the value\n// it seeks, not the label. Values are skewed (a root genre is on most\n// events), so the estimate is per value, never an average: every value's\n// count when a field has at most `VALUE_COUNTS` of them, else the most\n// common ones and, for any other value, the largest count among the rest.\n// A `@cypher` root without a declared `cost:` is charged the largest row\n// estimate of its statement's plan.\n\nimport type { LoraDriver, PlanNode } from \"../driver.js\";\nimport { name } from \"../compile/cypher.js\";\nimport type { GraphModel, NodeType, ScalarField } from \"../model/types.js\";\n\n/** Values whose counts `analyze()` keeps exactly, per field. */\nexport const VALUE_COUNTS = 1024;\n/** The most common values kept beyond that. */\nexport const COMMON_VALUES = 64;\n\nexport interface DegreeStats {\n sampled: number;\n mean: number;\n median: number;\n p99: number;\n /** The largest degree of any node, not only of the sample. */\n max: number;\n}\n\n/** Nodes per value of an indexed equality or list field (G-73). */\nexport interface ValueStats {\n /** Distinct values (of a list field: distinct elements), at most `VALUE_COUNTS + 1`. */\n distinct: number;\n /**\n * Nodes holding each value, keyed by the value as JSON: every value\n * when `rest` is 0, else the most common ones.\n */\n counts: Record<string, number>;\n /** The most nodes any value not in `counts` is held by. */\n rest: 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 /** Nodes per value of each filterable field an index seeks, `Type.field`. */\n values?: Record<string, ValueStats>;\n /**\n * Rows a `@cypher` root's statement examines, from its plan, keyed\n * `Query.field`; a declared `@cypher(cost:)` wins.\n */\n cypher?: Record<string, number>;\n}\n\n/** Field types whose values compare as their JSON. */\nconst COUNTED_TYPES = new Set([\"String\", \"ID\", \"Int\", \"Boolean\", \"Enum\"]);\n\n/**\n * Fields a root filter seeks by value: `eq`, `in`, `includes` or\n * `includesAny` on a stored field other than a unique one (that seek\n * finds one node).\n */\nexport function countedFields(node: NodeType): ScalarField[] {\n return [...node.fields.values()].filter(\n (f): f is ScalarField =>\n f.kind === \"scalar\" &&\n !f.private &&\n !f.unique &&\n f.name !== node.key.name &&\n COUNTED_TYPES.has(f.type) &&\n (f.list\n ? f.filters.has(\"INCLUDES\")\n : f.filters.has(\"EQ\") || f.filters.has(\"IN\")),\n );\n}\n\n/** The key a value is counted under in `ValueStats.counts`. */\nexport function valueKey(value: unknown): string {\n return JSON.stringify(value);\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 {\n text: `MATCH (n:${label}) WITH n LIMIT $sample RETURN size([(n)${arrow} | 1]) AS d`,\n params: { sample } as never,\n },\n // The hub a sample may miss: one pass over every relationship.\n {\n text: `MATCH (n:${label}) RETURN max(size([(n)${arrow} | 1])) AS m`,\n params: {},\n },\n );\n }\n const counted = countedFields(node);\n for (const f of counted) {\n // A node counts once per value, however often its list repeats it.\n const values = f.list\n ? `UNWIND list.unique(n.${name(f.name)}) AS v WITH v WHERE v IS NOT NULL`\n : `WITH n.${name(f.name)} AS v WHERE v IS NOT NULL`;\n statements.push({\n text: `MATCH (n:${label}) ${values} RETURN v, count(*) AS c ORDER BY c DESC LIMIT ${VALUE_COUNTS + 1}`,\n params: {},\n });\n }\n const results = await driver.run(statements, {\n mode: \"read\",\n timeoutMs: options.timeoutMs,\n });\n const [count, ...rest] = results;\n const degrees = rest.slice(0, 2 * rels.length);\n counted.forEach((f, i) => {\n const rows = rest[2 * rels.length + i]!.rows;\n const all = rows.length <= VALUE_COUNTS;\n const kept = all ? rows : rows.slice(0, COMMON_VALUES);\n const counts: Record<string, number> = {};\n for (const r of kept) counts[valueKey(r[\"v\"])] = Number(r[\"c\"]);\n stats.values ??= {};\n stats.values[`${node.name}.${f.name}`] = {\n distinct: rows.length,\n counts,\n rest: all ? 0 : Number(rows[COMMON_VALUES]![\"c\"]),\n };\n });\n stats.nodes[node.name] = Number(count!.rows[0]?.[\"c\"] ?? 0);\n rels.forEach((f, i) => {\n const values = degrees[2 * i]!.rows.map((r) => Number(r[\"d\"])).sort(\n (a, b) => a - b,\n );\n const summary = summarize(values);\n const max = Number(degrees[2 * i + 1]!.rows[0]?.[\"m\"] ?? 0);\n summary.max = Math.max(summary.max, max);\n stats.degrees[`${node.name}.${f.name}`] = summary;\n });\n }\n if (driver.explain) {\n for (const field of model.queries) {\n if (field.cost > 0) continue;\n // Planned with each argument's SDL default, null without one: the\n // estimate is the statement's shape, not one request's.\n const params = Object.fromEntries(\n field.params.map((p) => [\n p,\n field.args.find((a) => a.name === p)?.defaultValue ?? null,\n ]),\n );\n try {\n const plan = await driver.explain({\n text: field.statement,\n params: params as never,\n });\n const rows = largestEstimate(plan.tree);\n if (rows !== undefined) {\n stats.cypher ??= {};\n stats.cypher[`${field.owner}.${field.name}`] = rows;\n }\n } catch {\n // A statement the engine cannot plan without its arguments keeps\n // its projection's charge; declare `@cypher(cost:)` for it.\n }\n }\n }\n return stats;\n}\n\n/** The largest row estimate of any operator in a plan. */\nfunction largestEstimate(node: PlanNode): number | undefined {\n let max = node.estimatedRows ?? undefined;\n for (const child of node.children) {\n const rows = largestEstimate(child);\n if (rows !== undefined && (max === undefined || rows > max)) max = rows;\n }\n return max;\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","// What a `where` costs, for the cost limit. A projection is charged the\n// rows it returns (`projectNode`); a filter is charged the rows it must\n// examine to find them:\n//\n// - a root filter no index answers (CONTAINS, ENDS_WITH, case-insensitive,\n// NOT, OR, a quantifier, a computed field) examines every node of the\n// label: its count from `analyze()`, or the page size without statistics;\n// - a root filter an index answers by value (`eq`, `in`, `includes`,\n// `includesAny`) examines the nodes holding those values, from the\n// per-value counts `analyze()` keeps (G-73): an AND its narrowest test,\n// an OR of `includes` on one list (which the engine seeks per element,\n// G-72) the sum of its branches; the label without them;\n// - every relationship a filter follows visits each candidate's related\n// nodes, once per level: the mean degree when the candidates are a scan\n// of the label, the maximum when the caller picked them (by key, or as\n// the parents of a nested list), and the page size without statistics.\n\nimport { RANGE_UNINDEXABLE } from \"../analyze/indexes.js\";\nimport { valueKey } from \"../analyze/statistics.js\";\nimport type {\n AbstractType,\n NodeType,\n RelationshipField,\n} from \"../model/types.js\";\nimport type { CompileContext } from \"./context.js\";\n\ntype Where = Record<string, unknown>;\n\n/** Default `maxFilterDepth`: relationship levels one `where` may nest. */\nexport const MAX_FILTER_DEPTH = 2;\n/** Default `maxListFilter`: items an `in` filter operand may hold. */\nexport const MAX_LIST_FILTER = 1000;\n/** Default `maxStringFilter`: characters a string filter operand may hold. */\nexport const MAX_STRING_FILTER = 10_000;\n\nconst SEEK_OPS = new Set([\n \"eq\",\n \"in\",\n \"startsWith\",\n \"withinBBox\",\n \"distance\",\n // A list's elements, in the RANGE index inferred for it (G-63, G-72).\n \"includes\",\n \"includesAny\",\n]);\nconst RANGE_OPS = new Set([\"lt\", \"lte\", \"gt\", \"gte\"]);\n\n/** Nodes of the type, from statistics; `fallback` without them. */\nexport function labelRows(\n ctx: CompileContext,\n node: NodeType,\n fallback: number,\n): number {\n return ctx.statistics?.nodes[node.name] ?? fallback;\n}\n\n/**\n * Related nodes a filter visits per parent through `rel`: the maximum\n * degree when the caller chose the parents, the mean when they are every\n * node of the label, the declared `@cardinality` or the page size without\n * statistics. A single relationship visits one.\n */\nexport function filterDegree(\n ctx: CompileContext,\n rel: RelationshipField,\n chosen: boolean,\n): number {\n if (!rel.list) return 1;\n const stats = ctx.statistics?.degrees[`${rel.owner}.${rel.name}`];\n if (stats) return Math.max(chosen ? stats.max : stats.mean, 1);\n if (rel.cardinality !== undefined) return Math.max(rel.cardinality, 1);\n const limit =\n rel.limit ??\n ctx.model.nodes.get(rel.target)?.limit ??\n ctx.model.abstracts.get(rel.target)?.limit;\n return limit?.default ?? 1;\n}\n\n/**\n * Related nodes the filter visits per candidate row, over every\n * relationship it follows, nested levels multiplied. Scalar predicates\n * add nothing (the row is examined anyway); a computed field adds its\n * statement, once per row.\n */\nexport function perRowCost(\n ctx: CompileContext,\n node: NodeType,\n where: Where | null | undefined,\n chosen = false,\n): number {\n let cost = 0;\n for (const [key, value] of Object.entries(where ?? {})) {\n if (value === null || value === undefined) continue;\n if (key === \"AND\" || key === \"OR\") {\n for (const w of value as Where[])\n cost += perRowCost(ctx, node, w, chosen);\n continue;\n }\n if (key === \"NOT\") {\n cost += perRowCost(ctx, node, value as Where, chosen);\n continue;\n }\n const f = node.fields.get(key);\n if (f?.kind === \"cypher\" && f.computed) {\n // A filter on a computed field runs its statement for every row.\n cost += 1 + f.cost;\n } else if (f?.kind === \"relationship\") {\n cost += relationshipCost(ctx, f, value as Where, chosen);\n } else if (key.endsWith(\"Exists\")) {\n cost += 1;\n } else if (key.endsWith(\"Connection\")) {\n const rel = node.fields.get(key.slice(0, -\"Connection\".length));\n if (rel?.kind !== \"relationship\") continue;\n const d = filterDegree(ctx, rel, chosen);\n for (const inner of Object.values(value as Where)) {\n if (inner === null || inner === undefined) continue;\n const nodeWhere = (inner as Where)[\"node\"] as Where | undefined;\n cost += d * (1 + targetCost(ctx, rel, nodeWhere));\n }\n }\n }\n return cost;\n}\n\nfunction relationshipCost(\n ctx: CompileContext,\n rel: RelationshipField,\n value: Where,\n chosen: boolean,\n): number {\n const d = filterDegree(ctx, rel, chosen);\n if (!rel.list) return d * (1 + targetCost(ctx, rel, value));\n let cost = 0;\n for (const [quantifier, inner] of Object.entries(value)) {\n if (inner === null || inner === undefined) continue;\n if (quantifier === \"count\") cost += d;\n else if (quantifier === \"aggregate\") {\n cost += d * Math.max(1, Object.keys(inner as Where).length);\n } else cost += d * (1 + targetCost(ctx, rel, inner as Where));\n }\n return cost;\n}\n\n/** Per related node: the inner filter's cost, the costliest member's. */\nfunction targetCost(\n ctx: CompileContext,\n rel: RelationshipField,\n where: Where | undefined,\n): number {\n const node = ctx.model.nodes.get(rel.target);\n if (node) return perRowCost(ctx, node, where);\n const abstract = ctx.model.abstracts.get(rel.target);\n if (!abstract || !where) return 0;\n return Math.max(\n 0,\n ...abstract.members.map((name) =>\n perRowCost(\n ctx,\n ctx.model.nodes.get(name)!,\n memberWhere(abstract, name, where),\n ),\n ),\n );\n}\n\n/** The part of an interface's or union's `where` one member sees. */\nexport function memberWhere(\n abstract: AbstractType,\n member: string,\n where: Where | null | undefined,\n): Where | undefined {\n if (!where) return undefined;\n if (abstract.kind === \"union\") {\n return (where[member] as Where | null | undefined) ?? undefined;\n }\n return where;\n}\n\n/**\n * The extra cost of a root `where` on `node`: the label scan when no\n * index answers it, plus the related nodes it visits from each candidate.\n * `fallback` stands in for the label's size without statistics.\n */\nexport function rootFilterCost(\n ctx: CompileContext,\n node: NodeType,\n where: Where | null | undefined,\n fallback: number,\n /** Every match is read (a count or aggregate), not just a page. */\n all = false,\n): number {\n const keyed = keyedRows(node, where);\n if (keyed !== undefined)\n return keyed * (1 + perRowCost(ctx, node, where, true));\n const label = labelRows(ctx, node, fallback);\n const rows = Math.min(\n label,\n anchoredRows(ctx, node, where) ?? label,\n valueRows(ctx, node, where) ?? label,\n );\n const scan = all || (hasPredicate(where) && !seeks(ctx, node, where!));\n return (scan ? rows : 0) + rows * perRowCost(ctx, node, where);\n}\n\n/**\n * Rows a root anchored on a related node's key starts from: the anchors\n * times the most nodes one of them reaches back (the inverse field's\n * maximum degree), when statistics measured it.\n */\nfunction anchoredRows(\n ctx: CompileContext,\n node: NodeType,\n where: Where | null | undefined,\n): number | undefined {\n for (const [key, value] of Object.entries(where ?? {})) {\n const anchor = anchorOf(ctx, node, key, value);\n if (!anchor) continue;\n const inverse = [...anchor.target.fields.values()].find(\n (f) =>\n f.kind === \"relationship\" &&\n f.list &&\n f.type === anchor.rel.type &&\n f.target === node.name &&\n f.direction !== anchor.rel.direction,\n );\n const stats =\n inverse &&\n ctx.statistics?.degrees[`${anchor.target.name}.${inverse.name}`];\n if (stats) return anchor.count * Math.max(stats.max, 1);\n }\n return undefined;\n}\n\n/**\n * Nodes a `where` selects by indexed value, from the per-value counts of\n * `analyze()`: a test the narrowest of its operators, an AND (or one\n * where's fields) the narrowest of its tests, an OR of `includes` on one\n * list the sum of its branches. Any other OR is a label scan in the\n * engine and narrows nothing. Undefined without statistics.\n */\nfunction valueRows(\n ctx: CompileContext,\n node: NodeType,\n where: Where | null | undefined,\n): number | undefined {\n if (!ctx.statistics?.values) return undefined;\n let rows: number | undefined;\n const narrow = (n: number | undefined) => {\n if (n !== undefined) rows = rows === undefined ? n : Math.min(rows, n);\n };\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[]) narrow(valueRows(ctx, node, w));\n } else if (key === \"OR\") {\n if (!includesOr(node, value as Where[])) continue;\n const branches = (value as Where[]).map((w) => valueRows(ctx, node, w));\n if (branches.every((n) => n !== undefined)) {\n narrow(branches.reduce((a, b) => a! + b!, 0));\n }\n } else {\n narrow(fieldRows(ctx, node, key, value as Where));\n }\n }\n return rows;\n}\n\n/**\n * Whether an OR's branches each test one list field, the same one, with\n * `includes` or `includesAny` only: the engine seeks it element by element\n * (G-72).\n */\nfunction includesOr(node: NodeType, branches: Where[]): boolean {\n let field: string | undefined;\n return (\n branches.length > 0 &&\n branches.every((branch) => {\n const tests = Object.entries(branch).filter(([, v]) => v != null);\n if (tests.length !== 1) return false;\n const [key, ops] = tests[0]!;\n const f = node.fields.get(key);\n if (f?.kind !== \"scalar\" || !f.list) return false;\n if ((field ??= key) !== key) return false;\n const used = Object.entries(ops as Where).filter(([, v]) => v != null);\n return (\n used.length > 0 &&\n used.every(([op]) => op === \"includes\" || op === \"includesAny\")\n );\n })\n );\n}\n\n/** Nodes one field's operators select by value, from its counts. */\nfunction fieldRows(\n ctx: CompileContext,\n node: NodeType,\n key: string,\n ops: Where,\n): number | undefined {\n const values = ctx.statistics?.values?.[`${node.name}.${key}`];\n if (!values) return undefined;\n const held = (v: unknown) => values.counts[valueKey(v)] ?? values.rest;\n const sum = (vs: unknown) =>\n Array.isArray(vs) ? vs.reduce((n: number, v) => n + held(v), 0) : undefined;\n let rows: number | undefined;\n for (const [op, operand] of Object.entries(ops)) {\n if (operand === null || operand === undefined) continue;\n const n =\n op === \"eq\" || op === \"includes\"\n ? held(operand)\n : op === \"in\" || op === \"includesAny\"\n ? sum(operand)\n : undefined;\n if (n !== undefined) rows = rows === undefined ? n : Math.min(rows, n);\n }\n return rows;\n}\n\n/** A relationship filter naming related nodes by key, as the root seeks it. */\nfunction anchorOf(\n ctx: CompileContext,\n node: NodeType,\n key: string,\n value: unknown,\n): { rel: RelationshipField; target: NodeType; count: number } | undefined {\n const rel = node.fields.get(key);\n if (rel?.kind !== \"relationship\" || value == null) return undefined;\n if (ctx.model.abstracts.has(rel.target)) return undefined;\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 const ops = (inner as Where | undefined)?.[target.key.name] as\n | Where\n | undefined;\n if (ops?.[\"eq\"] != null) return { rel, target, count: 1 };\n if (Array.isArray(ops?.[\"in\"])) {\n return { rel, target, count: ops[\"in\"].length };\n }\n return undefined;\n}\n\n/** Rows an exact @key or @unique seek returns, when the where has one. */\nfunction keyedRows(\n node: NodeType,\n where: Where | null | undefined,\n): number | undefined {\n for (const [key, value] of Object.entries(where ?? {})) {\n const f = node.fields.get(key);\n if (f?.kind !== \"scalar\" || value == null) continue;\n if (key !== node.key.name && !f.unique) continue;\n const ops = value as Where;\n if (ops[\"eq\"] != null) return 1;\n if (Array.isArray(ops[\"in\"])) return ops[\"in\"].length;\n }\n return undefined;\n}\n\nfunction hasPredicate(where: Where | null | undefined): boolean {\n return Object.values(where ?? {}).some((v) => v !== null && v !== undefined);\n}\n\n/**\n * Whether an index narrows the root: an equality, range, prefix or point\n * predicate on a stored field, or a relationship filter naming a related\n * node by key (the root then starts from that node). CONTAINS and\n * ENDS_WITH are charged as scans even with a TEXT index: a short operand\n * matches most of the label.\n */\nfunction seeks(ctx: CompileContext, node: NodeType, where: Where): boolean {\n for (const [key, value] of Object.entries(where)) {\n if (value === null || value === undefined) continue;\n const f = node.fields.get(key);\n if (f?.kind === \"cypher\" && f.computed) return false;\n }\n for (const [key, value] of Object.entries(where)) {\n if (value === null || value === undefined) continue;\n const f = node.fields.get(key);\n if (f?.kind === \"scalar\") {\n for (const [op, operand] of Object.entries(value as Where)) {\n if (operand === null || operand === undefined) continue;\n if (SEEK_OPS.has(op)) return true;\n if (RANGE_OPS.has(op) && !RANGE_UNINDEXABLE.has(f.type)) return true;\n }\n } else if (key === \"OR\" && includesOr(node, value as Where[])) {\n return true;\n } else if (anchorOf(ctx, node, key, value)) {\n return true;\n }\n }\n return false;\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 MAX_FILTER_DEPTH,\n MAX_LIST_FILTER,\n MAX_STRING_FILTER,\n} from \"./cost.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 && guarded(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 descend(ctx, f, () => {\n const pred = relationshipPredicate(ctx, variable, f, value as Where);\n return pred && guarded(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 && guarded(rule, pred);\n };\n }\n // `<field>Exists`: whether a single relationship is set. A related node\n // the reader may not see counts as none, as in every relationship\n // filter (a rule sees every node).\n if (key.endsWith(\"Exists\")) {\n const rel = node.fields.get(key.slice(0, -\"Exists\".length));\n if (rel?.kind === \"relationship\" && !rel.list) {\n checkFieldAuthentication(ctx, node.name, rel);\n const rule = fieldValidate(ctx, node, rel, variable, \"READ\");\n return (value) => {\n if (typeof value !== \"boolean\") return undefined;\n const pred = descend(ctx, rel, () =>\n relationshipExists(ctx, variable, rel, value),\n );\n return guarded(rule, pred);\n };\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 descend(ctx, rel, () => {\n const pred = connectionPredicate(\n ctx,\n variable,\n rel,\n value as Where,\n );\n return pred && guarded(rule, pred);\n });\n }\n }\n return undefined;\n };\n}\n\n/**\n * A filter on a field with field-level READ rules: it matches only rows\n * passing the rule. The rule is read as false where it is unknown (a null\n * property), so the guarded predicate is never NULL on a row failing it:\n * `NOT` over it is then true on every such row, whatever the hidden value,\n * instead of true exactly where the value fails the predicate. Under no\n * `NOT` the coalesce changes nothing (NULL and false both drop the row).\n */\nfunction guarded(rule: Expr | undefined, pred: Expr): Expr {\n return rule ? and(fn(\"coalesce\", rule, lit(false)), pred)! : pred;\n}\n\n/**\n * Compile one relationship level of a filter: deeper than\n * `maxFilterDepth` is refused, since each level multiplies the work by\n * the relationship's degree. Authorization rules are the schema's own,\n * and are not counted.\n */\nfunction descend<T>(\n ctx: CompileContext,\n rel: RelationshipField,\n f: () => T,\n): T {\n if (ctx.inAuth) return f();\n const depth = (ctx.filterDepth ?? 0) + 1;\n const max = ctx.maxFilterDepth ?? MAX_FILTER_DEPTH;\n if (depth > max) {\n throw requestError(\n \"BAD_USER_INPUT\",\n `the filter nests relationships deeper than ${max} levels (at ${rel.owner}.${rel.name})`,\n );\n }\n const outer = ctx.filterDepth;\n ctx.filterDepth = depth;\n try {\n return f();\n } finally {\n ctx.filterDepth = outer;\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\n/**\n * Filter operands are capped: an `in` list at `maxListFilter` items, a\n * string at `maxStringFilter` characters. Each is bound as a parameter\n * and kept with the cached compile, and an `in` list seeks once per\n * value. Authorization rules are the schema's own, and are not capped.\n */\nfunction checkOperand(ctx: CompileContext, op: string, value: unknown): void {\n if (ctx.inAuth) return;\n const maxList = ctx.maxListFilter ?? MAX_LIST_FILTER;\n const maxString = ctx.maxStringFilter ?? MAX_STRING_FILTER;\n const tooLong = (v: unknown) => typeof v === \"string\" && v.length > maxString;\n if (Array.isArray(value)) {\n if (value.length > maxList) {\n throw requestError(\n \"BAD_USER_INPUT\",\n `the ${op} filter takes at most ${maxList} items`,\n undefined,\n { maxListFilter: maxList },\n );\n }\n if (value.some(tooLong)) {\n throw stringTooLong(op, maxString);\n }\n } else if (tooLong(value)) {\n throw stringTooLong(op, maxString);\n }\n}\n\nconst stringTooLong = (op: string, max: number) =>\n requestError(\n \"BAD_USER_INPUT\",\n `the ${op} filter takes strings of at most ${max} characters`,\n undefined,\n { maxStringFilter: max },\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 if (op === \"caseInsensitive\") {\n for (const [ciOp, ciValue] of Object.entries(value as Where)) {\n if (ciValue !== null && ciValue !== undefined) {\n checkOperand(ctx, ciOp, ciValue);\n }\n }\n } else checkOperand(ctx, op, value);\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 \"includesAny\": {\n // `any(x IN $values WHERE x IN n.list)`: the engine seeks each\n // value in the list's RANGE index (G-72).\n const x = freshVar(ctx, \"value\");\n parts.push({\n kind: \"any\",\n variable: x,\n list: bind(ctx, value),\n where: bin(\"IN\", v(x), target),\n });\n continue;\n }\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) => fn(\"id\", v(x)),\n ),\n ];\n });\n if (lists.length === 0) return lit(0);\n return distinctCount(lists.reduce((a, b) => bin(\"+\", a, b)));\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(\n compareCount(\n ctx,\n rel,\n () => distinct(undefined),\n () => count(undefined),\n w,\n ),\n );\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\n/** `size([(this)-[:T]->(x:Target) | 1]) > 0` (or `= 0`), over every member. */\nfunction relationshipExists(\n ctx: CompileContext,\n variable: string,\n rel: RelationshipField,\n exists: boolean,\n): Expr {\n const counts = 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 fn(\n \"size\",\n related(\n ctx,\n variable,\n field,\n () => undefined,\n () => lit(1),\n ),\n );\n });\n ctx.reads.relationships.add(rel.type);\n const total =\n counts.length === 0 ? lit(0) : counts.reduce((a, b) => bin(\"+\", a, b));\n return bin(exists ? \">\" : \"=\", total, lit(0));\n}\n\n/**\n * `count: { gt: 2 }`, over the distinct related nodes. A bound that only\n * asks whether there are any (`gt: 0`, `eq: 0`, `lt: 1`, ...) compares\n * the relationships instead: there are related nodes exactly when there\n * are relationships, and counting those needs no dedupe.\n */\nfunction compareCount(\n ctx: CompileContext,\n rel: RelationshipField,\n nodes: () => Expr,\n edges: () => 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 const anyOrNone =\n op === \"lt\" || op === \"gte\" ? (n as number) <= 1 : n === 0;\n parts.push(bin(cypherOp, anyOrNone ? edges() : nodes(), 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 all = (projection: (x: string) => Expr) =>\n related(ctx, variable, rel, () => undefined, projection);\n parts.push(\n compareCount(\n ctx,\n rel,\n () => distinctCount(all((x) => fn(\"id\", v(x)))),\n () =>\n fn(\n \"size\",\n all(() => lit(1)),\n ),\n value[\"count\"] as Where,\n ),\n );\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, RULE_REFERENCES } from \"../model/types.js\";\nimport {\n ruleParts,\n testsRelationshipEnds,\n VIEWER_TEST,\n} from \"../model/desugar.js\";\nimport { memberFields } from \"../model/relations.js\";\nimport { and, bin, fn, lit, not, or, prop, v, 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 // A rule over the relationship's ends never grants here: it is decided\n // per relationship, where they are known (`propertyReadGuard`).\n const granted = rules.some(\n (r) =>\n !(r.requireAuthentication && !ctx.jwt) &&\n !testsRelationshipEnds(r.where) &&\n compileRule(ctx, undefined, \"\", r.where) === true,\n );\n return granted ? \"allowed\" : \"forbidden\";\n}\n\n/**\n * Reading a relationship property: as `propertyAccess`, and `\"row\"` when\n * the claims do not grant it but a rule over the relationship's ends (or\n * the caller's node) may, per relationship: see `propertyReadGuard`.\n */\nexport function propertyReadAccess(\n ctx: CompileContext,\n field: Parameters<typeof propertyAccess>[1],\n): ReturnType<typeof propertyAccess> | \"row\" {\n const access = propertyAccess(ctx, field, \"READ\");\n if (access !== \"forbidden\") return access;\n const row = (field.authorization?.validate ?? []).some(\n (r) =>\n r.operations.has(\"READ\") &&\n !(r.requireAuthentication && !ctx.jwt) &&\n (testsRelationshipEnds(r.where) || rulePartsHaveViewer(r.where)),\n );\n return row ? \"row\" : \"forbidden\";\n}\n\nconst rulePartsHaveViewer = (where: unknown): boolean =>\n ruleParts(where).has(\"viewer\");\n\n/**\n * The per-relationship condition for reading a relationship property\n * whose READ rules test `source`, `target`, `edge` or `viewer`, with the\n * statement's owner-side, target-side and relationship variables of\n * `rel`. Any rule grants. Undefined when the claims alone grant; false\n * when nothing can.\n */\nexport function propertyReadGuard(\n ctx: CompileContext,\n rel: RelationshipField,\n field: Parameters<typeof propertyAccess>[1],\n vars: { owner: string; target: string; rel: string },\n): Expr | false | undefined {\n if (ctx.inAuth || bypassed(ctx, undefined)) return undefined;\n const rules = (field.authorization?.validate ?? []).filter((r) =>\n r.operations.has(\"READ\"),\n );\n if (rules.length === 0) return undefined;\n const source = ctx.model.nodes.get(rel.owner);\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 ends: RuleEnds | undefined =\n source && target\n ? {\n source: { node: source, variable: vars.owner },\n target: { node: target, variable: vars.target },\n edge: props ? { props, variable: vars.rel } : undefined,\n }\n : undefined;\n const folded = foldOr(\n rules.map((r) =>\n (r.requireAuthentication && !ctx.jwt) ||\n (!ends && testsRelationshipEnds(r.where))\n ? false\n : compileRule(ctx, undefined, \"\", r.where, ends),\n ),\n );\n return folded === true ? undefined : folded === false ? false : folded;\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 if (op === \"READ\" && propertyReadAccess(ctx, field) === \"row\") {\n throw requestError(\n \"FORBIDDEN\",\n `${type}.${field.name}: its READ rules decide per relationship, so it cannot be filtered, sorted or aggregated by`,\n );\n }\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 * A masked field's stored `raw` value as the reader may see it, decided by\n * the claims alone (for values no statement can test, such as a node's\n * values before a write): the first mask whose `unless` the claims do not\n * settle true substitutes its value, so a mask that depends on the node\n * reads as masked.\n */\nexport function claimsMaskedValue(\n ctx: CompileContext,\n node: NodeType,\n field: { authorization?: Authorization | undefined },\n raw: unknown,\n): unknown {\n const masks = field.authorization?.mask;\n if (!masks?.length || ctx.inAuth || bypassed(ctx, node)) return raw;\n const probe = { ...ctx, params: {}, vars: new Set(ctx.vars) };\n for (const m of masks) {\n if (compileRule(probe, node, \"probe\", m.unless) !== true) {\n return m.value ?? null;\n }\n }\n return raw;\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/**\n * `$viewer` in a @cypher statement: the caller's node's `@key`. The claim\n * itself when `@viewer` maps to the key; otherwise read in the statement\n * with one seek by the claim, so a statement matching `{key: $viewer}`\n * keeps working when `@viewer` moves to an opaque subject. Null signed\n * out, for a claim that is not a string or number, and for a token\n * naming no node.\n */\nexport function viewerKey(ctx: CompileContext): Expr {\n const mapping = ctx.model.viewer;\n const node = mapping && ctx.model.nodes.get(mapping.type);\n if (!mapping || !node || !ctx.jwt) return lit(null);\n const id = claim(ctx, mapping.claim, true);\n if (typeof id !== \"string\" && typeof id !== \"number\") return lit(null);\n if (mapping.field === node.key.name) return bind(ctx, id);\n const field = node.fields.get(mapping.field);\n const property = field?.kind === \"scalar\" ? field.property : mapping.field;\n const v = freshVar(ctx, \"viewer\");\n return fn(\"head\", {\n kind: \"comprehension\",\n pattern: {\n start: {\n variable: v,\n labels: [node.labels[0]!],\n properties: [{ key: property, value: bind(ctx, id) }],\n },\n hops: [],\n },\n where: undefined,\n projection: {\n kind: \"prop\",\n target: { kind: \"var\", name: v },\n key: node.key.property,\n },\n });\n}\n\n/**\n * `@authorization` on a Query or Mutation @cypher field: its validate\n * rules, over claims and the caller's node. Throws UNAUTHENTICATED or\n * FORBIDDEN when the claims alone decide against the request; otherwise\n * the condition left for the database (a `viewer` test), or undefined\n * when the call is allowed.\n */\nexport function rootFieldGuard(\n ctx: CompileContext,\n field: {\n name: string;\n owner: string;\n authorization?: Authorization | undefined;\n },\n): Expr | undefined {\n const rules = field.authorization?.validate ?? [];\n if (ctx.inAuth || rules.length === 0 || bypassed(ctx, undefined)) {\n return undefined;\n }\n const label = `${field.owner}.${field.name}`;\n if (rules.every((r) => r.requireAuthentication) && !ctx.jwt) {\n throw requestError(\n \"UNAUTHENTICATED\",\n `${label} needs an authenticated request`,\n );\n }\n const folded = foldOr(\n rules.map((r) =>\n r.requireAuthentication && !ctx.jwt\n ? false\n : compileRule(ctx, undefined, \"\", r.where),\n ),\n );\n if (folded === false) {\n throw requestError(\"FORBIDDEN\", `not allowed to run ${label}`);\n }\n return toExpr(folded);\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, ends, (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, ends, (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 plain = withoutViewer(ctx, node, value);\n if (typeof plain === \"boolean\") {\n parts.push(plain);\n continue;\n }\n const bound = substitute(plain, ctx, { node: { node, variable } });\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 refs: RuleRefs,\n compile: (where: Where) => Expr | undefined,\n): Folded {\n const bound = substitute(value, ctx, refs);\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 nodes (and edge) a rule string's `${node.…}`-style placeholders read. */\ninterface RuleRefs {\n node?: { node: NodeType; variable: string };\n source?: { node: NodeType; variable: string };\n target?: { node: NodeType; variable: string };\n edge?: { props: RelationshipPropertiesType; variable: string } | undefined;\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 if (ctx.model.abstracts.has(rel.target)) {\n // The declared field to an interface or union: each member's rules,\n // on the targets that are that member.\n const perMember = memberFields(ctx.model, rel).map((member) => ({\n member,\n rule: relationshipRules(ctx, member, op, vars, mode),\n }));\n if (perMember.every(({ rule }) => rule === undefined)) return undefined;\n if (perMember.every(({ rule }) => rule === false)) return false;\n const all = foldAnd(\n perMember.map(({ member, rule }): Folded => {\n if (rule === undefined) return true;\n const isMember: Expr = {\n kind: \"hasLabels\",\n variable: vars.target,\n labels: [ctx.model.nodes.get(member.target)!.labels[0]!],\n };\n return bin(\"OR\", not(isMember), rule === false ? lit(false) : rule);\n }),\n );\n return all === true ? undefined : all === false ? false : all;\n }\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 !== rel.via &&\n f.type === rel.type &&\n f.members.includes(rel.owner) &&\n f.direction !== rel.direction\n ) {\n // A field to an interface or union answers with its copy for this\n // side's type.\n const back = memberFields(ctx.model, f).find(\n (m) => m.target === rel.owner,\n );\n if (back && hasRules(back)) out.push({ field: back, 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 whose placeholders are read in the statement, not bound\n * from the request: `${viewer.field}` (the caller's node's fields, found by\n * the `@viewer` claim; the field the claim maps to is the claim itself)\n * and `${node.path}` / `${source.path}` / `${target.path}` /\n * `${edge.property}` (the rule's own node, ends or edge: a scalar field,\n * or one reached through single relationships). `${jwt.…}` and\n * `${context.…}` parts are bound as usual. Unknown without the claim or\n * when a reference has nothing to read.\n */\nfunction referenceString(\n ctx: CompileContext,\n value: string,\n refs: RuleRefs | undefined,\n): { ok: boolean; value: unknown } {\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 const mapping = ctx.model.viewer;\n const node = mapping && ctx.model.nodes.get(mapping.type);\n const id = mapping && claim(ctx, mapping.claim, true);\n if (\n !mapping ||\n !node ||\n (typeof id !== \"string\" && typeof id !== \"number\")\n ) {\n ok = false;\n continue;\n }\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 x = freshVar(ctx, \"viewer\");\n flush();\n parts.push(\n fn(\"head\", {\n kind: \"comprehension\",\n pattern: {\n start: {\n variable: x,\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: prop(v(x), property),\n }),\n );\n continue;\n }\n if (RULE_REFERENCES.has(source)) {\n const read = ruleReference(ctx, refs, source, path);\n if (!read) {\n ok = false;\n continue;\n }\n flush();\n parts.push(read);\n continue;\n }\n let resolved =\n source === \"jwt\"\n ? claim(ctx, path)\n : lookupPath(ctx.requestContext, path);\n if (source === \"context\") {\n ctx.contextReads.push([path, resolved]);\n if (resolved === undefined || resolved === null) {\n resolved = unknownContext(ctx, path);\n }\n }\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(\n parts.length === 1 ? parts[0]! : parts.reduce((a, b) => bin(\"+\", a, b)),\n ),\n };\n}\n\n/**\n * `${node.to.key}`: a value of the rule's own node, read in the statement.\n * Every step but the last is a single relationship (the model checks it):\n * `head([(n)-[:REQUESTED]->(x:Person) | x.key])`. The stored value, as\n * every rule sees it.\n */\nfunction ruleReference(\n ctx: CompileContext,\n refs: RuleRefs | undefined,\n source: string,\n path: string,\n): Expr | undefined {\n if (source === \"edge\") {\n const edge = refs?.edge;\n const f = edge?.props.fields.get(path);\n return edge && f ? prop(v(edge.variable), f.property) : undefined;\n }\n const start = refs?.[source as \"node\" | \"source\" | \"target\"];\n if (!start) return undefined;\n const steps = path.split(\".\");\n let node = start.node;\n const hops: Array<{\n rel: { type: string; direction: \"IN\" | \"OUT\" | \"BOTH\" };\n node: { variable: string; labels: string[] };\n }> = [];\n let variable = start.variable;\n for (const [i, step] of steps.entries()) {\n const f = node.fields.get(step);\n if (i === steps.length - 1) {\n if (f?.kind !== \"scalar\") return undefined;\n const read = prop(v(variable), f.property);\n if (hops.length === 0) return read;\n return fn(\"head\", {\n kind: \"comprehension\",\n pattern: { start: { variable: start.variable, labels: [] }, hops },\n where: undefined,\n projection: read,\n });\n }\n if (f?.kind !== \"relationship\" || f.list) return undefined;\n const target = ctx.model.nodes.get(f.target);\n if (!target) return undefined;\n variable = freshVar(ctx, `${start.variable}_${step}`);\n hops.push({\n rel: {\n type: f.type,\n direction: f.queryDirection === \"UNDIRECTED\" ? \"BOTH\" : f.direction,\n },\n node: { variable, labels: [target.labels[0]!] },\n });\n node = target;\n }\n return undefined;\n}\n\n/**\n * A rule's node filter as a request with no viewer reads it: every\n * `isViewer` test is false (see `VIEWER_TEST`), and the branches that\n * decides are folded away, so a signed-out read does not walk a pattern\n * that cannot match. True or false when the filter is decided; what is\n * left is substituted as usual, where a viewer test the fold kept (under\n * `all`, through an abstract type or a connection) still reads false.\n */\nfunction withoutViewer(\n ctx: CompileContext,\n node: NodeType,\n where: unknown,\n): boolean | unknown {\n const mapping = ctx.model.viewer;\n if (!mapping) return where;\n const id = claim(ctx, mapping.claim, true);\n if (id !== undefined && id !== null) return where;\n const fold = (owner: NodeType, w: unknown): boolean | unknown => {\n if (!isRecord(w)) return w;\n const out: Where = {};\n for (const [key, value] of Object.entries(w)) {\n if (key === \"AND\" || key === \"OR\") {\n if (!Array.isArray(value)) {\n out[key] = value;\n continue;\n }\n const items = value.map((x) => fold(owner, x));\n const decides = key === \"AND\" ? false : true;\n if (items.includes(decides)) {\n if (key === \"AND\") return false;\n continue;\n }\n const rest = items.filter((x) => typeof x !== \"boolean\");\n if (rest.length === 0 && key === \"OR\") return false;\n if (rest.length > 0) out[key] = rest;\n continue;\n }\n if (key === \"NOT\") {\n const inner = fold(owner, value);\n if (inner === true) return false;\n if (inner !== false) out[key] = inner;\n continue;\n }\n if (isRecord(value) && VIEWER_TEST in value) return false;\n const f = owner.fields.get(key);\n const target =\n f?.kind === \"relationship\" ? ctx.model.nodes.get(f.target) : undefined;\n if (!f || f.kind !== \"relationship\" || !target || !isRecord(value)) {\n out[key] = value;\n continue;\n }\n if (!f.list) {\n const inner = fold(target, value);\n if (inner === false) return false;\n if (inner !== true) {\n out[key] = inner;\n continue;\n }\n // Every node passes: what is left is that there is one.\n const exists = `${key}Exists`;\n if (w[exists] === false) return false;\n out[exists] = true;\n continue;\n }\n const quantified: Where = {};\n for (const [q, inner] of Object.entries(value)) {\n const r = q === \"all\" ? inner : fold(target, inner);\n if (r === false) {\n if (q === \"some\" || q === \"single\") return false;\n if (q === \"none\") continue;\n }\n quantified[q] = typeof r === \"boolean\" ? inner : r;\n }\n if (Object.keys(quantified).length > 0) out[key] = quantified;\n }\n return Object.keys(out).length === 0 ? true : out;\n };\n return fold(node, where);\n}\n\nconst isRecord = (x: unknown): x is Where =>\n typeof x === \"object\" && x !== null && !Array.isArray(x);\n\n/** The operators of a test no value passes: `isViewer` with no viewer. */\nconst NOBODY: Readonly<Record<string, unknown>> = Object.freeze({ in: [] });\n\n/**\n * A `$context` value the request lacks, where `unknownContext` asks to\n * keep the test (the access analyses, which have no request context): a\n * stand-in bound like any value, so the test reads as one that may or may\n * not hold for a row, never as one that cannot.\n */\nfunction unknownContext(ctx: CompileContext, path: string): unknown {\n return ctx.unknownContext ? `$context.${path}` : undefined;\n}\n\nfunction substitute(\n value: unknown,\n ctx: CompileContext,\n refs?: RuleRefs,\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 (\n typeof value === \"string\" &&\n [...value.matchAll(PLACEHOLDER)].some(\n (m) => m[1] === \"viewer\" || RULE_REFERENCES.has(m[1]!),\n )\n ) {\n return referenceString(ctx, value, refs);\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 if (v === undefined || v === null) v = unknownContext(ctx, path);\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 if (v === undefined || v === null)\n v = unknownContext(ctx, value.slice(9));\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, refs));\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 if (VIEWER_TEST in value && ctx.model.viewer) {\n // `isViewer` with no viewer: no node is the viewer (see VIEWER_TEST).\n const id = claim(ctx, ctx.model.viewer.claim, true);\n if (id === undefined || id === null) return { ok: true, value: NOBODY };\n }\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value)) {\n const r = substitute(v, ctx, refs);\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","// Helpers every read shares: finishing a compiled read, and the READ rule\n// checks that aggregates, counts and sorts apply.\n\nimport type { Statement } from \"../../driver.js\";\nimport { requestError } from \"../../errors.js\";\nimport type { NodeType, ScalarField } from \"../../model/types.js\";\nimport { authValidate, fieldValidate, maskSettled } from \"../auth.js\";\nimport { bind, type CompileContext } from \"../context.js\";\nimport { fn, lit, printClauses, v, type Clause, type Expr } from \"../cypher.js\";\nimport type { SeekExpectation, ReadSet, CompiledRead } from \"./types.js\";\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 ...(ctx.reads.opaque ? { opaque: true } : {}),\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 */\nexport function 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\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 */\nexport function 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\nexport function assertNoneDenied(\n row: Record<string, unknown> | undefined,\n): 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 */\nexport function 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\n/** A rule condition as a WHERE predicate: an unknown result excludes. */\nexport function coalesceFalse(e: Expr | undefined): Expr | undefined {\n return e && fn(\"coalesce\", e, lit(false));\n}\n\n/** Stop a count at `cap` matches (`maxTotalCount`): the scan ends there. */\nexport function countCap(\n ctx: CompileContext,\n cap: number | undefined,\n): Clause[] {\n return cap === undefined\n ? []\n : [{ kind: \"with\", items: [{ expr: v(\"this\") }], limit: bind(ctx, cap) }];\n}\n","// A relationship quantifier whose filter is empty is left out of the\n// statement, so a filter emptied by unset variables costs nothing. Written\n// as a literal `{}` in the document, though, it can only have meant \"has\n// any\" (or \"has none\", \"has exactly one\"), and leaving it out would match\n// every row without a word. It is refused, naming the count filter that\n// asks for it: by a validation rule, so `persist()` and `buildManifest()`\n// fail on it, and again when arguments are read, for servers that validate\n// with the standard rules only. An empty `all` holds on every row, which is\n// what leaving it out gives, so it stays allowed.\n\nimport {\n GraphQLError,\n getNullableType,\n isInputObjectType,\n isListType,\n Kind,\n type GraphQLInputType,\n type ObjectFieldNode,\n type ValidationRule,\n type ValueNode,\n} from \"graphql\";\n\nconst QUANTIFIERS = [\"some\", \"all\", \"none\", \"single\"];\n\nconst INSTEAD = new Map([\n [\"some\", 'ask `count: { gt: 0 }` for \"has any\"'],\n [\"none\", 'ask `count: { eq: 0 }` for \"has none\"'],\n [\"single\", 'ask `count: { eq: 1 }` for \"has exactly one\"'],\n]);\n\n/**\n * An object value with nothing in it, written out in the document: `{}`,\n * or only such objects (`{ node: {} }`). A variable or a value anywhere\n * makes it non-empty here, even if it turns out null at run time.\n */\nfunction literallyEmpty(value: ValueNode): boolean {\n return (\n value.kind === Kind.OBJECT &&\n value.fields.every((f) => literallyEmpty(f.value))\n );\n}\n\n/**\n * The first literal empty `some`, `none` or `single` in an argument value\n * of `type`, as an error. `name` is the field (or argument) that holds\n * `value`.\n */\nexport function emptyQuantifier(\n value: ValueNode,\n type: GraphQLInputType,\n name: string,\n): GraphQLError | undefined {\n const t = getNullableType(type);\n if (isListType(t)) {\n const items = value.kind === Kind.LIST ? value.values : [value];\n for (const item of items) {\n const found = emptyQuantifier(item, t.ofType, name);\n if (found) return found;\n }\n return undefined;\n }\n if (!isInputObjectType(t) || value.kind !== Kind.OBJECT) return undefined;\n const fields = t.getFields();\n // The relationship and connection filter types are the input types\n // that take all four quantifiers.\n const quantified = QUANTIFIERS.every((q) => q in fields);\n for (const field of value.fields) {\n const def = fields[field.name.value];\n if (!def) continue;\n const instead = quantified ? INSTEAD.get(field.name.value) : undefined;\n if (instead !== undefined && literallyEmpty(field.value)) {\n return refusal(name, field, instead);\n }\n const found = emptyQuantifier(field.value, def.type, field.name.value);\n if (found) return found;\n }\n return undefined;\n}\n\nfunction refusal(\n name: string,\n field: ObjectFieldNode,\n instead: string,\n): GraphQLError {\n return new GraphQLError(\n `\\`${name}: { ${field.name.value}: {} }\\` has an empty filter, which is left out and would match every row; ${instead}`,\n { nodes: field },\n );\n}\n\n/** Refuses a literal empty `some`, `none` or `single` (`some: {}`). */\nexport const emptyQuantifierRule: ValidationRule = (context) => ({\n Argument(node) {\n const arg = context.getArgument();\n if (!arg) return;\n const found = emptyQuantifier(node.value, arg.type, node.name.value);\n if (found) context.reportError(found);\n },\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\";\nimport { emptyQuantifier } from \"../quantifier-rule.js\";\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/**\n * `ctx` with `values` in place of the coerced variables they name, on\n * graphql 16 and 17 alike.\n */\nexport function withVariables(\n ctx: SelectionContext,\n values: Record<string, unknown>,\n): SelectionContext {\n const v = ctx.variables;\n return {\n ...ctx,\n variables: GRAPHQL_17\n ? { ...v, coerced: { ...(v[\"coerced\"] as object), ...values } }\n : { ...v, ...values },\n };\n}\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 // Validated documents never hold one; a server that validates with the\n // standard rules only still gets the refusal here.\n for (const arg of node.arguments ?? []) {\n const argDef = def.args.find((a) => a.name === arg.name.value);\n if (!argDef) continue;\n const found = emptyQuantifier(arg.value, argDef.type, arg.name.value);\n if (found) throw found;\n }\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","// 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\n/** `node:crypto` where there is one: its HMAC is native. */\nconst nodeCrypto = (() => {\n try {\n const process = (\n globalThis as {\n process?: { getBuiltinModule?: (id: string) => unknown };\n }\n ).process;\n return process?.getBuiltinModule?.(\"node:crypto\") as\n | {\n createHmac(\n algorithm: string,\n key: Uint8Array,\n ): {\n update(data: string): { digest(): Uint8Array };\n };\n }\n | undefined;\n } catch {\n return undefined;\n }\n})();\n\n/** Secrets as key bytes: a server signs every cursor with the same one. */\nconst keys = new Map<string, Uint8Array>();\n\nfunction sign(secret: string, payload: string): Uint8Array {\n let key = keys.get(secret);\n if (!key) {\n if (keys.size >= 16) keys.clear();\n key = new TextEncoder().encode(secret);\n keys.set(secret, key);\n }\n // The portable implementation serves browsers (the WASM binding) and\n // Node versions without `process.getBuiltinModule`.\n const digest = nodeCrypto\n ? new Uint8Array(\n nodeCrypto.createHmac(\"sha256\", key).update(payload).digest(),\n )\n : hmacSha256(key, new TextEncoder().encode(payload));\n return digest.slice(0, SIGNATURE_BYTES);\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","// Sort keys, limits and paging: `sort`, `limit`, `first` / `after`,\n// `last` / `before`, and the keyset predicate a cursor turns into.\n\nimport { requestError } from \"../../errors.js\";\nimport type {\n NodeType,\n RelationshipPropertiesType,\n PageLimit,\n ScalarField,\n} from \"../../model/types.js\";\nimport { checkFieldAuthentication, checkPropertyAccess } from \"../auth.js\";\nimport { bind, type CompileContext } from \"../context.js\";\nimport { decodeCursor } from \"../cursor.js\";\nimport {\n and,\n bin,\n isNull,\n lit,\n or,\n prop,\n v,\n type Expr,\n type SortItem,\n} from \"../cypher.js\";\nimport type { Args } from \"./types.js\";\nimport { refuseRowRules } from \"./common.js\";\n\nexport interface 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// ---------------------------------------------------------------------------\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 */\nexport function 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 */\nexport function 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\nexport function sortSignature(sort: SortKey[]): string {\n return sort\n .map((k) => `${k.edge ? \"edge.\" : \"\"}${k.field.name}:${k.direction}`)\n .join(\",\");\n}\n\nexport function 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\nexport function cursorValues(\n variable: string,\n sort: SortKey[],\n edge?: string,\n): 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. */\nexport function 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 */\nexport function 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","// Value rules a field declares with @length, @pattern, @format, @range,\n// @multipleOf and @size, and the one function that applies them. Pure:\n// the model build uses it to check defaults, the mutation path to check\n// inputs before the transaction and computed values inside it, so a rule\n// has one implementation and one meaning.\n//\n// Semantics, each chosen on purpose (docs/design/graphql-input-validation.md):\n// null and absent values pass (nullability is the type's business); a\n// string's length is its Unicode code points, as in JSON Schema and in\n// LoraDB's size(); a pattern must match the whole value; on a list field\n// @size is about the list and every other rule about each item.\n\n/** The rules of one field. Arguments map onto JSON Schema keywords. */\nexport interface FieldConstraints {\n length?: { min?: number; max?: number; message?: string };\n pattern?: { source: string; regex: RegExp; message?: string };\n format?: { name: string; message?: string };\n range?: {\n min?: number;\n max?: number;\n exclusiveMin?: number;\n exclusiveMax?: number;\n message?: string;\n };\n multipleOf?: { value: number; message?: string };\n size?: { min?: number; max?: number; unique: boolean; message?: string };\n /** `@normalize`: applied before the rules, and to what is stored. */\n normalize?: {\n trim: boolean;\n unicode?: \"NFC\" | \"NFD\" | \"NFKC\" | \"NFKD\";\n case?: \"LOWER\" | \"UPPER\";\n emptyToNull: boolean;\n };\n}\n\n/** One rule a value breaks. `rule` is the JSON Schema keyword. */\nexport interface RuleFailure {\n rule: string;\n /** The rule's own numbers and names, for clients that localise. */\n params: Record<string, unknown>;\n message: string;\n /** The item of a list field the failure is about. */\n index?: number;\n}\n\ninterface Format {\n test: (value: string) => boolean;\n message: string;\n}\n\n/** Longest input any format looks at: longer never matches. */\nconst FORMAT_MAX_LENGTH = 2048;\n\n// Every expression here is linear: no nested unbounded repetition, and\n// inner repetitions are bounded.\nconst LABEL = \"[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?\";\n// The WHATWG HTML rule for input[type=email].\nconst EMAIL = new RegExp(\n `^[a-zA-Z0-9.!#$%&'*+/=?^_\\`{|}~-]{1,64}@${LABEL}(?:\\\\.${LABEL})*$`,\n);\nconst EMAIL_STRICT = new RegExp(\n `^[a-zA-Z0-9.!#$%&'*+/=?^_\\`{|}~-]{1,64}@(?:${LABEL}\\\\.)+[a-zA-Z]{2,63}$`,\n);\nconst HOSTNAME = new RegExp(`^${LABEL}(?:\\\\.${LABEL})*$`);\nconst IPV4 =\n /^(?:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)$/;\nconst HEX_GROUP = /^[0-9a-fA-F]{1,4}$/;\nconst UUID =\n /^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$/;\nconst SLUG = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;\nconst HEX_COLOR = /^#(?:[0-9a-fA-F]{3,4}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$/;\nconst ULID = /^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$/;\nconst E164 = /^\\+[1-9]\\d{6,14}$/;\n\n/** RFC 4291 text form, with an optional embedded IPv4 tail; no zone id. */\nfunction isIpv6(value: string): boolean {\n const halves = value.split(\"::\");\n if (halves.length > 2) return false;\n const groups = (part: string): string[] | undefined => {\n if (part === \"\") return [];\n const out = part.split(\":\");\n return out.every((g) => g !== \"\") ? out : undefined;\n };\n const head = groups(halves[0]!);\n const tail = halves.length === 2 ? groups(halves[1]!) : [];\n if (!head || !tail) return false;\n const all = [...head, ...tail];\n let count = all.length;\n const last = all[all.length - 1];\n if (last !== undefined && last.includes(\".\")) {\n if (!IPV4.test(last)) return false;\n all.pop();\n count += 1; // an IPv4 tail stands for two groups\n }\n if (!all.every((g) => HEX_GROUP.test(g))) return false;\n return halves.length === 2 ? count < 8 : count === 8;\n}\n\nfunction isHttpUrl(value: string): boolean {\n try {\n const { protocol } = new URL(value);\n return protocol === \"http:\" || protocol === \"https:\";\n } catch {\n return false;\n }\n}\n\n/**\n * The formats `@format(as:)` knows. Named after JSON Schema's where the\n * meaning matches, and differently where it does not (`url` is the WHATWG\n * parser with an http/https allow-list, not RFC 3986; `e164` is a shape,\n * not proof a number exists).\n */\nexport const FORMATS: Readonly<Record<string, Format>> = Object.freeze({\n email: {\n test: (v) => v.length <= 254 && EMAIL.test(v),\n message: \"must be an email address\",\n },\n \"email-strict\": {\n test: (v) => v.length <= 254 && EMAIL_STRICT.test(v),\n message: \"must be an email address with a top-level domain\",\n },\n url: { test: isHttpUrl, message: \"must be an http or https URL\" },\n uuid: { test: (v) => UUID.test(v), message: \"must be a UUID\" },\n hostname: {\n test: (v) => v.length <= 253 && HOSTNAME.test(v),\n message: \"must be a host name\",\n },\n ipv4: { test: (v) => IPV4.test(v), message: \"must be an IPv4 address\" },\n ipv6: { test: isIpv6, message: \"must be an IPv6 address\" },\n slug: {\n test: (v) => SLUG.test(v),\n message: \"must be lower-case letters and digits separated by hyphens\",\n },\n \"hex-color\": {\n test: (v) => HEX_COLOR.test(v),\n message: \"must be a hex colour such as #1b6dff\",\n },\n ulid: {\n test: (v) => ULID.test(v),\n message: \"must be a ULID\",\n },\n e164: {\n test: (v) => E164.test(v),\n message:\n \"must be a phone number in international form, such as +31201234567\",\n },\n});\n\nfunction normalizeText(\n n: NonNullable<FieldConstraints[\"normalize\"]>,\n value: string,\n): string {\n let out = n.trim ? value.trim() : value;\n if (n.unicode) out = out.normalize(n.unicode);\n // Locale-independent on purpose: a stored value must not depend on\n // where the server runs.\n if (n.case === \"LOWER\") out = out.toLowerCase();\n else if (n.case === \"UPPER\") out = out.toUpperCase();\n return out;\n}\n\n/**\n * `value` as `@normalize` stores it: trimmed, normalised and case-mapped,\n * in that order, and null for an empty string under `emptyToNull`. Items\n * of a list are normalised one by one. Anything but a string is returned\n * as it is.\n */\nexport function normalizeValue(c: FieldConstraints, value: unknown): unknown {\n const n = c.normalize;\n if (!n) return value;\n if (Array.isArray(value)) {\n return value.map((item) =>\n typeof item === \"string\" ? normalizeText(n, item) : item,\n );\n }\n if (typeof value !== \"string\") return value;\n const out = normalizeText(n, value);\n return n.emptyToNull && out === \"\" ? null : out;\n}\n\n/** Unicode code points in `s`. */\nexport function codePoints(s: string): number {\n let n = 0;\n for (const _ of s) n++;\n return n;\n}\n\nconst plural = (n: number, word: string) => `${n} ${word}${n === 1 ? \"\" : \"s\"}`;\n\n/** Whether `value / divisor` is an integer, within float tolerance. */\nfunction isMultiple(value: number, divisor: number): boolean {\n if (Number.isInteger(value) && Number.isInteger(divisor)) {\n return value % divisor === 0;\n }\n // `0.3 % 0.1` is not 0 in IEEE arithmetic: compare the quotient with\n // its rounding instead, scaled to the magnitude of the quotient.\n const quotient = value / divisor;\n return (\n Math.abs(quotient - Math.round(quotient)) <=\n 1e-9 * Math.max(1, Math.abs(quotient))\n );\n}\n\nfunction checkScalar(c: FieldConstraints, value: unknown): RuleFailure[] {\n const out: RuleFailure[] = [];\n if (typeof value === \"string\") {\n if (c.length) {\n const { min, max, message } = c.length;\n // A string has at most as many code points as UTF-16 units, so the\n // count is only needed when the cheap length does not settle it.\n if (max !== undefined && value.length > max && codePoints(value) > max) {\n out.push({\n rule: \"maxLength\",\n params: { limit: max },\n message: message ?? `must be at most ${plural(max, \"character\")}`,\n });\n }\n if (\n min !== undefined &&\n (value.length < min || codePoints(value) < min)\n ) {\n out.push({\n rule: \"minLength\",\n params: { limit: min },\n message: message ?? `must be at least ${plural(min, \"character\")}`,\n });\n }\n }\n // A value over its length bound is not handed to an expression: the\n // bound is what keeps the match cheap.\n const tooLong = out.some((f) => f.rule === \"maxLength\");\n if (c.format && !tooLong) {\n const format = FORMATS[c.format.name]!;\n if (value.length > FORMAT_MAX_LENGTH || !format.test(value)) {\n out.push({\n rule: \"format\",\n params: { format: c.format.name },\n message: c.format.message ?? format.message,\n });\n }\n }\n if (c.pattern && !tooLong && !c.pattern.regex.test(value)) {\n out.push({\n rule: \"pattern\",\n params: { pattern: c.pattern.source },\n message: c.pattern.message ?? \"does not match the required pattern\",\n });\n }\n return out;\n }\n if (typeof value === \"number\" || typeof value === \"bigint\") {\n // Bounds are floats: a bigint beyond the safe range is compared\n // approximately, which the reference says.\n const n = Number(value);\n if (!Number.isFinite(n)) {\n if (c.range || c.multipleOf) {\n out.push({\n rule: \"finite\",\n params: {},\n message: \"must be a finite number\",\n });\n }\n return out;\n }\n if (c.range) {\n const { min, max, exclusiveMin, exclusiveMax, message } = c.range;\n const fail = (\n rule: string,\n limit: number,\n comparison: string,\n text: string,\n ) =>\n out.push({\n rule,\n params: { limit, comparison },\n message: message ?? text,\n });\n if (min !== undefined && n < min) {\n fail(\"minimum\", min, \">=\", `must be at least ${min}`);\n }\n if (exclusiveMin !== undefined && n <= exclusiveMin) {\n fail(\n \"exclusiveMinimum\",\n exclusiveMin,\n \">\",\n `must be greater than ${exclusiveMin}`,\n );\n }\n if (max !== undefined && n > max) {\n fail(\"maximum\", max, \"<=\", `must be at most ${max}`);\n }\n if (exclusiveMax !== undefined && n >= exclusiveMax) {\n fail(\n \"exclusiveMaximum\",\n exclusiveMax,\n \"<\",\n `must be less than ${exclusiveMax}`,\n );\n }\n }\n if (c.multipleOf && !isMultiple(n, c.multipleOf.value)) {\n out.push({\n rule: \"multipleOf\",\n params: { multipleOf: c.multipleOf.value },\n message:\n c.multipleOf.message ?? `must be a multiple of ${c.multipleOf.value}`,\n });\n }\n }\n return out;\n}\n\n/**\n * The rules `value` breaks, in declaration order; empty when it is valid.\n * A list is checked as a list (`@size`) and then item by item.\n */\nexport function checkValue(c: FieldConstraints, value: unknown): RuleFailure[] {\n if (value === null || value === undefined) return [];\n if (!Array.isArray(value)) return checkScalar(c, value);\n const out: RuleFailure[] = [];\n if (c.size) {\n const { min, max, unique, message } = c.size;\n if (max !== undefined && value.length > max) {\n out.push({\n rule: \"maxItems\",\n params: { limit: max },\n message: message ?? `must have at most ${plural(max, \"item\")}`,\n });\n }\n if (min !== undefined && value.length < min) {\n out.push({\n rule: \"minItems\",\n params: { limit: min },\n message: message ?? `must have at least ${plural(min, \"item\")}`,\n });\n }\n // Scalars only reach here, so a Set of their text is exact. The list\n // is not walked when it is already over its size.\n if (\n unique &&\n (max === undefined || value.length <= max) &&\n new Set(value.map((v) => `${typeof v}:${String(v)}`)).size !==\n value.length\n ) {\n out.push({\n rule: \"uniqueItems\",\n params: {},\n message: message ?? \"must not contain the same item twice\",\n });\n }\n }\n for (const [index, item] of value.entries()) {\n for (const failure of checkScalar(c, item)) out.push({ ...failure, index });\n }\n return out;\n}\n\n/** Budget of one probe match; a linear match takes microseconds. */\nconst PROBE_BUDGET_MS = 25;\nconst now = () => globalThis.performance.now();\n\n/**\n * Why `regex` is not safe to run on client input of up to `maxLength`\n * characters, or undefined. JavaScript's engine backtracks, so a pattern\n * such as `(a+)+` takes seconds on thirty characters. This runs the\n * compiled pattern on inputs built to make it backtrack (a character it\n * accepts, repeated, then one it rejects) and refuses a pattern that\n * overruns the budget. A probe, not a proof: it finds the repetition\n * mistakes people make, and `@length(max:)` bounds everything else.\n */\nexport function probePattern(\n regex: RegExp,\n source: string,\n maxLength: number,\n): string | undefined {\n // Characters the pattern mentions, and a few every pattern meets.\n const seeds = new Set<string>([\"a\", \"A\", \"0\", \" \", \"-\", \".\", \"@\", \"_\"]);\n for (const ch of source.replace(/\\\\./g, \"\")) {\n if (/[\\p{L}\\p{N}]/u.test(ch)) seeds.add(ch);\n }\n const candidates = [...seeds].slice(0, 16);\n const pairs = candidates\n .slice(0, 4)\n .flatMap((a) => candidates.slice(0, 4).map((b) => a + b))\n .filter((p) => p[0] !== p[1]);\n const lengths = [\n ...[12, 16, 20, 24, 28, 32].filter((n) => n < maxLength),\n Math.min(maxLength, 5000),\n ];\n const slow = (input: string): boolean => {\n // Best of three: one slow run may be the machine, three are the pattern.\n for (let attempt = 0; attempt < 3; attempt++) {\n const started = now();\n regex.test(input);\n if (now() - started < PROBE_BUDGET_MS) return false;\n }\n return true;\n };\n for (const n of lengths) {\n for (const unit of [...candidates, ...pairs]) {\n const body = unit.repeat(Math.ceil(n / unit.length)).slice(0, n);\n // A tail no character class of a sane pattern accepts forces the\n // engine to try every way of splitting the body.\n if (slow(body + \"\\u0000\")) {\n return `takes too long on ${n} characters of input (catastrophic backtracking): simplify the repetition`;\n }\n }\n }\n return undefined;\n}\n\n/**\n * How each format is written in JSON Schema: the standard `format` name\n * where there is one, and the expression where the format is one. A\n * client's JSON Schema validator treats `format` as a remark unless told\n * otherwise, so the expression is what makes an exported rule hold.\n */\nconst FORMAT_EXPORT: Readonly<\n Record<string, { format?: string; pattern?: string; maxLength?: number }>\n> = {\n email: { format: \"email\", pattern: EMAIL.source, maxLength: 254 },\n \"email-strict\": {\n format: \"email\",\n pattern: EMAIL_STRICT.source,\n maxLength: 254,\n },\n url: { format: \"uri\", pattern: \"^https?://\", maxLength: FORMAT_MAX_LENGTH },\n uuid: { format: \"uuid\", pattern: UUID.source },\n hostname: { format: \"hostname\", pattern: HOSTNAME.source, maxLength: 253 },\n ipv4: { format: \"ipv4\", pattern: IPV4.source },\n ipv6: { format: \"ipv6\" },\n slug: { pattern: SLUG.source },\n \"hex-color\": { pattern: HEX_COLOR.source },\n ulid: { pattern: ULID.source },\n e164: { pattern: E164.source },\n};\n\n/**\n * The rules as JSON Schema 2020-12 keywords, for one value (`item`) and\n * for the list holding it (`list`). A pattern is exported anchored, since\n * here it must match the whole value and in JSON Schema it need not. When\n * a format and a @pattern both give an expression, they are joined with\n * `allOf`.\n */\nexport function jsonSchemaKeywords(c: FieldConstraints | undefined): {\n item: Record<string, unknown>;\n list: Record<string, unknown>;\n} {\n const item: Record<string, unknown> = {};\n const list: Record<string, unknown> = {};\n if (!c) return { item, list };\n const patterns: string[] = [];\n if (c.format) {\n const exported = FORMAT_EXPORT[c.format.name] ?? {};\n if (exported.format) item[\"format\"] = exported.format;\n if (exported.pattern) patterns.push(exported.pattern);\n if (exported.maxLength !== undefined)\n item[\"maxLength\"] = exported.maxLength;\n }\n if (c.length?.min !== undefined) item[\"minLength\"] = c.length.min;\n if (c.length?.max !== undefined) {\n item[\"maxLength\"] = Math.min(\n c.length.max,\n (item[\"maxLength\"] as number | undefined) ?? Infinity,\n );\n }\n if (c.pattern) patterns.push(`^(?:${c.pattern.source})$`);\n if (patterns.length === 1) item[\"pattern\"] = patterns[0];\n else if (patterns.length > 1) {\n item[\"allOf\"] = patterns.map((pattern) => ({ pattern }));\n }\n if (c.range?.min !== undefined) item[\"minimum\"] = c.range.min;\n if (c.range?.max !== undefined) item[\"maximum\"] = c.range.max;\n if (c.range?.exclusiveMin !== undefined) {\n item[\"exclusiveMinimum\"] = c.range.exclusiveMin;\n }\n if (c.range?.exclusiveMax !== undefined) {\n item[\"exclusiveMaximum\"] = c.range.exclusiveMax;\n }\n if (c.multipleOf) item[\"multipleOf\"] = c.multipleOf.value;\n if (c.size?.min !== undefined) list[\"minItems\"] = c.size.min;\n if (c.size?.max !== undefined) list[\"maxItems\"] = c.size.max;\n if (c.size?.unique) list[\"uniqueItems\"] = true;\n return { item, list };\n}\n\nconst sentence = (text: string) =>\n `${text.charAt(0).toUpperCase()}${text.slice(1)}.`;\n\n/**\n * The rules in a sentence or two, for the description of a generated\n * input field: what a client reads in GraphiQL and in the printed schema.\n */\nexport function describeConstraints(\n c: FieldConstraints | undefined,\n list: boolean,\n): string | undefined {\n if (!c) return undefined;\n const parts: string[] = [];\n if (c.size) {\n const { min, max, unique } = c.size;\n if (min !== undefined && max !== undefined) {\n parts.push(sentence(`${min} to ${plural(max, \"item\")}`));\n } else if (max !== undefined) {\n parts.push(sentence(`at most ${plural(max, \"item\")}`));\n } else if (min !== undefined) {\n parts.push(sentence(`at least ${plural(min, \"item\")}`));\n }\n if (unique) parts.push(\"No item twice.\");\n }\n const each: string[] = [];\n if (c.normalize) {\n const steps = [\n c.normalize.trim ? \"trimmed\" : undefined,\n c.normalize.unicode ? `${c.normalize.unicode}-normalised` : undefined,\n c.normalize.case === \"LOWER\"\n ? \"lower-cased\"\n : c.normalize.case === \"UPPER\"\n ? \"upper-cased\"\n : undefined,\n ].filter((x): x is string => x !== undefined);\n if (steps.length > 0) each.push(sentence(`stored ${steps.join(\", \")}`));\n if (c.normalize.emptyToNull) {\n each.push(\"An empty value is stored as none.\");\n }\n }\n if (c.length) {\n const { min, max } = c.length;\n if (min !== undefined && max !== undefined) {\n each.push(sentence(`${min} to ${plural(max, \"character\")}`));\n } else if (max !== undefined) {\n each.push(sentence(`at most ${plural(max, \"character\")}`));\n } else if (min !== undefined) {\n each.push(sentence(`at least ${plural(min, \"character\")}`));\n }\n }\n if (c.format) each.push(sentence(FORMATS[c.format.name]!.message));\n if (c.pattern) each.push(`Must match \\`${c.pattern.source}\\`.`);\n if (c.range) {\n const { min, max, exclusiveMin, exclusiveMax } = c.range;\n if (min !== undefined) each.push(sentence(`at least ${min}`));\n if (exclusiveMin !== undefined) {\n each.push(sentence(`greater than ${exclusiveMin}`));\n }\n if (max !== undefined) each.push(sentence(`at most ${max}`));\n if (exclusiveMax !== undefined) {\n each.push(sentence(`less than ${exclusiveMax}`));\n }\n }\n if (c.multipleOf) each.push(sentence(`a multiple of ${c.multipleOf.value}`));\n if (each.length > 0) {\n parts.push(list ? `Each item: ${each.join(\" \")}` : each.join(\" \"));\n }\n return parts.length > 0 ? parts.join(\" \") : undefined;\n}\n\n/**\n * What changed between two versions of a field's rules, in the terms a\n * schema diff needs: `tightened` refuses input the old rules accepted,\n * `changed` may, `loosened` only accepts more.\n */\nexport function compareConstraints(\n before: FieldConstraints | undefined,\n after: FieldConstraints | undefined,\n): { tightened: string[]; changed: string[]; loosened: string[] } {\n const tightened: string[] = [];\n const changed: string[] = [];\n const loosened: string[] = [];\n /** A bound that refuses more when it moves in `direction`. */\n const bound = (\n label: string,\n old: number | undefined,\n now: number | undefined,\n direction: \"up\" | \"down\",\n ) => {\n if (old === now) return;\n if (now === undefined) loosened.push(`${label} was removed (was ${old})`);\n else if (old === undefined) tightened.push(`${label} is now ${now}`);\n else if (direction === \"down\" ? now < old : now > old) {\n tightened.push(`${label} went from ${old} to ${now}`);\n } else loosened.push(`${label} went from ${old} to ${now}`);\n };\n bound(\"@length(min:)\", before?.length?.min, after?.length?.min, \"up\");\n bound(\"@length(max:)\", before?.length?.max, after?.length?.max, \"down\");\n bound(\"@range(min:)\", before?.range?.min, after?.range?.min, \"up\");\n bound(\"@range(max:)\", before?.range?.max, after?.range?.max, \"down\");\n bound(\n \"@range(exclusiveMin:)\",\n before?.range?.exclusiveMin,\n after?.range?.exclusiveMin,\n \"up\",\n );\n bound(\n \"@range(exclusiveMax:)\",\n before?.range?.exclusiveMax,\n after?.range?.exclusiveMax,\n \"down\",\n );\n bound(\"@size(min:)\", before?.size?.min, after?.size?.min, \"up\");\n bound(\"@size(max:)\", before?.size?.max, after?.size?.max, \"down\");\n /** A rule with no order: added, removed, or different. */\n const rule = (label: string, old: unknown, now: unknown) => {\n if (old === now) return;\n if (now === undefined) loosened.push(`${label} was removed`);\n else if (old === undefined) tightened.push(`${label} was added`);\n else changed.push(`${label} changed from ${String(old)} to ${String(now)}`);\n };\n rule(\"@pattern\", before?.pattern?.source, after?.pattern?.source);\n rule(\"@format\", before?.format?.name, after?.format?.name);\n rule(\"@multipleOf\", before?.multipleOf?.value, after?.multipleOf?.value);\n rule(\n \"@size(unique:)\",\n before?.size?.unique || undefined,\n after?.size?.unique || undefined,\n );\n const stored = (n: FieldConstraints[\"normalize\"]) =>\n n ? JSON.stringify(n) : undefined;\n if (stored(before?.normalize) !== stored(after?.normalize)) {\n changed.push(\n \"@normalize changed: values already stored keep their old form\",\n );\n }\n return { tightened, changed, loosened };\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","// 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 // `update`: the relationship's properties with UPDATE or UPDATE_EDGE,\n // the connected node with UPDATE only (as the nested update input).\n const props = rel.properties\n ? model.relationshipProperties.get(rel.properties)\n : undefined;\n return (\n ((allows(\"UPDATE\") || allows(\"UPDATE_EDGE\")) &&\n props !== undefined &&\n hasSettable(props, \"UPDATE\")) ||\n (allows(\"UPDATE\") &&\n target.mutations.has(\"UPDATE\") &&\n 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\n/**\n * The first value in `value` (each item, for a list) outside `range`, or\n * undefined. Null and absent values are not checked: nullability is the\n * type's business.\n */\nexport function outOfRange(\n value: unknown,\n range: { min?: number | undefined; max?: number | undefined },\n): number | undefined {\n if (Array.isArray(value)) {\n for (const item of value) {\n const bad = outOfRange(item, range);\n if (bad !== undefined) return bad;\n }\n return undefined;\n }\n if (typeof value !== \"number\" && typeof value !== \"bigint\") return undefined;\n const n = Number(value);\n if (range.min !== undefined && n < range.min) return n;\n if (range.max !== undefined && n > range.max) return n;\n return undefined;\n}\n","// Interfaces and unions: root lists, relationship fields whose target is\n// abstract, and the per-member projection of an abstract node.\n\nimport type { FieldNode, SelectionSetNode } from \"graphql\";\nimport { memberWhere, rootFilterCost } from \"../cost.js\";\nimport { requestError } from \"../../errors.js\";\nimport type {\n AbstractType,\n NodeType,\n RelationshipField,\n ScalarField,\n} from \"../../model/types.js\";\nimport {\n authFilter,\n checkAuthentication,\n checkFieldAuthentication,\n} from \"../auth.js\";\nimport { bind, freshVar, type CompileContext } from \"../context.js\";\nimport {\n and,\n bin,\n fn,\n lit,\n or,\n prop,\n v,\n type Clause,\n type Expr,\n type SortItem,\n} from \"../cypher.js\";\nimport { compileMemberWhere, relationshipPattern } from \"../filter.js\";\nimport { memberFields } from \"../../model/relations.js\";\nimport { subSelections } from \"../selection.js\";\nimport type { CompiledRead, Args, Where, Projection } from \"./types.js\";\nimport { finish, refuseRowRules, collectOne, coalesceFalse } from \"./common.js\";\nimport { resolveLimit } from \"./sort.js\";\nimport { projectNode } from \"./project.js\";\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 ctx.cost += rootFilterCost(\n ctx,\n member,\n memberWhere(abstract, member.name, args[\"where\"] as Where | undefined),\n limitValue,\n );\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. */\nexport function 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/**\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 */\nexport function 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","// `@cypher` fields: root fields on Query and Mutation, object fields run\n// once per parent, and the binding of their statement's parameters.\n\nimport type { FieldNode, SelectionSetNode } from \"graphql\";\nimport { requestError, validationError, type Violation } from \"../../errors.js\";\nimport { checkValue, normalizeValue } from \"../../model/constraints.js\";\nimport { scanParams } from \"../../model/cypher-lexer.js\";\nimport type { CypherField } from \"../../model/types.js\";\nimport { authFilter, checkAuthentication, viewerKey } from \"../auth.js\";\nimport { bind, freshVar, noteClaim, type CompileContext } from \"../context.js\";\nimport { fn, printExpr, v, type Clause, type Expr } from \"../cypher.js\";\nimport { outOfRange } from \"../../model/inputs.js\";\nimport { subSelections } from \"../selection.js\";\nimport type { CompiledRead, Args, Projection } from \"./types.js\";\nimport { finish, collectOne } from \"./common.js\";\nimport { projectAbstract } from \"./abstract.js\";\nimport { projectNode } from \"./project.js\";\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 // Declared, or estimated from the statement's plan by `analyze()`.\n ctx.cost +=\n field.cost ||\n (ctx.statistics?.cypher?.[`${field.owner}.${field.name}`] ?? 0);\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/** 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 args = normalized(field, args);\n checkListArguments(ctx, field, args);\n ctx.reads.opaque = true;\n const texts = new Map<string, string>();\n for (const p of field.params) {\n if (p === \"viewer\") {\n const expr = viewerKey(ctx);\n texts.set(\n p,\n expr.kind === \"param\" ? printExpr(expr) : `(${printExpr(expr)})`,\n );\n continue;\n }\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 texts.set(p, printExpr(bind(ctx, value)));\n }\n let out = \"\";\n let last = 0;\n for (const ref of scanParams(field.statement)) {\n out +=\n field.statement.slice(last, ref.start) +\n (texts.get(ref.name) ?? `$${ref.name}`);\n last = ref.end;\n }\n return out + field.statement.slice(last);\n}\n\n/** `args` as `@normalize` changes them: what the rules and the statement see. */\nfunction normalized(field: CypherField, args: Args): Args {\n let out = args;\n for (const a of field.args) {\n const value = args[a.name];\n if (!a.constraints?.normalize || value === null || value === undefined) {\n continue;\n }\n if (out === args) out = { ...args };\n out[a.name] = normalizeValue(a.constraints, value);\n }\n return out;\n}\n\n/** Default `maxListArgument`: the most items a @cypher list argument takes. */\nexport const MAX_LIST_ARGUMENT = 1000;\n\n/**\n * List arguments of a @cypher field hold at most `@size(max:)` items, or\n * `maxListArgument` without it: the statement sees the input as is, so\n * the cap is checked before it runs. Every level of a nested list counts.\n * Int and Float arguments with `@range(min:, max:)` stay inside it.\n */\nfunction checkListArguments(\n ctx: CompileContext,\n field: CypherField,\n args: Args,\n): void {\n const violations: Violation[] = [];\n for (const a of field.args) {\n if (!a.constraints) continue;\n for (const failure of checkValue(a.constraints, args[a.name])) {\n violations.push({\n path: failure.index === undefined ? [a.name] : [a.name, failure.index],\n coordinate: `${field.owner}.${field.name}(${a.name}:)`,\n rule: failure.rule,\n params: failure.params,\n message: failure.message,\n });\n }\n }\n if (violations.length > 0) {\n throw validationError(\"BAD_USER_INPUT\", violations);\n }\n for (const a of field.args) {\n if (a.range) {\n const bad = outOfRange(args[a.name], a.range);\n if (bad !== undefined) {\n const { min, max } = a.range;\n const bounds =\n min !== undefined && max !== undefined\n ? `between ${min} and ${max}`\n : min !== undefined\n ? `at least ${min}`\n : `at most ${max}`;\n throw requestError(\n \"BAD_USER_INPUT\",\n `${field.owner}.${field.name}: argument ${a.name} must be ${bounds} (got ${bad})`,\n );\n }\n }\n if (!a.type.list) continue;\n const max = a.maxItems ?? ctx.maxListArgument ?? MAX_LIST_ARGUMENT;\n const tooLong = (value: unknown): boolean =>\n Array.isArray(value) && (value.length > max || value.some(tooLong));\n if (tooLong(args[a.name])) {\n throw requestError(\n \"BAD_USER_INPUT\",\n `${field.owner}.${field.name}: argument ${a.name} takes at most ${max} items`,\n );\n }\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 */\nexport function 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 // The statement runs once per parent row.\n ctx.cost += rows * field.cost;\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","// Reading a directive's arguments off a definition and its extensions,\n// reporting what graphql-js would let through silently: a directive\n// written twice, an input field its types do not define.\n\nimport {\n getDirectiveValues,\n isInputObjectType,\n isListType,\n isNonNullType,\n Kind,\n type ConstDirectiveNode,\n type ConstValueNode,\n type GraphQLDirective,\n type GraphQLInputType,\n} from \"graphql\";\n\n/**\n * The arguments of `def` on `node` (a type, field, argument or the schema),\n * undefined when it is absent. A type's directives are read from its\n * definition and every extension (`extend type T @authorization(...)`),\n * so a directive on an extension is never silently dropped; a\n * non-repeatable one written more than once across them is a problem\n * naming each place. Repeatable directives are read with `directiveNodes`.\n */\n/** Input-object fields in a directive argument that its type lacks. */\nfunction unknownInputFields(\n type: GraphQLInputType,\n value: ConstValueNode,\n path: string,\n): Array<{ path: string; name: string; known: string[] }> {\n const named = isNonNullType(type) ? type.ofType : type;\n if (isListType(named)) {\n return value.kind === Kind.LIST\n ? value.values.flatMap((v, i) =>\n unknownInputFields(named.ofType, v, `${path}[${i}]`),\n )\n : unknownInputFields(named.ofType, value, path);\n }\n if (!isInputObjectType(named) || value.kind !== Kind.OBJECT) return [];\n const fields = named.getFields();\n return value.fields.flatMap((f) => {\n const field = fields[f.name.value];\n return field\n ? unknownInputFields(field.type, f.value, `${path}.${f.name.value}`)\n : [{ path, name: f.name.value, known: Object.keys(fields) }];\n });\n}\n\nexport function directive(\n def: GraphQLDirective,\n node: { astNode?: unknown; extensionASTNodes?: unknown },\n at: (message: string) => void,\n): Record<string, unknown> | undefined {\n const found = directiveNodes(def.name, node);\n if (found.length === 0) return undefined;\n if (found.length > 1 && !def.isRepeatable) {\n at(\n `@${def.name} is written ${found.length} times (${found.map((x) => x.place).join(\", \")}); write it once`,\n );\n }\n // graphql-js 16 drops input fields a directive's types do not define\n // (17 refuses them): a misspelt `operations` would silently fall back\n // to the default.\n let unknown = false;\n for (const arg of found[0]!.node.arguments ?? []) {\n const type = def.args.find((a) => a.name === arg.name.value)?.type;\n if (!type) continue;\n for (const { path, name, known } of unknownInputFields(\n type,\n arg.value,\n arg.name.value,\n )) {\n unknown = true;\n at(\n `@${def.name}: ${path} has no field ${name} (expected ${known.join(\", \")})`,\n );\n }\n }\n if (unknown) return undefined;\n try {\n return getDirectiveValues(def, { directives: [found[0]!.node] });\n } catch (err) {\n at(`@${def.name}: ${err instanceof Error ? err.message : String(err)}`);\n return undefined;\n }\n}\n\n/**\n * Every use of the directive `name` on `node`: its definition's, then each\n * extension's, with where it was written (for messages).\n */\nexport function directiveNodes(\n name: string,\n node: { astNode?: unknown; extensionASTNodes?: unknown },\n): Array<{ node: ConstDirectiveNode; place: string }> {\n type WithDirectives = {\n directives?: readonly ConstDirectiveNode[];\n loc?: { startToken: { line: number } };\n } | null;\n const out: Array<{ node: ConstDirectiveNode; place: string }> = [];\n const visit = (ast: WithDirectives | undefined, kind: string) => {\n for (const dir of ast?.directives ?? []) {\n if (dir.name.value !== name) continue;\n const line = dir.loc?.startToken.line;\n out.push({\n node: dir,\n place: line !== undefined ? `${kind}, line ${line}` : kind,\n });\n }\n };\n visit(node.astNode as WithDirectives, \"the definition\");\n for (const ext of (node.extensionASTNodes as WithDirectives[] | undefined) ??\n []) {\n visit(ext, \"an extension\");\n }\n return out;\n}\n","// Small readers of GraphQL types shared by the model build: the built-in\n// scalars, how a field's type unwraps (list, required, items), a custom\n// scalar's storage type, and the names derived from a type's name.\n\nimport {\n isEnumType,\n isListType,\n isNonNullType,\n isScalarType,\n Kind,\n type GraphQLNamedType,\n type GraphQLInputType,\n type GraphQLOutputType,\n type GraphQLSchema,\n} from \"graphql\";\nimport type { TypeShape, ScalarType } from \"../types.js\";\nimport { directiveNodes } from \"./directive-args.js\";\n\nexport const 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\nexport function 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\nexport function 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 = directiveNodes(\"storedAs\", t)[0]?.node;\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\nexport function shapeOf(\n shape: ReturnType<typeof unwrap>,\n): Omit<TypeShape, \"named\"> {\n return {\n list: shape.list,\n required: shape.required,\n itemRequired: shape.itemRequired,\n };\n}\n\nexport function 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\nexport function upperFirst(s: string): string {\n return s.charAt(0).toUpperCase() + s.slice(1);\n}\n\nexport function 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","// Generated type and field names, in one place so the schema builder\n// and the compiler agree.\n\nimport { lowerFirst } from \"../model/build/shapes.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","// The root MATCH of a read: what it anchors on, its filters and keyset,\n// and how its plan is expected to find the first rows.\n\nimport { RANGE_UNINDEXABLE } from \"../../analyze/indexes.js\";\nimport type { CypherField, NodeType } from \"../../model/types.js\";\nimport { authFilter, checkAuthentication } from \"../auth.js\";\nimport { bind, freshVar, type CompileContext } from \"../context.js\";\nimport { and, bin, lit, prop, v, type Clause, type Expr } from \"../cypher.js\";\nimport { compileNodeWhere } from \"../filter.js\";\nimport type { SeekExpectation, Where } from \"./types.js\";\nimport { type SortKey, leadBound, keysetPredicate } from \"./sort.js\";\nimport { keyOf } from \"./by-keys.js\";\nimport { projectCypher } from \"./cypher-field.js\";\n\n// ---------------------------------------------------------------------------\n// The root MATCH: anchoring, filters, keyset\n// ---------------------------------------------------------------------------\n\nconst EXACT_OPS = new Set([\"eq\", \"in\"]);\n\nconst RANGE_OPS = new Set([\"lt\", \"lte\", \"gt\", \"gte\"]);\n\nconst TEXT_OPS = new Set([\"contains\", \"startsWith\", \"endsWith\"]);\n\nconst POINT_OPS = new Set([\"withinBBox\", \"distance\"]);\n\nexport function 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 } else if (expectation?.access === \"element\") {\n // The planner may walk the sort key's index from the cursor instead.\n expectation = { ...expectation, access: \"any\" };\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; an\n // UNDIRECTED field is followed both ways, as its reads are.\n pattern: {\n start: { variable: a, labels: [] },\n hops: [\n {\n rel: {\n type: rel.type,\n direction:\n rel.queryDirection === \"UNDIRECTED\"\n ? \"BOTH\"\n : rel.direction === \"OUT\"\n ? \"IN\"\n : \"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 // A list `includes` (or `includesAny`, G-72) seeks the list's elements\n // in its RANGE index (G-63).\n const includes = Object.entries(where).find(([key, value]) => {\n const field = node.fields.get(key);\n return (\n field?.kind === \"scalar\" &&\n field.list &&\n value != null &&\n ((value as Where)[\"includes\"] != null ||\n (value as Where)[\"includesAny\"] != null)\n );\n });\n const other = seekFromOps(node, where);\n if (includes) {\n const op =\n (includes[1] as Where)[\"includes\"] != null ? \"includes\" : \"includesAny\";\n const reason = `${node.name}.${includes[0]} ${op}`;\n return other\n ? { label, access: \"any\", reason: `${other.reason} or ${reason}` }\n : { label, access: \"element\", reason };\n }\n return other;\n}\n\nfunction seekFromOps(\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","// Aggregates: the `<plural>Aggregate` and `<plural>Grouped` root fields,\n// and the aggregate statement a root connection shares with them.\n\nimport {\n getNamedType,\n type GraphQLObjectType,\n type SelectionSetNode,\n} from \"graphql\";\nimport { rootFilterCost } from \"../cost.js\";\nimport { requestError } from \"../../errors.js\";\nimport { listAggregate, type ListAggregate } from \"../aggregate.js\";\nimport type { NodeType, ScalarField } from \"../../model/types.js\";\nimport { names } from \"../../schema/names.js\";\nimport { checkFieldAuthentication } from \"../auth.js\";\nimport { bind, freshVar, type CompileContext } from \"../context.js\";\nimport { fn, prop, v, type Clause, type Expr } from \"../cypher.js\";\nimport { collectFields, subSelections } from \"../selection.js\";\nimport type { CompiledRead, Args, Where } from \"./types.js\";\nimport {\n finish,\n refuseRowRules,\n deniedItem,\n assertNoneDenied,\n} from \"./common.js\";\nimport { resolveLimit } from \"./sort.js\";\nimport { rootMatch } from \"./match.js\";\n\nexport const AGGREGATES = new Set([\n \"min\",\n \"max\",\n \"avg\",\n \"sum\",\n \"shortest\",\n \"longest\",\n]);\n\nexport interface 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 */\nexport function 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\nexport function 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 where = args[\"where\"] as Where | undefined;\n const root = rootMatch(ctx, node, where, []);\n ctx.cost += rootFilterCost(ctx, node, where, node.limit.default, true);\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 */\nexport function 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 where = args[\"where\"] as Where | undefined;\n const root = rootMatch(ctx, node, where, []);\n ctx.cost += rootFilterCost(ctx, node, where, limit, true);\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","// Nested relationship connections: the page, its counts and aggregates,\n// the relationship properties, and what a connection selection asks for.\n\nimport {\n getNamedType,\n type GraphQLObjectType,\n type SelectionSetNode,\n} from \"graphql\";\nimport { filterDegree, perRowCost } from \"../cost.js\";\nimport {\n distinctCount,\n listAggregate,\n type ListAggregate,\n} from \"../aggregate.js\";\nimport type {\n NodeType,\n RelationshipPropertiesType,\n RelationshipField,\n ScalarField,\n} from \"../../model/types.js\";\nimport { connectionTypeNames, hasOwnConnection } from \"../../schema/names.js\";\nimport {\n authFilter,\n authValidate,\n checkAuthentication,\n checkFieldAuthentication,\n checkPropertyAccess,\n propertyReadAccess,\n propertyReadGuard,\n refusedEdgeRead,\n relationshipRules,\n} from \"../auth.js\";\nimport { bind, freshVar, type CompileContext } from \"../context.js\";\nimport {\n and,\n fn,\n lit,\n not,\n prop,\n v,\n type Expr,\n type ProjectionEntry,\n} from \"../cypher.js\";\nimport {\n compileNodeWhere,\n compilePropsWhere,\n relationshipPattern,\n} from \"../filter.js\";\nimport { collectFields, subSelections } from \"../selection.js\";\nimport type { Args, Where, Projection } from \"./types.js\";\nimport { refuseRowRules } from \"./common.js\";\nimport {\n resolvePage,\n sortItems,\n cursorValues,\n keysetPredicate,\n} from \"./sort.js\";\nimport { AGGREGATES } from \"./aggregates.js\";\nimport { projectNode, guardedValue, fanOut } from \"./project.js\";\n\nexport function 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 ctx.cost +=\n rows * filterDegree(ctx, rel, true) * perRowCost(ctx, target, nodeWhere);\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 rel,\n owner: parent,\n target: x,\n }),\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(matching((nv) => fn(\"id\", v(nv)))),\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\nfunction projectProperties(\n ctx: CompileContext,\n propsType: string,\n variable: string,\n sets: SelectionSetNode[],\n guard?: Expr | false,\n /** The relationship being read, for rules over its ends. */\n ends?: { rel: RelationshipField; owner: string; target: string },\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 over the relationship's ends (or the caller's node) decide\n // per relationship: a failing one reads the property as FORBIDDEN.\n const access = propertyReadAccess(ctx, field);\n const own =\n access === \"row\" && ends\n ? propertyReadGuard(ctx, ends.rel, field, {\n owner: ends.owner,\n target: ends.target,\n rel: variable,\n })\n : undefined;\n if (access === \"row\" && own !== undefined) {\n const when =\n guard === false || own === false\n ? lit(false)\n : guard === undefined\n ? own\n : and(guard, own)!;\n entries.push({\n kind: \"entry\",\n key,\n value: guardedValue(\n { when, code: \"FORBIDDEN\" },\n prop(v(variable), field.property),\n ),\n });\n continue;\n }\n // Rules testing claims only: a request they refuse reads the property\n // as FORBIDDEN, on every row that has it.\n if (access !== \"allowed\" && !(access === \"row\" && ends)) {\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. */\nexport function 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","// Projecting a node: its stored properties, guarded and masked fields,\n// and the nested relationship lists read with it.\n\nimport {\n parse,\n type GraphQLObjectType,\n type OperationDefinitionNode,\n type SelectionSetNode,\n} from \"graphql\";\nimport { filterDegree, perRowCost } from \"../cost.js\";\nimport type { NodeType, RelationshipField } from \"../../model/types.js\";\nimport {\n authFilter,\n authValidate,\n checkAuthentication,\n fieldReadGuard,\n maskedValue,\n} from \"../auth.js\";\nimport { bind, freshVar, type CompileContext } from \"../context.js\";\nimport {\n and,\n fn,\n lit,\n prop,\n v,\n type Clause,\n type Expr,\n type ProjectionEntry,\n} from \"../cypher.js\";\nimport { compileNodeWhere, relationshipPattern } from \"../filter.js\";\nimport { collectFields, fieldArgs, subSelections } from \"../selection.js\";\nimport type { Args, Where, Projection } from \"./types.js\";\nimport { collectOne } from \"./common.js\";\nimport { resolveLimit, resolveSort, sortItems } from \"./sort.js\";\nimport { projectCypher } from \"./cypher-field.js\";\nimport { projectPolymorphic } from \"./abstract.js\";\nimport { projectRelationshipConnection } from \"./connection.js\";\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\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. */\nexport function 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. */\nexport function 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 // A filter examines every related node, not only the page it returns.\n ctx.cost +=\n rows *\n filterDegree(ctx, rel, true) *\n perRowCost(ctx, target, args[\"where\"] as Where | undefined);\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","// Nodes by @key in one statement, for mutation payloads.\n\nimport type { SelectionSetNode } from \"graphql\";\nimport type { NodeType } from \"../../model/types.js\";\nimport { authFilter, checkAuthentication } from \"../auth.js\";\nimport { bind, freshVar, type CompileContext } from \"../context.js\";\nimport { and, bin, prop, v, type Clause } from \"../cypher.js\";\nimport type { CompiledRead } from \"./types.js\";\nimport { finish } from \"./common.js\";\nimport { projectNode } from \"./project.js\";\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 // The same integer may arrive as a number from the database and as a\n // bigint from an argument: within the safe range they are one key.\n if (typeof value === \"bigint\") {\n return value >= BigInt(Number.MIN_SAFE_INTEGER) &&\n value <= BigInt(Number.MAX_SAFE_INTEGER)\n ? value.toString()\n : `n${value}`;\n }\n return JSON.stringify(value);\n}\n","// Which `@uniqueTogether` types a hand-written statement may write. The\n// write-set of a `@cypher` mutation is unknown, so this reads it off the\n// text of its write clauses (`CREATE`, `MERGE`, `SET`, `REMOVE`,\n// `DELETE`), generously: a type is touched when a write clause names one\n// of its labels, the relationship type of a constrained relationship, or\n// a constrained (or `where`-filtered) property (`.prop`). A `MATCH`, a\n// `WHERE` or a pattern comprehension that only reads a type does not\n// touch it (G-55).\n//\n// A clause that writes a variable without naming what it is (`SET v =\n// $map`, `SET v += $map`, `DELETE v`) touches the labels and types the\n// variable is bound to anywhere in the statement; deleting a node also\n// touches the types constrained on a relationship to it. A variable bound\n// to nothing the text names (an alias, an `UNWIND`, an untyped pattern)\n// makes the whole statement count, as before. A superset, never a guess\n// that leaves a write out — short of a statement that builds labels or\n// property names dynamically, which LoraDB's Cypher cannot.\n\nimport { maskLiterals } from \"./cypher-lexer.js\";\nimport type { GraphModel, NodeType } from \"./types.js\";\n\nconst NAME = \"[A-Za-z_][A-Za-z0-9_]*|`(?:[^`]|``)+`\";\nconst unquote = (n: string) =>\n n.startsWith(\"`\") ? n.slice(1, -1).replace(/``/g, \"`\") : n;\n\nconst WRITES = new Set([\n \"CREATE\",\n \"MERGE\",\n \"SET\",\n \"REMOVE\",\n \"DELETE\",\n \"DETACH\",\n]);\n/** Keywords that end a clause at the same bracket depth. */\nconst CLAUSES = new Set([\n ...WRITES,\n \"MATCH\",\n \"OPTIONAL\",\n \"WITH\",\n \"RETURN\",\n \"UNWIND\",\n \"CALL\",\n \"FOREACH\",\n \"UNION\",\n \"WHERE\",\n \"YIELD\",\n \"LOAD\",\n \"USE\",\n \"ORDER\",\n \"SKIP\",\n \"LIMIT\",\n]);\n\n/** The `@uniqueTogether` types `statement` may write. */\nexport function uniqueTogetherTouched(\n model: GraphModel,\n statement: string,\n): NodeType[] {\n const constrained = [...model.nodes.values()].filter(\n (node) => node.uniqueTogether.length > 0,\n );\n if (constrained.length === 0) return [];\n // Strings and comments blanked, quoted names kept, offsets unchanged.\n const mask = maskLiterals(statement);\n let plain = \"\";\n for (let i = 0; i < mask.length; i++) {\n plain += mask[i] === \"_\" ? statement[i] : mask[i];\n }\n const names = new Set<string>();\n const props = new Set<string>();\n const extra = new Set<NodeType>();\n for (const { keyword, text } of writeClauses(mask, plain)) {\n for (const n of colonNames(text)) names.add(n);\n for (const p of dotNames(text)) props.add(p);\n const vars =\n keyword === \"SET\"\n ? assigned(text)\n : keyword === \"DELETE\"\n ? deleted(text)\n : [];\n for (const v of vars) {\n const bound = boundNames(plain, v);\n // Written, but the text does not say what it is.\n if (bound.length === 0)\n return touchedBy(constrained, colonNames(plain), dotNames(plain));\n for (const l of bound) {\n names.add(l);\n if (keyword !== \"DELETE\") continue;\n // A deleted node leaves the relationships to it.\n for (const node of constrained) {\n const linked = node.uniqueTogether.some((u) =>\n [...u.singles, ...(u.set ? [u.set] : [])].some((f) =>\n model.nodes.get(f.target)?.labels.includes(l),\n ),\n );\n if (linked) extra.add(node);\n }\n }\n }\n }\n return constrained.filter(\n (node) => extra.has(node) || touchedBy([node], names, props).length > 0,\n );\n}\n\nfunction touchedBy(\n constrained: readonly NodeType[],\n names: ReadonlySet<string>,\n props: ReadonlySet<string>,\n): NodeType[] {\n return constrained.filter(\n (node) =>\n node.labels.some((l) => names.has(l)) ||\n node.uniqueTogether.some((u) => {\n const filtered = whereFields(node, u.where);\n return (\n u.scalars.some((f) => props.has(f.property)) ||\n [...u.singles, ...(u.set ? [u.set] : [])].some((f) =>\n names.has(f.type),\n ) ||\n filtered.props.some((p) => props.has(p)) ||\n filtered.types.some((t) => names.has(t))\n );\n }),\n );\n}\n\n/** The properties and relationship types a `where:` filter reads. */\nfunction whereFields(\n node: NodeType,\n where: unknown,\n): { props: string[]; types: string[] } {\n const out = { props: [] as string[], types: [] as string[] };\n const walk = (value: unknown) => {\n if (Array.isArray(value)) value.forEach(walk);\n else if (value && typeof value === \"object\") {\n for (const [key, inner] of Object.entries(value)) {\n const f = node.fields.get(key);\n if (f?.kind === \"scalar\") out.props.push(f.property);\n else if (f?.kind === \"relationship\") out.types.push(f.type);\n walk(inner);\n }\n }\n };\n walk(where);\n return out;\n}\n\n/**\n * The write clauses of a statement, each from its keyword to the next\n * clause keyword at the same bracket depth, or the bracket that closes\n * around it (`FOREACH (… | …)`, `CALL { … }`). `ON CREATE SET` reads as\n * write clauses of its own, which is what it is.\n */\nfunction writeClauses(\n mask: string,\n plain: string,\n): { keyword: string; text: string }[] {\n const out: { keyword: string; text: string }[] = [];\n const open: { keyword: string; start: number; depth: number }[] = [];\n const close = (end: number, depth: number) => {\n while (open.length > 0 && open[open.length - 1]!.depth >= depth) {\n const s = open.pop()!;\n out.push({ keyword: s.keyword, text: plain.slice(s.start, end) });\n }\n };\n const word = /[A-Za-z0-9_]+/y;\n let depth = 0;\n let before = \" \";\n for (let i = 0; i < mask.length; ) {\n const c = mask[i]!;\n if (c === \"`\") {\n const end = mask.indexOf(\"`\", i + 1);\n i = end < 0 ? mask.length : end + 1;\n before = \"`\";\n } else if (c === \"(\" || c === \"[\" || c === \"{\") {\n depth++;\n i++;\n before = c;\n } else if (c === \")\" || c === \"]\" || c === \"}\") {\n close(i, depth);\n depth--;\n i++;\n before = c;\n } else if (/\\s/.test(c)) {\n i++;\n } else {\n word.lastIndex = i;\n const m = word.exec(mask);\n if (!m) {\n i++;\n before = c;\n continue;\n }\n const upper = m[0].toUpperCase();\n const end = i + m[0].length;\n if (\n CLAUSES.has(upper) &&\n // Not a property, label, parameter or map key.\n !\".:$\".includes(before) &&\n !/^\\s*:/.test(mask.slice(end, end + 64))\n ) {\n close(i, depth);\n if (WRITES.has(upper)) open.push({ keyword: upper, start: i, depth });\n }\n i = end;\n before = \"a\";\n }\n }\n close(mask.length, -Infinity);\n return out;\n}\n\nfunction colonNames(text: string): Set<string> {\n return new Set(\n [...text.matchAll(new RegExp(`:\\\\s*(${NAME})`, \"g\"))].map((m) =>\n unquote(m[1]!),\n ),\n );\n}\n\nfunction dotNames(text: string): Set<string> {\n return new Set(\n [...text.matchAll(new RegExp(`\\\\.\\\\s*(${NAME})`, \"g\"))].map((m) =>\n unquote(m[1]!),\n ),\n );\n}\n\n/** Variables a `SET` replaces or merges a map into (`v = …`, `v += …`). */\nfunction assigned(text: string): string[] {\n return [\n ...text.matchAll(\n new RegExp(`(?<![.\\\\w\\`$])(${NAME})\\\\s*\\\\+?=(?![=~])`, \"g\"),\n ),\n ].map((m) => m[1]!);\n}\n\nconst NOT_VARIABLES = new Set([\n \"DELETE\",\n \"NULL\",\n \"TRUE\",\n \"FALSE\",\n \"IN\",\n \"IS\",\n \"NOT\",\n \"AND\",\n \"OR\",\n \"XOR\",\n \"CASE\",\n \"WHEN\",\n \"THEN\",\n \"ELSE\",\n \"END\",\n]);\n\n/** Variables a `DELETE` names: identifiers that are not functions. */\nfunction deleted(text: string): string[] {\n return [\n ...text.matchAll(new RegExp(`(?<![.:\\\\w\\`$])(${NAME})(?!\\\\s*[(.])`, \"g\")),\n ]\n .map((m) => m[1]!)\n .filter((v) => !NOT_VARIABLES.has(v.toUpperCase()));\n}\n\n/** The labels and relationship types `v` is bound to anywhere in `plain`. */\nfunction boundNames(plain: string, v: string): string[] {\n const escaped = v.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n const at = new RegExp(\n `[(\\\\[]\\\\s*${escaped}\\\\s*(:\\\\s*(?:${NAME})\\\\s*(?:[:&|]\\\\s*:?\\\\s*(?:${NAME})\\\\s*)*)`,\n \"g\",\n );\n return [...plain.matchAll(at)].flatMap((m) =>\n [...m[1]!.matchAll(new RegExp(NAME, \"g\"))].map((n) => unquote(n[0])),\n );\n}\n","// S5: what a write changed, and whether a read could have seen it.\n\nimport { keyOf } from \"../compile/read/by-keys.js\";\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\n/**\n * Complete `change` with the relationships a mutation wrote: both lists,\n * and the entities and types that follow from everything in it.\n */\nexport function fillChange(\n change: WriteChange,\n wrote: {\n connected: readonly RelationshipRef[];\n disconnected: readonly RelationshipRef[];\n },\n): void {\n const id = (e: EntityRef) => `${e.type}\\0${keyOf(e.key)}`;\n // A node a DELETE trigger function already deleted is listed once.\n change.deleted = [...new Map(change.deleted.map((e) => [id(e), e])).values()];\n change.connected.push(...wrote.connected);\n change.disconnected.push(...wrote.disconnected);\n const entities = new Map<string, EntityRef>();\n for (const e of [...change.created, ...change.updated, ...change.deleted]) {\n entities.set(id(e), e);\n }\n for (const r of [...change.connected, ...change.disconnected]) {\n entities.set(id(r.from), r.from);\n entities.set(id(r.to), 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\nexport interface ReadSetLike {\n labels: readonly string[];\n relationships: readonly string[];\n /** Reads nobody can name (a `@cypher` statement): every change affects it. */\n opaque?: boolean | undefined;\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 || reads.opaque) 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","// 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 { EntityRef, WriteChange } from \"./changes.js\";\n\n/** What the application's own Cypher in a transaction wrote. */\nexport interface Touched {\n /** Node types (GraphQL type names) whose nodes were written. */\n types?: readonly string[];\n /** Relationship types written, e.g. `FOLLOWS`. */\n relationshipTypes?: readonly string[];\n /** Nodes written, by type and key. Their types count as written too. */\n entities?: readonly EntityRef[];\n /**\n * The write-set is unknown: everything counts as changed. The default\n * when nothing else is named.\n */\n broad?: boolean;\n /** The name listeners see as the change's `field` (default `transaction`). */\n field?: string;\n}\n\nexport class LoraTransaction {\n readonly #tx: DriverTransaction;\n readonly #emit: (change: WriteChange) => void;\n readonly #pending: WriteChange[] = [];\n readonly #inTrigger: boolean;\n readonly #isType: ((type: string) => boolean) | undefined;\n\n /**\n * @internal Created by `LoraGraphQL.begin()`, and for a JavaScript\n * trigger over the transaction of the mutation that fired it\n * (`inTrigger`), which that mutation commits.\n */\n constructor(\n tx: DriverTransaction,\n emit: (change: WriteChange) => void,\n inTrigger = false,\n isType?: (type: string) => boolean,\n ) {\n this.#tx = tx;\n this.#emit = emit;\n this.#inTrigger = inTrigger;\n this.#isType = isType;\n }\n\n /**\n * @internal Whether a trigger owns this handle: mutations run in it\n * fire no trigger themselves.\n */\n get inTrigger(): boolean {\n return this.#inTrigger;\n }\n\n /** @internal The write-sets recorded so far, handed over. */\n drain(): WriteChange[] {\n return this.#pending.splice(0);\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 /**\n * State what the application's own Cypher in this transaction wrote:\n * it is reported at the commit like a mutation's write-set, to\n * `onWrite` listeners (a response cache), `changes()` and\n * subscriptions, and dropped on a rollback. Without an argument, or\n * with `broad: true`, everything counts as changed.\n */\n touched(written: Touched = {}): void {\n const entities = [...(written.entities ?? [])];\n const types = [\n ...new Set([...(written.types ?? []), ...entities.map((e) => e.type)]),\n ].sort();\n const relationshipTypes = [\n ...new Set(written.relationshipTypes ?? []),\n ].sort();\n if (this.#isType) {\n for (const type of types) {\n if (!this.#isType(type)) {\n throw new Error(\n `touched(): ${type} is not a node type of the schema`,\n );\n }\n }\n }\n this.#pending.push({\n operation: \"CYPHER\",\n field: written.field ?? \"transaction\",\n created: [],\n updated: entities,\n deleted: [],\n connected: [],\n disconnected: [],\n entities,\n types,\n relationshipTypes,\n broad:\n written.broad ?? (types.length === 0 && relationshipTypes.length === 0),\n });\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 this.#notInTrigger(\"commit\");\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.#notInTrigger(\"rollback\");\n this.#pending.length = 0;\n if (this.#tx.isOpen) await this.#tx.rollback();\n }\n\n #notInTrigger(action: string): void {\n if (this.#inTrigger) {\n throw new Error(\n `a trigger cannot ${action} its transaction: the mutation that fired it does. Throw to roll it back`,\n );\n }\n }\n}\n","// What a hand-written statement (a `@trigger`'s, a `@cypher` mutation's)\n// says it wrote: the nodes it returns as `created` and `updated`.\n\nimport { bind, type CompileContext } from \"../../compile/context.js\";\nimport { name, printExpr } from \"../../compile/cypher.js\";\nimport { keyOf } from \"../../compile/read/by-keys.js\";\nimport type { QueryResult, Statement } from \"../../driver.js\";\nimport { OUTBOX } from \"../../events/outbox.js\";\nimport type { GraphModel, NodeType } from \"../../model/types.js\";\nimport type { EntityRef } from \"../changes.js\";\n\nexport interface Reported {\n created: EntityRef[];\n updated: EntityRef[];\n /** The statement wrote something listeners cannot be told about. */\n broad: boolean;\n}\n\nexport const refId = (e: EntityRef): string => `${e.type}\\0${keyOf(e.key)}`;\n\n/**\n * The nodes `result` returns as `created` or `updated`, each once (a node\n * in both is created). A statement that writes and names neither is\n * broad, and so is one that returns something that is not a node of the\n * model (a key, a node of an unknown label).\n */\nexport function reportedWrites(\n model: GraphModel,\n statement: { writes: boolean; reports: boolean },\n result: QueryResult,\n): Reported {\n const out: Reported = { created: [], updated: [], broad: false };\n // The result's own columns say what it reports. One that matched no row\n // has none: then the statement's text does.\n const reports =\n result.rows.length > 0\n ? result.columns.includes(\"created\") || result.columns.includes(\"updated\")\n : statement.reports;\n if (!reports) {\n out.broad = statement.writes;\n return out;\n }\n const seen = new Set<string>();\n for (const column of [\"created\", \"updated\"] as const) {\n for (const row of result.rows) {\n const value = row[column];\n for (const item of Array.isArray(value) ? value : [value]) {\n if (item === null || item === undefined) continue;\n const ref = entityOf(model, item);\n if (!ref) {\n if (statement.writes) out.broad = true;\n continue;\n }\n const id = refId(ref);\n if (seen.has(id)) continue;\n seen.add(id);\n out[column].push(ref);\n }\n }\n }\n return out;\n}\n\n/**\n * A statement's CREATE knows nothing of @outbox: the nodes it reports as\n * created become work with these, in the same transaction.\n */\nexport function outboxStatements(\n model: GraphModel,\n created: readonly EntityRef[],\n ctx: () => CompileContext,\n): Statement[] {\n const work = new Map<NodeType, unknown[]>();\n for (const ref of created) {\n const node = model.nodes.get(ref.type);\n if (node?.outbox) work.set(node, [...(work.get(node) ?? []), ref.key]);\n }\n return [...work].map(([node, keys]) => {\n const c = ctx();\n return {\n text:\n `UNWIND ${printExpr(bind(c, keys))} AS k\\n` +\n `MATCH (n:${name(node.labels[0]!)}) WHERE n.${name(node.key.property)} = k AND n.${name(OUTBOX.state)} IS NULL\\n` +\n `SET n.${name(OUTBOX.state)} = \"PENDING\"`,\n params: c.params,\n };\n });\n}\n\n/** The @node type and key of a node value the engine returned. */\nfunction entityOf(model: GraphModel, value: unknown): EntityRef | undefined {\n const node = value as\n | { labels?: unknown; properties?: Record<string, unknown> }\n | null\n | undefined;\n if (!node || !Array.isArray(node.labels) || !node.properties) {\n return undefined;\n }\n for (const type of model.nodes.values()) {\n if (!node.labels.includes(type.labels[0])) continue;\n const key = node.properties[type.key.property];\n return key === undefined || key === null\n ? undefined\n : { type: type.name, key };\n }\n return undefined;\n}\n","// What a mutation runs with: the environment the server hands it, the\n// statement runner every write goes through, and the counts it reports.\n\nimport type { TypeValidator } from \"../../standard-schema.js\";\nimport type { Statistics } from \"../../analyze/statistics.js\";\nimport type { SelectionContext } from \"../../compile/selection.js\";\nimport type {\n DriverTransaction,\n LoraDriver,\n QueryResult,\n Statement,\n} from \"../../driver.js\";\nimport type { GraphModel, NodeType } from \"../../model/types.js\";\nimport type { WriteChange } from \"../changes.js\";\nimport type { LoraTransaction } from \"../transaction.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\n/** What a JavaScript trigger is called with. */\nexport interface TriggerEvent {\n operation: \"CREATE\" | \"UPDATE\" | \"DELETE\";\n /** The node type whose nodes were written. */\n type: string;\n /** Their @key values. For DELETE the nodes still exist. */\n keys: unknown[];\n /** The mutation's write-set so far. */\n change: WriteChange;\n /**\n * The mutation's transaction: `execute()` runs Cypher in it, and\n * `lora.execute({ context: { ...context, transaction } })` runs a\n * generated mutation in it, whose writes join the write-set. The\n * mutation commits it; throw to roll everything back.\n */\n transaction: LoraTransaction;\n /** The GraphQL context of the request. */\n context: unknown;\n}\n\n/** A trigger function; it may return a promise. Throwing vetoes the write. */\nexport type TriggerFunction = (event: TriggerEvent) => unknown;\n\n/** The trigger functions of one node type. */\nexport interface TriggerFunctions {\n create?: TriggerFunction;\n update?: TriggerFunction;\n delete?: TriggerFunction;\n}\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 /**\n * Most nodes one mutation may create, update or delete, nested ones\n * included; relationships written, ten times as many.\n */\n maxBatch: number;\n /** Most items a @cypher list argument takes without `@size(max:)`. */\n maxListArgument?: number | undefined;\n /** Relationship levels one `where` may nest. */\n maxFilterDepth?: number | undefined;\n /** Items an `in` filter operand may hold. */\n maxListFilter?: number | undefined;\n /** Characters a string filter operand may hold. */\n maxStringFilter?: number | undefined;\n /** Statistics from `analyze()`, for filter costs. */\n statistics?: Statistics | undefined;\n callbacks: Readonly<Record<string, PopulatedByCallback>>;\n /** The `singleCallMutations` option; false keeps every mutation in a transaction. */\n singleCall?: boolean | undefined;\n /** The `triggers` option: functions per node type and operation. */\n triggers?: Readonly<Record<string, TriggerFunctions>> | undefined;\n /** The `triggerTimeoutMs` option, defaulted. */\n triggerTimeoutMs?: number | undefined;\n /**\n * The mutation runs inside a trigger's transaction: it fires no trigger\n * itself, so what a trigger writes never cascades.\n */\n inTrigger?: boolean | undefined;\n /**\n * `@populatedBy` callbacks already started, by the input they compute\n * for and the field's name: those of the mutation's own inputs start\n * before the transaction opens, all at once, so they do not run under\n * the writer lock one after another. Each is awaited where it would\n * have been called, so a failure surfaces at the same point.\n */\n computed?: WeakMap<object, Map<string, Promise<unknown>>> | undefined;\n /** The `validators` option: a Standard Schema per node type. */\n validators?: Readonly<Record<string, TypeValidator>> | undefined;\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 * Called inside the transaction once a delete knows every node it\n * removes, before any is removed: subscribers' checks of the nodes as\n * they were (a deleted node cannot be checked after the commit).\n */\n beforeDelete?:\n | ((\n change: WriteChange,\n doomed: ReadonlyArray<{ node: NodeType; keys: unknown[] }>,\n run: (statement: Statement) => Promise<QueryResult>,\n ) => Promise<void>)\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","// Pieces the mutation statements are built from: Cypher text for\n// timestamps, relationship patterns and label tests, and small helpers\n// over the model and the keys.\n\nimport { authFilter } from \"../../compile/auth.js\";\nimport type { CompileContext } from \"../../compile/context.js\";\nimport {\n bin,\n name,\n printExpr,\n prop,\n v,\n type Expr,\n} from \"../../compile/cypher.js\";\nimport { keyOf } from \"../../compile/read/by-keys.js\";\nimport type {\n Field,\n GraphModel,\n NodeType,\n RelationshipField,\n ScalarField,\n} from \"../../model/types.js\";\nimport type { RelationshipRef } from \"../changes.js\";\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]. */\nexport function 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. */\nexport function 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. */\nexport function 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 */\nexport function 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 */\nexport function 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. */\nexport const orFresh = (e: Expr | undefined): Expr | undefined =>\n e && bin(\"OR\", prop(v(\"row\"), \"fresh\"), e);\n\n/** `AND (<expr>)`, or nothing. */\nexport const andText = (e: Expr | undefined) =>\n e ? ` AND (${printExpr(e)})` : \"\";\n\n/** Fields on the other side of `rel`'s relationship type, pointing back. */\nexport function 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/** Whether the caller can read `variable` (a `node`): a boolean expression. */\nexport function readable(\n ctx: CompileContext,\n node: NodeType,\n variable: string,\n): string {\n const filter = authFilter(ctx, node, variable, \"READ\");\n return filter ? `coalesce(${printExpr(filter)}, false)` : \"true\";\n}\n\n/** `x:A OR x:B`: the field's target types (one, or an abstract's members). */\nexport function 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\nexport function dedupe(keys: unknown[]): unknown[] {\n return [...new Map(keys.map((k) => [keyOf(k), k])).values()];\n}\n\nexport function 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","// `@uniqueTogether` at write time: the statement that finds a node sharing\n// its combination with another, and the check for writes whose write-set\n// is unknown.\n\nimport {\n bind,\n newContext,\n type CompileContext,\n} from \"../../compile/context.js\";\nimport { name, printExpr } from \"../../compile/cypher.js\";\nimport { compileNodeWhere } from \"../../compile/filter.js\";\nimport type { DriverTransaction } from \"../../driver.js\";\nimport { requestError } from \"../../errors.js\";\nimport type {\n GraphModel,\n NodeType,\n UniqueTogether,\n} from \"../../model/types.js\";\nimport { runStatement, type MutationEnv } from \"./env.js\";\nimport { arrow, dedupe, labelTest } from \"./fragments.js\";\n\nexport function notUniqueTogether(\n node: NodeType,\n u: UniqueTogether,\n key: unknown,\n) {\n return requestError(\n \"CONSTRAINT_VIOLATION\",\n `${node.name} must be unique by (${u.fields.join(\", \")}); ${node.name} ${JSON.stringify(key)} would share it with another`,\n undefined,\n { type: node.name, fields: [...u.fields] },\n );\n}\n\n/**\n * `@uniqueTogether` after a write whose write-set is unknown (a `@cypher`\n * mutation): every node of each type in `nodes` is compared, in `tx`.\n */\nexport async function checkUniqueTogetherOf(\n env: MutationEnv,\n tx: DriverTransaction,\n nodes: readonly NodeType[],\n): Promise<void> {\n for (const node of nodes) {\n for (const u of node.uniqueTogether) {\n const ctx = newContext(env.selection, env.model, {\n jwt: env.jwt,\n degrees: env.degrees,\n requestContext: env.requestContext,\n });\n ctx.inAuth = true;\n const text = uniqueTogetherStatement(ctx, env.model, node, u, undefined);\n const { rows } = await runStatement(env, tx, {\n text,\n params: ctx.params,\n });\n if (rows.length > 0) throw notUniqueTogether(node, u, rows[0]![\"key\"]);\n }\n }\n}\n\n/**\n * The first node among `keys` whose `@uniqueTogether` combination another\n * node of its type shares: seeks each by key, binds its combination, then\n * compares it with the nodes that share its first relationship end (or,\n * with scalars only, its first scalar's value) — never a scan of the type.\n * Without `keys`, every node of the type is compared (a scan).\n *\n * With `failing`, the statement fails instead of returning that node:\n * `failing` gives the assertion's message, from an expression for the\n * node's place in `keys`.\n */\nexport function uniqueTogetherStatement(\n ctx: CompileContext,\n model: GraphModel,\n node: NodeType,\n u: UniqueTogether,\n keys: unknown[] | undefined,\n failing?: (index: string) => string,\n): string {\n const label = name(node.labels[0]!);\n const key = name(node.key.property);\n const rels = [...u.singles, ...(u.set ? [u.set] : [])];\n // Target keys through each relationship, from `at`.\n const ends = (at: string) =>\n rels.map((f) => {\n const target = model.nodes.get(f.target)!;\n return `[(${at})${arrow(f, \"\", \"x\", undefined)} WHERE (${labelTest(\"x\", target)}) | x.${name(target.key.property)}]`;\n });\n const nWhere = u.where\n ? compileNodeWhere(ctx, node, \"n\", u.where)\n : undefined;\n const mWhere = u.where\n ? compileNodeWhere(ctx, node, \"m\", u.where)\n : undefined;\n const mine = rels.map((_, i) => `u${i}`);\n const theirs = rels.map((_, i) => `v${i}`);\n // Exempt: a null scalar, a missing single relationship, an empty set.\n const present = [\n ...(nWhere ? [`(${printExpr(nWhere)})`] : []),\n ...u.scalars.map((f) => `n.${name(f.property)} IS NOT NULL`),\n ...rels.map((f, i) => (f.list ? `size(u${i}) > 0` : `size(u${i}) = 1`)),\n ];\n const anchor = rels[0];\n let candidates: string;\n if (anchor) {\n const target = model.nodes.get(anchor.target)!;\n const back =\n anchor.direction === \"OUT\"\n ? `<-[:${name(anchor.type)}]-(m)`\n : `-[:${name(anchor.type)}]->(m)`;\n candidates =\n `MATCH (n)${arrow(anchor, \"\", \"t\", undefined)} WHERE ${labelTest(\"t\", target)}\\n` +\n `MATCH (t)${back} WHERE ${labelTest(\"m\", node)} AND m.${key} <> n.${key}\\n`;\n } else {\n const first = u.scalars[0]!;\n candidates = `MATCH (m:${label}) WHERE m.${name(first.property)} = n.${name(first.property)} AND m.${key} <> n.${key}\\n`;\n }\n const same = [\n ...u.scalars.map((f) => `m.${name(f.property)} = n.${name(f.property)}`),\n ...rels.map((f, i) =>\n f.list\n ? `size(v${i}) = size(u${i}) AND all(y IN v${i} WHERE y IN u${i})`\n : `v${i} = u${i}`,\n ),\n ...(mWhere ? [`(${printExpr(mWhere)})`] : []),\n ];\n const bound = keys ? printExpr(bind(ctx, dedupe(keys))) : \"\";\n return (\n (keys\n ? `UNWIND ${bound} AS k\\n` + `MATCH (n:${label}) WHERE n.${key} = k\\n`\n : `MATCH (n:${label})\\n`) +\n `WITH ${[\"n\", ...ends(\"n\").map((e, i) => `${e} AS ${mine[i]!}`)].join(\", \")}` +\n (present.length > 0 ? ` WHERE ${present.join(\" AND \")}` : \"\") +\n \"\\n\" +\n candidates +\n `WITH ${[\"n\", \"m\", ...mine, ...ends(\"m\").map((e, i) => `${e} AS ${theirs[i]!}`)].join(\", \")}` +\n (same.length > 0 ? ` WHERE ${same.join(\" AND \")}` : \"\") +\n (failing && keys\n ? `\\nWITH n LIMIT 1\\nRETURN assert(false, ${failing(\n `toString([i IN range(0, size(${bound}) - 1) WHERE ${bound}[i] = n.${key}][0])`,\n )}) AS key`\n : `\\nRETURN n.${key} AS key LIMIT 1`)\n );\n}\n","// `@trigger` statements: run for the nodes a mutation wrote, inside its\n// transaction, so what they write commits or rolls back with it. A\n// statement is the schema author's own Cypher: it is not checked against\n// @authorization or the validation rules, as a @cypher mutation is not.\n\nimport { viewerKey } from \"../../compile/auth.js\";\nimport { bind, type CompileContext } from \"../../compile/context.js\";\nimport { name, printExpr } from \"../../compile/cypher.js\";\nimport { keyOf } from \"../../compile/read/by-keys.js\";\nimport type { QueryResult, Statement } from \"../../driver.js\";\nimport { scanParams } from \"../../model/cypher-lexer.js\";\nimport type {\n GraphModel,\n MutationOperation,\n NodeType,\n RelationshipField,\n Trigger,\n TriggerOperation,\n} from \"../../model/types.js\";\nimport { uniqueTogetherTouched } from \"../../model/unique-together.js\";\nimport { requestError } from \"../../errors.js\";\nimport {\n fillChange,\n type EntityRef,\n type RelationshipRef,\n type WriteChange,\n} from \"../changes.js\";\nimport { LoraTransaction } from \"../transaction.js\";\nimport type { MutationEnv } from \"./env.js\";\nimport type { Runner } from \"./runner.js\";\nimport { outboxStatements, refId, reportedWrites } from \"./reported.js\";\nimport { checkUniqueTogetherOf } from \"./unique-together.js\";\n\nconst anyTriggers = new WeakMap<GraphModel, boolean>();\n\n/** Whether the mutation may fire a trigger: a statement or a function. */\nexport function hasTriggers(env: MutationEnv): boolean {\n if (env.inTrigger) return false;\n if (env.triggers && Object.keys(env.triggers).length > 0) return true;\n let any = anyTriggers.get(env.model);\n if (any === undefined) {\n any = [...env.model.nodes.values()].some((n) => n.triggers.length > 0);\n anyTriggers.set(env.model, any);\n }\n return any;\n}\n\n/** Whether the mutation may call a trigger function. */\nexport function hasTriggerFunctions(env: MutationEnv): boolean {\n return (\n !env.inTrigger && !!env.triggers && Object.keys(env.triggers).length > 0\n );\n}\n\n/** The statement as written, with `$jwt`, `$viewer` and `$operation` bound. */\nfunction triggerBody(\n ctx: CompileContext,\n trigger: Trigger,\n operation: TriggerOperation,\n): string {\n const texts = new Map<string, string>();\n for (const p of trigger.params) {\n if (p === \"viewer\") {\n const expr = viewerKey(ctx);\n texts.set(\n p,\n expr.kind === \"param\" ? printExpr(expr) : `(${printExpr(expr)})`,\n );\n } else {\n texts.set(\n p,\n printExpr(bind(ctx, p === \"jwt\" ? (ctx.jwt ?? null) : operation)),\n );\n }\n }\n let body = \"\";\n let last = 0;\n for (const ref of scanParams(trigger.statement)) {\n body +=\n trigger.statement.slice(last, ref.start) +\n (texts.get(ref.name) ?? `$${ref.name}`);\n last = ref.end;\n }\n return body + trigger.statement.slice(last);\n}\n\n/** The trigger statement for `keys`, with `this` bound to each node. */\nexport function triggerStatement(\n ctx: CompileContext,\n node: NodeType,\n trigger: Trigger,\n operation: TriggerOperation,\n keys: unknown[],\n): Statement {\n const body = triggerBody(ctx, trigger, operation);\n // The statement runs as written after the match, not in a CALL { }:\n // the engine refuses writes in a subquery.\n return {\n text:\n `UNWIND ${printExpr(bind(ctx, keys))} AS lora_trigger_key\\n` +\n `MATCH (this:${name(node.labels[0]!)}) WHERE this.${name(node.key.property)} = lora_trigger_key\\n` +\n body,\n params: ctx.params,\n };\n}\n\n/**\n * The text ahead of a CONNECT or DISCONNECT trigger's statement: one row\n * per pair of `pairs` (a list of `[this key, target key]`), with `this`\n * and `target` bound.\n */\nexport function relationshipTriggerPrefix(\n node: NodeType,\n target: NodeType,\n pairs: string,\n): string {\n return (\n `UNWIND ${pairs} AS lora_trigger_pair\\n` +\n `MATCH (this:${name(node.labels[0]!)}) WHERE this.${name(node.key.property)} = lora_trigger_pair[0]\\n` +\n `MATCH (target:${name(target.labels[0]!)}) WHERE target.${name(target.key.property)} = lora_trigger_pair[1]\\n`\n );\n}\n\n/**\n * The relationships of `refs` a trigger on `node.field` fires for, as\n * `[this key, target key]` pairs per target type. A relationship counts\n * whichever side's field wrote it: what is compared is its type and the\n * nodes at its start and end.\n */\nfunction pairsFor(\n runner: Runner,\n node: NodeType,\n field: RelationshipField,\n refs: readonly RelationshipRef[],\n): Map<NodeType, unknown[][]> {\n const { model } = runner.env;\n const gone = new Set(runner.change.deleted.map(refId));\n const out = new Map<NodeType, Map<string, unknown[]>>();\n for (const ref of refs) {\n if (ref.type !== field.type) continue;\n const [owner, written] = ref.field.split(\".\") as [string, string];\n const via = model.nodes.get(owner)?.fields.get(written);\n if (via?.kind !== \"relationship\") continue;\n // The relationship as stored: from its start node to its end node.\n const [start, end] =\n via.direction === \"OUT\" ? [ref.from, ref.to] : [ref.to, ref.from];\n const [self, other] =\n field.direction === \"OUT\" ? [start, end] : [end, start];\n if (self.type !== node.name || !field.members.includes(other.type))\n continue;\n // A node deleted since is not there to be `this` or `target`.\n if (gone.has(refId(self)) || gone.has(refId(other))) continue;\n const target = model.nodes.get(other.type);\n if (!target) continue;\n const pairs = out.get(target) ?? new Map<string, unknown[]>();\n pairs.set(`${keyOf(self.key)}\\0${keyOf(other.key)}`, [self.key, other.key]);\n out.set(target, pairs);\n }\n return new Map(\n [...out].map(([target, pairs]) => [target, [...pairs.values()]]),\n );\n}\n\n/**\n * Run the CREATE and UPDATE triggers for what the mutation wrote so far.\n * A node the mutation created and then updated fires CREATE only.\n */\nexport async function runWriteTriggers(runner: Runner): Promise<void> {\n if (!hasTriggers(runner.env)) return;\n // What a trigger wrote (a DELETE trigger ran before this) fires nothing.\n const own = (e: EntityRef) => !runner.triggered.has(refId(e));\n const created = group(runner, runner.change.created.filter(own));\n const fresh = new Set(runner.change.created.map(refId));\n const updated = group(\n runner,\n runner.change.updated.filter((e) => own(e) && !fresh.has(refId(e))),\n );\n const fired: Fired[] = [];\n const perNode = (\n node: NodeType,\n trigger: Trigger,\n operation: MutationOperation,\n keys: unknown[],\n ): Fired => [\n trigger,\n (ctx) => triggerStatement(ctx, node, trigger, operation, keys),\n ];\n for (const node of runner.env.model.nodes.values()) {\n for (const trigger of node.triggers) {\n const field =\n trigger.field === undefined\n ? undefined\n : node.fields.get(trigger.field);\n if (field?.kind === \"relationship\") {\n // Per relationship: the ones that were not there before, and the\n // ones removed with both ends still there.\n for (const [operation, refs] of [\n [\"CONNECT\", runner.linked],\n [\"DISCONNECT\", runner.disconnected],\n ] as const) {\n if (!trigger.operations.has(operation)) continue;\n for (const [target, pairs] of pairsFor(runner, node, field, refs)) {\n fired.push([\n trigger,\n (ctx) => ({\n text:\n relationshipTriggerPrefix(\n node,\n target,\n printExpr(bind(ctx, pairs)),\n ) + triggerBody(ctx, trigger, operation),\n params: ctx.params,\n }),\n ]);\n }\n }\n continue;\n }\n const creates = trigger.operations.has(\"CREATE\")\n ? (created.get(node) ?? [])\n : [];\n if (creates.length > 0) {\n fired.push(perNode(node, trigger, \"CREATE\", creates));\n }\n const updates = trigger.operations.has(\"UPDATE\")\n ? (updated.get(node) ?? []).filter((key) =>\n setOneOf(runner, node, key, trigger.fields),\n )\n : [];\n if (updates.length > 0) {\n fired.push(perNode(node, trigger, \"UPDATE\", updates));\n }\n }\n }\n await fire(runner, fired);\n // Functions after statements, type by type.\n for (const node of runner.env.model.nodes.values()) {\n await call(runner, node, \"CREATE\", created.get(node) ?? []);\n await call(runner, node, \"UPDATE\", updated.get(node) ?? []);\n }\n}\n\n/** Run the DELETE triggers of `doomed`, while the nodes still exist. */\nexport async function runDeleteTriggers(\n runner: Runner,\n doomed: ReadonlyArray<{ node: NodeType; keys: unknown[] }>,\n): Promise<void> {\n if (!hasTriggers(runner.env)) return;\n const fired: Fired[] = [];\n for (const { node, keys } of doomed) {\n for (const trigger of node.triggers) {\n if (trigger.operations.has(\"DELETE\") && keys.length > 0) {\n fired.push([\n trigger,\n (ctx) => triggerStatement(ctx, node, trigger, \"DELETE\", keys),\n ]);\n }\n }\n }\n await fire(runner, fired);\n for (const { node, keys } of doomed) await call(runner, node, \"DELETE\", keys);\n}\n\n/**\n * Call the type's trigger function for `operation`, bounded by\n * `triggerTimeoutMs`: it runs while the mutation holds the writer lock.\n * What it writes through the transaction it is given joins the write-set.\n */\nasync function call(\n runner: Runner,\n node: NodeType,\n operation: MutationOperation,\n keys: unknown[],\n): Promise<void> {\n const fn =\n runner.env.triggers?.[node.name]?.[\n operation.toLowerCase() as \"create\" | \"update\" | \"delete\"\n ];\n if (!fn) return;\n if (operation !== \"DELETE\") {\n // An earlier trigger function may have deleted some of them.\n const gone = new Set(runner.change.deleted.map(refId));\n keys = keys.filter((key) => !gone.has(refId({ type: node.name, key })));\n }\n if (keys.length === 0) return;\n runner.triggerFunctionRan = true;\n // Everything issued so far is in the database before user code reads it.\n await runner.settle();\n const transaction = new LoraTransaction(\n runner.tx,\n () => undefined,\n true,\n (type) => runner.env.model.nodes.has(type),\n );\n const limit = runner.env.triggerTimeoutMs ?? 1000;\n let timer: ReturnType<typeof setTimeout> | undefined;\n try {\n const running = (async () =>\n fn({\n operation,\n type: node.name,\n keys,\n change: changeSoFar(runner),\n transaction,\n context: runner.env.requestContext,\n }))();\n running.catch(() => undefined);\n await (limit > 0 && Number.isFinite(limit)\n ? Promise.race([\n running,\n new Promise<never>((_, reject) => {\n timer = setTimeout(\n () =>\n reject(\n requestError(\n \"TIMEOUT\",\n `the ${node.name} ${operation} trigger ran past triggerTimeoutMs (${limit} ms); the mutation is rolled back`,\n undefined,\n { triggerTimeoutMs: limit },\n ),\n ),\n limit,\n );\n }),\n ])\n : running);\n } finally {\n clearTimeout(timer);\n }\n for (const nested of transaction.drain()) merge(runner, nested);\n}\n\n/**\n * The write-set as a trigger function sees it: the nodes written so far\n * and the relationships connected and disconnected, which the mutation\n * adds to its change only at its end.\n */\nfunction changeSoFar(runner: Runner): WriteChange {\n const change: WriteChange = {\n ...runner.change,\n created: [...runner.change.created],\n updated: [...runner.change.updated],\n deleted: [...runner.change.deleted],\n connected: [...runner.change.connected],\n disconnected: [...runner.change.disconnected],\n };\n fillChange(change, runner);\n return change;\n}\n\n/**\n * Add the write-set of a mutation a trigger ran to the parent's. A node\n * it deleted is no longer created or updated; one the parent created and\n * the trigger deleted never existed for anyone outside the transaction.\n */\nfunction merge(runner: Runner, nested: WriteChange): void {\n const into = runner.change;\n const drop = (list: EntityRef[], id: string): boolean => {\n const at = list.findIndex((e) => refId(e) === id);\n if (at >= 0) list.splice(at, 1);\n return at >= 0;\n };\n for (const ref of nested.deleted) {\n const id = refId(ref);\n const wasCreated = drop(into.created, id);\n drop(into.updated, id);\n if (!wasCreated && !into.deleted.some((e) => refId(e) === id)) {\n into.deleted.push(ref);\n }\n runner.triggered.add(id);\n }\n const seen = new Set(\n [...into.created, ...into.updated, ...into.deleted].map(refId),\n );\n for (const list of [\"created\", \"updated\"] as const) {\n for (const ref of nested[list]) {\n const id = refId(ref);\n // Deleted earlier in the transaction and created again: it exists.\n if (list === \"created\" && drop(into.deleted, id)) seen.delete(id);\n if (seen.has(id)) continue;\n seen.add(id);\n into[list].push(ref);\n runner.triggered.add(id);\n }\n }\n into.connected.push(...nested.connected);\n into.disconnected.push(...nested.disconnected);\n if (nested.before) (into.before ??= []).push(...nested.before);\n into.broad ||= nested.broad;\n // Types or relationship types named by `touched()` without a node or a\n // relationship to carry them: the mutation's write-set lists only\n // those, so it counts as broad.\n const carried = new Set(nested.entities.map((e) => e.type));\n const written = new Set(\n [...nested.connected, ...nested.disconnected].map((r) => r.type),\n );\n if (\n nested.types.some((t) => !carried.has(t)) ||\n nested.relationshipTypes.some((t) => !written.has(t))\n ) {\n into.broad = true;\n }\n}\n\n/** A trigger that fires, and its statement for what it fires for. */\ntype Fired = [Trigger, (ctx: CompileContext) => Statement];\n\n/** Issue every statement at once, then merge what each reports. */\nasync function fire(runner: Runner, fired: Fired[]): Promise<void> {\n if (fired.length === 0) return;\n const pending = fired.map(([, statement]) => {\n const result = runner.send(statement(runner.ctx()));\n result.catch(() => undefined);\n return result;\n });\n const touched = new Set<NodeType>();\n const made: EntityRef[] = [];\n for (const [i, [trigger]] of fired.entries()) {\n made.push(...report(runner, trigger, await pending[i]!));\n for (const node of uniqueTogetherTouched(\n runner.env.model,\n trigger.statement,\n )) {\n touched.add(node);\n }\n }\n // What a statement wrote is not known node by node: every node of each\n // @uniqueTogether type it may write is compared.\n await checkUniqueTogetherOf(runner.env, runner.tx, [...touched]);\n for (const statement of outboxStatements(runner.env.model, made, () =>\n runner.ctx(),\n )) {\n await runner.send(statement);\n }\n}\n\n/**\n * Add the nodes a statement returned as `created` or `updated` to the\n * write-set. A statement that writes and names neither makes the change\n * broad: listeners cannot tell what it touched. Returns the nodes it\n * reported as created.\n */\nfunction report(\n runner: Runner,\n trigger: Trigger,\n result: QueryResult,\n): EntityRef[] {\n const reported = reportedWrites(runner.env.model, trigger, result);\n if (reported.broad) runner.change.broad = true;\n const made: EntityRef[] = [];\n const seen = new Set(\n [...runner.change.created, ...runner.change.updated].map(refId),\n );\n for (const list of [\"created\", \"updated\"] as const) {\n for (const ref of reported[list]) {\n const id = refId(ref);\n if (seen.has(id)) continue;\n seen.add(id);\n runner.change[list].push(ref);\n runner.triggered.add(id);\n if (list === \"created\") made.push(ref);\n }\n }\n return made;\n}\n\nfunction group(\n runner: Runner,\n entities: readonly EntityRef[],\n): Map<NodeType, unknown[]> {\n const out = new Map<NodeType, Map<string, unknown>>();\n for (const e of entities) {\n const node = runner.env.model.nodes.get(e.type);\n if (!node) continue;\n const keys = out.get(node) ?? new Map<string, unknown>();\n keys.set(keyOf(e.key), e.key);\n out.set(node, keys);\n }\n return new Map([...out].map(([node, keys]) => [node, [...keys.values()]]));\n}\n\n/** Whether the node's update set one of `fields` (any, without `fields`). */\nfunction setOneOf(\n runner: Runner,\n node: NodeType,\n key: unknown,\n fields: readonly string[] | undefined,\n): boolean {\n if (!fields) return true;\n const set = runner.updatedFields.get(node)?.get(keyOf(key));\n return !!set && fields.some((f) => set.has(f));\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 { relationshipTriggerPrefix } from \"../execute/mutate/triggers.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 // @trigger statements, composed as they run: after the match of `this`.\n for (const node of model.nodes.values()) {\n for (const [i, trigger] of node.triggers.entries()) {\n const params: Record<string, unknown> = { a_keys: [] };\n const statement = renameParams(trigger.statement, (p) => {\n params[`a_${p}`] = null;\n return `a_${p}`;\n });\n // A CONNECT or DISCONNECT trigger runs per relationship, once per\n // type its field reaches: `target` is a node of each in turn.\n const field =\n trigger.field === undefined\n ? undefined\n : node.fields.get(trigger.field);\n const texts =\n field?.kind === \"relationship\"\n ? field.members.flatMap((member) => {\n const target = model.nodes.get(member);\n return target\n ? [\n relationshipTriggerPrefix(node, target, \"$a_keys\") +\n statement,\n ]\n : [];\n })\n : [\n `UNWIND $a_keys AS lora_trigger_key\\n` +\n `MATCH (this:${name(node.labels[0]!)}) WHERE this.${name(node.key.property)} = lora_trigger_key\\n` +\n statement,\n ];\n const at = (message: string) =>\n findings.push({\n type: node.name,\n field: `@trigger ${i + 1}`,\n message,\n });\n for (const text of texts) {\n try {\n await driver.explain({ text, params: params as never });\n } catch (err) {\n at(err instanceof Error ? err.message : String(err));\n break;\n }\n }\n }\n }\n return findings;\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/types.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 element: [\"NodeByPropertyScan\"],\n any: [\n \"NodeByPropertyScan\",\n \"NodeByPropertyRangeScan\",\n \"NodeByTextScan\",\n \"NodeByPointScan\",\n ],\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\n/**\n * Plan the statements a mutation ran. Every one starts from keys, so none\n * may expand from a full scan (`scanExpands`); the engine's row estimate\n * is held to `rowBudget` when one is given.\n */\nexport async function checkStatements(\n driver: LoraDriver,\n statements: readonly Statement[],\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 statement of statements) {\n const plan = await driver.explain(statement);\n const nodes = flatten(plan.tree);\n const findings = scanExpands(statement, plan);\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\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 {\n FilterOperator,\n GraphModel,\n ModelWarning,\n} from \"../model/types.js\";\nimport { rootSortable } from \"./indexes.js\";\n\n/** Filter operators a RANGE index answers. */\nconst INDEXED_OPS: ReadonlySet<FilterOperator> = new Set<FilterOperator>([\n \"EQ\",\n \"IN\",\n \"GT\",\n \"GTE\",\n \"LT\",\n \"LTE\",\n]);\n\nexport interface LintOptions {\n /** Statistics are loaded: relationship degrees are known. */\n statistics?: boolean;\n}\n\nconst settableOn = (\n f: { settableOn: { create: boolean; update: boolean } },\n op: \"create\" | \"update\",\n) => f.settableOn[op];\n\n/** Whether a field has a rule that judges its value (not only @normalize). */\nconst hasRules = (f: { constraints?: object | undefined }) =>\n f.constraints !== undefined &&\n Object.keys(f.constraints).some((rule) => rule !== \"normalize\");\n\nexport function lintModel(\n model: GraphModel,\n options: LintOptions = {},\n): ModelWarning[] {\n const out: ModelWarning[] = [];\n for (const field of model.mutations) {\n // As for a trigger statement: what it wrote is what it returns.\n if (field.writes && !field.reports) {\n out.push({\n type: \"Mutation\",\n field: field.name,\n message:\n \"the statement writes but returns neither `created` nor `updated`: its change is reported as broad, so subscriptions do not fire for what it wrote and a response cache has to drop everything. Return the nodes it wrote, e.g. RETURN n, n AS created\",\n });\n }\n }\n for (const node of model.nodes.values()) {\n for (const [i, trigger] of node.triggers.entries()) {\n // What a statement wrote is known only from what it returns.\n if (trigger.writes && !trigger.reports) {\n out.push({\n type: node.name,\n field: `@trigger ${i + 1}`,\n message:\n \"the statement writes but returns neither `created` nor `updated`: every mutation it fires in is reported as broad, so listeners and subscriptions cannot tell what changed. Return the nodes it wrote, e.g. RETURN n AS created\",\n });\n }\n }\n for (const f of node.fields.values()) {\n if (f.kind === \"scalar\") {\n if (f.filters.has(\"CASE_INSENSITIVE\")) {\n out.push({\n type: node.name,\n field: f.name,\n message:\n \"CASE_INSENSITIVE compares lowercased values and cannot use an index: every such filter scans the label\",\n });\n }\n // LoraDB compares strings exactly: without @normalize, two\n // spellings of one value are two values to a unique constraint.\n if (\n f.unique &&\n !f.list &&\n (f.type === \"String\" || f.type === \"ID\") &&\n !f.constraints?.normalize &&\n (settableOn(f, \"create\") || settableOn(f, \"update\"))\n ) {\n out.push({\n type: node.name,\n field: f.name,\n message:\n \"@unique on text a client supplies, without @normalize: 'Ada@x.com', 'ada@x.com' and 'ada@x.com ' are three values. Add @normalize(trim: true, case: LOWER) if they should be one\",\n });\n }\n // A rule on a generated key never runs: the key is not an input.\n if (f.key && f.generate && hasRules(f)) {\n out.push({\n type: node.name,\n field: f.name,\n message:\n \"validation rules on a @key(generate: true) apply only to a key the client supplies; a generated UUID is stored as it is\",\n });\n }\n // An index over two or a handful of values narrows little: half\n // the label is still read for `{ active: { eq: true } }`.\n if (\n (f.type === \"Boolean\" || f.type === \"Enum\") &&\n !f.list &&\n !f.unique &&\n !f.key &&\n f.indexes.length === 0 &&\n (rootSortable(model, node, f) ||\n [...f.filters].some((op) => INDEXED_OPS.has(op)))\n ) {\n out.push({\n type: node.name,\n field: f.name,\n message: `an index is inferred for this ${f.type === \"Boolean\" ? \"Boolean\" : `enum (${f.enumName ?? \"Enum\"})`}, which has few distinct values: a filter on it alone still reads a large share of the label. It helps next to a selective filter, not instead of one`,\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 // A filter rule never guards CREATE: there is no node to filter yet.\n const rules = (op: string) => [\n ...(op === \"CREATE\" ? [] : (node.authorization?.filter ?? [])),\n ...(node.authorization?.validate ?? []),\n ];\n const open = [...node.mutations].filter(\n (op) =>\n !node.authentication?.has(op) &&\n !rules(op).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","// Reading `@authentication` and `@authorization` into rules, and the\n// questions the build asks of a rule's shape: whether it tests claims\n// only, whether an anonymous request could pass it, which relationship\n// operations it covers.\n\nimport type {\n AuthOperation,\n Authorization,\n AuthorizationWhere,\n NodeType,\n RelationshipField,\n} from \"../types.js\";\nimport { RELATIONSHIP_OPERATIONS } from \"../types.js\";\nimport { VIEWER_TEST } from \"../desugar.js\";\n\nexport function 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 */\nexport function 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\n/**\n * `@authorization` on a Query or Mutation @cypher field: validate rules\n * guarding the call, tested before the statement runs. There is no node,\n * so they test claims (`jwt`) and the caller's node (`viewer`); their\n * `operations` and `when` do not matter.\n */\nexport function rootFieldRules(\n args: Record<string, unknown> | undefined,\n at: (message: string) => void,\n): Authorization | undefined {\n const rules = readAuthorization(args);\n if (!rules) return undefined;\n if (rules.filter.length > 0) {\n at(\n \"a root @cypher field takes validate rules: there are no rows to filter\",\n );\n }\n if (rules.mask?.length) {\n at(\"a root @cypher field takes validate rules: there is no row to mask\");\n }\n return rules;\n}\n\nexport function readAuthorization(\n args: Record<string, unknown> | undefined,\n): Authorization | undefined {\n if (!args) return undefined;\n type Raw = {\n operations: AuthOperation[];\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 // Settled with the schema's default once the rule is desugared.\n requireAuthentication: true,\n where: r.where,\n }));\n const validate = ((args[\"validate\"] as Raw[] | undefined) ?? []).map((r) => ({\n operations: new Set(r.operations),\n when: new Set<\"BEFORE\" | \"AFTER\">(r.when ?? [\"BEFORE\", \"AFTER\"]),\n // Settled with the schema's default once the rule is desugared.\n requireAuthentication: true,\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\nexport const PROPERTY_OPS = new Set<AuthOperation>([\n \"READ\",\n \"CREATE\",\n \"UPDATE\",\n]);\n\n/** Keys of a rule that are not claim tests: `node`, `viewer`, … */\n/**\n * Whether a request without a token could pass the rule: some branch\n * reads no claim. A claim read without a token denies its branch (and\n * the whole rule under NOT), so those branches never pass. An `isViewer`\n * test is the exception: without a token it is false for every node (see\n * `VIEWER_TEST`), so under `none`, `NOT` or `all` it can pass.\n */\nexport function passableWithoutClaims(where: unknown): boolean {\n if (!isRecord(where)) return false;\n return Object.entries(where).every(([k, value]) => {\n if (k === \"AND\") {\n return Array.isArray(value) && value.every(passableWithoutClaims);\n }\n if (k === \"OR\") {\n return Array.isArray(value) && value.some(passableWithoutClaims);\n }\n if (k === \"jwt\" || k === \"viewer\") return false;\n return !readsClaims(value, k === \"NOT\" ? \"negated\" : \"plain\");\n });\n}\n\n/**\n * Where a test stands: `plain` (it must hold), `negated` (under `none` or\n * `NOT`: it must fail), or `any` (under `all`: an empty list passes).\n */\ntype Polarity = \"plain\" | \"negated\" | \"any\";\n\nfunction readsClaims(value: unknown, polarity: Polarity = \"plain\"): boolean {\n if (typeof value === \"string\") {\n return (\n value.startsWith(\"$jwt.\") ||\n value.includes(\"${jwt.\") ||\n value.includes(\"${viewer.\")\n );\n }\n if (Array.isArray(value)) return value.some((v) => readsClaims(v, polarity));\n if (!isRecord(value)) return false;\n // A false `isViewer` passes a negated test, and `all` over no nodes.\n if (VIEWER_TEST in value) return polarity === \"plain\";\n return Object.entries(value).some(([k, v]) => {\n if (k === \"jwt\" || k === \"viewer\") return true;\n const inner: Polarity =\n polarity === \"any\"\n ? \"any\"\n : k === \"all\"\n ? \"any\"\n : k === \"none\" || k === \"NOT\"\n ? polarity === \"plain\"\n ? \"negated\"\n : \"plain\"\n : polarity;\n return readsClaims(v, inner);\n });\n}\n\nexport function 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/** The relationship operations a field's rules cover. */\nexport function relationshipRuleOperations(\n f: RelationshipField,\n): Set<AuthOperation> {\n return new Set(\n (f.authorization?.validate ?? []).flatMap((r) =>\n [...r.operations].filter((op) => RELATIONSHIP_OPERATIONS.has(op)),\n ),\n );\n}\n\n/** A rule over a relationship's source, target and edge. */\nexport const isRelationshipRule = (rule: {\n operations: ReadonlySet<AuthOperation>;\n}): boolean =>\n [...rule.operations].some((op) => RELATIONSHIP_OPERATIONS.has(op));\n\n/**\n * The authorization of a field to an interface or union, per member: its\n * relationship rules hold per member, each with that member as its\n * target. Sugar expands differently per member (`target: { isViewer:\n * true }` is only ever true of one), so each member gets its own copy of\n * the rules, which `desugar` expands in place.\n */\nexport function memberAuthorization(\n f: RelationshipField,\n nodes: ReadonlyMap<string, NodeType>,\n desugar: (\n rules: ReadonlyArray<{ where: AuthorizationWhere }>,\n target: NodeType,\n ) => void,\n): Map<string, Authorization> {\n const perMember = new Map<string, Authorization>();\n const authorization = f.authorization;\n if (!authorization) return perMember;\n const rel = authorization.validate.filter(isRelationshipRule);\n const rest = authorization.validate.filter((r) => !isRelationshipRule(r));\n for (const member of f.members) {\n const target = nodes.get(member);\n if (!target) continue;\n const own = rel.map((r) => ({ ...r, where: structuredClone(r.where) }));\n desugar(own, target);\n perMember.set(member, { ...authorization, validate: [...rest, ...own] });\n }\n return perMember;\n}\n\nexport const isRecord = (x: unknown): x is Record<string, unknown> =>\n typeof x === \"object\" && x !== null && !Array.isArray(x);\n","// The callers the access matrix and the authorization lints evaluate as:\n// anonymous, authenticated, `viewer`, and one per claim value the rules test,\n// each with the token (and, for `viewer`, the model) its verdicts are read off.\n\nimport type {\n AuthorizationWhere,\n Field,\n GraphModel,\n NodeType,\n RelationshipPropertiesType,\n} from \"../model/types.js\";\n\nexport interface Principal {\n name: string;\n jwt: Record<string, unknown> | undefined;\n /** The model this principal's verdicts are read off, when not the schema's. */\n model?: GraphModel;\n}\n\n/** `node` (or its field, or a property type's field) as `p` sees the model. */\nexport const nodeAs = (p: Principal, node: NodeType): NodeType =>\n p.model?.nodes.get(node.name) ?? node;\nexport const fieldAs = <F extends Field>(\n p: Principal,\n node: NodeType,\n f: F,\n): F => (nodeAs(p, node).fields.get(f.name) as F | undefined) ?? f;\nexport const propertyAs = <F extends { name: string }>(\n p: Principal,\n props: RelationshipPropertiesType,\n f: F,\n): F =>\n (p.model?.relationshipProperties.get(props.name)?.fields.get(f.name) as\n | F\n | undefined) ?? f;\n\n/**\n * Anonymous, authenticated (a token with no roles), `viewer` when rules\n * name the caller's node, and one principal per claim value the rules\n * test with `includes`, `eq` or `in` (`roles:admin`).\n */\nexport function 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 // `@authentication(jwt:)` holds the claims without the `jwt` key a\n // rule writes them under.\n const claims = (where: unknown) => (where ? { jwt: where } : undefined);\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(claims(node.authenticationJwt));\n for (const f of node.fields.values()) {\n visit(rules(f.authorization));\n visit(claims(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 for (const f of [...model.queries, ...model.mutations]) {\n visit(rules(f.authorization));\n visit(claims(f.authenticationJwt));\n }\n const related = viewerModel(model);\n return [\n { name: \"anonymous\", jwt: undefined },\n { name: \"authenticated\", jwt: base },\n ...(related ? [{ name: \"viewer\", jwt: base, model: related }] : []),\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 * The model as the `viewer` principal meets it: an authenticated caller\n * on nodes that are theirs, so every part of a rule that only names the\n * caller's node (`isViewer`, alone or through relationships) passes. It\n * shows the most a related caller gets, where `authenticated` shows what\n * every signed-in caller gets. Undefined when no rule has such a part.\n *\n * A part under `NOT` is left as written. \"Not following themselves\" does\n * not fail for the viewer because the viewer is who it names: it depends\n * on the rows, as it does for any signed-in caller, and passing the part\n * and then negating it would read the viewer below `authenticated`.\n */\nfunction viewerModel(model: GraphModel): GraphModel | undefined {\n const viewer = model.viewer;\n if (!viewer) return undefined;\n let found = false;\n const always = { jwt: { [viewer.claim]: { exists: true } } };\n const namesViewer = (node: NodeType | undefined, where: unknown): boolean => {\n if (!node || !isRecord(where)) return false;\n const entries = Object.entries(where);\n if (entries.length !== 1) return false;\n const [key, value] = entries[0]!;\n if (key === \"AND\" || key === \"OR\") {\n if (!Array.isArray(value) || value.length === 0) return false;\n return key === \"AND\"\n ? value.every((w) => namesViewer(node, w))\n : value.some((w) => namesViewer(node, w));\n }\n if (node.name === viewer.type && key === viewer.field) {\n return (\n isRecord(value) &&\n Object.keys(value).length === 1 &&\n value[\"eq\"] === `$jwt.${viewer.claim}`\n );\n }\n const f = node.fields.get(key);\n if (f?.kind !== \"relationship\") return false;\n const target = model.nodes.get(f.target);\n if (!f.list) return namesViewer(target, value);\n return (\n isRecord(value) &&\n Object.keys(value).length === 1 &&\n namesViewer(target, value[\"some\"])\n );\n };\n type Ends = Partial<\n Record<\"node\" | \"source\" | \"target\", NodeType | undefined>\n >;\n const rewrite = (\n where: AuthorizationWhere,\n ends: Ends,\n negated = false,\n ): AuthorizationWhere => {\n if (!isRecord(where)) return where;\n const out: Record<string, unknown> = {};\n let dropped = false;\n for (const [key, value] of Object.entries(where)) {\n if (key === \"AND\" || key === \"OR\") {\n out[key] = Array.isArray(value)\n ? value.map((w) => rewrite(w as AuthorizationWhere, ends, negated))\n : value;\n } else if (key === \"NOT\") {\n out[key] = rewrite(value as AuthorizationWhere, ends, !negated);\n } else if (\n !negated &&\n (key === \"node\" || key === \"source\" || key === \"target\") &&\n namesViewer(ends[key], value)\n ) {\n dropped = true;\n } else out[key] = value;\n }\n if (!dropped) return out;\n found = true;\n // The part passes: it leaves the rule, or stands as a claim the\n // caller has when nothing else is tested beside it.\n return Object.keys(out).length === 0 ? always : out;\n };\n const authorization = <A extends NodeType[\"authorization\"]>(\n a: A,\n ends: Ends,\n ): A =>\n a && {\n ...a,\n filter: a.filter.map((r) => ({ ...r, where: rewrite(r.where, ends) })),\n validate: a.validate.map((r) => ({\n ...r,\n where: rewrite(r.where, ends),\n })),\n ...(a.mask\n ? {\n mask: a.mask.map((m) => ({\n ...m,\n unless: rewrite(m.unless, ends),\n })),\n }\n : {}),\n };\n const nodes = new Map<string, NodeType>();\n for (const node of model.nodes.values()) {\n const fields = new Map<string, Field>();\n for (const f of node.fields.values()) {\n fields.set(\n f.name,\n f.authorization\n ? ({\n ...f,\n authorization: authorization(f.authorization, {\n node,\n ...(f.kind === \"relationship\"\n ? { source: node, target: model.nodes.get(f.target) }\n : {}),\n }),\n } as Field)\n : f,\n );\n }\n nodes.set(node.name, {\n ...node,\n fields,\n authorization: authorization(node.authorization, { node }),\n });\n }\n const relationshipProperties = new Map<string, RelationshipPropertiesType>();\n for (const props of model.relationshipProperties.values()) {\n // Property rules test the ends of the relationship fields using them.\n const user = [...model.nodes.values()]\n .flatMap((n) => [...n.fields.values()])\n .find((f) => f.kind === \"relationship\" && f.properties === props.name);\n const ends: Ends =\n user?.kind === \"relationship\"\n ? {\n source: model.nodes.get(user.owner),\n target: model.nodes.get(user.target),\n }\n : {};\n relationshipProperties.set(props.name, {\n ...props,\n fields: new Map(\n [...props.fields.values()].map((f) => [\n f.name,\n f.authorization\n ? { ...f, authorization: authorization(f.authorization, ends) }\n : f,\n ]),\n ),\n } as RelationshipPropertiesType);\n }\n return found ? { ...model, nodes, relationshipProperties } : undefined;\n}\n\n/**\n * A token carrying `claims` where the `@jwt` type says they live\n * (`@jwtClaim(path: \"app_metadata.roles\")`).\n */\nexport function 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\nexport const isRecord = (x: unknown): x is Record<string, unknown> =>\n typeof x === \"object\" && x !== null && !Array.isArray(x);\n","// The verdict of one rule set for one caller: a type, a field, a relationship,\n// a relationship property or a root @cypher field, for one operation. The\n// claims part of every rule is decided the way a request decides it; what is\n// left depends on the rows.\n\nimport {\n authFilter,\n authValidate,\n bypassed,\n checkAuthentication,\n checkFieldAuthentication,\n fieldReadGuard,\n fieldValidate,\n maskSettled,\n propertyAccess,\n propertyReadAccess,\n relationshipRules,\n rootFieldGuard,\n} from \"../compile/auth.js\";\nimport type { CompileContext } from \"../compile/context.js\";\nimport { printExpr, type Expr } from \"../compile/cypher.js\";\nimport type {\n AuthOperation,\n CypherField,\n Field,\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 /** `EXECUTE`: running a Mutation @cypher field. */\n operation: AuthOperation | \"EXECUTE\";\n principal: string;\n verdict: AccessVerdict;\n /** What decides it: `filter[0]`, `validate[1]`, `@authentication`, `bypass`, … */\n by: string[];\n}\n\nexport function rootFieldVerdict(\n ctx: CompileContext,\n field: CypherField,\n): Pick<AccessEntry, \"verdict\" | \"by\"> {\n const by = [\n ...(field.authentication?.size ? [\"@authentication\"] : []),\n ...(field.authorization?.validate ?? []).map((_, i) => `validate[${i}]`),\n ];\n // A root mutation's listed operations are its own: any one guards it.\n const op =\n field.owner === \"Mutation\"\n ? [...(field.authentication ?? [])][0]\n : (\"READ\" as const);\n try {\n if (op) checkFieldAuthentication(ctx, field.owner, field, op);\n if (field.authorization?.validate.length && bypassed(ctx, undefined)) {\n return { verdict: \"allowed\", by: [\"bypass\"] };\n }\n const rule = rootFieldGuard(ctx, field);\n if (rule) return { verdict: \"validated\", by };\n return { verdict: \"allowed\", by: allowedBy(by) };\n } catch (err) {\n return failed(err, by);\n }\n}\n\nexport const PROPERTY_OPS = [\"READ\", \"CREATE\", \"UPDATE\"] as const;\n\n/** `field` has rules (or `@authentication`) for `op`. */\nexport function fieldWriteGuarded(\n field: {\n authentication?: ReadonlySet<AuthOperation> | undefined;\n authorization?: NodeType[\"authorization\"];\n },\n op: AuthOperation,\n): boolean {\n return (\n (field.authentication?.has(op) ?? false) ||\n (field.authorization?.validate.some((r) => r.operations.has(op)) ?? false)\n );\n}\n\nfunction ruleLabels(\n field: {\n authentication?: ReadonlySet<AuthOperation> | undefined;\n authorization?: NodeType[\"authorization\"];\n },\n op: AuthOperation,\n): string[] {\n return [\n ...(field.authentication?.has(op) ? [\"@authentication\"] : []),\n ...(field.authorization?.validate ?? []).flatMap((r, i) =>\n r.operations.has(op) ? [`validate[${i}]`] : [],\n ),\n ];\n}\n\nexport function fieldWriteVerdict(\n ctx: CompileContext,\n node: NodeType,\n field: Field & { kind: \"scalar\" },\n op: \"CREATE\" | \"UPDATE\",\n): Pick<AccessEntry, \"verdict\" | \"by\"> {\n const by = ruleLabels(field, op);\n try {\n checkFieldAuthentication(ctx, node.name, field, op);\n if (\n field.authorization?.validate.some((r) => r.operations.has(op)) &&\n bypassed(ctx, node)\n ) {\n return { verdict: \"allowed\", by: [\"bypass\"] };\n }\n const rule =\n fieldValidate(ctx, node, field, \"n\", op, \"BEFORE\") ??\n fieldValidate(ctx, node, field, \"n\", op, \"AFTER\");\n return rule ? { verdict: \"validated\", by } : { verdict: \"allowed\", by };\n } catch (err) {\n return failed(err, by);\n }\n}\n\nexport function propertyVerdict(\n ctx: CompileContext,\n field: Parameters<typeof propertyAccess>[1],\n op: AuthOperation,\n): Pick<AccessEntry, \"verdict\" | \"by\"> {\n const by = ruleLabels(field, op);\n if (\n field.authorization?.validate.some((r) => r.operations.has(op)) &&\n bypassed(ctx, undefined) &&\n !field.authentication?.has(op)\n ) {\n return { verdict: \"allowed\", by: [\"bypass\"] };\n }\n // READ rules over the relationship's ends decide per relationship.\n const access: string =\n op === \"READ\"\n ? propertyReadAccess(ctx, field)\n : propertyAccess(ctx, field, op);\n const verdict: AccessVerdict =\n access === \"allowed\"\n ? \"allowed\"\n : access === \"unauthenticated\"\n ? \"unauthenticated\"\n : access === \"forbidden\"\n ? \"denied\"\n : \"validated\";\n return { verdict, by };\n}\n\nexport function typeVerdict(\n ctx: CompileContext,\n node: NodeType,\n op: AuthOperation,\n): Pick<AccessEntry, \"verdict\" | \"by\"> {\n const verdict = typeRuleVerdict(ctx, node, op);\n // `@key(scope: VIEWER)`: a create is checked against the caller's key\n // space before any statement runs, so it needs a token, and then it is\n // decided per key. The schema's bypass skips it.\n if (\n op !== \"CREATE\" ||\n !node.key.keyScope ||\n !ctx.model.viewer ||\n verdict.verdict === \"denied\" ||\n verdict.verdict === \"unauthenticated\" ||\n bypassed(ctx, node)\n ) {\n return verdict;\n }\n const by = [...verdict.by.filter((b) => b !== \"no rule\"), \"key scope\"];\n return { verdict: ctx.jwt ? \"validated\" : \"unauthenticated\", by };\n}\n\nfunction typeRuleVerdict(\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\nexport function 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\n/**\n * The `@authentication` operation a relationship operation answers to: a\n * connect is checked as CREATE_RELATIONSHIP on the field, a disconnect as\n * DELETE_RELATIONSHIP. Edge reads and updates have none of their own.\n */\nexport function relationshipAuthentication(\n op: RelationshipOperation,\n): AuthOperation | undefined {\n return op === \"CONNECT\"\n ? \"CREATE_RELATIONSHIP\"\n : op === \"DISCONNECT\"\n ? \"DELETE_RELATIONSHIP\"\n : undefined;\n}\n\nexport function relationshipVerdict(\n ctx: CompileContext,\n node: NodeType,\n field: Parameters<typeof relationshipRules>[1],\n op: RelationshipOperation,\n): Pick<AccessEntry, \"verdict\" | \"by\"> {\n const authentication = relationshipAuthentication(op);\n const authenticated =\n authentication !== undefined && field.authentication?.has(authentication);\n const by = [\n ...(authenticated ? [\"@authentication\"] : []),\n ...(field.authorization?.validate ?? []).flatMap((r, i) =>\n r.operations.has(op) ? [`validate[${i}]`] : [],\n ),\n ];\n try {\n // Like a field's READ: `@authentication` is asked before the bypass.\n if (authentication) {\n checkFieldAuthentication(ctx, node.name, field, authentication);\n }\n if (bypassed(ctx, node)) return { verdict: \"allowed\", by: [\"bypass\"] };\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","// Authorization lint for `check`: rules that are valid but probably not what\n// was meant. Warnings, not failures, decided with the access matrix's\n// verdicts for an authenticated caller without roles.\n\nimport type { GraphQLSchema } from \"graphql\";\nimport { authFilter, maskSettled } from \"../compile/auth.js\";\nimport { newContext, type CompileContext } from \"../compile/context.js\";\nimport type {\n AuthorizationWhere,\n Field,\n GraphModel,\n ModelWarning,\n NestedOperation,\n NodeType,\n} from \"../model/types.js\";\nimport { passableWithoutClaims } from \"../model/build/authorization.js\";\nimport { PLACEHOLDER } from \"../model/types.js\";\nimport { isRecord, token } from \"./principals.js\";\nimport { typeVerdict } from \"./verdicts.js\";\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 out.push(...anonymousLints(node, undefined, node.authorization));\n for (const f of node.fields.values()) {\n if (f.kind === \"custom\") continue;\n out.push(...anonymousLints(node, f, f.authorization));\n }\n // `bypass: true` (or `false`) on the type says it was decided.\n if (model.bypass && node.authorization?.bypass === undefined) {\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, or bypass: true to acknowledge it`,\n });\n }\n }\n }\n }\n out.push(\n ...bypassReach(model),\n ...rewritableRuleFields(model, authenticated),\n ...maskOracles(model, authenticated),\n ...refusedNestedWrites(model, () =>\n newContext({ schema, fragments: {}, variables: {} }, model, {\n jwt: token(model, { [subject]: \"someone\" }),\n }),\n ),\n );\n return out;\n}\n\n/**\n * Every type whose rules the schema's bypass skips, in one line: the\n * bypass is written once and reaches each type that has rules, so a new\n * type joins it without a word. Types that say `bypass: true` or `false`\n * have decided and are left out.\n */\nfunction bypassReach(model: GraphModel): ModelWarning[] {\n if (!model.bypass) return [];\n const reached: string[] = [];\n for (const node of model.nodes.values()) {\n if (node.authorization?.bypass !== undefined) continue;\n const ruled =\n (node.authorization?.filter.length ?? 0) > 0 ||\n (node.authorization?.validate.length ?? 0) > 0 ||\n node.key.keyScope !== undefined ||\n [...node.fields.values()].some(\n (f) =>\n (f.authorization?.filter.length ?? 0) > 0 ||\n (f.authorization?.validate.length ?? 0) > 0 ||\n (f.authorization?.mask?.length ?? 0) > 0,\n );\n if (ruled) reached.push(node.name);\n }\n // Property rules have no type to say `bypass: false` on.\n const properties = [...model.relationshipProperties.values()]\n .filter((p) =>\n [...p.fields.values()].some(\n (f) => (f.authorization?.validate.length ?? 0) > 0,\n ),\n )\n .map((p) => p.name);\n if (reached.length + properties.length === 0) return [];\n const parts = [\n ...(reached.length > 0\n ? [\n `the rules of ${reached.length} ${reached.length === 1 ? \"type\" : \"types\"} that ${reached.length === 1 ? \"says\" : \"say\"} neither bypass: true nor bypass: false (${reached.join(\", \")})`,\n ]\n : []),\n ...(properties.length > 0\n ? [`the property rules of ${properties.join(\", \")}, which cannot opt out`]\n : []),\n ];\n return [\n {\n type: \"schema\",\n message: `@authorizationDefaults(bypass:) reaches ${parts.join(\", and \")}; callers passing it skip them`,\n },\n ];\n}\n\n/**\n * Fields of `node` a rule tests at the top level of its `part` (`node`,\n * `source` or `target`), through AND, OR and NOT. `pinned`: every test of\n * the field names one node by a claim or context value (`author: {\n * isViewer: true }` once expanded), so it passes for one node only.\n */\nfunction testedFields(\n where: unknown,\n part: \"node\" | \"source\" | \"target\",\n node: NodeType,\n model: GraphModel,\n out = new Map<string, { pinned: boolean }>(),\n): Map<string, { pinned: boolean }> {\n if (Array.isArray(where)) {\n for (const w of where) testedFields(w, part, node, model, out);\n return out;\n }\n if (!isRecord(where)) return out;\n for (const [key, value] of Object.entries(where)) {\n if (key === \"AND\" || key === \"OR\" || key === \"NOT\") {\n testedFields(value, part, node, model, out);\n } else if (key === part) nodeTests(value, node, model, out);\n // `${node.trip.key}` anywhere in the rule reads the node's `trip` too.\n for (const name of referencedFields(value, part)) {\n if (node.fields.has(name)) out.set(name, { pinned: false });\n }\n }\n return out;\n}\n\n/** The first field of every `${<part>.path}` placeholder in a rule value. */\nfunction referencedFields(value: unknown, part: string): string[] {\n if (typeof value === \"string\") {\n return [...value.matchAll(PLACEHOLDER)]\n .filter((m) => m[1] === part)\n .map((m) => m[2]!.split(\".\")[0]!);\n }\n if (Array.isArray(value)) {\n return value.flatMap((v) => referencedFields(v, part));\n }\n if (isRecord(value)) {\n return Object.values(value).flatMap((v) => referencedFields(v, part));\n }\n return [];\n}\n\nfunction nodeTests(\n filter: unknown,\n node: NodeType,\n model: GraphModel,\n out: Map<string, { pinned: boolean }>,\n): void {\n if (Array.isArray(filter)) {\n for (const f of filter) nodeTests(f, node, model, out);\n return;\n }\n if (!isRecord(filter)) return;\n for (const [key, value] of Object.entries(filter)) {\n if (key === \"AND\" || key === \"OR\" || key === \"NOT\") {\n nodeTests(value, node, model, out);\n continue;\n }\n const name = node.fields.has(key)\n ? key\n : key.replace(/(Connection|Aggregate|Exists)$/, \"\");\n const f = node.fields.get(name);\n if (!f || (f.kind !== \"scalar\" && f.kind !== \"relationship\")) continue;\n const pinned =\n f.kind === \"relationship\" &&\n key === name &&\n pinsOne(value, model.nodes.get(f.target));\n out.set(name, { pinned: (out.get(name)?.pinned ?? true) && pinned });\n }\n}\n\n/** `{ <key or unique field>: { eq: \"$jwt.…\" } }`: one node, by a claim. */\nfunction pinsOne(value: unknown, target: NodeType | undefined): boolean {\n if (!target || !isRecord(value)) return false;\n const keys = Object.keys(value);\n if (keys.length !== 1) return false;\n const f = target.fields.get(keys[0]!);\n const test = value[keys[0]!];\n return (\n f?.kind === \"scalar\" &&\n (f.key || f.unique) &&\n !f.list &&\n isRecord(test) &&\n Object.keys(test).length === 1 &&\n typeof test[\"eq\"] === \"string\" &&\n test[\"eq\"].startsWith(\"$\")\n );\n}\n\nconst REPOINT: readonly NestedOperation[] = [\"CONNECT\", \"DISCONNECT\", \"CREATE\"];\n\n/**\n * The nested writes an update input offers that re-point a single\n * relationship (`connect`, `disconnect`, `create`), or none.\n */\nfunction repointable(node: NodeType, f: Field): NestedOperation[] {\n if (\n f.kind !== \"relationship\" ||\n f.list ||\n !node.mutations.has(\"UPDATE\") ||\n !f.settableOn.update\n ) {\n return [];\n }\n return REPOINT.filter((op) => f.nestedOperations.has(op));\n}\n\n/** Whether an update can change the field's value. */\nfunction updatable(node: NodeType, f: Field): boolean {\n if (f.kind === \"scalar\") {\n return node.mutations.has(\"UPDATE\") && f.settableOn.update && !f.readonly;\n }\n return repointable(node, f).length > 0;\n}\n\n/**\n * A rule over a field the guarded operation can rewrite:\n * - an UPDATE rule testing a single relationship the update input can\n * re-point: the rule sees the node before (and, validated AFTER, after)\n * the write, so a caller passing it on two targets moves the node;\n * - a CREATE validate rule testing a field UPDATE can change while no\n * UPDATE rule tests it: created as the rule demands, then changed.\n * Tests that name one node by a claim (`isViewer`) can only re-point to\n * the caller's own node, so the first check skips them. A type no\n * signed-in caller without roles may update has nothing to re-point, and a\n * scalar a CREATE rule tests is usually state an update moves on (a\n * request's status), so the second check looks at relationships only.\n */\nfunction rewritableRuleFields(\n model: GraphModel,\n authenticated: CompileContext,\n): ModelWarning[] {\n const out: ModelWarning[] = [];\n for (const node of model.nodes.values()) {\n if (!node.mutations.has(\"UPDATE\")) continue;\n const probe = { ...authenticated, params: {}, vars: new Set([\"n\"]) };\n const { verdict } = typeVerdict(probe, node, \"UPDATE\");\n if (verdict === \"denied\" || verdict === \"unauthenticated\") continue;\n const rules = [\n ...(node.authorization?.filter ?? []).map((r, i) => ({\n r,\n label: `filter[${i}]`,\n after: false,\n })),\n ...(node.authorization?.validate ?? []).map((r, i) => ({\n r,\n label: `validate[${i}]`,\n after: r.when.has(\"AFTER\"),\n })),\n ];\n const updateRules = rules.filter(({ r }) => r.operations.has(\"UPDATE\"));\n const updateTests = new Map<\n string,\n { labels: string[]; after: boolean; pinned: boolean }\n >();\n for (const { r, label, after } of updateRules) {\n for (const [name, t] of testedFields(r.where, \"node\", node, model)) {\n const seen = updateTests.get(name);\n updateTests.set(name, {\n labels: [...(seen?.labels ?? []), label],\n after: (seen?.after ?? false) || after,\n pinned: (seen?.pinned ?? true) && t.pinned,\n });\n }\n }\n for (const [name, t] of updateTests) {\n const f = node.fields.get(name)!;\n const ops = repointable(node, f);\n if (ops.length === 0 || t.pinned || f.kind !== \"relationship\") continue;\n out.push({\n type: node.name,\n field: name,\n message: `${t.labels.join(\", \")} ${t.labels.length === 1 ? \"guards\" : \"guard\"} UPDATE by testing ${name}, which the update input can re-point (${ops.map((o) => o.toLowerCase()).join(\", \")}): ${t.after ? `the rule runs before and after the write, so a caller who passes it on both the old and the new ${f.target} moves the ${node.name}` : `the rule only sees the ${node.name} before the write, so a caller who passes it can move it to any ${f.target}`}; declare ${name} @settable(onCreate: true, onUpdate: false) if it is fixed once created`,\n });\n }\n const createTested = new Map<string, string[]>();\n (node.authorization?.validate ?? []).forEach((r, i) => {\n if (!r.operations.has(\"CREATE\")) return;\n for (const name of testedFields(r.where, \"node\", node, model).keys()) {\n createTested.set(name, [\n ...(createTested.get(name) ?? []),\n `validate[${i}]`,\n ]);\n }\n });\n for (const [name, labels] of createTested) {\n const f = node.fields.get(name)!;\n if (updateTests.has(name) || !updatable(node, f)) continue;\n // A field-level UPDATE rule guards writing the field itself.\n if (f.authorization?.validate.some((r) => r.operations.has(\"UPDATE\"))) {\n continue;\n }\n if (f.kind !== \"relationship\" || f.list) continue;\n out.push({\n type: node.name,\n field: name,\n message: `${labels.join(\", \")} ${labels.length === 1 ? \"tests\" : \"test\"} ${name} on CREATE, but UPDATE can re-point it and no UPDATE rule tests it: a caller can create the ${node.name} as the rule demands, then change ${name}; declare ${name} @settable(onCreate: true, onUpdate: false), or add an UPDATE rule that tests it`,\n });\n }\n }\n return out;\n}\n\n/**\n * A validate rule (other than READ) or relationship rule testing a masked\n * field: rules see the stored value, so success versus FORBIDDEN tells a\n * caller what the mask hides from them. Skipped when the claims of an\n * authenticated caller already settle the mask.\n */\nfunction maskOracles(\n model: GraphModel,\n authenticated: CompileContext,\n): ModelWarning[] {\n const out: ModelWarning[] = [];\n const masked = (node: NodeType, name: string) => {\n const f = node.fields.get(name);\n return (\n f?.kind === \"scalar\" &&\n (f.authorization?.mask?.length ?? 0) > 0 &&\n !maskSettled(authenticated, node, f)\n );\n };\n const report = (owner: NodeType, name: string, rule: string, ops: string[]) =>\n out.push({\n type: owner.name,\n field: name,\n message: `${rule} (${ops.join(\", \")}) tests ${owner.name}.${name}, which a mask hides from callers failing its unless; rules see the stored value, so whether the request succeeds or is FORBIDDEN tells such a caller the hidden value. Test what the caller can see, or make sure every caller the rule decides for passes the mask`,\n });\n for (const node of model.nodes.values()) {\n const seen = new Set<string>();\n const once = (...args: Parameters<typeof report>) => {\n const id = `${args[0].name}.${args[1]}:${args[2]}`;\n if (seen.has(id)) return;\n seen.add(id);\n report(...args);\n };\n // A create's rules test values the caller wrote: nothing hidden.\n const opsOf = (r: { operations: ReadonlySet<string> }) =>\n [...r.operations].filter((op) => op !== \"READ\" && op !== \"CREATE\");\n (node.authorization?.validate ?? []).forEach((r, i) => {\n const ops = opsOf(r);\n if (ops.length === 0) return;\n for (const name of testedFields(r.where, \"node\", node, model).keys()) {\n if (masked(node, name)) once(node, name, `validate[${i}]`, ops);\n }\n });\n for (const f of node.fields.values()) {\n (f.authorization?.validate ?? []).forEach((r, i) => {\n const ops = opsOf(r);\n if (ops.length === 0) return;\n const label = `${node.name}.${f.name} validate[${i}]`;\n for (const part of [\"node\", \"source\"] as const) {\n for (const name of testedFields(r.where, part, node, model).keys()) {\n if (masked(node, name)) once(node, name, label, ops);\n }\n }\n const target =\n f.kind === \"relationship\" ? model.nodes.get(f.target) : undefined;\n if (!target) return;\n for (const name of testedFields(\n r.where,\n \"target\",\n target,\n model,\n ).keys()) {\n if (masked(target, name)) once(target, name, label, ops);\n }\n });\n }\n }\n return out;\n}\n\n/**\n * Nested creates, updates and deletes an input offers into a type whose\n * rules for that write refuse every authenticated caller without a role\n * or claim beyond the subject: surface only an admin (or the bypass) can\n * use. Decided with the access matrix's verdicts; skipped on an input the\n * same caller cannot use at all (an admin-only type's links).\n */\nfunction refusedNestedWrites(\n model: GraphModel,\n context: () => CompileContext,\n): ModelWarning[] {\n const out: ModelWarning[] = [];\n const subject = model.viewer?.claim ?? \"sub\";\n const refuses = (t: NodeType, op: \"CREATE\" | \"UPDATE\" | \"DELETE\") => {\n const { verdict } = typeVerdict(context(), t, op);\n return verdict === \"denied\" || verdict === \"unauthenticated\";\n };\n for (const node of model.nodes.values()) {\n // An input the same caller cannot use advertises nothing to them.\n const createOpen = node.mutations.has(\"CREATE\") && !refuses(node, \"CREATE\");\n const updateOpen = node.mutations.has(\"UPDATE\") && !refuses(node, \"UPDATE\");\n if (!createOpen && !updateOpen) continue;\n for (const f of node.fields.values()) {\n if (f.kind !== \"relationship\" || f.via) continue;\n const offered = new Set<\"CREATE\" | \"UPDATE\" | \"DELETE\">();\n if (createOpen && f.settableOn.create) {\n if (f.nestedOperations.has(\"CREATE\")) offered.add(\"CREATE\");\n }\n if (updateOpen && f.settableOn.update) {\n for (const op of [\"CREATE\", \"UPDATE\", \"DELETE\"] as const) {\n if (f.nestedOperations.has(op)) offered.add(op);\n }\n }\n const targets = f.members\n .map((m) => model.nodes.get(m))\n .filter((t): t is NodeType => t !== undefined);\n if (targets.length === 0) continue;\n const refused = [...offered].filter((op) =>\n targets.every((t) => refuses(t, op)),\n );\n if (refused.length === 0) continue;\n const kept = [...f.nestedOperations].filter(\n (op) => !refused.includes(op as \"CREATE\"),\n );\n // Edge properties stay writable without the node: UPDATE_EDGE.\n if (\n refused.includes(\"UPDATE\") &&\n f.properties &&\n !kept.includes(\"UPDATE_EDGE\")\n ) {\n kept.push(\"UPDATE_EDGE\");\n }\n out.push({\n type: node.name,\n field: f.name,\n message: `nested ${refused.map((o) => o.toLowerCase()).join(\", \")} into ${f.target}: its ${refused.join(\", \")} rules refuse every signed-in caller without a role or claim beyond ${subject}, so the input advertises writes only an admin (or the bypass) can make; declare nestedOperations: [${kept.join(\", \")}] on ${f.name}`,\n });\n }\n }\n return out;\n}\n\n/** Write operations of a type's rules, and of a relationship field's. */\nconst TYPE_WRITES = [\"CREATE\", \"UPDATE\", \"DELETE\"] as const;\nconst RELATIONSHIP_WRITES = [\"CONNECT\", \"DISCONNECT\", \"UPDATE_EDGE\"] as const;\n\n/**\n * What the rules of `node` (or of its `field`) mean for a request without\n * a token, which depends on one schema-wide setting.\n *\n * While `@authorizationDefaults(requireAuthentication:)` is unset, a rule\n * that needs no claims, as a whole or in one OR branch, is refused for\n * anonymous callers by the default: say which was meant.\n *\n * Once it is `false`, such a rule decides for anonymous callers too. For a\n * read that is the point of the setting. For a write it is easy to turn on\n * by accident, since the setting is one for the schema: name every write\n * rule a signed-out caller can pass and that no `@authentication` covers.\n */\nfunction anonymousLints(\n node: NodeType,\n field: Field | undefined,\n authorization: NodeType[\"authorization\"],\n): ModelWarning[] {\n const out: ModelWarning[] = [];\n const at = field\n ? { type: node.name, field: field.name }\n : { type: node.name };\n const rules = [\n ...(authorization?.filter ?? []).map((r, i) => ({\n r,\n label: `filter[${i}]`,\n })),\n ...(authorization?.validate ?? []).map((r, i) => ({\n r,\n label: `validate[${i}]`,\n })),\n ];\n const advice =\n \"set @authorizationDefaults(requireAuthentication: false) if anonymous callers should get such\";\n for (const { r, label } of rules) {\n if (r.requireAuthenticationDefaulted) {\n const branch = claimFreeBranch(r.where);\n if (branch !== undefined) {\n out.push({\n ...at,\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; ${advice} branches, or true to say they should not`,\n });\n } else if (passableWithoutClaims(r.where)) {\n out.push({\n ...at,\n message: `${label} needs no claims, but requireAuthentication defaults to true, so anonymous callers are refused by it; ${advice} rules, or true to say they should not`,\n });\n }\n continue;\n }\n // The schema said `false`, and the rule reads no claims on some path.\n if (r.requireAuthentication) continue;\n const open = (\n field?.kind === \"relationship\" ? RELATIONSHIP_WRITES : TYPE_WRITES\n ).filter(\n (op) =>\n r.operations.has(op) &&\n !authorization?.public?.has(op) &&\n !node.authorization?.public?.has(op) &&\n !authenticationCovers(node, field, op),\n );\n if (open.length === 0) continue;\n const guard = open.map(guardOf).join(\", \");\n out.push({\n ...at,\n message: `${label} lets a signed-out caller ${open.join(\", \")}: it needs no claims and requireAuthentication is false for the whole schema; test { jwt: { sub: { exists: true } } } beside it, or add @authentication(operations: [${guard}])${field ? \"\" : ` to ${node.name}`}`,\n });\n }\n return out;\n}\n\n/** The `@authentication` operation that guards `op` most directly. */\nconst guardOf = (op: string): string =>\n op === \"CONNECT\"\n ? \"CREATE_RELATIONSHIP\"\n : op === \"DISCONNECT\"\n ? \"DELETE_RELATIONSHIP\"\n : op === \"UPDATE_EDGE\"\n ? \"UPDATE\"\n : op;\n\n/**\n * Whether `@authentication`, on the field or on its type, refuses a\n * request without a token before a rule for `op` is asked.\n *\n * A type's operation is guarded by the type, a field's write by the field\n * or the type. A relationship operation is guarded by its own operation\n * (CONNECT by CREATE_RELATIONSHIP, DISCONNECT by DELETE_RELATIONSHIP), or\n * by every mutation it can be written in: a connect in a create or an\n * update, a disconnect or an edge update in an update.\n */\nfunction authenticationCovers(\n node: NodeType,\n field: Field | undefined,\n op: string,\n): boolean {\n const has = (o: string) =>\n (node.authentication?.has(o as never) ?? false) ||\n (field?.kind !== \"custom\" &&\n (field?.authentication?.has(o as never) ?? false));\n if (field?.kind !== \"relationship\") return has(op);\n const own =\n op === \"CONNECT\"\n ? \"CREATE_RELATIONSHIP\"\n : op === \"DISCONNECT\"\n ? \"DELETE_RELATIONSHIP\"\n : undefined;\n if (own && has(own)) return true;\n const within = op === \"CONNECT\" ? [\"CREATE\", \"UPDATE\"] : [\"UPDATE\"];\n return within.every(has);\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","// 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 { describeConstraints } from \"../model/constraints.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 // What a client reads on an input field: the SDL's description, then\n // the field's validation rules in words, so they show in the schema.\n const inputDescription = (f: ScalarField, note?: string) =>\n [f.description, describeConstraints(f.constraints, f.list), note]\n .filter((part) => part)\n .join(\" \") || undefined;\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: inputDescription(\n f,\n op === \"UPDATE\" && !f.required\n ? \"null removes the value.\"\n : undefined,\n ),\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 // With UPDATE_EDGE alone, `node` is left out: the properties only.\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 rel.nestedOperations.has(\"UPDATE\") &&\n target.mutations.has(\"UPDATE\") &&\n 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 // `@size(max:)` on the field, said on each list it bounds.\n const atMost = (rel: RelationshipField, text?: string) => {\n if (!rel.list || !rel.maxItems) return text ? { description: text } : {};\n const bound = `At most ${rel.maxItems.max} per list.`;\n return { description: text ? `${text} ${bound}` : bound };\n };\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, ...atMost(rel) };\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 ...atMost(rel),\n };\n }\n if (allows(\"CREATE\") && canCreate(rel)) {\n const create = nestedCreateInput(owner, rel);\n fields[\"create\"] = {\n type: rel.list ? listOf(nonNull(create)) : create,\n ...atMost(rel),\n };\n }\n if (update && allows(\"DISCONNECT\")) {\n fields[\"disconnect\"] = rel.list\n ? {\n type: listOf(nonNull(ctx.inputType(target.key))),\n ...atMost(\n rel,\n `${target.key.name}s of the ${target.name} nodes to disconnect.`,\n ),\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\") || allows(\"UPDATE_EDGE\"))) {\n const nested = nestedUpdateInput(owner, rel);\n if (nested) {\n fields[\"update\"] = {\n type: rel.list ? listOf(nonNull(nested)) : nested,\n ...atMost(\n rel,\n `Update connected ${target.name} nodes or their relationship properties in place.`,\n ),\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: inputDescription(f),\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","// 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 {\n Kind,\n valueFromASTUntyped,\n visit,\n type FragmentDefinitionNode,\n type GraphQLSchema,\n type OperationDefinitionNode,\n type SelectionSetNode,\n} from \"graphql\";\nimport { newContext } from \"../compile/context.js\";\nimport type {\n AuthOperation,\n CypherField,\n Field,\n GraphModel,\n NodeType,\n RelationshipOperation,\n} from \"../model/types.js\";\nimport { lowerFirst } from \"../model/build/shapes.js\";\nimport { names } from \"../schema/names.js\";\nimport { mutationNames } from \"../schema/mutations.js\";\nimport {\n fieldAs,\n isRecord,\n nodeAs,\n principalsOf,\n propertyAs,\n type Principal,\n} from \"./principals.js\";\nimport {\n PROPERTY_OPS,\n fieldVerdict,\n fieldWriteGuarded,\n fieldWriteVerdict,\n propertyVerdict,\n relationshipAuthentication,\n relationshipVerdict,\n rootFieldVerdict,\n typeVerdict,\n type AccessEntry,\n type AccessVerdict,\n} from \"./verdicts.js\";\n\n/** One root field of an operation, as each kind of caller. */\nexport interface RootFieldAccess {\n /** The root field. */\n field: string;\n /** Its response key, when aliased. */\n alias?: string;\n /**\n * What the field acts on: a node type, an interface or union, `Node`\n * (for `node` / `nodes`), or `Query` / `Mutation` for a `@cypher` field.\n */\n type: string;\n /** The operations it needs: `READ`, `CREATE`, `UPDATE` …, `EXECUTE`. */\n operations: Array<AuthOperation | \"EXECUTE\">;\n /**\n * Per principal (`anonymous`, `authenticated`, `roles:admin` …). A\n * field over several operations or types (an upsert, `node`, a union)\n * reports the most restrictive of them, `by` naming each part.\n */\n access: Record<string, { verdict: AccessVerdict; by: string[] }>;\n /**\n * Variables in the field's arguments that were given no value: what\n * they would write through relationship fields is not in `access`.\n */\n unresolved?: string[];\n}\n\nexport interface OperationAccess {\n operation: \"query\" | \"mutation\" | \"subscription\";\n name: string | undefined;\n /** The principals, in the order the matrix lists them. */\n principals: string[];\n /** Root fields in document order (fragments followed); `__typename` left out. */\n fields: RootFieldAccess[];\n /**\n * Per principal, the most restrictive verdict over the root fields:\n * `denied` or `unauthenticated` means the operation cannot succeed.\n */\n verdicts: Record<string, AccessVerdict>;\n}\n\n/** Most restrictive first. */\nconst RESTRICTIVENESS: readonly AccessVerdict[] = [\n \"denied\",\n \"unauthenticated\",\n \"validated\",\n \"filtered\",\n \"masked\",\n \"allowed\",\n];\n\nfunction strictest(verdicts: AccessVerdict[]): AccessVerdict {\n let best = RESTRICTIVENESS.length - 1;\n for (const v of verdicts) best = Math.min(best, RESTRICTIVENESS.indexOf(v));\n return RESTRICTIVENESS[best]!;\n}\n\ntype RootTarget =\n | { kind: \"node\"; node: NodeType; ops: AuthOperation[] }\n | { kind: \"abstract\"; type: string; members: NodeType[] }\n | { kind: \"relay\"; members: NodeType[] }\n | { kind: \"cypher\"; field: CypherField };\n\n/** Every generated or declared root field, by operation type and name. */\nfunction rootTargets(\n model: GraphModel,\n): Record<OperationAccess[\"operation\"], Map<string, RootTarget>> {\n const query = new Map<string, RootTarget>();\n const mutation = new Map<string, RootTarget>();\n const subscription = new Map<string, RootTarget>();\n const read = (node: NodeType): RootTarget => ({\n kind: \"node\",\n node,\n ops: [\"READ\"],\n });\n for (const node of model.nodes.values()) {\n if (node.read) {\n for (const name of [\n names.listRoot(node),\n names.connectionRoot(node),\n names.singleRoot(node),\n names.aggregateRoot(node),\n names.groupedRoot(node),\n ]) {\n query.set(name, read(node));\n }\n for (const index of node.search) {\n query.set(index.queryName, read(node));\n query.set(`${index.queryName}Connection`, read(node));\n }\n }\n const write = (ops: AuthOperation[]): RootTarget => ({\n kind: \"node\",\n node,\n ops,\n });\n mutation.set(mutationNames.create(node), write([\"CREATE\"]));\n mutation.set(mutationNames.upsert(node), write([\"CREATE\", \"UPDATE\"]));\n mutation.set(mutationNames.update(node), write([\"UPDATE\"]));\n mutation.set(mutationNames.updateMany(node), write([\"UPDATE\"]));\n mutation.set(mutationNames.delete(node), write([\"DELETE\"]));\n mutation.set(mutationNames.deleteMany(node), write([\"DELETE\"]));\n subscription.set(`${lowerFirst(node.name)}Changed`, write([\"SUBSCRIBE\"]));\n }\n for (const abstract of model.abstracts.values()) {\n query.set(abstract.plural, {\n kind: \"abstract\",\n type: abstract.name,\n members: abstract.members\n .map((m) => model.nodes.get(m))\n .filter((n): n is NodeType => n !== undefined)\n .sort(byName),\n });\n }\n const relay: RootTarget = {\n kind: \"relay\",\n members: [...model.nodes.values()]\n .filter((n) => n.key.relayId && n.read)\n .sort(byName),\n };\n query.set(\"node\", relay);\n query.set(\"nodes\", relay);\n for (const field of model.queries)\n query.set(field.name, { kind: \"cypher\", field });\n for (const field of model.mutations)\n mutation.set(field.name, { kind: \"cypher\", field });\n return { query, mutation, subscription };\n}\n\n/** One write a mutation's input makes below its root field. */\ntype NestedWrite =\n | {\n kind: \"relationship\";\n node: NodeType;\n field: Field & { kind: \"relationship\" };\n op: RelationshipOperation;\n }\n | { kind: \"type\"; node: NodeType; op: AuthOperation };\n\n/** `x` when a list, `[x]` when one value, nothing when absent. */\nconst asList = (x: unknown): unknown[] =>\n Array.isArray(x) ? x : x === undefined || x === null ? [] : [x];\n\n/** A type has `@authentication` or a rule for `op`. */\nconst ruled = (node: NodeType, op: AuthOperation): boolean =>\n (node.authentication?.has(op) ?? false) ||\n [\n ...(node.authorization?.filter ?? []),\n ...(node.authorization?.validate ?? []),\n ].some((r) => r.operations.has(op));\n\n/**\n * The relationship writes in `input` (a create or update input of `node`),\n * as the mutation planner reads them: a connect or nested create is a\n * CONNECT, a disconnect or nested delete a DISCONNECT, as is re-pointing a\n * single relationship in an update; `update: { edge }` is an UPDATE_EDGE;\n * nested creates, updates and deletes are that operation on the target,\n * and are read on in turn.\n */\nfunction nestedWrites(\n model: GraphModel,\n node: NodeType,\n input: unknown,\n update: boolean,\n out: NestedWrite[],\n): void {\n if (!isRecord(input)) return;\n for (const field of node.fields.values()) {\n if (field.kind !== \"relationship\") continue;\n const value = input[field.name];\n if (!isRecord(value)) continue;\n const relationship = (op: RelationshipOperation) =>\n out.push({ kind: \"relationship\", node, field, op });\n // Unions and interfaces take their writes keyed by member type.\n const targets = model.abstracts.has(field.target)\n ? (model.abstracts.get(field.target)?.members ?? [])\n : [field.target];\n const parts = (key: string): Array<[NodeType, unknown]> =>\n targets.flatMap((name) => {\n const target = model.nodes.get(name);\n if (!target) return [];\n const given = model.abstracts.has(field.target)\n ? isRecord(value[key])\n ? (value[key] as Record<string, unknown>)[name]\n : undefined\n : value[key];\n return asList(given).map((v): [NodeType, unknown] => [target, v]);\n });\n const connect = parts(\"connect\");\n const create = parts(\"create\");\n const adds = connect.length + create.length > 0;\n if (adds) {\n relationship(\"CONNECT\");\n for (const end of new Set([\n node,\n ...connect.concat(create).map(([t]) => t),\n ])) {\n if (ruled(end, \"CREATE_RELATIONSHIP\")) {\n out.push({ kind: \"type\", node: end, op: \"CREATE_RELATIONSHIP\" });\n }\n }\n }\n const given = (key: string) =>\n value[key] !== undefined && value[key] !== null && value[key] !== false;\n if (update) {\n const removes =\n given(\"disconnect\") || given(\"delete\") || (!field.list && adds);\n if (removes) {\n relationship(\"DISCONNECT\");\n if (ruled(node, \"DELETE_RELATIONSHIP\")) {\n out.push({ kind: \"type\", node, op: \"DELETE_RELATIONSHIP\" });\n }\n }\n if (given(\"delete\")) {\n for (const name of targets) {\n const target = model.nodes.get(name);\n if (target) out.push({ kind: \"type\", node: target, op: \"DELETE\" });\n }\n }\n }\n for (const [target, item] of create) {\n out.push({ kind: \"type\", node: target, op: \"CREATE\" });\n nestedWrites(\n model,\n target,\n isRecord(item) ? item[\"node\"] : undefined,\n false,\n out,\n );\n }\n for (const [target, item] of parts(\"update\")) {\n if (!isRecord(item)) continue;\n if (isRecord(item[\"edge\"])) relationship(\"UPDATE_EDGE\");\n if (isRecord(item[\"node\"])) {\n out.push({ kind: \"type\", node: target, op: \"UPDATE\" });\n nestedWrites(model, target, item[\"node\"], true, out);\n }\n }\n }\n}\n\n/**\n * Who may run `operation`: each root field's verdict per principal, read\n * off the same rules as `accessMatrix`. A mutation's inputs are read for\n * the relationship writes they make, each a part of its root field's\n * verdict; an input given as a variable is read when `variables` has its\n * value and listed in `unresolved` when it does not. Selections below a\n * root field answer to their own types' READ rules (see the matrix).\n */\nexport function operationAccess(\n model: GraphModel,\n schema: GraphQLSchema,\n operation: OperationDefinitionNode,\n fragments: ReadonlyMap<string, FragmentDefinitionNode>,\n variables: Readonly<Record<string, unknown>> = {},\n): OperationAccess {\n const principals = principalsOf(model);\n const context = (p: Principal) =>\n newContext({ schema, fragments: {}, variables: {} }, p.model ?? model, {\n jwt: p.jwt,\n unknownContext: true,\n });\n const targets = rootTargets(model)[operation.operation];\n const fields: RootFieldAccess[] = [];\n for (const sel of rootSelections(operation.selectionSet, fragments)) {\n const field = sel.name.value;\n if (field === \"__typename\") continue;\n const target = targets.get(field);\n if (!target) {\n throw new Error(\n `operationAccess: ${operation.operation} has no root field ${field}`,\n );\n }\n const access: RootFieldAccess[\"access\"] = {};\n let type: string;\n let operations: RootFieldAccess[\"operations\"];\n // What the field's inputs write through relationship fields.\n const nested: NestedWrite[] = [];\n const unresolved = new Set<string>();\n if (operation.operation === \"mutation\" && target.kind === \"node\") {\n const creates = target.ops.includes(\"CREATE\");\n const updates = target.ops.includes(\"UPDATE\");\n for (const arg of sel.arguments ?? []) {\n if (arg.name.value !== \"input\" && arg.name.value !== \"update\") continue;\n visit(arg.value, {\n Variable(v) {\n if (!(v.name.value in variables)) unresolved.add(v.name.value);\n },\n });\n const value = valueFromASTUntyped(\n arg.value,\n variables as Record<string, unknown>,\n );\n for (const item of asList(value)) {\n // An upsert may do either; an update re-points and removes.\n nestedWrites(model, target.node, item, updates || !creates, nested);\n }\n }\n }\n for (const p of principals) {\n const parts: Array<\n { label?: string } & Pick<AccessEntry, \"verdict\" | \"by\">\n > = [];\n if (target.kind === \"cypher\") {\n parts.push(rootFieldVerdict(context(p), target.field));\n } else if (target.kind === \"node\") {\n for (const op of target.ops) {\n parts.push({\n ...(target.ops.length > 1 ? { label: op } : {}),\n ...typeVerdict(context(p), nodeAs(p, target.node), op),\n });\n }\n const seen = new Set<string>();\n for (const w of nested) {\n const label =\n w.kind === \"relationship\"\n ? `${w.node.name}.${w.field.name} ${w.op}`\n : `${w.node.name} ${w.op}`;\n if (seen.has(label)) continue;\n seen.add(label);\n parts.push({\n label,\n ...(w.kind === \"relationship\"\n ? relationshipVerdict(\n context(p),\n nodeAs(p, w.node),\n fieldAs(p, w.node, w.field),\n w.op,\n )\n : typeVerdict(context(p), nodeAs(p, w.node), w.op)),\n });\n }\n } else {\n for (const member of target.members) {\n parts.push({\n label: member.name,\n ...typeVerdict(context(p), nodeAs(p, member), \"READ\"),\n });\n }\n }\n access[p.name] = {\n verdict:\n parts.length === 0\n ? \"denied\"\n : strictest(parts.map((x) => x.verdict)),\n by: parts.flatMap((x) =>\n x.label ? x.by.map((b) => `${x.label}: ${b}`) : x.by,\n ),\n };\n }\n if (target.kind === \"cypher\") {\n type = target.field.owner;\n operations = [target.field.owner === \"Mutation\" ? \"EXECUTE\" : \"READ\"];\n } else if (target.kind === \"node\") {\n type = target.node.name;\n operations = [...target.ops];\n } else {\n type = target.kind === \"relay\" ? \"Node\" : target.type;\n operations = [\"READ\"];\n }\n fields.push({\n field,\n ...(sel.alias ? { alias: sel.alias.value } : {}),\n type,\n operations,\n access,\n ...(unresolved.size > 0 ? { unresolved: [...unresolved].sort() } : {}),\n });\n }\n const verdicts: Record<string, AccessVerdict> = {};\n for (const p of principals) {\n verdicts[p.name] = strictest(fields.map((f) => f.access[p.name]!.verdict));\n }\n return {\n operation: operation.operation,\n name: operation.name?.value,\n principals: principals.map((p) => p.name),\n fields,\n verdicts,\n };\n}\n\nfunction rootSelections(\n set: SelectionSetNode,\n fragments: ReadonlyMap<string, FragmentDefinitionNode>,\n seen = new Set<string>(),\n): Array<\n Extract<SelectionSetNode[\"selections\"][number], { kind: Kind.FIELD }>\n> {\n const out: Array<\n Extract<SelectionSetNode[\"selections\"][number], { kind: Kind.FIELD }>\n > = [];\n for (const sel of set.selections) {\n if (sel.kind === Kind.FIELD) out.push(sel);\n else if (sel.kind === Kind.INLINE_FRAGMENT) {\n out.push(...rootSelections(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 out.push(...rootSelections(frag.selectionSet, fragments, seen));\n }\n }\n return out;\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: {} }, p.model ?? model, {\n jwt: p.jwt,\n unknownContext: true,\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), nodeAs(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 // `@authentication` on the field guards connecting and\n // disconnecting through it, with or without a rule beside it.\n for (const op of [\"CONNECT\", \"DISCONNECT\"] as const) {\n const guard = relationshipAuthentication(op);\n if (guard && f.authentication?.has(guard)) ruleOps.add(op);\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(\n context(p),\n nodeAs(p, node),\n fieldAs(p, node, f),\n op,\n ),\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) {\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), nodeAs(p, node), fieldAs(p, node, f)),\n });\n }\n }\n // Field-level CREATE / UPDATE rules: who may write this field.\n if (f.kind !== \"scalar\") continue;\n for (const op of [\"CREATE\", \"UPDATE\"] as const) {\n if (!node.mutations.has(op) || !fieldWriteGuarded(f, op)) continue;\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 ...fieldWriteVerdict(\n context(p),\n nodeAs(p, node),\n fieldAs(p, node, f),\n op,\n ),\n });\n }\n }\n }\n }\n // Rules on relationship properties, per property and operation.\n for (const props of [...model.relationshipProperties.values()].sort(byName)) {\n for (const f of [...props.fields.values()].sort(byName)) {\n for (const op of PROPERTY_OPS) {\n if (!fieldWriteGuarded(f, op)) continue;\n for (const p of principals) {\n out.push({\n type: props.name,\n field: f.name,\n operation: op,\n principal: p.name,\n ...propertyVerdict(context(p), propertyAs(p, props, f), op),\n });\n }\n }\n }\n }\n // Root @cypher fields, guarded or not: a hand-written write is exactly\n // what an audit wants listed.\n for (const field of [\n ...[...model.queries].sort(byName),\n ...[...model.mutations].sort(byName),\n ]) {\n for (const p of principals) {\n out.push({\n type: field.owner,\n field: field.name,\n operation: field.owner === \"Mutation\" ? \"EXECUTE\" : \"READ\",\n principal: p.name,\n ...rootFieldVerdict(context(p), field),\n });\n }\n }\n return out;\n}\n\nconst byName = (a: { name: string }, b: { name: string }) =>\n a.name < b.name ? -1 : a.name > b.name ? 1 : 0;\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//\n// The same is done for a variable the caller names as rebindable: the key\n// of a lookup by @key. `festival(key: $key)` compiles to the same\n// statement for every key, with the key as a parameter, so the entry is\n// keyed on everything but that variable and its value is swapped in.\n// Only when the key is the variable's one use in the field: anywhere else\n// the compile may check the value (a filter's string limit), and a value\n// swapped in afterwards is one it never saw.\n\nimport {\n GraphQLError,\n Kind,\n type ASTNode,\n type FieldNode,\n type FragmentDefinitionNode,\n} from \"graphql\";\nimport type { CompiledRead } from \"./read/types.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/** Default `compileCacheBytes`: the approximate size the cache may reach. */\nexport const COMPILE_CACHE_BYTES = 64 * 1024 * 1024;\n/**\n * Requests whose variables key is longer than this are compiled but not\n * cached: a 10 000-item `in:` list or an embedding vector rarely repeats,\n * and would hold its statement's parameters for nothing.\n */\nexport const MAX_CACHED_VARIABLES = 16 * 1024;\n/** What an entry costs beyond its strings: the shape closure, maps. */\nconst ENTRY_OVERHEAD = 1024;\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\n/** A variable bound as a whole parameter value: rebound per request. */\ninterface VariableSlot {\n statement: number;\n param: string;\n name: string;\n}\n\ninterface Entry {\n /** The variables the compile depends on, without the rebound ones. */\n variables: string;\n /** Variables bound as parameters, and their names joined (the key). */\n variableSlots: VariableSlot[];\n rebound: 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 /** Approximate bytes the entry holds. */\n bytes: number;\n}\n\n/** A compile the cache did not have, and what an entry keeps of it. */\ninterface Miss {\n ctx: CompileContext;\n compiled: CompiledRead;\n template: CompiledRead;\n slots: Slot[];\n variableSlots: VariableSlot[];\n}\n\ntype Compile = (\n jwt: Record<string, unknown> | undefined,\n /** Values to compile with in place of the request's variables. */\n variables?: Record<string, unknown>,\n) => {\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 * Variables whose value only ever lands in the statement as a whole\n * parameter: the variable given as the key of a lookup by @key. One\n * compile then serves every value of them.\n */\n rebindable?: readonly string[] | undefined;\n}\n\nexport class CompileCache {\n readonly #byField = new WeakMap<FieldNode, Entry[]>();\n /**\n * Every live entry, oldest first, with its field's entry list, for the\n * caps. The list, not the field node: a field node's location pins its\n * whole document (source and tokens), which must be free to go once\n * the document cache drops it.\n */\n readonly #live = new Map<Entry, Entry[]>();\n readonly #variableNames = new WeakMap<FieldNode, VariableUses | null>();\n /** Claims a field's compile bound into rule filters, to try as slots. */\n readonly #bindHints = new WeakMap<FieldNode, string[]>();\n /** Fields whose rebindable variable did not land as a whole parameter. */\n readonly #notRebindable = new WeakSet<FieldNode>();\n /** Drops the entries of a field node that was garbage collected. */\n readonly #collected =\n typeof FinalizationRegistry === \"function\"\n ? new FinalizationRegistry<Entry[]>((entries) => {\n for (const e of entries.splice(0)) this.#drop(e);\n })\n : undefined;\n readonly #total: number;\n readonly #maxBytes: number;\n #bytes = 0;\n\n constructor(total = COMPILED_TOTAL, maxBytes = COMPILE_CACHE_BYTES) {\n this.#total = total;\n this.#maxBytes = maxBytes;\n }\n\n get size(): number {\n return this.#live.size;\n }\n\n /** Approximate bytes the cached entries hold. */\n get bytes(): number {\n return this.#bytes;\n }\n\n #drop(entry: Entry): void {\n if (this.#live.delete(entry)) this.#bytes -= entry.bytes;\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 // The variables to rebind: only when each has a value a parameter can\n // simply take and no other use in the field, and the field has not\n // shown that it cannot be done.\n const rebindable = request.rebindable ?? [];\n const once = this.#uses(request)?.once;\n const names =\n once &&\n !this.#notRebindable.has(field) &&\n rebindable.every(\n (name) => once.has(name) && rebindableValue(request.variables?.[name]),\n )\n ? rebindable\n : [];\n const variables = this.#variablesKey(request, names);\n if (variables === undefined || variables.length > MAX_CACHED_VARIABLES) {\n return compile(request.jwt).compiled;\n }\n const authenticated = !!request.jwt;\n const reboundKey = names.join(\"\\0\");\n const entries = this.#byField.get(field) ?? [];\n for (const e of entries) {\n if (\n e.variables !== variables ||\n e.rebound !== reboundKey ||\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.variableSlots.length === 0\n ? e.compiled\n : rebind(e, request.jwt, request.variables);\n }\n\n const miss = this.#compileMiss(field, request, names, compile);\n const { ctx, compiled, slots, variableSlots } = miss;\n // The rebindable variables did not all become slots: the entry would\n // be keyed without a value its statement depends on. Compiled, not\n // cached; the field is remembered and its next request keys on them.\n if (names.length > 0 && variableSlots.length === 0) return compiled;\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 variableSlots,\n rebound: reboundKey,\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: miss.template,\n bytes: entryBytes(variables, claims, compiled),\n };\n if (entry.bytes > this.#maxBytes) return compiled;\n if (!this.#byField.has(field)) {\n this.#byField.set(field, entries);\n this.#collected?.register(field, entries);\n }\n entries.unshift(entry);\n this.#live.set(entry, entries);\n this.#bytes += entry.bytes;\n for (const dropped of entries.splice(COMPILED_PER_FIELD)) {\n this.#drop(dropped);\n }\n while (this.#live.size > this.#total || this.#bytes > this.#maxBytes) {\n const [oldest, list] = this.#live.entries().next().value!;\n this.#drop(oldest);\n const at = list.indexOf(oldest);\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 * The same for the variables to rebind. Otherwise compile with the real\n * values, and stop trying for the field.\n *\n * `template` is what the entry keeps (markers in its slots); `compiled`\n * is the same with this request's values.\n */\n #compileMiss(\n field: FieldNode,\n request: CacheRequest,\n names: readonly string[],\n compile: Compile,\n ): Miss {\n const jwt = request.jwt;\n // With the request's own values: nothing to rebind.\n const plain = (): Miss => {\n const { ctx, compiled } = compile(jwt);\n return {\n ctx,\n compiled,\n template: compiled,\n slots: [],\n variableSlots: [],\n };\n };\n const hint = this.#bindHints.get(field);\n const hinted =\n jwt && hint && hint.length > 0\n ? hint.every((path) => bindable(lookupPath(jwt, path)))\n : false;\n if (hinted || names.length > 0) {\n const claimMarkers = hinted ? hint!.map((_, i) => `${MARKER}${i}X`) : [];\n let marked: unknown = jwt;\n if (hinted) {\n hint!.forEach((path, i) => {\n marked = withPath(marked, path.split(\".\"), claimMarkers[i]);\n });\n }\n // A marker of the value's own type, so a typed argument takes it.\n const variableMarkers = names.map((name, i) =>\n typeof request.variables?.[name] === \"number\"\n ? NUMBER_MARKER - i\n : `${VARIABLE_MARKER}${i}X`,\n );\n let result: ReturnType<Compile> | undefined;\n try {\n result = compile(\n marked as Record<string, unknown> | undefined,\n names.length > 0\n ? Object.fromEntries(names.map((n, i) => [n, variableMarkers[i]]))\n : undefined,\n );\n } catch (error) {\n // A compile may refuse a marker as it would a bad value; anything\n // else is not the marker's doing.\n if (!(error instanceof GraphQLError)) throw error;\n result = undefined;\n }\n if (!result) {\n // Whether the markers were refused or the request itself: when the\n // real values do not compile either (an unauthenticated request),\n // the error is the request's and the field is tried again.\n const real = plain();\n if (hinted) this.#bindHints.set(field, []);\n if (names.length > 0) this.#notRebindable.add(field);\n return real;\n }\n const slots = hinted ? findSlots(result, hint!, claimMarkers) : [];\n const variableSlots =\n names.length > 0\n ? findVariableSlots(result, names, variableMarkers)\n : [];\n if (slots && variableSlots) {\n const entry = { compiled: result.compiled, slots, variableSlots };\n return {\n ctx: result.ctx,\n template: result.compiled,\n compiled: rebind(entry, jwt, request.variables),\n slots,\n variableSlots,\n };\n }\n // Whichever did not work out is not tried again for this field.\n if (hinted && !slots) this.#bindHints.set(field, []);\n if (names.length > 0 && !variableSlots) {\n this.#notRebindable.add(field);\n return plain();\n }\n return this.#compileMiss(field, request, names, compile);\n }\n const real = plain();\n const { ctx } = real;\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 real;\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(\n request: CacheRequest,\n rebound: readonly string[],\n ): string | undefined {\n const used = this.#uses(request);\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.names) {\n if (rebound.includes(name)) continue;\n if (Object.hasOwn(values, name)) picked[name] = values[name];\n }\n return stableKey(picked);\n }\n\n #uses(request: CacheRequest): VariableUses | null {\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 return used;\n }\n}\n\n/**\n * An entry's approximate size: its strings at two bytes a character, the\n * parameters as large as the variables they mostly come from, and a fixed\n * overhead.\n */\nfunction entryBytes(\n variables: string,\n claims: Array<[string, string]>,\n compiled: CompiledRead,\n): number {\n let chars = 2 * variables.length;\n for (const [path, key] of claims) chars += path.length + key.length;\n for (const s of compiled.statements) chars += s.text.length;\n return 2 * chars + ENTRY_OVERHEAD;\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/** The same for a rebound variable, as a string and as a number. */\nconst VARIABLE_MARKER = \"\\u0000lora-variable-\";\n/** As it reads inside a `stableKey()`. */\nconst VARIABLE_MARKER_KEYED = JSON.stringify(VARIABLE_MARKER).slice(1, -1);\nconst NUMBER_MARKER = Number.MIN_SAFE_INTEGER + 1024;\n\n/**\n * A variable value a cached compile may rebind: a string or a whole\n * number, the kinds a @key holds. `null`, a list or an object would\n * compile to a different statement.\n */\nfunction rebindableValue(value: unknown): boolean {\n return (\n (typeof value === \"string\" &&\n value.length > 0 &&\n !value.includes(\"\\u0000\")) ||\n (typeof value === \"number\" &&\n Number.isSafeInteger(value) &&\n value > NUMBER_MARKER)\n );\n}\n\n/**\n * The parameters holding each variable's marker as their whole value.\n * Undefined when a marker is missing or appears anywhere else: in the\n * statement text, inside a list or a map, or changed on the way (a value\n * the compile converts or checks is not one it merely passes on).\n */\nfunction findVariableSlots(\n result: { compiled: CompiledRead },\n names: readonly string[],\n markers: ReadonlyArray<string | number>,\n): VariableSlot[] | undefined {\n const slots: VariableSlot[] = [];\n const statements = result.compiled.statements;\n for (let s = 0; s < statements.length; s++) {\n const { text, params } = statements[s]!;\n if (\n text.includes(VARIABLE_MARKER) ||\n markers.some((m) => typeof m === \"number\" && text.includes(String(m)))\n ) {\n return undefined;\n }\n for (const [param, value] of Object.entries(params)) {\n const i = markers.indexOf(value as string | number);\n if (i >= 0) {\n slots.push({ statement: s, param, name: names[i]! });\n } else if (value !== null && typeof value === \"object\") {\n const inside = stableKey(value) ?? VARIABLE_MARKER_KEYED;\n if (\n inside.includes(VARIABLE_MARKER_KEYED) ||\n markers.some(\n (m) => typeof m === \"number\" && inside.includes(String(m)),\n )\n ) {\n return undefined;\n }\n } else if (typeof value === \"string\" && value.includes(VARIABLE_MARKER)) {\n return undefined;\n }\n }\n }\n return names.every((name) => slots.some((slot) => slot.name === name))\n ? slots\n : undefined;\n}\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 and variables in its slots. */\nfunction rebind(\n entry: Pick<Entry, \"compiled\" | \"slots\" | \"variableSlots\">,\n jwt: Record<string, unknown> | undefined,\n variables: 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 const set = (statement: number, param: string, value: unknown) => {\n const st = statements[statement]!;\n if (!copied.has(statement)) {\n st.params = { ...st.params };\n copied.add(statement);\n }\n st.params[param] = value;\n };\n for (const slot of entry.slots) {\n set(slot.statement, slot.param, claimAt(jwt, slot.path));\n }\n for (const slot of entry.variableSlots) {\n set(slot.statement, slot.param, variables?.[slot.name]);\n }\n return { ...entry.compiled, statements };\n}\n\ninterface VariableUses {\n /** Sorted. */\n names: string[];\n /** Those the selection references exactly once. */\n once: Set<string>;\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): VariableUses | null {\n const names = new Map<string, number>();\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.set(ast.name.value, (names.get(ast.name.value) ?? 0) + 1);\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 if (!exact) return null;\n return {\n names: [...names.keys()].sort(),\n once: new Set([...names].filter(([, n]) => n === 1).map(([name]) => name)),\n };\n}\n\n/**\n * A deterministic key for JSON-like values (object keys sorted, bigints\n * tagged); undefined when the value cannot be keyed (functions, cycles,\n * class instances), which turns caching off for that request.\n */\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","// Root fields over one node type: the list, the lookup by @key and the\n// connection (the aggregate and grouped roots are in aggregates.ts).\n\nimport {\n Kind,\n type FieldNode,\n type GraphQLObjectType,\n type SelectionSetNode,\n} from \"graphql\";\nimport { rootFilterCost } from \"../cost.js\";\nimport type { Statement } from \"../../driver.js\";\nimport type { NodeType } from \"../../model/types.js\";\nimport { names } from \"../../schema/names.js\";\nimport { authFilter, checkAuthentication } from \"../auth.js\";\nimport { bind, type CompileContext } from \"../context.js\";\nimport {\n and,\n bin,\n fn,\n printClauses,\n prop,\n v,\n type Clause,\n type Expr,\n} from \"../cypher.js\";\nimport { collectFields, subSelections } from \"../selection.js\";\nimport type {\n RootKind,\n SeekExpectation,\n CompiledRead,\n Args,\n Where,\n RawConnection,\n} from \"./types.js\";\nimport {\n finish,\n readSet,\n deniedItem,\n assertNoneDenied,\n countCap,\n} from \"./common.js\";\nimport {\n resolveLimit,\n resolveSort,\n resolvePage,\n sortItems,\n cursorValues,\n} from \"./sort.js\";\nimport { rootMatch } from \"./match.js\";\nimport {\n type WantedAggregate,\n aggregateReturn,\n compileAggregate,\n compileGrouped,\n} from \"./aggregates.js\";\nimport { projectNode } from \"./project.js\";\nimport { connectionSelections } from \"./connection.js\";\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\n/**\n * The variables of a root field whose value only ever becomes a\n * parameter, so one compile can be shared across their values: the\n * variable given as the key of a lookup by @key (`festival(key: $key)`),\n * when it is one.\n */\nexport function rebindableVariables(\n kind: RootKind,\n node: NodeType,\n fieldNodes: readonly FieldNode[],\n): readonly string[] | undefined {\n if (kind !== \"single\" || fieldNodes.length !== 1) return undefined;\n const value = fieldNodes[0]!.arguments?.find(\n (argument) => argument.name.value === node.key.name,\n )?.value;\n return value?.kind === Kind.VARIABLE ? [value.name.value] : undefined;\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 where = args[\"where\"] as Where | undefined;\n const root = rootMatch(ctx, node, where, sort);\n ctx.cost += rootFilterCost(ctx, node, where, limit);\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 ctx.cost += rootFilterCost(ctx, node, where, first + 1);\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 // An aggregate is over every match: only a bare count can stop early.\n const capped = sel.aggregate === undefined ? ctx.maxTotalCount : 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 const returned = aggregateReturn(statsCtx, \"this\", items, wanted);\n statements.push({\n text: printClauses([\n ...statsRoot.clauses,\n ...countCap(statsCtx, capped),\n ...returned,\n ]),\n params: statsCtx.params,\n });\n // With no page asked for, the count is the first statement, and its\n // columns are the ones the plan check holds the plan to.\n const last = returned.at(-1);\n if (!sel.page && last?.kind === \"return\") {\n columns = last.items.map((item) => item.alias ?? \"\");\n }\n }\n statsColumns = statsColumns.slice();\n\n return {\n statements,\n columns,\n reads: readSet(ctx),\n expectations: expectation ? [{ statement: 0, ...expectation }] : [],\n // Counting reads every match, not a page.\n cost:\n ctx.cost +\n (stats\n ? Math.max(\n 1,\n // Without a filter a capped count reads no more than its cap.\n capped !== undefined && !where\n ? Math.min(\n capped,\n rootFilterCost(ctx, node, where, first + 1, true),\n )\n : rootFilterCost(ctx, node, where, first + 1, true),\n )\n : 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\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","// Full-text and vector search root fields, as lists and as connections.\n\nimport type { FieldNode, GraphQLObjectType, SelectionSetNode } from \"graphql\";\nimport { requestError } from \"../../errors.js\";\nimport type { NodeType, SearchIndex } from \"../../model/types.js\";\nimport { names } from \"../../schema/names.js\";\nimport {\n authFilter,\n authValidate,\n checkAuthentication,\n checkFieldAuthentication,\n fieldValidate,\n} from \"../auth.js\";\nimport { bind, type CompileContext } from \"../context.js\";\nimport { decodeCursor } from \"../cursor.js\";\nimport {\n and,\n bin,\n fn,\n or,\n prop,\n v,\n type Clause,\n type Expr,\n} from \"../cypher.js\";\nimport { labelRows, perRowCost } from \"../cost.js\";\nimport { compileNodeWhere } from \"../filter.js\";\nimport { collectFields, subSelections } from \"../selection.js\";\nimport type { CompiledRead, Args, Where, RawConnection } from \"./types.js\";\nimport {\n finish,\n deniedItem,\n assertNoneDenied,\n coalesceFalse,\n countCap,\n} from \"./common.js\";\nimport {\n cursorValues,\n keysetPredicate,\n resolveLimit,\n resolveSort,\n sortItems,\n sortSignature,\n type SortKey,\n} from \"./sort.js\";\nimport { projectNode } from \"./project.js\";\nimport { connectionSelections } from \"./connection.js\";\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 * With `sort`, the matches are ordered by its fields, then the key, and a\n * connection pages by keyset on them; `score` is still returned.\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 // A `sort` replaces score order: by its fields, then the key.\n const sorted = args[\"sort\"] as unknown[] | null | undefined;\n const keys: SortKey[] | undefined =\n sorted && sorted.length > 0\n ? resolveSort(ctx, node, sorted, true)\n : undefined;\n const signature = keys ? sortSignature(keys) : SEARCH_SORT;\n const cursor =\n after != null\n ? decodeCursor(\n after,\n signature,\n keys ? keys.length : 2,\n ctx.model.cursorSecret,\n )\n : undefined;\n const keyset = !cursor\n ? undefined\n : keys\n ? keysetPredicate(ctx, \"this\", keys, 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 // 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 = shortPrefixesWhole(\n args[\"query\"] as string,\n index.minPrefixLength,\n );\n clauses.push({\n kind: \"procedure\",\n procedure: \"db.index.fulltext.queryNodes\",\n args: [\n bind(c, index.name),\n bind(c, query),\n // The index ranks only its best `maxMatches`.\n ...(index.maxMatches !== undefined\n ? [\n {\n kind: \"map\" as const,\n entries: [{ key: \"limit\", value: bind(c, index.maxMatches) }],\n },\n ]\n : []),\n ],\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 // Every ranked node's vector decides its score, so the vector field's\n // READ rules apply to each result as to the anchor: a node whose\n // vector the reader may not read is not ranked at all.\n checkFieldAuthentication(c, node.name, index.field);\n const readable = coalesceFalse(\n fieldValidate(c, node, index.field, \"this\", \"READ\"),\n );\n const pool = Math.max(node.limit.max * 4, 1);\n const candidates = connection\n ? pool\n : Math.min(\n (limit + (to != null ? 1 : 0)) * (where || readable ? 4 : 1),\n pool,\n );\n let source: Expr;\n let exclude: Expr | undefined;\n if (to != null) {\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, readable, 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, index, args, matches, (rows) => ({\n __rows: [],\n __first: limit,\n __after: cursor !== undefined,\n __backward: false,\n __sort: signature,\n __totalCount: rows,\n }));\n }\n const clauses = matches(ctx, keyset);\n ctx.cost += searchCandidatesCost(ctx, node, index, args);\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: keys\n ? sortItems(\"this\", keys)\n : [\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: keys\n ? cursorValues(\"this\", keys)\n : {\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, index, args, 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: signature,\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 index: SearchIndex,\n args: Args,\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 ...countCap(statsCtx, ctx.maxTotalCount),\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 + searchCandidatesCost(ctx, node, index, args);\n return compiled;\n}\n\n/**\n * The matches a full-text search reads before its page: the index's\n * `maxMatches`, else every node of the label (statistics; the type's page\n * size without them), each examined by the `where`. A vector search reads\n * a fixed candidate pool, counted by its page.\n */\nfunction searchCandidatesCost(\n ctx: CompileContext,\n node: NodeType,\n index: SearchIndex,\n args: Args,\n): number {\n if (index.kind !== \"fulltext\") return 0;\n const rows = Math.min(\n index.maxMatches ?? Infinity,\n labelRows(ctx, node, node.limit.default),\n );\n return rows * (1 + perRowCost(ctx, node, args[\"where\"] as Where | undefined));\n}\n\n/**\n * `query` with every `*` word shorter than `min` matched whole: `lo*`\n * becomes `lo`. Words are the index analyzer's: runs of letters and\n * digits.\n */\nexport function shortPrefixesWhole(\n query: string,\n min: number | undefined,\n): string {\n if (min === undefined || min <= 1) return query;\n return query.replace(/([\\p{L}\\p{N}]+)\\*/gu, (whole, word: string) =>\n [...word].length < min ? word : whole,\n );\n}\n\n/** The `edges { node }` selections of a search connection. */\nfunction searchConnectionSelections(\n ctx: CompileContext,\n node: NodeType,\n fieldNodes: readonly FieldNode[],\n): 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","// 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 * A mutation sent as one write batch: counted against\n * `maxQueuedWrites`, as a transaction waiting for the lock is.\n */\n queued?: boolean;\n}\n\n/** An open interactive transaction: statements see earlier writes. */\nexport interface DriverTransaction {\n execute(statement: Statement): Promise<QueryResult>;\n /**\n * Run several statements in one call, in order, each seeing the writes\n * of those before it. The first failure rolls the transaction back and\n * rejects with that statement's error. Optional: without it the\n * statements run one `execute()` at a time.\n */\n executeMany?(statements: 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 * A write transaction waits for the writer lock: the wait must honour\n * `timeoutMs` and `signal` (`loraDriver` bounds it).\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 * Write an online copy of the database into `targetDir` (lora-node\n * `db.snapshot()`). Optional: only a named, directory-backed database\n * has one.\n */\n snapshot?(targetDir: string): Promise<DriverSnapshot>;\n}\n\n/** What a snapshot wrote, as lora-node's `db.snapshot()` reports it. */\nexport interface DriverSnapshot {\n /** The `.loradb` written under the target directory. */\n path: string;\n bytes: number;\n /** The LSN of the last committed transaction the copy holds. */\n lsn: number;\n nodeCount: number;\n relationshipCount: number;\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 /** For an update: the properties the transaction set and removed. */\n setKeys?: string[];\n removedKeys?: string[];\n /** For a node update: the labels it added and removed. */\n addedLabels?: string[];\n removedLabels?: string[];\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 snapshot?(targetDir: string): Promise<DriverSnapshot>;\n begin?(\n mode?: \"read_write\" | \"read_only\",\n options?: { timeoutMs?: number; signal?: AbortSignal },\n ): Promise<{\n execute(\n query: string,\n params?: never,\n options?: { timeoutMs?: number; signal?: AbortSignal },\n ): Promise<QueryResult>;\n executeMany?(\n statements: Array<{ query: string; 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 limits = runLimits(options);\n // A current lora-node bounds the wait for the writer lock itself;\n // an older binding ignores the limits, so they are also held here.\n const tx = await bounded(\n begin(options.mode === \"read\" ? \"read_only\" : \"read_write\", limits),\n limits,\n );\n const many =\n typeof tx.executeMany === \"function\"\n ? tx.executeMany.bind(tx)\n : undefined;\n return {\n execute: (s) => tx.execute(s.text, s.params as never, limits),\n ...(many\n ? {\n executeMany: (statements: Statement[]) =>\n many(\n statements.map((s) => ({\n query: s.text,\n params: s.params as never,\n })),\n limits,\n ).catch((err: unknown) => {\n // The binding names the failing statement's position in\n // the batch; callers see the error a lone statement\n // gives. A read-only message (an abort) stays as it is.\n if (\n err instanceof Error &&\n / \\(statement \\d+ of \\d+\\)$/.test(err.message)\n ) {\n try {\n err.message = err.message.replace(\n / \\(statement \\d+ of \\d+\\)$/,\n \"\",\n );\n } catch {\n // Not ours to rewrite.\n }\n }\n throw err;\n }),\n }\n : {}),\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 if (typeof db.snapshot === \"function\") {\n driver.snapshot = db.snapshot.bind(db);\n }\n return driver;\n}\n\n/**\n * `driver`, refusing a write transaction when `max` are already waiting\n * for the writer lock: one writer runs at a time, so past saturation a\n * queue only adds latency. `onFull` builds the error to throw. Reads are\n * not counted: they do not wait for the lock.\n */\nexport function boundedWrites(\n driver: LoraDriver,\n max: number,\n onFull: (waiting: number) => Error,\n): LoraDriver {\n // `driver` is absent in an offline instance (schema tooling).\n const begin = (driver as LoraDriver | undefined)?.begin?.bind(driver);\n if (!begin || !Number.isFinite(max)) return driver;\n let waiting = 0;\n // Each method is called on `driver` itself: a driver may be a class\n // instance, whose methods a spread would leave behind.\n const queued = async <T>(work: () => Promise<T>, limit = max): Promise<T> => {\n if (waiting >= limit) throw onFull(waiting);\n waiting++;\n try {\n return await work();\n } finally {\n waiting--;\n }\n };\n // Write transactions begun through this driver and still open: one of\n // them holds the lock.\n const open = new Set<DriverTransaction>();\n const lockHeldByTransaction = () => {\n for (const tx of open) if (!tx.isOpen) open.delete(tx);\n return open.size > 0;\n };\n return {\n // A mutation sent as one write batch (`queued`) waits for the writer\n // lock like a transaction does. It is counted until it returns, not\n // until it holds the lock: unless a transaction holds the lock, one\n // of those counted is the one running, and one more is let in.\n // Other write batches (a worker's bookkeeping, DDL) are never refused.\n run: (statements, options) =>\n options.mode === \"write\" && options.queued\n ? queued(\n () => driver.run(statements, options),\n lockHeldByTransaction() ? max : max + 1,\n )\n : driver.run(statements, options),\n ...(driver.explain\n ? { explain: (statement: Statement) => driver.explain!(statement) }\n : {}),\n ...(driver.changes\n ? {\n changes: (options: { fromLsn?: number; signal?: AbortSignal }) =>\n driver.changes!(options),\n }\n : {}),\n ...(driver.snapshot\n ? { snapshot: (targetDir: string) => driver.snapshot!(targetDir) }\n : {}),\n begin: async (options) => {\n if (options.mode !== \"write\") return begin(options);\n const tx = await queued(() => begin(options));\n open.add(tx);\n return tx;\n },\n };\n}\n\n/**\n * `begin()` bounded by `timeoutMs` and `signal`: a transaction that opens\n * after the caller gave up is rolled back at once, so it never holds the\n * writer lock.\n */\nfunction bounded<T extends { rollback(): Promise<void> }>(\n start: Promise<T>,\n limits: { timeoutMs?: number; signal?: AbortSignal },\n): Promise<T> {\n const { timeoutMs, signal } = limits;\n if (!(timeoutMs !== undefined && timeoutMs > 0) && !signal) return start;\n return new Promise<T>((resolve, reject) => {\n let settled = false;\n let timer: ReturnType<typeof setTimeout> | undefined;\n const abandon = (err: unknown) => {\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n signal?.removeEventListener(\"abort\", onAbort);\n void start.then(\n (tx) => tx.rollback().catch(() => undefined),\n () => undefined,\n );\n reject(err);\n };\n const onAbort = () => abandon(signal!.reason);\n if (signal?.aborted) return onAbort();\n signal?.addEventListener(\"abort\", onAbort, { once: true });\n if (timeoutMs !== undefined && timeoutMs > 0) {\n timer = setTimeout(\n () =>\n abandon(\n Object.assign(\n new Error(\n `timed out after ${timeoutMs} ms waiting for the writer lock`,\n ),\n { code: \"LORA_TIMEOUT\" },\n ),\n ),\n timeoutMs,\n );\n }\n start.then(\n (tx) => {\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n signal?.removeEventListener(\"abort\", onAbort);\n resolve(tx);\n },\n (err: unknown) => {\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n signal?.removeEventListener(\"abort\", onAbort);\n reject(err);\n },\n );\n });\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","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","// 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. Inside\n// a shared transaction (a caller-owned `lora.begin()`, or every root field\n// of an operation under `mutationTransaction: \"operation\"`) it runs there\n// and leaves the commit to its owner, as generated mutations do.\n\nimport type { FieldNode } from \"graphql\";\nimport { newContext } from \"../compile/context.js\";\nimport { bindStatement } from \"../compile/read/cypher-field.js\";\nimport { compileByKeys } from \"../compile/read/by-keys.js\";\nimport { subSelections } from \"../compile/selection.js\";\nimport { requestError } from \"../errors.js\";\nimport { assertReadable } from \"../schema/guard.js\";\nimport type { Statement } from \"../driver.js\";\nimport type { CypherField } from \"../model/types.js\";\nimport { uniqueTogetherTouched } from \"../model/unique-together.js\";\nimport { checkUniqueTogetherOf } from \"./mutate/unique-together.js\";\nimport { runStatement, type MutationEnv } from \"./mutate/env.js\";\nimport {\n outboxStatements,\n reportedWrites,\n type Reported,\n} from \"./mutate/reported.js\";\n\nexport async function executeCypherMutation(\n env: MutationEnv,\n field: CypherField,\n args: Record<string, unknown>,\n fieldNodes: readonly FieldNode[],\n /** The field's `viewer` rules, checked in the transaction first. */\n guard?: Statement,\n): Promise<{ value: unknown; written: Reported }> {\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 options = {\n jwt: env.jwt,\n degrees: env.degrees,\n maxListArgument: env.maxListArgument,\n };\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 =\n owned ??\n (await env.driver.begin!({\n mode: \"write\",\n timeoutMs: env.timeoutMs,\n signal: env.signal,\n }));\n try {\n if (guard) {\n const check = await runStatement(env, tx, guard);\n if (check.rows[0]?.[\"allowed\"] !== true) {\n throw requestError(\n \"FORBIDDEN\",\n `not allowed to run ${field.owner}.${field.name}`,\n );\n }\n }\n const result = await runStatement(env, tx, statement);\n // The write-set is unknown: every node of each @uniqueTogether type\n // the statement may write is checked (a scan; the model warns).\n await checkUniqueTogetherOf(\n env,\n tx,\n uniqueTogetherTouched(env.model, field.statement),\n );\n // The nodes it returns as `created` and `updated` are its write-set,\n // as a trigger statement's are. Read here, and not written to: no\n // trigger fires for them. Without them it is taken to have written\n // something, whatever its text looks like.\n const written = reportedWrites(\n env.model,\n { writes: true, reports: field.reports },\n result,\n );\n for (const work of outboxStatements(env.model, written.created, () =>\n newContext(env.selection, env.model, options),\n )) {\n await runStatement(env, tx, work);\n }\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 if (!owned) await tx.commit();\n return { value: field.type.list ? value : (value[0] ?? null), written };\n } catch (err) {\n if (tx.isOpen) await tx.rollback();\n throw err;\n }\n}\n","// The time and parallelism one operation may use. `timeoutMs` bounds each\n// statement; an operation with many root fields (aliases) could still run\n// for timeoutMs × fields and occupy every libuv worker at once. The\n// budget gives the operation one deadline and a bounded number of\n// statements in flight; past the deadline its statements are aborted and\n// its fields fail with TIMEOUT.\n\nimport { requestError } from \"../errors.js\";\n\n/** Default `maxConcurrentStatements`. */\nexport const MAX_CONCURRENT_STATEMENTS = 2;\n/** Default `operationTimeoutMs`, as a multiple of `timeoutMs`. */\nexport const OPERATION_TIMEOUT_FACTOR = 2;\n\nexport class OperationBudget {\n readonly #controller = new AbortController();\n readonly #deadline: number;\n readonly #timeoutMs: number;\n readonly #timer: ReturnType<typeof setTimeout> | undefined;\n readonly #maxConcurrent: number;\n readonly #waiting: Array<() => void> = [];\n readonly #expired: Promise<never>;\n #running = 0;\n /** Root fields of the operation in flight. */\n active = 0;\n\n constructor(timeoutMs: number, maxConcurrent: number) {\n this.#timeoutMs = timeoutMs;\n this.#maxConcurrent = Math.max(1, maxConcurrent);\n this.#deadline =\n timeoutMs > 0 && Number.isFinite(timeoutMs)\n ? performance.now() + timeoutMs\n : Infinity;\n let expire!: (err: unknown) => void;\n this.#expired = new Promise<never>((_, reject) => (expire = reject));\n // A budget nobody races against must not report an unhandled rejection.\n this.#expired.catch(() => undefined);\n if (this.#deadline !== Infinity) {\n this.#timer = setTimeout(() => {\n const error = this.#timeoutError();\n this.#controller.abort(error);\n expire(error);\n for (const wake of this.#waiting.splice(0)) wake();\n }, timeoutMs);\n (this.#timer as { unref?: () => void }).unref?.();\n }\n }\n\n get signal(): AbortSignal {\n return this.#controller.signal;\n }\n\n /** Milliseconds left before the deadline (Infinity without one). */\n remaining(): number {\n return Math.max(0, this.#deadline - performance.now());\n }\n\n /**\n * Run `fn` once a statement slot is free, failing with TIMEOUT when the\n * deadline passes first (the statement keeps its own abort signal).\n */\n async run<T>(fn: (signal: AbortSignal) => Promise<T>): Promise<T> {\n while (this.#running >= this.#maxConcurrent && !this.signal.aborted) {\n await new Promise<void>((wake) => this.#waiting.push(wake));\n }\n if (this.signal.aborted) throw this.#timeoutError();\n this.#running++;\n try {\n return await Promise.race([fn(this.signal), this.#expired]);\n } finally {\n this.#running--;\n this.#waiting.shift()?.();\n }\n }\n\n /** Stop the deadline timer: the operation is over. */\n dispose(): void {\n if (this.#timer !== undefined) clearTimeout(this.#timer);\n }\n\n #timeoutError() {\n return requestError(\n \"TIMEOUT\",\n `the operation ran longer than ${this.#timeoutMs} ms; ask for less, or split it into several requests`,\n undefined,\n { operationTimeoutMs: this.#timeoutMs },\n );\n }\n}\n\n/** One signal aborted when either is; `b` alone when `a` is absent. */\nexport function anySignal(\n a: AbortSignal | undefined,\n b: AbortSignal,\n): AbortSignal {\n if (!a) return b;\n // A signal that is not the platform's own (whatwg-node's passes\n // `instanceof AbortSignal`) is followed by a native one first: Node\n // 24.22's `AbortSignal.any` refuses it, and earlier Nodes accept it but\n // never see it abort.\n a = nativeSignal(a)!;\n b = nativeSignal(b)!;\n if (typeof AbortSignal.any === \"function\") {\n try {\n return AbortSignal.any([a, b]);\n } catch {\n // Combined below.\n }\n }\n const both = new AbortController();\n const abort = (s: AbortSignal) => () => both.abort(s.reason);\n if (a.aborted) both.abort(a.reason);\n else if (b.aborted) both.abort(b.reason);\n else {\n a.addEventListener(\"abort\", abort(a), { once: true });\n b.addEventListener(\"abort\", abort(b), { once: true });\n }\n return both.signal;\n}\n\nconst abortedGetter = Object.getOwnPropertyDescriptor(\n AbortSignal.prototype,\n \"aborted\",\n)?.get;\nconst followers = new WeakMap<AbortSignal, AbortSignal>();\n\n/**\n * The caller's signal as one of the platform's own: `signal` itself when it\n * is, otherwise a native signal that aborts when it does (one per signal).\n * Any object with `aborted`, `reason` and `abort` events is accepted.\n */\nexport function nativeSignal(\n signal: AbortSignal | undefined,\n): AbortSignal | undefined {\n if (signal === undefined || signal === null) return undefined;\n if (abortedGetter) {\n try {\n abortedGetter.call(signal);\n return signal;\n } catch {\n // Not native: followed below.\n }\n }\n let follower = followers.get(signal);\n if (follower) return follower;\n const controller = new AbortController();\n if (signal.aborted) controller.abort(signal.reason);\n else\n signal.addEventListener(\"abort\", () => controller.abort(signal.reason), {\n once: true,\n });\n follower = controller.signal;\n followers.set(signal, follower);\n return follower;\n}\n","// Errors mutations raise for what the graph holds: a pair that is not\n// connected, a target that is not there, a relationship rule that\n// refuses, a single relationship holding two, a required relationship\n// left empty, and the engine's constraint errors named by field.\n\nimport { requestError } from \"../../errors.js\";\nimport type {\n GraphModel,\n NodeType,\n RelationshipField,\n ScalarField,\n} from \"../../model/types.js\";\n\nexport function 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\n/** The error of a connect whose targets are not there (or not visible). */\nexport function noTarget(\n owner: NodeType,\n rel: RelationshipField,\n target: NodeType,\n missing: unknown[],\n) {\n return 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\n/** The error of a relationship field's rules refusing `op`. */\nexport function refusedRule(\n op: \"CONNECT\" | \"DISCONNECT\" | \"UPDATE_EDGE\",\n rel: RelationshipField,\n) {\n return requestError(\n \"FORBIDDEN\",\n `not allowed to ${op.toLowerCase().replace(\"_\", \" \")} ${rel.owner}.${rel.name}`,\n );\n}\n\n/** The error of a single relationship field that would hold `count` nodes. */\nexport function tooMany(\n field: RelationshipField,\n key: unknown,\n count: number,\n seen: number,\n) {\n // Held by a node the caller cannot read: replacing it would write\n // a relationship of a node they cannot see, and the count would\n // reveal it. Refused like a rule would refuse it.\n if (seen < count) {\n return requestError(\n \"FORBIDDEN\",\n `not allowed to replace ${field.owner}.${field.name}`,\n );\n }\n return requestError(\n \"CONSTRAINT_VIOLATION\",\n `${field.owner}.${field.name} holds one ${field.target}, but ${field.owner} ${JSON.stringify(key)} would have ${String(count)}`,\n undefined,\n { type: field.owner, field: field.name },\n );\n}\n\n/** In place of the key of a node the caller cannot read, in messages. */\nexport const HIDDEN = Symbol(\"hidden\");\n\nexport function requiredMissing(\n owner: NodeType,\n field: RelationshipField,\n target: string,\n key: unknown,\n) {\n const who =\n key === HIDDEN\n ? `a ${owner.name} the caller can't read`\n : `${owner.name} ${JSON.stringify(key)}`;\n return requestError(\n \"CONSTRAINT_VIOLATION\",\n `${who} requires a ${target} (${owner.name}.${field.name})`,\n undefined,\n { type: owner.name, field: field.name },\n );\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","// Invariants checked after a mutation's writes, inside its transaction:\n// single relationships hold one node, @uniqueTogether combinations stay\n// unique, required relationships stay set.\n\nimport { bind, type CompileContext } from \"../../compile/context.js\";\nimport { name, printExpr } from \"../../compile/cypher.js\";\nimport { keyOf } from \"../../compile/read/by-keys.js\";\nimport { declared, memberFields } from \"../../model/relations.js\";\nimport type { NodeType, RelationshipField } from \"../../model/types.js\";\nimport type { EntityRef } from \"../changes.js\";\nimport { HIDDEN, requiredMissing, tooMany } from \"./errors.js\";\nimport {\n arrow,\n dedupe,\n inverseFields,\n labelTest,\n memberTest,\n readable,\n} from \"./fragments.js\";\nimport type { WritePlan } from \"./plan.js\";\nimport type { Runner } from \"./runner.js\";\nimport {\n notUniqueTogether,\n uniqueTogetherStatement,\n} from \"./unique-together.js\";\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 */\nexport async function checkCardinality(\n runner: Runner,\n plan: WritePlan,\n): Promise<void> {\n const model = runner.env.model;\n for (const { field, keys } of singlesTouched(runner, plan)) {\n const owner = model.nodes.get(field.owner)!;\n const ctx = runner.ctx();\n const text =\n `UNWIND ${printExpr(bind(ctx, keys))} AS k\\n` +\n `MATCH (a:${name(owner.labels[0]!)}) WHERE a.${name(owner.key.property)} = k\\n` +\n `WITH a, ${related(runner, field)} AS c WHERE c > 1\\n` +\n `RETURN a.${name(owner.key.property)} AS key, c AS count` +\n `, ${relatedSeen(runner, ctx, field)} AS seen`;\n const rows = await runner.run(text, ctx);\n if (rows.length > 0) {\n const row = rows[0]!;\n throw tooMany(\n field,\n row[\"key\"],\n Number(row[\"count\"]),\n Number(row[\"seen\"]),\n );\n }\n }\n}\n\n/**\n * {@link checkCardinality} for a single call: each check is a statement\n * that fails on the first node holding more than one, naming the node and\n * its counts in the message. Nothing is awaited.\n */\nexport function assertCardinality(runner: Runner, plan: WritePlan): void {\n const model = runner.env.model;\n for (const { field, keys } of singlesTouched(runner, plan)) {\n runner.inPlace(() => {\n const owner = model.nodes.get(field.owner)!;\n const ctx = runner.ctx();\n const message = runner.assertions.failsAs((detail) => {\n const [i, count, seen] = detail.split(\",\").map(Number);\n return tooMany(field, keys[i!], count!, seen!);\n }, \"toString(row.i) + ',' + toString(c) + ',' + toString(seen)\");\n void runner.run(\n `UNWIND ${printExpr(\n bind(\n ctx,\n keys.map((k, i) => ({ i, k })),\n ),\n )} AS row\\n` +\n `MATCH (a:${name(owner.labels[0]!)}) WHERE a.${name(owner.key.property)} = row.k\\n` +\n `WITH row, a, ${related(runner, field)} AS c\\n` +\n `WITH row, c, ${relatedSeen(runner, ctx, field)} AS seen\\n` +\n `RETURN assert(c <= 1, ${message}) AS ok`,\n ctx,\n );\n });\n }\n}\n\n/** How many nodes `a` holds on `field`. */\nfunction related(runner: Runner, field: RelationshipField): string {\n return `size([(a)${arrow(field, \"\", \"x\", undefined)} WHERE ${memberTest(runner.env.model, \"x\", field)} | 1])`;\n}\n\n/** How many of them the caller can read. */\nfunction relatedSeen(\n runner: Runner,\n ctx: CompileContext,\n field: RelationshipField,\n): string {\n const model = runner.env.model;\n return `size([(a)${arrow(field, \"\", \"x\", undefined)} WHERE ${field.members\n .map((m) => {\n const member = model.nodes.get(m)!;\n return `(${labelTest(\"x\", member)} AND ${readable(ctx, member, \"x\")})`;\n })\n .join(\" OR \")} | 1])`;\n}\n\n/**\n * The single relationship fields the plan's links touch, each with the\n * keys of the nodes to check: those that may now hold more than one.\n */\nfunction singlesTouched(\n runner: Runner,\n plan: WritePlan,\n): Array<{ field: RelationshipField; keys: unknown[] }> {\n const model = runner.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 const checks: Array<{ field: RelationshipField; keys: unknown[] }> = [];\n for (const { field, keys: all, fresh } of touched.values()) {\n const keys = dedupe(all.filter((k) => fresh.get(keyOf(k)) !== 1));\n if (keys.length > 0) checks.push({ field, keys });\n }\n return checks;\n}\n\n/**\n * `@uniqueTogether`: after every write of the mutation, no two nodes of\n * a constrained type share a combination. Checks the nodes it created\n * or updated and the nodes whose constrained relationships it connected\n * or disconnected, from either side, against the nodes reachable\n * through the same ends. For every caller: a data invariant, not a\n * rule, so the bypass does not skip it.\n */\nexport async function checkUniqueTogether(runner: Runner): Promise<void> {\n const model = runner.env.model;\n const touched = new Map<NodeType, Map<string, unknown>>();\n const touch = (type: string, key: unknown) => {\n const node = model.nodes.get(type);\n if (!node?.uniqueTogether.length) return;\n const keys = touched.get(node) ?? new Map<string, unknown>();\n keys.set(keyOf(key), key);\n touched.set(node, keys);\n };\n for (const e of runner.change.created) touch(e.type, e.key);\n for (const [node, { keys }] of runner.updated) {\n for (const key of keys) touch(node.name, key);\n }\n // An edge (start)-[:T]->(end) changes the combination of `start` when\n // its type constrains an OUT field of T reaching `end`'s type, and of\n // `end` for an IN field reaching `start`'s.\n const end = (\n at: EntityRef,\n direction: \"IN\" | \"OUT\",\n other: string,\n type: string,\n ) => {\n const node = model.nodes.get(at.type);\n const hit = node?.uniqueTogether.some((u) =>\n [...u.singles, ...(u.set ? [u.set] : [])].some(\n (f) =>\n f.type === type &&\n f.direction === direction &&\n f.members.includes(other),\n ),\n );\n if (hit) touch(at.type, at.key);\n };\n for (const ref of [...runner.connected, ...runner.disconnected]) {\n const [ownerName, fieldName] = ref.field.split(\".\") as [string, string];\n const field = model.nodes.get(ownerName)?.fields.get(fieldName);\n if (field?.kind !== \"relationship\") continue;\n const [start, finish] =\n field.direction === \"OUT\" ? [ref.from, ref.to] : [ref.to, ref.from];\n end(start, \"OUT\", finish.type, ref.type);\n end(finish, \"IN\", start.type, ref.type);\n }\n if (runner.single) {\n await assertUniqueTogether(\n runner,\n [...touched].map(([node, keys]) => ({ node, keys: [...keys.values()] })),\n );\n return;\n }\n for (const [node, keys] of touched) {\n for (const u of node.uniqueTogether) {\n const ctx = runner.ctx();\n // The constraint's filter is the data's, not the caller's view.\n ctx.inAuth = true;\n const rows = await runner.run(\n uniqueTogetherStatement(ctx, model, node, u, [...keys.values()]),\n ctx,\n );\n if (rows.length > 0) throw notUniqueTogether(node, u, rows[0]![\"key\"]);\n }\n }\n}\n\n/**\n * `@uniqueTogether` for a single call, on the nodes with `keys` of each\n * type: every check is issued before this first waits, as a statement\n * that fails on the node sharing its combination.\n */\nexport function assertUniqueTogether(\n runner: Runner,\n touched: Array<{ node: NodeType; keys: unknown[] }>,\n): Promise<void> {\n const issued: Array<Promise<unknown>> = [];\n for (const { node, keys: all } of touched) {\n const keys = dedupe(all);\n for (const u of node.uniqueTogether) {\n runner.inPlace(() => {\n const ctx = runner.ctx();\n // The constraint's filter is the data's, not the caller's view.\n ctx.inAuth = true;\n issued.push(\n runner.run(\n uniqueTogetherStatement(ctx, runner.env.model, node, u, keys, (i) =>\n runner.assertions.failsAs(\n (detail) => notUniqueTogether(node, u, keys[Number(detail)]),\n i,\n ),\n ),\n ctx,\n ),\n );\n });\n }\n }\n return Promise.all(issued).then(() => undefined);\n}\n\n/**\n * A required single relationship stays set: disconnecting from the other\n * side must not leave the owner without one.\n */\nexport async function checkRequired(runner: Runner): Promise<void> {\n const model = runner.env.model;\n const byField = new Map<RelationshipField, unknown[]>();\n for (const ref of runner.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) ?? 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 = runner.ctx();\n const rows = await runner.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, ${readable(ctx, owner, \"a\")} AS visible`,\n ctx,\n );\n if (rows.length > 0) {\n const row = rows.find((r) => r[\"visible\"] === true) ?? rows[0]!;\n throw requiredMissing(\n owner,\n field,\n field.target,\n row[\"visible\"] === true ? row[\"key\"] : HIDDEN,\n );\n }\n }\n}\n","// Deleting nodes by key: what onDelete: CASCADE reaches, the rules and\n// constraints checked before anything goes, and the relationships the\n// deleted nodes take with them, for the write-set.\n\nimport { runDeleteTriggers } from \"./triggers.js\";\nimport {\n authFilter,\n authValidate,\n checkAuthentication,\n forbidden,\n} from \"../../compile/auth.js\";\nimport { bind } from \"../../compile/context.js\";\nimport { lit, name, printExpr } from \"../../compile/cypher.js\";\nimport { keyOf } from \"../../compile/read/by-keys.js\";\nimport { requestError } from \"../../errors.js\";\nimport { memberFields } from \"../../model/relations.js\";\nimport type { NodeType, RelationshipField } from \"../../model/types.js\";\nimport type { RelationshipRef } from \"../changes.js\";\nimport { runStatement } from \"./env.js\";\nimport { HIDDEN, requiredMissing } from \"./errors.js\";\nimport { arrow, readable, relRef, seekThenExpand } from \"./fragments.js\";\nimport type { Runner } from \"./runner.js\";\n\n/**\n * Delete nodes by key, with what `onDelete: CASCADE` reaches. Checks\n * BEFORE rules, RESTRICT, and required relationships of the survivors.\n */\nexport async function deleteNodes(\n runner: Runner,\n root: NodeType,\n keys: unknown[],\n): Promise<void> {\n const model = runner.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(runner.ctx(), node, \"DELETE\");\n const ctx = runner.ctx();\n const before = authValidate(ctx, node, \"n\", \"DELETE\", \"BEFORE\");\n const rows = await runner.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 > runner.env.maxBatch) {\n throw requestError(\n \"LIMIT_EXCEEDED\",\n `the delete reaches more than ${runner.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 = runner.ctx();\n const related = await runner.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 = runner.ctx();\n const rows = await runner.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 `, ${readable(ctx, target, \"m\")} AS visible`,\n ctx,\n );\n const blocking = rows.filter((r) => !isDoomed(target.name, r[\"related\"]));\n // A blocker the caller can read may be named; one they cannot\n // must not be revealed by the message.\n const seen = blocking.find((r) => r[\"visible\"] === true);\n if (seen) {\n throw requestError(\n \"CONSTRAINT_VIOLATION\",\n `${node.name} ${JSON.stringify(seen[\"key\"])} still has ${f.name} (onDelete: RESTRICT); remove them first`,\n undefined,\n { type: node.name, field: f.name },\n );\n }\n if (blocking.length > 0) {\n throw requestError(\n \"CONSTRAINT_VIOLATION\",\n `${node.name} ${JSON.stringify(blocking[0]![\"key\"])} cannot be deleted: ${node.name}.${f.name} has onDelete: RESTRICT`,\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 = runner.ctx();\n const back = {\n ...f,\n direction: f.direction === \"OUT\" ? \"IN\" : \"OUT\",\n } as const;\n const rows = await runner.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 `, ${readable(ctx, owner, \"o\")} AS visible`,\n ctx,\n );\n const orphans = rows.filter((r) => !isDoomed(owner.name, r[\"key\"]));\n const orphan = orphans.find((r) => r[\"visible\"] === true) ?? orphans[0];\n if (orphan) {\n throw requiredMissing(\n owner,\n f,\n f.target,\n orphan[\"visible\"] === true ? orphan[\"key\"] : HIDDEN,\n );\n }\n }\n }\n }\n\n await runner.env.beforeDelete?.(\n runner.change,\n [...doomed].map(([node, keysByNode]) => ({\n node,\n keys: [...keysByNode.values()],\n })),\n (statement) => runStatement(runner.env, runner.tx, statement),\n );\n // DELETE triggers see the nodes as they are, before any is removed.\n await runDeleteTriggers(\n runner,\n [...doomed].map(([node, keysByNode]) => ({\n node,\n keys: [...keysByNode.values()],\n })),\n );\n\n const relIds = new Set<number>();\n for (const [node, keysByNode] of doomed) {\n const { refs, ids } = await neighbours(runner, node, [\n ...keysByNode.values(),\n ]);\n runner.disconnected.push(...refs);\n for (const id of ids) relIds.add(id);\n }\n for (const [node, keysByNode] of doomed) {\n const nodeKeys = [...keysByNode.values()];\n if (node.subscriptionOptions.previousState) {\n const pctx = runner.ctx();\n const rows = await runner.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 (runner.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 = runner.ctx();\n await runner.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 runner.info.nodesDeleted += nodeKeys.length;\n for (const key of nodeKeys) {\n runner.change.deleted.push({ type: node.name, key });\n }\n }\n runner.info.relationshipsDeleted += relIds.size;\n}\n\n/**\n * The nodes' current relationships: those in the model, for the\n * write-set, and the ids of all of them, for the count. One statement\n * for all `keys`.\n */\nasync function neighbours(\n runner: Runner,\n node: NodeType,\n keys: unknown[],\n): Promise<{ refs: RelationshipRef[]; ids: number[] }> {\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 = runner.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 const ctx = runner.ctx();\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 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` +\n `RETURN n.${name(node.key.property)} AS key, { ${entries.join(\", \")} } AS related, [(n)-[r]-() | id(r)] AS ids`,\n ctx,\n );\n const refs: RelationshipRef[] = [];\n const ids: number[] = [];\n for (const row of rows) {\n ids.push(...(row[\"ids\"] as number[]));\n const key = row[\"key\"];\n const related = row[\"related\"] as Record<string, unknown[]>;\n const found = [\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 for (const r of found) {\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)) continue;\n seen.add(id);\n refs.push(r);\n }\n }\n return { refs, ids };\n}\n","// `adjust` inputs: arithmetic on numbers and push / pop / pull on lists,\n// compiled to SET assignments.\n\nimport { bind, type CompileContext } from \"../../compile/context.js\";\nimport {\n bin,\n fn,\n lit,\n name,\n printExpr,\n prop,\n v,\n type Expr,\n} from \"../../compile/cypher.js\";\nimport { requestError } from \"../../errors.js\";\nimport type { NodeType } from \"../../model/types.js\";\nimport type { Input } from \"./plan.js\";\n\n/** `n.p = <expr>` assignments for an `adjust` input. */\nexport function 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","// A mutation in one call. A transaction opened with `begin()` holds the\n// database's writer lock until `commit()`, and between its calls the lock\n// waits for the JavaScript thread, which under load is busy with other\n// requests. A mutation whose statements are all known before the first is\n// sent needs none of that: `driver.run()` begins, runs them and commits\n// in one native step. What JavaScript decided between statements (a rule\n// that fails, a hidden key) is then a statement too: `assert()` raises\n// inside the transaction and rolls it back.\n\nimport { forbidden } from \"../../compile/auth.js\";\nimport { lit, printExpr } from \"../../compile/cypher.js\";\nimport { keyOf } from \"../../compile/read/by-keys.js\";\nimport type {\n DriverTransaction,\n LoraDriver,\n QueryResult,\n RunOptions,\n Statement,\n} from \"../../driver.js\";\nimport { requestError } from \"../../errors.js\";\nimport type { GraphModel, MutationOperation } from \"../../model/types.js\";\nimport type { WritePlan } from \"./plan.js\";\n\n/**\n * A transaction that is one `driver.run()` call until `open()` makes it a\n * real one. In its single form the first batch is the whole mutation: it\n * is committed when the call returns, so `commit()` has nothing left to\n * do, and a failure has already rolled everything back.\n *\n * With `single` false it is never one call, only late: the transaction\n * begins with its first statement, so what a mutation works out before\n * that (its plan, its `@populatedBy` callbacks) does not hold the lock.\n */\nexport class LazyTransaction implements DriverTransaction {\n readonly #driver: LoraDriver;\n readonly #options: RunOptions;\n readonly #single: boolean;\n #real: DriverTransaction | undefined;\n #opening: Promise<void> | undefined;\n #ran = false;\n #succeeded = false;\n #open = true;\n\n constructor(driver: LoraDriver, options: RunOptions, single = true) {\n this.#driver = driver;\n this.#options = options;\n this.#single = single;\n }\n\n /**\n * Whether the single call ran and committed: an error after that can\n * no longer undo the write.\n */\n get committed(): boolean {\n return (\n this.#single && this.#real === undefined && this.#ran && this.#succeeded\n );\n }\n\n /** Whether the mutation is still one call. */\n get single(): boolean {\n return this.#single && this.#real === undefined;\n }\n\n /** The mutation needs more than one round trip: begin a transaction. */\n open(): Promise<void> {\n if (this.#real) return Promise.resolve();\n if (this.#ran) {\n return Promise.reject(\n new Error(\"lora-graphql: a single-call mutation cannot be reopened\"),\n );\n }\n // Once, however many statements ask for it together.\n return (this.#opening ??= this.#driver.begin!(this.#options).then(\n (real) => {\n this.#real = real;\n },\n ));\n }\n\n execute(statement: Statement): Promise<QueryResult> {\n if (this.#real) return this.#real.execute(statement);\n return this.executeMany([statement]).then((results) => results[0]!);\n }\n\n async executeMany(statements: Statement[]): Promise<QueryResult[]> {\n if (!this.#single && this.#open) await this.open();\n if (this.#real) {\n if (this.#real.executeMany) return this.#real.executeMany(statements);\n const results: QueryResult[] = [];\n for (const s of statements) results.push(await this.#real.execute(s));\n return results;\n }\n if (this.#ran) {\n // The first call committed. Reaching this is a bug in what was\n // judged a single-call mutation, and must be loud.\n throw new Error(\n \"lora-graphql: a single-call mutation sent a second batch after its commit\",\n );\n }\n this.#ran = true;\n try {\n const results = await this.#driver.run(statements, {\n ...this.#options,\n queued: true,\n });\n this.#succeeded = true;\n return results;\n } catch (err) {\n throw withoutPosition(err);\n } finally {\n this.#open = false;\n }\n }\n\n commit(): Promise<void> {\n if (this.#real) return this.#real.commit();\n this.#open = false;\n return Promise.resolve();\n }\n\n rollback(): Promise<void> {\n if (this.#real) return this.#real.rollback();\n this.#open = false;\n return Promise.resolve();\n }\n\n get isOpen(): boolean {\n return this.#real ? this.#real.isOpen : this.#open;\n }\n}\n\n/**\n * `err` without the position the binding appends to the error of a\n * failing statement of a batch (`(statement 2 of 3)`): callers see the\n * error a lone statement gives. An error whose message is read-only (the\n * DOMException of an aborted request) is passed on as it is.\n */\nexport function withoutPosition(err: unknown): unknown {\n if (err instanceof Error && / \\(statement \\d+ of \\d+\\)$/.test(err.message)) {\n try {\n err.message = err.message.replace(/ \\(statement \\d+ of \\d+\\)$/, \"\");\n } catch {\n // Not ours to rewrite.\n }\n }\n return err;\n}\n\nconst asserts = new WeakMap<LoraDriver, Promise<boolean>>();\n\n/**\n * Whether the database has `assert()`: asked once per driver. Without it\n * every mutation keeps its transaction and decides in JavaScript.\n */\nexport function supportsAssert(driver: LoraDriver): Promise<boolean> {\n let known = asserts.get(driver);\n if (!known) {\n known = driver\n .run([{ text: \"RETURN assert(true) AS ok\", params: {} }], {\n mode: \"read\",\n verified: true,\n })\n .then(\n ([result]) => result?.rows[0]?.[\"ok\"] === true,\n (err: unknown) => {\n // Only \"there is no such function\" is an answer. Anything else\n // (a timeout, a database being opened) is asked again.\n const message = err instanceof Error ? err.message : String(err);\n if (!/unknown function|assert/i.test(message)) asserts.delete(driver);\n return false;\n },\n );\n asserts.set(driver, known);\n }\n return known;\n}\n\nconst readValidated = new WeakMap<GraphModel, boolean>();\n\n/**\n * Whether reading any node can be refused by a READ validate rule: a\n * payload read would then need a decision after the write, which a single\n * call cannot make.\n */\nexport function readCanBeRefused(model: GraphModel): boolean {\n let any = readValidated.get(model);\n if (any === undefined) {\n const refuses = (rules?: {\n validate: readonly { operations: ReadonlySet<string> }[];\n }) => !!rules?.validate.some((r) => r.operations.has(\"READ\"));\n any = [...model.nodes.values()].some(\n (n) =>\n refuses(n.authorization) ||\n [...n.fields.values()].some((f) => refuses(f.authorization)),\n );\n readValidated.set(model, any);\n }\n return any;\n}\n\n/**\n * What the guard of a single-call update that writes relationships stands\n * for: the node is not there (or not the caller's to update), so the call\n * rolled back and the mutation answers null, as a transaction would after\n * finding nothing.\n */\nexport const NOT_THERE = Symbol(\"lora-graphql: no node to update\");\n\n/**\n * Whether `plan`'s links can go out in a single call: when each is\n * known to create its relationship. A transaction asks the database\n * whether the pair was connected already, and applies other rules to a\n * re-connect; here it must be certain beforehand. It is when one end is\n * a node this plan creates (it has no relationships yet) and no two\n * links name the same relationship (one from each side's field). An\n * update's links ask the database instead (`plan.reconnects`). A\n * property the rules refuse depends on what the link found, in\n * JavaScript.\n */\nexport function linksInOne(plan: WritePlan): boolean {\n const model = plan.model;\n const pairs = new Set<string>();\n const edges = new Set<string>();\n for (const { rel, from, to, refused } of plan.links) {\n if (refused) return false;\n // An update's links tell in the database whether they are new.\n if (plan.reconnects) continue;\n const owner = model.nodes.get(rel.owner)!;\n const target = model.nodes.get(rel.target)!;\n if (!plan.isFresh(owner.name, from) && !plan.isFresh(target.name, to)) {\n return false;\n }\n const pair = `${rel.owner}.${rel.name}\\0${keyOf(from)}\\0${keyOf(to)}`;\n if (pairs.has(pair)) continue;\n pairs.add(pair);\n const a = `${owner.name}\\0${keyOf(from)}`;\n const b = `${target.name}\\0${keyOf(to)}`;\n const edge =\n rel.direction === \"OUT\"\n ? `${rel.type}\\0${a}\\0${b}`\n : `${rel.type}\\0${b}\\0${a}`;\n if (edges.has(edge)) return false;\n edges.add(edge);\n }\n return true;\n}\n\nconst PREFIX = \"lora-graphql:\";\n\n/** The message of an `assert()` that stands for a refused rule. */\nexport function refusal(\n kind: \"forbidden\" | \"hidden\" | \"taken\",\n type: string,\n detail: string,\n): string {\n return `${PREFIX}${kind}:${type}:${detail}`;\n}\n\n/**\n * The request error an assertion stood for, or `err` when it is not one\n * of ours.\n */\nexport function refused(model: GraphModel, err: unknown): unknown {\n const message = err instanceof Error ? err.message : String(err);\n const found =\n /assertion failed: lora-graphql:(forbidden|hidden|taken):([^:\\s]+):([^\\s(]+)/.exec(\n message,\n );\n if (!found) return err;\n const [, kind, type, detail] = found;\n const node = model.nodes.get(type!);\n if (!node) return err;\n if (kind === \"taken\") {\n return requestError(\n \"CONSTRAINT_VIOLATION\",\n `${node.name}.${detail} must be unique; the value is taken`,\n undefined,\n { type: node.name, field: detail },\n );\n }\n return forbidden(\n node,\n kind === \"hidden\" ? \"CREATE\" : (detail as MutationOperation),\n );\n}\n\n/**\n * The assertions of one single call that stand for an error only this\n * mutation can name (the row a check failed on, a target that is not\n * there): each is numbered, and its number is its message.\n */\nexport class Assertions {\n readonly #errors: Array<(detail: string) => unknown> = [];\n\n /**\n * The message, a Cypher expression, of an assertion that stands for\n * `error`: {@link Assertions.refusedBy} gives the error back. `detail`\n * is an expression appended to it, for an error that names what the\n * rows held.\n */\n failsAs(error: (detail: string) => unknown, detail?: string): string {\n this.#errors.push(error);\n const prefix = `${PREFIX}at:${this.#errors.length - 1}:`;\n return detail\n ? `${printExpr(lit(prefix))} + ${detail} + ';'`\n : printExpr(lit(`${prefix};`));\n }\n\n /** The error an assertion of {@link Assertions.failsAs} stood for, if `err` is one. */\n refusedBy(err: unknown): unknown {\n const message = err instanceof Error ? err.message : String(err);\n const found = /assertion failed: lora-graphql:at:(\\d+):([^\\s(;]*);/.exec(\n message,\n );\n const error = found ? this.#errors[Number(found[1])] : undefined;\n return error ? error(found![2]!) : undefined;\n }\n}\n","// Connecting nodes: the statement that links a relationship field's pairs\n// and the rule checks around it, on both ends and on the field. In a\n// transaction each is awaited and judged in JavaScript; in a single call\n// they are all issued at once, each decision an assertion.\n\nimport {\n authFilter,\n authValidate,\n forbidden,\n relationshipRules,\n} from \"../../compile/auth.js\";\nimport { bind, type CompileContext } from \"../../compile/context.js\";\nimport { lit, name, printExpr, type Expr } from \"../../compile/cypher.js\";\nimport { keyOf } from \"../../compile/read/by-keys.js\";\nimport type { NodeType, RelationshipField } from \"../../model/types.js\";\nimport { noTarget, refusedRule } from \"./errors.js\";\nimport { andText, arrow, orFresh, relRef, timestamps } from \"./fragments.js\";\nimport type { Link, WritePlan } from \"./plan.js\";\nimport type { Runner } from \"./runner.js\";\nimport { refusal } from \"./single-call.js\";\n\n/** `plan`'s links per relationship field, each pair once. */\nfunction linkGroups(plan: WritePlan): Map<RelationshipField, Link[]> {\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 return groups;\n}\n\n/**\n * The links of a single call: what {@link applyLinks} does, with\n * nothing awaited. The rules on both ends and on the relationship field\n * are assertions, and so is every target being there: the link reports\n * the rows it connected in the message of the assertion that fails\n * when one is missing.\n */\nexport function linkInOne(runner: Runner, plan: WritePlan): void {\n runner.linking();\n const issue = (\n statement: { text: string; ctx: CompileContext } | undefined,\n ) => {\n if (statement) {\n runner.defer(runner.run(statement.text, statement.ctx));\n }\n };\n for (const [rel, links] of linkGroups(plan)) {\n const owner = runner.env.model.nodes.get(rel.owner)!;\n const target = runner.env.model.nodes.get(rel.target)!;\n const pairs = links.map((l) => ({ from: l.from, to: l.to }));\n const ends = (when: \"BEFORE\" | \"AFTER\") =>\n runner.inPlace(() =>\n issue(\n endsStatement(\n runner,\n \"CREATE_RELATIONSHIP\",\n owner,\n target,\n pairs,\n when,\n ),\n ),\n );\n ends(\"BEFORE\");\n const missing = (detail: string) => {\n const linked = new Set(detail.split(\",\").filter(Boolean).map(Number));\n const found = new Set(\n links.filter((_, i) => linked.has(i)).map((l) => keyOf(l.to)),\n );\n return noTarget(\n owner,\n rel,\n target,\n links.map((l) => l.to).filter((k) => !found.has(keyOf(k))),\n );\n };\n if (plan.reconnects) {\n // One statement connects, tells the new relationships from those\n // that were there, and holds each to its rules: a new one to\n // CONNECT, one that was there and is given properties to\n // UPDATE_EDGE. In that order, after every target was found.\n runner.inPlace(() => {\n const { text, ctx } = linkStatement(runner, plan, rel, links, (ctx) => {\n const rule = (op: \"CONNECT\" | \"UPDATE_EDGE\") => {\n try {\n const cond = relationshipRules(ctx, rel, op, {\n owner: \"a\",\n target: \"b\",\n rel: \"r\",\n });\n return {\n ok:\n cond === undefined\n ? \"true\"\n : `coalesce(${printExpr(cond === false ? lit(false) : cond)}, false)`,\n error: (): unknown => refusedRule(op, rel),\n };\n } catch (err) {\n // The claims refuse: an error once a row comes to it.\n return { ok: \"false\", error: (): unknown => err };\n }\n };\n const connect = rule(\"CONNECT\");\n const edge = rule(\"UPDATE_EDGE\");\n return (\n `WITH row, existed, ${connect.ok} AS c, (NOT row.sets OR ${edge.ok}) AS e\\n` +\n `WITH collect({ i: row.i, existed: existed, c: c, e: e }) AS linked\\n` +\n `RETURN linked, assert(size(linked) = ${links.length}, ${runner.assertions.failsAs(\n missing,\n \"reduce(s = '', l IN linked | s + toString(l.i) + ',')\",\n )}) AS found` +\n `, assert(all(l IN linked WHERE l.existed OR l.c), ${runner.assertions.failsAs(connect.error)}) AS connect` +\n `, assert(all(l IN linked WHERE NOT l.existed OR l.e), ${runner.assertions.failsAs(edge.error)}) AS edge`\n );\n });\n runner.defer(\n runner.run(text, ctx).then(([row]) => {\n const linked = (row?.[\"linked\"] ?? []) as Array<{\n existed: boolean;\n }>;\n runner.info.relationshipsCreated += linked.filter(\n (l) => l.existed !== true,\n ).length;\n }),\n );\n });\n ends(\"AFTER\");\n for (const l of links) runner.connected.push(relRef(rel, l.from, l.to));\n continue;\n }\n runner.inPlace(() => {\n issue(\n linkStatement(\n runner,\n plan,\n rel,\n links,\n `WITH collect(row.i) AS linked\\n` +\n `RETURN assert(size(linked) = ${links.length}, ${runner.assertions.failsAs(\n missing,\n \"reduce(s = '', i IN linked | s + toString(i) + ',')\",\n )}) AS ok`,\n ),\n );\n });\n runner.inPlace(() => issue(rulesStatement(runner, \"CONNECT\", rel, pairs)));\n ends(\"AFTER\");\n runner.info.relationshipsCreated += links.length;\n for (const l of links) runner.connected.push(relRef(rel, l.from, l.to));\n }\n}\n\n/**\n * The statement that connects `links`. A transaction reads back which\n * pairs it connected and whether each was connected before; a single\n * call ends in `ending` instead: text when its links are all new, a\n * function of the statement's context when it must tell (`existed`).\n */\nfunction linkStatement(\n runner: Runner,\n plan: WritePlan,\n rel: RelationshipField,\n links: Link[],\n ending?: string | ((ctx: CompileContext) => string),\n): { text: string; ctx: CompileContext } {\n const owner = runner.env.model.nodes.get(rel.owner)!;\n const target = runner.env.model.nodes.get(rel.target)!;\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 = runner.ctx();\n const rows = printExpr(\n bind(\n lctx,\n links.map((l, i) => ({\n i,\n from: l.from,\n to: l.to,\n sets: Object.keys(l.props).length > 0,\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 ? runner.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 (typeof ending === \"string\"\n ? \"\"\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\\n` +\n (typeof ending === \"function\"\n ? ending(lctx)\n : (ending ?? `RETURN row.from AS from, row.to AS key, existed`));\n return { text, ctx: lctx };\n}\n\n/**\n * Connect `plan`'s links in a transaction, a relationship field at a\n * time: the rules on both ends, the MERGE, then the rules on what it\n * created or found.\n */\nexport async function applyLinks(\n runner: Runner,\n plan: WritePlan,\n): Promise<void> {\n for (const [rel, links] of linkGroups(plan)) {\n const owner = runner.env.model.nodes.get(rel.owner)!;\n const target = runner.env.model.nodes.get(rel.target)!;\n const pairs = links.map((l) => ({ from: l.from, to: l.to }));\n await checkEnds(\n runner,\n \"CREATE_RELATIONSHIP\",\n owner,\n target,\n pairs,\n \"BEFORE\",\n );\n const { text, ctx: lctx } = linkStatement(runner, plan, rel, links);\n const linked = await runner.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 = 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 throw noTarget(\n owner,\n rel,\n target,\n links.map((l) => l.to).filter((k) => !found.has(keyOf(k))),\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 checkRelationshipRules(\n runner,\n \"CONNECT\",\n rel,\n linked\n .filter((r) => r[\"existed\"] !== true)\n .map((r) => ({ from: r[\"from\"], to: r[\"key\"] })),\n );\n await checkRelationshipRules(\n runner,\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 checkEnds(\n runner,\n \"CREATE_RELATIONSHIP\",\n owner,\n target,\n pairs,\n \"AFTER\",\n );\n const made = linked.filter((r) => r[\"existed\"] !== true);\n runner.info.relationshipsCreated += made.length;\n for (const r of made) runner.linked.push(relRef(rel, r[\"from\"], r[\"key\"]));\n for (const l of links) runner.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 */\nexport async function checkRelationshipRules(\n runner: Runner,\n op: \"CONNECT\" | \"DISCONNECT\" | \"UPDATE_EDGE\",\n rel: RelationshipField,\n pairs: Array<{ from: unknown; to: unknown }>,\n): Promise<void> {\n const statement = rulesStatement(runner, op, rel, pairs);\n if (!statement) return;\n const rows = await runner.run(statement.text, statement.ctx);\n if (rows.some((r) => r[\"ok\"] !== true)) throw refusedRule(op, rel);\n}\n\n/**\n * The statement of {@link checkRelationshipRules}, when a rule\n * applies: a row per pair, `ok` when its rules hold. In a single call\n * the row that fails them fails the statement.\n */\nfunction rulesStatement(\n runner: Runner,\n op: \"CONNECT\" | \"DISCONNECT\" | \"UPDATE_EDGE\",\n rel: RelationshipField,\n pairs: Array<{ from: unknown; to: unknown }>,\n): { text: string; ctx: CompileContext } | undefined {\n if (pairs.length === 0) return undefined;\n const ctx = runner.ctx();\n const cond = relationshipRules(ctx, rel, op, {\n owner: \"a\",\n target: \"b\",\n rel: \"r\",\n });\n if (cond === undefined) return undefined;\n const owner = runner.env.model.nodes.get(rel.owner)!;\n const target = runner.env.model.nodes.get(rel.target)!;\n const ok = `coalesce(${printExpr(cond === false ? lit(false) : cond)}, false)`;\n return {\n text:\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 ${\n runner.single\n ? `assert(${ok}, ${runner.assertions.failsAs(() => refusedRule(op, rel))})`\n : ok\n } AS ok`,\n ctx,\n };\n}\n\n/** Whether either end has validate rules for `op` at `when`. */\nexport function 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 */\nexport async function checkEnds(\n runner: Runner,\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 const statement = endsStatement(runner, op, owner, target, pairs, when);\n if (!statement) return;\n for (const row of await runner.run(statement.text, statement.ctx)) {\n if (row[\"a\"] !== true) throw forbidden(owner, op);\n if (row[\"b\"] !== true) throw forbidden(target, op);\n }\n}\n\n/**\n * The statement of {@link checkEnds}, when either end has a\n * rule: a row per pair, `a` and `b` whether each end's rules hold. In a\n * single call the end that fails them fails the statement.\n */\nfunction endsStatement(\n runner: Runner,\n op: \"CREATE_RELATIONSHIP\" | \"DELETE_RELATIONSHIP\",\n owner: NodeType,\n target: NodeType,\n pairs: Array<{ from: unknown; to: unknown }>,\n when: \"BEFORE\" | \"AFTER\",\n): { text: string; ctx: CompileContext } | undefined {\n if (pairs.length === 0) return undefined;\n const ctx = runner.ctx();\n const a = authValidate(ctx, owner, \"a\", op, when);\n const b = authValidate(ctx, target, \"b\", op, when);\n if (!a && !b) return undefined;\n const holds = (rule: Expr | undefined, node: NodeType) =>\n !rule\n ? \"true\"\n : runner.single\n ? `assert(${printExpr(rule)}, ${printExpr(lit(refusal(\"forbidden\", node.name, op)))})`\n : printExpr(rule);\n return {\n text:\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 ${holds(a, owner)} AS a, ${holds(b, target)} AS b`,\n ctx,\n };\n}\n","// The write plan: one mutation's input turned into the creates, links,\n// disconnects and nested updates to run, with the input checks that need\n// no statement (required fields, settable fields, @authentication).\n\nimport {\n checkAuthentication,\n checkFieldAuthentication,\n checkKeyScope,\n checkPropertyAccess,\n propertyAccess,\n} from \"../../compile/auth.js\";\nimport type { CompileContext } from \"../../compile/context.js\";\nimport { keyOf } from \"../../compile/read/by-keys.js\";\nimport { requestError, validationError } from \"../../errors.js\";\nimport { checkValue, normalizeValue } from \"../../model/constraints.js\";\nimport { toStored } from \"../../model/points.js\";\nimport { memberFields } from \"../../model/relations.js\";\nimport type {\n GraphModel,\n NodeType,\n RelationshipField,\n ScalarField,\n} from \"../../model/types.js\";\nimport { requiredOnCreate, settable } from \"../../schema/mutations.js\";\nimport type { MutationEnv } from \"./env.js\";\nimport { inverseFields } from \"./fragments.js\";\n\nexport type Input = Record<string, unknown>;\n\nexport interface 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\nexport interface 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\nexport interface 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\nexport interface 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. */\nexport class 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 * The plan is an update's: a link may find its relationship there\n * already, which a single call must then tell in the database.\n */\n reconnects = false;\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 started = this.env.computed?.get(input)?.get(f.name);\n const value = await (started ??\n this.env.callbacks[f.populatedBy!.callback]!({\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 // A computed value answers to the field's rules like a supplied one.\n if (f.constraints) {\n const stored = normalizeValue(f.constraints, value);\n const failures = checkValue(f.constraints, stored);\n if (failures.length > 0) {\n throw validationError(\n \"CONSTRAINT_VIOLATION\",\n failures.map((failure) => ({\n path: [],\n coordinate: `${node.name}.${f.name}`,\n rule: failure.rule,\n params: failure.params,\n message: `${failure.message} (from its @populatedBy callback ${f.populatedBy!.callback})`,\n })),\n );\n }\n return stored;\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\nexport function 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","// Runs a write plan inside the mutation's transaction: the statements for\n// each kind of write, in order, with the rule checks around them, and what\n// they changed for the payload and the write-set.\n\nimport type { SelectionSetNode } from \"graphql\";\nimport {\n authFilter,\n authValidate,\n checkAuthentication,\n checkFieldAuthentication,\n fieldValidate,\n forbidden,\n relationshipRules,\n} from \"../../compile/auth.js\";\nimport {\n bind,\n newContext,\n type CompileContext,\n} from \"../../compile/context.js\";\nimport { and, lit, name, printExpr, type Expr } from \"../../compile/cypher.js\";\nimport { compileNodeWhere } from \"../../compile/filter.js\";\nimport { compileByKeys, keyOf } from \"../../compile/read/by-keys.js\";\nimport type {\n DriverTransaction,\n QueryResult,\n Statement,\n} from \"../../driver.js\";\nimport {\n MAX_VIOLATIONS,\n requestError,\n validationError,\n type Violation,\n} from \"../../errors.js\";\nimport { checkValue } from \"../../model/constraints.js\";\nimport { toStored } from \"../../model/points.js\";\nimport type {\n NodeType,\n RelationshipField,\n ScalarField,\n} from \"../../model/types.js\";\nimport { assertReadable } from \"../../schema/guard.js\";\nimport { settable } from \"../../schema/mutations.js\";\nimport type { RelationshipRef, WriteChange } from \"../changes.js\";\nimport { compileAdjust } from \"./adjust.js\";\nimport {\n assertCardinality,\n checkCardinality,\n checkRequired,\n} from \"./checks.js\";\nimport { deleteNodes } from \"./delete.js\";\nimport {\n applyLinks,\n checkEnds,\n checkRelationshipRules,\n endRules,\n linkInOne,\n} from \"./links.js\";\nimport type { MutationEnv, MutationInfo } from \"./env.js\";\nimport { OUTBOX } from \"../../events/outbox.js\";\nimport { notConnected } from \"./errors.js\";\nimport {\n Assertions,\n LazyTransaction,\n linksInOne,\n NOT_THERE,\n refusal,\n} from \"./single-call.js\";\nimport {\n andText,\n dedupe,\n edgeStamps,\n relRef,\n seekThenExpand,\n timestamps,\n} from \"./fragments.js\";\nimport {\n assertUniqueKeys,\n WritePlan,\n type CreateRow,\n type Input,\n} from \"./plan.js\";\n\nexport class 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 /**\n * The relationships of `connected` that were not there before, for\n * CONNECT triggers. Filled in a transaction, which is where a mutation\n * of a schema with triggers runs.\n */\n linked: RelationshipRef[] = [];\n /** Nodes updated per type, for AFTER validation. */\n updated = new Map<NodeType, { keys: unknown[]; fields: Set<string> }>();\n /**\n * Keys and unique values this mutation moved aside, for a single-call\n * mutation to assert at its end that nothing was there to move.\n */\n #moved: Array<{\n kind: \"hidden\" | \"taken\";\n node: NodeType;\n property: string;\n field: string;\n values: unknown[];\n }> = [];\n /** Whether a trigger function was called: it may have closed the transaction. */\n triggerFunctionRan = false;\n /** Nodes a trigger added to the write-set: they fire no trigger. */\n triggered = new Set<string>();\n /** The fields each update set, per type and key: `@trigger(fields:)`. */\n updatedFields = new Map<NodeType, Map<string, 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 /** What the assertions of a single call stand for. */\n readonly assertions = new Assertions();\n /** Statements issued so far, and how many when the links began. */\n #issued = 0;\n #linking: number | undefined;\n\n /** Statements issued and not sent yet; see {@link Runner.send}. */\n #queue: Array<{\n statement: Statement;\n resolve: (result: QueryResult) => void;\n reject: (err: unknown) => void;\n }> = [];\n\n /** Writes issued with `later`, not awaited yet. */\n #unchecked: Array<Promise<unknown>> = [];\n /** Whether the queue waits for the next turn of the event loop. */\n #deferred = false;\n /** Set by `abandon()`: the mutation failed, send nothing more. */\n #abandoned = false;\n\n constructor(\n readonly env: MutationEnv,\n readonly tx: DriverTransaction,\n readonly change: WriteChange,\n ) {}\n\n /** Whether the mutation is one call that commits as it returns. */\n get single(): boolean {\n return this.tx instanceof LazyTransaction && this.tx.single;\n }\n\n /** The mutation needs more than one round trip: open its transaction. */\n async open(): Promise<void> {\n if (this.tx instanceof LazyTransaction) await this.tx.open();\n }\n\n /**\n * In a single call, what JavaScript would decide after the mutation's\n * statements is their last statement instead: an assertion that no node\n * sat under a key or a unique value this create moved aside. It is last,\n * so any other error is still the one a free key gets.\n */\n assertNothingMoved(): void {\n if (!this.single) return;\n for (const { kind, node, property, field, values } of this.#moved) {\n const ctx = this.ctx();\n held(\n this.run(\n `MATCH (n:${name(node.labels[0]!)}) WHERE n.${name(property)} IN ${printExpr(bind(ctx, values))}\\n` +\n `RETURN assert(count(n) = 0, ${printExpr(lit(refusal(kind, node.name, field)))}) AS ok`,\n ctx,\n ),\n );\n }\n }\n\n /**\n * Put a statement together and issue it. A single call puts every\n * statement together before the first is sent, where a transaction\n * does so once the one before it answered. An error raised meanwhile (a\n * rule the claims settle) must not outrank what an earlier statement\n * raises in the database: it becomes a statement that fails with it, in\n * its place. Before the links' first statement it is thrown, as a\n * transaction throws it: nothing was sent yet there either.\n */\n inPlace(issue: () => void): void {\n try {\n issue();\n } catch (err) {\n if (this.#linking === undefined || this.#issued === this.#linking) {\n throw err;\n }\n this.#unchecked.push(\n this.run(\n `RETURN assert(false, ${this.assertions.failsAs(() => err)}) AS ok`,\n this.ctx(),\n ),\n );\n }\n }\n\n /**\n * Run `statement` in the transaction. Statements issued in the same\n * tick, without awaiting one before issuing the next, go to the\n * database in one call (`executeMany`), in the order issued: one round\n * trip under the writer lock instead of one each. When a statement of\n * such a batch fails, every statement of the batch rejects with its\n * error, so a batch holds writes whose results are not checked,\n * followed by reads.\n */\n send(statement: Statement): Promise<QueryResult> {\n if (this.#abandoned) {\n return held(Promise.reject(new Error(\"the mutation was abandoned\")));\n }\n const result = new Promise<QueryResult>((resolve, reject) => {\n this.#queue.push({ statement, resolve, reject });\n });\n // Awaited later, or not at all when an earlier check throws first.\n result.catch(() => undefined);\n if (this.#queue.length === 1) {\n // A single call commits with its batch, so the batch waits for the\n // event loop to turn: whatever fails while the mutation is still\n // being put together (a rule the claims settle, a selection that\n // does not compile) has then been seen, and nothing is sent. No\n // lock is held meanwhile: the transaction has not begun.\n if (this.single) this.#deferred = true;\n queueMicrotask(() => void this.#flush());\n }\n this.#issued++;\n this.env.onStatement?.(statement);\n return result;\n }\n\n /**\n * Issue a write whose result nothing checks, and leave it for the next\n * statements to share its round trip: it is sent with whatever is\n * issued before the event loop turns. `settle()` awaits it.\n */\n later(statement: Statement): void {\n this.#unchecked.push(this.send(statement));\n this.#deferred = true;\n }\n\n /**\n * Leave `pending` (a statement issued, with what follows from its\n * rows) for `settle()` to await.\n */\n defer(pending: Promise<unknown>): void {\n this.#unchecked.push(held(pending));\n }\n\n /** The links of a single call begin; see {@link Runner.inPlace}. */\n linking(): void {\n this.#linking = this.#issued;\n }\n\n /** Wait for the writes issued with `later`; throws the first failure. */\n async settle(): Promise<void> {\n for (const pending of this.#unchecked.splice(0)) await pending;\n }\n\n /**\n * `pending`, safe to leave unawaited, and the mutation abandoned the\n * moment it fails: before a batch still waiting to be sent goes out.\n */\n watch<T>(pending: Promise<T>): Promise<T> {\n pending.catch((err: unknown) => this.abandon(err));\n return pending;\n }\n\n /**\n * The mutation failed: nothing queued is sent. A single call commits\n * with its first batch, so a batch must not go out after the error that\n * should have stopped it.\n */\n abandon(err: unknown): void {\n this.#abandoned = true;\n for (const queued of this.#queue.splice(0)) queued.reject(err);\n }\n\n async #flush(): Promise<void> {\n if (this.#abandoned) return;\n if (this.#deferred) {\n this.#deferred = false;\n nextTurn(() => void this.#flush());\n return;\n }\n const batch = this.#queue;\n this.#queue = [];\n const run = () =>\n batch.length > 1 && this.tx.executeMany\n ? this.tx.executeMany(batch.map((b) => b.statement))\n : inOrder(this.tx, batch);\n try {\n const observe = this.env.observe;\n let results: QueryResult[];\n if (!observe) {\n results = await run();\n } else {\n // One call, timed once: the first statement carries the batch's\n // duration, the others are observed as done the moment it is.\n // What the database answered decides the batch, not the\n // observer: a tracer that throws must not turn a committed write\n // into an error, nor hide the error of a failed one.\n let outcome:\n | { results: QueryResult[] }\n | { error: unknown }\n | undefined;\n try {\n await observe(batch[0]!.statement, async () => {\n try {\n const all = await run();\n outcome = { results: all };\n return all[0]!;\n } catch (error) {\n outcome = { error };\n throw error;\n }\n });\n } catch (error) {\n outcome ??= { error };\n }\n const settled = outcome as\n | { results: QueryResult[] }\n | { error: unknown };\n if (\"error\" in settled) throw settled.error;\n results = settled.results;\n for (const [i, b] of batch.entries()) {\n if (i === 0) continue;\n try {\n await observe(b.statement, async () => results[i]!);\n } catch {\n // As above.\n }\n }\n }\n for (const [i, b] of batch.entries()) b.resolve(results[i]!);\n } catch (err) {\n for (const b of batch) b.reject(err);\n }\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 statistics: this.env.statistics,\n requestContext: this.env.requestContext,\n maxFilterDepth: this.env.maxFilterDepth,\n maxListFilter: this.env.maxListFilter,\n maxStringFilter: this.env.maxStringFilter,\n });\n }\n\n /**\n * What an update's input sets on a node and removes from it, with its\n * `@populatedBy` values; relationship inputs are planned on `plan`.\n */\n async #prepareRow(\n plan: WritePlan,\n node: NodeType,\n key: unknown,\n input: Input,\n adjust: Input | undefined,\n ): Promise<{ key: unknown; set: Input; remove: string[] }> {\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 return { key, set, remove };\n }\n\n /** The `SET` items of an update: the input, then the type's timestamps. */\n #setItems(node: NodeType, adjustments: string[]): string[] {\n const suppliable = new Set(\n [...node.fields.values()]\n .filter(\n (f): f is ScalarField =>\n f.kind === \"scalar\" && !!f.timestamp && settable(f, \"UPDATE\"),\n )\n .map((f) => f.property),\n );\n return [\n \"n += row.set\",\n ...adjustments,\n // A @timestamp settable on update keeps a value the input supplied.\n ...timestamps(node, \"UPDATE\").map(([p, now]) =>\n suppliable.has(p)\n ? `n.${name(p)} = coalesce(row.set.${name(p)}, ${now})`\n : `n.${name(p)} = ${now}`,\n ),\n ];\n }\n\n /**\n * An update of one node by key as one statement, for a single call:\n * the match under the caller's filter rules, the BEFORE rules, the\n * write and the AFTER rules, each rule an assertion. Which nodes it\n * touched is then decided in the database, not between two round\n * trips. Returns nothing when the update is not that simple (it writes\n * relationships, adjusts a field with a constraint, or cannot be\n * prepared without knowing whether the node is there): the caller opens\n * a transaction instead.\n */\n async updateInOne(\n plan: WritePlan,\n node: NodeType,\n key: unknown,\n input: Input,\n adjust: Input | undefined,\n tail: () => void,\n ): Promise<{ done: Promise<unknown[]> } | undefined> {\n if (\n !this.single ||\n // A constraint on an adjusted field is checked on what the\n // statement stored, in JavaScript: that needs a transaction.\n Object.entries(adjust ?? {}).some(([fieldName, ops]) => {\n const f = node.fields.get(fieldName);\n return ops != null && f?.kind === \"scalar\" && !!f.constraints;\n })\n ) {\n return undefined;\n }\n const relating = [...node.fields.values()].some(\n (f) => f.kind === \"relationship\" && input[f.name],\n );\n this.assertBatch(undefined, 1);\n const ctx0 = this.ctx();\n checkAuthentication(ctx0, node, \"UPDATE\");\n // Any field named in `adjust`, null included: its field rules apply\n // as for one it adjusts.\n const fields = [\n ...new Set([...Object.keys(input), ...Object.keys(adjust ?? {})]),\n ];\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 const ctx = this.ctx();\n // Rules the claims alone settle against refuse here, node or no node,\n // as they do in a transaction.\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 let prepared: { key: unknown; set: Input; remove: string[] };\n let after: Expr | undefined;\n let adjustments: string[];\n try {\n // In a transaction these run only once the node is found: a bad\n // input for a node that is not there answers null, not an error.\n prepared = await this.#prepareRow(plan, node, key, input, adjust);\n adjustments = compileAdjust(ctx, node, adjust);\n if (relating) {\n // Only connects and creates: what else an update does to its\n // relationships is read back between statements.\n plan.reconnects = true;\n if (!this.#inOne(plan)) return undefined;\n this.assertBatch(plan, 1);\n assertUniqueKeys(plan);\n // Nothing is sent while user code runs: a batch that went out\n // without the statements that follow would commit without them.\n for (const computed of plan.pending\n .splice(0)\n .map((task) => held(task()))) {\n await computed;\n }\n }\n after = and(\n authValidate(ctx, node, \"n\", \"UPDATE\", \"AFTER\"),\n ...fields.map((f) => {\n const field = node.fields.get(f);\n return field\n ? fieldValidate(ctx, node, field, \"n\", \"UPDATE\", \"AFTER\")\n : undefined;\n }),\n );\n } catch {\n return undefined;\n }\n const previous = node.subscriptionOptions.previousState;\n const refusedUpdate = printExpr(\n lit(refusal(\"forbidden\", node.name, \"UPDATE\")),\n );\n const text =\n `UNWIND ${printExpr(bind(ctx, [{ key: prepared.key, set: prepared.set }]))} AS row\\n` +\n `MATCH (n:${name(node.labels[0]!)}) WHERE n.${name(node.key.property)} = row.key` +\n // A node the caller cannot read is missing, not forbidden.\n andText(authFilter(ctx, node, \"n\", \"READ\")) +\n andText(authFilter(ctx, node, \"n\", \"UPDATE\")) +\n `\\nWITH n, row` +\n (previous ? \", properties(n) AS lora_previous\" : \"\") +\n (before\n ? `, assert(${printExpr(before)}, ${refusedUpdate}) AS lora_before`\n : \"\") +\n `\\nSET ${this.#setItems(node, adjustments).join(\", \")}` +\n (prepared.remove.length > 0\n ? `\\nREMOVE ${prepared.remove.map((p) => `n.${name(p)}`).join(\", \")}`\n : \"\") +\n `\\nRETURN n.${name(node.key.property)} AS key` +\n (previous ? \", lora_previous AS props\" : \"\") +\n // With relationships to write, the rules after the write wait for\n // them: they may well test what the node is connected to.\n (after && !relating\n ? `, assert(${printExpr(after)}, ${refusedUpdate}) AS ok`\n : \"\");\n if (relating) {\n // The statements after the update take the node as found. When it\n // is not there, this fails the call before any of them runs.\n const gctx = this.ctx();\n this.#unchecked.push(\n this.run(\n `MATCH (n:${name(node.labels[0]!)}) WHERE n.${name(node.key.property)} = ${printExpr(bind(gctx, key))}` +\n andText(authFilter(gctx, node, \"n\", \"READ\")) +\n andText(authFilter(gctx, node, \"n\", \"UPDATE\")) +\n `\\nWITH count(n) AS found\\nRETURN assert(found > 0, ${this.assertions.failsAs(() => NOT_THERE)}) AS ok`,\n gctx,\n ),\n );\n }\n const done = this.run(text, ctx).then((found) => {\n const keys = found.map((r) => r[\"key\"]);\n if (previous) {\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 this.#updatedNodes(node, keys, written, [{ key, input }], adjust);\n return keys;\n });\n if (!relating) {\n tail();\n return { done: this.watch(done) };\n }\n // Not awaited before it has issued everything: `apply` has nothing\n // left to wait for ahead of its statements.\n const applied = this.apply(plan, () => {\n this.#unchecked.push(\n held(\n this.validateAfter(\n node,\n [key],\n \"UPDATE\",\n new Set(written.map((f) => f.name)),\n ),\n ),\n );\n tail();\n });\n return {\n done: this.watch(Promise.all([done, applied]).then(([keys]) => keys)),\n };\n }\n\n /**\n * The single call found no node to update and rolled back: nothing of\n * what was planned happened.\n */\n nothingWritten(): void {\n for (const count of Object.keys(this.info) as Array<keyof MutationInfo>) {\n this.info[count] = 0;\n }\n this.connected = [];\n this.change.created.length = 0;\n this.updated.clear();\n this.updatedFields.clear();\n this.#unchecked = [];\n }\n\n /**\n * Whether `plan` can go out in a single call: creates and links only,\n * each link's outcome known or told in the database.\n */\n #inOne(plan: WritePlan): boolean {\n return (\n plan.disconnects.length === 0 &&\n linksInOne(plan) &&\n plan.edgeUpdates.length === 0 &&\n plan.nodeUpdates.length === 0 &&\n plan.nestedDeletes.length === 0 &&\n this.disconnected.length === 0\n );\n }\n\n /**\n * `send()` for a statement's rows. The promise is safe to leave\n * unawaited: a batch fails as a whole, so when one statement of several\n * issued together is refused, the others reject too, and whoever\n * stopped at the first must not leave the rest unhandled.\n */\n run(\n text: string,\n ctx: CompileContext,\n ): Promise<Array<Record<string, unknown>>> {\n return held(\n this.send({ text, params: ctx.params }).then((result) => result.rows),\n );\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 /**\n * `tail` is called once the plan's last statements are issued, without\n * waiting for them: what it issues (the payload read, the caller's own\n * checks) shares their round trip.\n */\n async apply(plan: WritePlan, tail?: () => void): Promise<void> {\n // Started together; the first to fail, in order, is the one reported.\n for (const computed of plan.pending.map((task) => held(task()))) {\n await computed;\n }\n this.assertBatch(plan);\n assertUniqueKeys(plan);\n // One call only when every statement is known now: nothing but\n // creates and the links between them and to nodes that are there.\n // Decided before anything is issued: the first batch of a single\n // call commits.\n if (this.single && !this.#inOne(plan)) await this.open();\n // Issued together, in this order: the moves precede the creates.\n const creating = [\n this.moveHiddenKeys(plan),\n this.moveTakenUniques(plan),\n this.applyCreates(plan),\n ].map((step) => this.watch(step));\n // A plan that only creates nodes has nothing between its creates and\n // its last checks, so all of it is one batch.\n const createsOnly =\n plan.disconnects.length === 0 &&\n plan.links.length === 0 &&\n plan.edgeUpdates.length === 0 &&\n plan.nodeUpdates.length === 0 &&\n plan.nestedDeletes.length === 0 &&\n this.disconnected.length === 0;\n if (!createsOnly && this.single) {\n // Creates and the relationships between them and to nodes that are\n // there: every statement is issued now, each decision an assertion.\n linkInOne(this, plan);\n assertCardinality(this, plan);\n } else if (!createsOnly) {\n // The creates wait for the first statement of what follows (a read\n // of the nodes to connect, usually) and share its round trip. A\n // create that fails rejects that statement with its error.\n if (this.#queue.length > 0) this.#deferred = true;\n await this.applyDisconnects(plan);\n await applyLinks(this, plan);\n await this.applyEdgeUpdates(plan);\n await this.applyNodeUpdates(plan);\n await this.applyNestedDeletes(plan);\n await checkCardinality(this, plan);\n await checkRequired(this);\n }\n const validating = this.watch(this.validateCreated(plan));\n tail?.();\n for (const step of creating) await step;\n await validating;\n await this.settle();\n }\n\n /**\n * `maxBatch` over the whole mutation: nodes created and updated so far\n * plus those `plan` creates and updates (nested `update` entries\n * included), and relationships written so far plus those `plan`\n * connects, disconnects (each listed key) and updates, at most ten per\n * node allowed. Checked before any of the plan's writes.\n */\n assertBatch(plan?: WritePlan, updating = 0): void {\n const max = this.env.maxBatch;\n let creates = 0;\n for (const rows of plan?.creates.values() ?? []) creates += rows.length;\n const updates =\n this.info.nodesUpdated + updating + (plan?.nodeUpdates.length ?? 0);\n const nodes = this.info.nodesCreated + creates + updates;\n const relationships =\n this.info.relationshipsCreated +\n this.info.relationshipsDeleted +\n (plan\n ? plan.links.length +\n plan.edgeUpdates.length +\n plan.disconnects.reduce((n, d) => n + (d.to ? d.to.length : 1), 0)\n : 0);\n if (nodes > max || relationships > max * 10) {\n throw requestError(\n \"LIMIT_EXCEEDED\",\n `the mutation writes ${nodes} nodes (${this.info.nodesCreated + creates} created, ${updates} updated) and ${relationships} relationships; the limit is ${max} nodes (and ${max * 10} relationships) per mutation`,\n );\n }\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 // Every statement is issued before the first is awaited (see `send`).\n const moving: Array<[NodeType, Promise<Array<Record<string, unknown>>>]> =\n [];\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 this.#moved.push({\n kind: \"hidden\",\n node,\n property: node.key.property,\n field: node.key.name,\n values: moves.map((m) => m.to),\n });\n const key = `n.${name(node.key.property)}`;\n moving.push([\n node,\n 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 ]);\n }\n for (const [node, pending] of moving) {\n const [moved] = await pending;\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 const moving: Array<\n [NodeType, ScalarField, Promise<Array<Record<string, unknown>>>]\n > = [];\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 this.#moved.push({\n kind: \"taken\",\n node,\n property: f.property,\n field: f.name,\n values: moves.map((m) => m.to),\n });\n const ctx = this.ctx();\n const p = `n.${name(f.property)}`;\n moving.push([\n node,\n f,\n 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 ]);\n }\n }\n for (const [node, field, pending] of moving) {\n const [moved] = await pending;\n if (Number(moved?.[\"moved\"] ?? 0) > 0) {\n this.takenUnique ??= { node, field };\n }\n }\n }\n\n async applyCreates(plan: WritePlan): Promise<void> {\n const creating: Array<Promise<unknown>> = [];\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 given = shape ? shape.split(\"\\0\") : [];\n const props = [\n `${name(node.key.property)}: row.key`,\n // Work for the type's worker from the moment it commits.\n ...(node.outbox ? [`${name(OUTBOX.state)}: \"PENDING\"`] : []),\n ...given.map((prop) => `${name(prop)}: row.props.${name(prop)}`),\n // A settable @timestamp the input supplied keeps its value.\n ...stamped\n .filter(([prop]) => !given.includes(prop))\n .map(([prop, now]) => `${name(prop)}: ${now}`),\n ];\n creating.push(\n this.run(\n `UNWIND ${p} AS row\\nCREATE (n:${labels} { ${props.join(\", \")} })`,\n ctx,\n ),\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 this.triggered.delete(`${node.name}\\0${keyOf(r.key)}`);\n }\n }\n for (const pending of creating) await pending;\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 checkRelationshipRules(this, \"DISCONNECT\", rel, pairs(doomed));\n }\n if (endRules(owner, target, \"DELETE_RELATIONSHIP\", \"BEFORE\")) {\n const doomed = await this.run(`${matchText}RETURN ${returned}`, ctx);\n await checkEnds(\n this,\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 checkEnds(\n this,\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 /** `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 checkRelationshipRules(\n this,\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 deleteNodes(\n this,\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 // Several round trips: the keys found decide what is written.\n await this.open();\n this.assertBatch(undefined, rows.length);\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 // A node the caller cannot read is missing, not forbidden.\n andText(authFilter(ctx, node, \"n\", \"READ\")) +\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 prepared.push(await this.#prepareRow(plan, node, key, input, adjust));\n }\n\n const actx = this.ctx();\n const adjustments = compileAdjust(actx, node, adjust);\n // An adjusted value is computed in the statement, so its rules can\n // only be checked on what the statement stored: returned and checked\n // here, and the transaction rolled back when one is broken.\n const adjusted = Object.entries(adjust ?? {})\n .filter(([, ops]) => ops !== null && ops !== undefined)\n .map(([fieldName]) => node.fields.get(fieldName))\n .filter((f): f is ScalarField => f?.kind === \"scalar\" && !!f.constraints);\n const broken: Violation[] = [];\n let brokenTotal = 0;\n const stamped = timestamps(node, \"UPDATE\");\n const suppliable = new Set(\n [...node.fields.values()]\n .filter(\n (f): f is ScalarField =>\n f.kind === \"scalar\" && !!f.timestamp && settable(f, \"UPDATE\"),\n )\n .map((f) => f.property),\n );\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 // A @timestamp settable on update keeps a value the input supplied.\n ...stamped.map(([p, now]) =>\n suppliable.has(p)\n ? `n.${name(p)} = coalesce(row.set.${name(p)}, ${now})`\n : `n.${name(p)} = ${now}`,\n ),\n ];\n const removes = shape ? shape.split(\"\\0\") : [];\n const text =\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 (adjusted.length > 0\n ? `\\nRETURN ${adjusted.map((f, i) => `n.${name(f.property)} AS adjusted${i}`).join(\", \")}`\n : \"\");\n // Nothing to check on what it stored: the write shares the round\n // trip of the statements that follow it.\n if (adjusted.length === 0) {\n this.later({ text, params: sctx.params });\n continue;\n }\n const stored = await this.run(text, sctx);\n for (const row of stored) {\n for (const [i, f] of adjusted.entries()) {\n for (const failure of checkValue(\n f.constraints!,\n row[`adjusted${i}`],\n )) {\n brokenTotal++;\n if (broken.length >= MAX_VIOLATIONS) continue;\n broken.push({\n path:\n failure.index === undefined\n ? [\"adjust\", f.name]\n : [\"adjust\", f.name, failure.index],\n coordinate: `${node.name}.${f.name}`,\n rule: failure.rule,\n params: failure.params,\n message: `${failure.message} after the adjustment`,\n });\n }\n }\n }\n }\n if (brokenTotal > 0) {\n throw validationError(\"CONSTRAINT_VIOLATION\", broken, brokenTotal);\n }\n const keys = todo.map((r) => r.key);\n this.#updatedNodes(node, keys, written, todo, adjust);\n return keys;\n }\n\n /** Record nodes an update wrote: counts, the write-set, what to check after. */\n #updatedNodes(\n node: NodeType,\n keys: unknown[],\n written: ScalarField[],\n rows: Array<{ key: unknown; input: Input }>,\n adjust: Input | undefined,\n ): void {\n const done = new Set(keys.map(keyOf));\n this.info.nodesUpdated += keys.length;\n for (const key of keys) {\n this.change.updated.push({ type: node.name, key });\n // The mutation's own write: its triggers fire, whatever a trigger\n // reported about the node before.\n this.triggered.delete(`${node.name}\\0${keyOf(key)}`);\n }\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 const byKey =\n this.updatedFields.get(node) ?? new Map<string, Set<string>>();\n for (const { key, input } of rows) {\n if (!done.has(keyOf(key))) continue;\n const set = byKey.get(keyOf(key)) ?? new Set<string>();\n for (const name of Object.keys(input)) set.add(name);\n for (const name of Object.keys(adjust ?? {})) set.add(name);\n byKey.set(keyOf(key), set);\n }\n this.updatedFields.set(node, byKey);\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 // Issued together; the first failure, in order, is the one reported.\n const validating: Array<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 validating.push(\n this.validateAfter(node, keys, \"CREATE\", new Set(fields)),\n );\n }\n }\n for (const pending of settled(validating)) await pending;\n }\n\n async validateUpdated(): Promise<void> {\n const validating: Array<Promise<void>> = [];\n for (const [node, { keys, fields }] of this.updated) {\n validating.push(this.validateAfter(node, keys, \"UPDATE\", fields));\n }\n for (const pending of settled(validating)) await pending;\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 let rule: Expr | undefined;\n // Behind the links of a single call, a rule the claims refuse waits\n // its turn (see `inPlace`).\n this.inPlace(() => {\n 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 });\n if (!rule) return;\n // In a single call the rule refuses by failing the statement, which\n // rolls the mutation back before its commit.\n const ok = this.single\n ? `assert(${printExpr(rule)}, ${printExpr(lit(refusal(\"forbidden\", node.name, op)))})`\n : printExpr(rule);\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, ${ok} 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 result = await this.send(compiled.statements[0]!);\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\", \"READ\")) +\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/**\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\n/** One `execute()` per statement, for a driver without `executeMany`. */\nasync function inOrder(\n tx: DriverTransaction,\n batch: ReadonlyArray<{ statement: Statement }>,\n): Promise<QueryResult[]> {\n const results: QueryResult[] = [];\n for (const { statement } of batch) results.push(await tx.execute(statement));\n return results;\n}\n\n/** Run `fn` on the next turn of the event loop. */\nconst nextTurn: (fn: () => void) => void =\n typeof setImmediate === \"function\" ? setImmediate : (fn) => setTimeout(fn, 0);\n\n/** `pending`, safe to leave unawaited when an earlier check throws. */\nexport function held<T>(pending: Promise<T>): Promise<T> {\n pending.catch(() => undefined);\n return pending;\n}\n\n/** `pending`, each safe to leave unawaited when an earlier one throws. */\nfunction settled<T>(pending: Array<Promise<T>>): Array<Promise<T>> {\n for (const p of pending) p.catch(() => undefined);\n return pending;\n}\n","// An upsert's rows that would write nothing: every stated property\n// already holds and every stated connect is already there, with its\n// properties. They are left out of the update, so a seed re-run over a\n// seeded graph costs a read per row (G-57). The comparison shares the\n// read that tells existing keys from new ones.\n//\n// Only what the caller may read is compared, or the answer would tell a\n// write-only value. A row the comparison cannot settle cheaply (a nested\n// create, a polymorphic field, a relationship with rules, a `@populatedBy`\n// value) is written as before, and so meets every check it did.\n\nimport {\n authFilter,\n authValidate,\n checkAuthentication,\n checkFieldAuthentication,\n fieldValidate,\n propertyAccess,\n relationshipRules,\n} from \"../../compile/auth.js\";\nimport { bind, type CompileContext } from \"../../compile/context.js\";\nimport { and, name, printExpr, type Expr } from \"../../compile/cypher.js\";\nimport { settable } from \"../../model/inputs.js\";\nimport { keyOf } from \"../../compile/read/by-keys.js\";\nimport { toStored } from \"../../model/points.js\";\nimport type {\n AuthOperation,\n NodeType,\n RelationshipField,\n ScalarField,\n} from \"../../model/types.js\";\nimport { andText, arrow, labelTest } from \"./fragments.js\";\nimport type { Input } from \"./plan.js\";\nimport type { Runner } from \"./runner.js\";\n\n/** A row the comparison may settle: what it sets, removes and connects. */\ninterface Candidate {\n /** Per relationship field: the targets and their stored properties. */\n connects: Map<RelationshipField, Array<{ to: unknown; props: Input }>>;\n /** The statement's row: key, set, remove, and `connects` per field. */\n row: Input;\n}\n\n/**\n * Which of an upsert's keys name a node the caller may read and update\n * (`existing`), and which of those an update would change nothing on\n * (`same`): one read for both. `input` is what an update of the row\n * would write. A row that cannot be settled here is never `same`.\n */\nexport async function existingRows(\n runner: Runner,\n node: NodeType,\n rows: Array<{ key: unknown; input: Input }>,\n): Promise<{ existing: Set<string>; same: Set<string> }> {\n const ctx = runner.ctx();\n // A callback's value is only known by running it.\n const computed = [...node.fields.values()].some(\n (f) => f.kind === \"scalar\" && f.populatedBy?.operations.has(\"UPDATE\"),\n );\n // Per relationship field: whether its connects may be compared.\n const comparable = new Map<RelationshipField, boolean>();\n const candidates: Candidate[] = [];\n const statementRows: Input[] = [];\n const stated = new Set<ScalarField>();\n const rels = new Set<RelationshipField>();\n for (const { key, input } of rows) {\n const c = computed\n ? undefined\n : candidate(ctx, comparable, node, key, input);\n if (!c) {\n statementRows.push({ key });\n continue;\n }\n candidates.push(c);\n statementRows.push(c.row);\n for (const n of Object.keys(input)) {\n const f = node.fields.get(n);\n if (f?.kind === \"scalar\" && !f.key) stated.add(f);\n }\n for (const rel of c.connects.keys()) rels.add(rel);\n }\n\n // The rules the update would hold the node to, before and after: on an\n // unchanged node both read what is stored now. A rule the claims alone\n // refuse throws: the rows are written, and fail as they did.\n let rules: Expr | undefined;\n const relTests: string[] = [];\n try {\n if (candidates.length > 0) checkAuthentication(ctx, node, \"UPDATE\");\n rules = and(\n authValidate(ctx, node, \"n\", \"UPDATE\", \"BEFORE\"),\n authValidate(ctx, node, \"n\", \"UPDATE\", \"AFTER\"),\n ...[...stated].flatMap((f) => [\n fieldValidate(ctx, node, f, \"n\", \"UPDATE\", \"BEFORE\"),\n fieldValidate(ctx, node, f, \"n\", \"UPDATE\", \"AFTER\"),\n ]),\n );\n for (const [i, rel] of [...rels].entries()) {\n const target = runner.env.model.nodes.get(rel.target)!;\n const param = `c${i}`;\n // Without edge properties a connect is its target's key: a smaller\n // parameter, which is most of what the comparison costs.\n const keyed = candidates.every((c) =>\n (c.connects.get(rel) ?? []).every(\n (w) => Object.keys(w.props).length === 0,\n ),\n );\n for (const c of candidates) {\n const list = c.connects.get(rel);\n if (list) c.row[param] = keyed ? list.map((w) => w.to) : list;\n }\n // Only what a connect could see: a hidden target is not found.\n const visible =\n ` WHERE ${labelTest(\"m\", target)}` +\n andText(authFilter(ctx, target, \"m\", \"READ\")) +\n andText(authFilter(ctx, target, \"m\", \"CREATE_RELATIONSHIP\"));\n const there =\n `[(n)${arrow(rel, \"r\", \"m\", undefined)}${visible}` +\n ` AND m.${name(target.key.property)} = ${keyed ? \"want\" : \"want.to\"} | properties(r)]`;\n const connected = keyed\n ? `all(want IN row.${param} WHERE size(${there}) > 0)`\n : `all(want IN row.${param} WHERE any(edge IN ${there}` +\n ` WHERE all(k IN keys(want.props) WHERE edge[k] = want.props[k])))`;\n // A single relationship is replaced: it holds no other target.\n const alone = rel.list\n ? \"\"\n : ` AND (row.${param} IS NULL OR size([(n)${arrow(rel, \"r\", \"m\", undefined)} WHERE ${labelTest(\"m\", target)} | 1]) = 1)`;\n const owner = authFilter(ctx, node, \"n\", \"CREATE_RELATIONSHIP\");\n relTests.push(\n `(row.${param} IS NULL OR (${connected}${alone}` +\n `${owner ? ` AND ${printExpr(owner)}` : \"\"}))`,\n );\n }\n } catch {\n for (const c of candidates) {\n for (const k of Object.keys(c.row)) if (k !== \"key\") delete c.row[k];\n }\n rules = undefined;\n relTests.length = 0;\n }\n\n const rowsParam = printExpr(bind(ctx, statementRows));\n // A row that is not compared has no `set`, and stops there.\n const tests = [\n \"row.set IS NOT NULL\",\n \"all(k IN keys(row.set) WHERE n[k] = row.set[k])\",\n \"all(k IN coalesce(row.remove, []) WHERE n[k] IS NULL)\",\n ...relTests,\n ...(rules ? [printExpr(rules)] : []),\n ];\n const found = await runner.run(\n `UNWIND ${rowsParam} AS row\\n` +\n `MATCH (n:${name(node.labels[0]!)}) WHERE n.${name(node.key.property)} = row.key` +\n andText(authFilter(ctx, node, \"n\", \"READ\")) +\n andText(authFilter(ctx, node, \"n\", \"UPDATE\")) +\n \"\\n\" +\n `RETURN n.${name(node.key.property)} AS key, coalesce(${tests.join(\"\\n AND \")}, false) AS same`,\n ctx,\n );\n return {\n existing: new Set(found.map((r) => keyOf(r[\"key\"]))),\n same: new Set(\n found.filter((r) => r[\"same\"] === true).map((r) => keyOf(r[\"key\"])),\n ),\n };\n}\n\n/** What the row writes, when the comparison can settle it; else nothing. */\nfunction candidate(\n ctx: CompileContext,\n comparable: Map<RelationshipField, boolean>,\n node: NodeType,\n key: unknown,\n input: Input,\n): Candidate | undefined {\n const set: Input = {};\n const remove: string[] = [];\n const connects: Candidate[\"connects\"] = new Map();\n try {\n for (const [n, value] of Object.entries(input)) {\n const f = node.fields.get(n);\n if (f?.kind === \"scalar\") {\n if (f.key) continue;\n if (!readable(f)) return undefined;\n checkFieldAuthentication(ctx, node.name, f, \"UPDATE\");\n if (value === null) {\n // A required field cannot be removed: the update says so.\n if (f.required) return undefined;\n remove.push(f.property);\n } else set[f.property] = toStored(f, value);\n continue;\n }\n if (f?.kind !== \"relationship\") return undefined;\n if (value === null || value === undefined) continue;\n let ok = comparable.get(f);\n if (ok === undefined) {\n ok = connectable(ctx, node, f);\n comparable.set(f, ok);\n }\n if (!ok) return undefined;\n const list = connectsOf(ctx, f, value as Input);\n if (!list) return undefined;\n connects.set(f, list);\n }\n } catch {\n return undefined;\n }\n return {\n connects,\n row: remove.length > 0 ? { key, set, remove } : { key, set },\n };\n}\n\n/**\n * Whether a field's connects may be compared: to a concrete type, with no\n * rule on the relationship or its ends that the comparison would skip,\n * and none the claims alone refuse. The same for every row.\n */\nfunction connectable(\n ctx: CompileContext,\n owner: NodeType,\n rel: RelationshipField,\n): boolean {\n const target = ctx.model.nodes.get(rel.target);\n if (!target || rel.via) return false;\n const vars = { owner: \"a\", target: \"b\", rel: \"r\" };\n const ops: Array<\"CONNECT\" | \"UPDATE_EDGE\" | \"DISCONNECT\"> = [\n \"CONNECT\",\n \"UPDATE_EDGE\",\n \"DISCONNECT\",\n ];\n try {\n if (ops.some((op) => relationshipRules(ctx, rel, op, vars) !== undefined)) {\n return false;\n }\n const ends: AuthOperation[] = [\n \"CREATE_RELATIONSHIP\",\n \"DELETE_RELATIONSHIP\",\n ];\n for (const op of ends) {\n for (const when of [\"BEFORE\", \"AFTER\"] as const) {\n if (authValidate(ctx, owner, \"a\", op, when)) return false;\n if (authValidate(ctx, target, \"b\", op, when)) return false;\n }\n }\n checkFieldAuthentication(ctx, owner.name, rel, \"UPDATE\");\n checkFieldAuthentication(ctx, owner.name, rel, \"CREATE_RELATIONSHIP\");\n checkAuthentication(ctx, owner, \"CREATE_RELATIONSHIP\");\n checkAuthentication(ctx, target, \"CREATE_RELATIONSHIP\");\n checkAuthentication(ctx, owner, \"DELETE_RELATIONSHIP\");\n } catch {\n return false;\n }\n return true;\n}\n\n/** A relationship input's connects, when it holds nothing else. */\nfunction connectsOf(\n ctx: CompileContext,\n rel: RelationshipField,\n value: Input,\n): Array<{ to: unknown; props: Input }> | undefined {\n const model = ctx.model;\n const target = model.nodes.get(rel.target)!;\n for (const [op, v] of Object.entries(value)) {\n if (op !== \"connect\" && v !== null && v !== undefined) return undefined;\n }\n const connect = value[\"connect\"];\n const list = (\n connect === null || connect === undefined\n ? []\n : Array.isArray(connect)\n ? connect\n : [connect]\n ) as Input[];\n if (list.length === 0 || (!rel.list && list.length > 1)) return undefined;\n const props = rel.properties\n ? model.relationshipProperties.get(rel.properties)\n : undefined;\n const out: Array<{ to: unknown; props: Input }> = [];\n const seen = new Set<string>();\n for (const c of list) {\n const to = c[target.key.name];\n if (seen.has(keyOf(to))) return undefined;\n seen.add(keyOf(to));\n const edge = (c[\"edge\"] as Input | null | undefined) ?? {};\n const stored: Input = {};\n for (const [n, v] of Object.entries(edge)) {\n const f = props?.fields.get(n);\n if (v === null || v === undefined) continue;\n // A re-connect updates the properties it is given.\n if (\n !f ||\n !readable(f) ||\n !settable(f, \"UPDATE\") ||\n propertyAccess(ctx, f, \"UPDATE\") !== \"allowed\"\n ) {\n return undefined;\n }\n stored[f.property] = toStored(f, v);\n }\n out.push({ to, props: stored });\n }\n return out;\n}\n\n/** Readable by anyone who may read the node: no rule, mask or write-only. */\nfunction readable(f: ScalarField): boolean {\n return (\n !f.private &&\n f.selectableOn.read &&\n !f.authentication?.has(\"READ\") &&\n !(f.authorization?.validate ?? []).some((r) => r.operations.has(\"READ\")) &&\n !f.authorization?.mask\n );\n}\n","// The Standard Schema interface (https://standardschema.dev), which zod,\n// valibot, arktype, yup, joi and others implement. The specification is\n// types only and written to be copied, so accepting these validators\n// costs no dependency.\n\n/** A validator from any library that implements Standard Schema v1. */\nexport interface StandardSchemaV1<Input = unknown, Output = Input> {\n readonly \"~standard\": {\n readonly version: 1;\n readonly vendor: string;\n readonly validate: (\n value: unknown,\n ) => StandardResult<Output> | Promise<StandardResult<Output>>;\n readonly types?:\n | { readonly input: Input; readonly output: Output }\n | undefined;\n };\n}\n\nexport type StandardResult<Output> =\n | { readonly value: Output; readonly issues?: undefined }\n | { readonly issues: ReadonlyArray<StandardIssue> };\n\nexport interface StandardIssue {\n readonly message: string;\n /** Keys into the value; a segment is a key, or an object holding one. */\n readonly path?:\n | ReadonlyArray<PropertyKey | { readonly key: PropertyKey }>\n | undefined;\n}\n\n/**\n * The validator of one node type's mutation inputs: one schema for every\n * input, or one per kind of input. An update's input holds only the\n * fields it sets, and an upsert's only the key for certain, so a schema\n * that requires fields belongs under `create`.\n */\nexport type TypeValidator =\n | StandardSchemaV1\n | {\n create?: StandardSchemaV1;\n update?: StandardSchemaV1;\n upsert?: StandardSchemaV1;\n };\n\nexport function isStandardSchema(value: unknown): value is StandardSchemaV1 {\n if (\n value === null ||\n (typeof value !== \"object\" && typeof value !== \"function\")\n ) {\n return false;\n }\n const standard = (value as { \"~standard\"?: unknown })[\"~standard\"];\n return (\n standard !== null &&\n typeof standard === \"object\" &&\n typeof (standard as { validate?: unknown }).validate === \"function\"\n );\n}\n","// The value rules of a mutation's input (@normalize, @length, @pattern,\n// @format, @range, @multipleOf, @size, and the validators option),\n// applied in JavaScript before the transaction opens: a request with a\n// bad value never takes the writer lock. Walks the arguments the way the\n// plan does (create and update inputs, nested connect / create / update,\n// relationship properties, the member-keyed parts of interface and union\n// inputs) and reports every violation at once.\n//\n// Order: normalise, then the field rules, then the type's validator.\n// What is normalised is written back into the arguments, so the plan\n// stores the value that was checked. That is safe to repeat: when two\n// root fields share a variable's value, normalising it twice changes\n// nothing.\n//\n// Keys are checked where they are stored (a create), never where they\n// address a node (connect, disconnect, the key of an update): a rule\n// added later must not make an existing node unreachable.\n\nimport {\n MAX_VIOLATIONS,\n validationError,\n type Violation,\n} from \"../../errors.js\";\nimport { checkValue, normalizeValue } from \"../../model/constraints.js\";\nimport type {\n GraphModel,\n NodeType,\n RelationshipField,\n ScalarField,\n} from \"../../model/types.js\";\nimport type { MutationKind } from \"../../schema/mutations.js\";\nimport {\n isStandardSchema,\n type StandardSchemaV1,\n type TypeValidator,\n} from \"../../standard-schema.js\";\nimport type { Input } from \"./plan.js\";\n\ntype Path = Array<string | number>;\ntype InputKind = \"create\" | \"update\" | \"upsert\";\nexport type Validators = Readonly<Record<string, TypeValidator>>;\n\ninterface Job {\n schema: StandardSchemaV1;\n node: NodeType;\n input: Input;\n path: Path;\n}\n\nclass Collector {\n readonly violations: Violation[] = [];\n readonly jobs: Job[] = [];\n total = 0;\n\n constructor(\n readonly model: GraphModel,\n readonly validators: Validators,\n ) {}\n\n add(violation: Violation): void {\n this.total++;\n if (this.violations.length < MAX_VIOLATIONS)\n this.violations.push(violation);\n }\n\n /** Normalise `holder[f.name]` in place, then apply the field's rules. */\n field(owner: string, f: ScalarField, holder: Input, path: Path): void {\n if (!f.constraints) return;\n let value = holder[f.name];\n if (value === null || value === undefined) return;\n if (f.constraints.normalize) {\n value = normalizeValue(f.constraints, value);\n holder[f.name] = value;\n }\n for (const failure of checkValue(f.constraints, value)) {\n this.add({\n path:\n failure.index === undefined\n ? [...path, f.name]\n : [...path, f.name, failure.index],\n coordinate: `${owner}.${f.name}`,\n rule: failure.rule,\n params: failure.params,\n message: failure.message,\n });\n }\n }\n}\n\nfunction schemaFor(\n validator: TypeValidator | undefined,\n kind: InputKind,\n): StandardSchemaV1 | undefined {\n if (validator === undefined) return undefined;\n return isStandardSchema(validator) ? validator : validator[kind];\n}\n\n/** Items of a nested operation with their paths: one, or a list. */\nfunction* items(value: unknown, path: Path): Generator<[Input, Path]> {\n if (value === null || value === undefined) return;\n if (Array.isArray(value)) {\n for (const [i, item] of value.entries()) {\n if (item !== null && typeof item === \"object\") {\n yield [item as Input, [...path, i]];\n }\n }\n } else if (typeof value === \"object\") {\n yield [value as Input, path];\n }\n}\n\nfunction walkEdge(\n rel: RelationshipField,\n edge: unknown,\n path: Path,\n out: Collector,\n): void {\n if (!rel.properties || edge === null || typeof edge !== \"object\") return;\n const props = out.model.relationshipProperties.get(rel.properties);\n if (!props) return;\n for (const f of props.fields.values()) {\n out.field(props.name, f, edge as Input, path);\n }\n}\n\nfunction walkRelationship(\n rel: RelationshipField,\n value: Input,\n path: Path,\n out: Collector,\n): void {\n const { model } = out;\n const parts = (op: string): Array<[NodeType, unknown, Path]> => {\n const given = value[op];\n if (given === null || given === undefined) return [];\n if (!model.abstracts.has(rel.target)) {\n const target = model.nodes.get(rel.target);\n return target ? [[target, given, [...path, op]]] : [];\n }\n // An interface or union target takes its parts per member type.\n return Object.entries(given as Input).flatMap(([member, part]) => {\n const target = model.nodes.get(member);\n return target\n ? [[target, part, [...path, op, member]] as [NodeType, unknown, Path]]\n : [];\n });\n };\n // @size(max:) on the field: each list, per member of an abstract target.\n if (rel.maxItems) {\n const { max, message } = rel.maxItems;\n for (const op of [\"connect\", \"create\", \"disconnect\", \"update\"]) {\n for (const [, given, at] of parts(op)) {\n if (!Array.isArray(given) || given.length <= max) continue;\n out.add({\n path: at,\n coordinate: `${rel.owner}.${rel.name}`,\n rule: \"maxItems\",\n params: { limit: max },\n message:\n message ??\n `must have at most ${max} ${max === 1 ? \"item\" : \"items\"}`,\n });\n }\n }\n }\n for (const [, given, at] of parts(\"connect\")) {\n for (const [item, itemPath] of items(given, at)) {\n walkEdge(rel, item[\"edge\"], [...itemPath, \"edge\"], out);\n }\n }\n for (const [target, given, at] of parts(\"create\")) {\n for (const [item, itemPath] of items(given, at)) {\n walkEdge(rel, item[\"edge\"], [...itemPath, \"edge\"], out);\n walkNode(target, item[\"node\"], [...itemPath, \"node\"], \"create\", out);\n }\n }\n for (const [target, given, at] of parts(\"update\")) {\n for (const [item, itemPath] of items(given, at)) {\n walkEdge(rel, item[\"edge\"], [...itemPath, \"edge\"], out);\n walkNode(target, item[\"node\"], [...itemPath, \"node\"], \"update\", out);\n }\n }\n}\n\nfunction walkNode(\n node: NodeType,\n input: unknown,\n path: Path,\n kind: InputKind,\n out: Collector,\n): void {\n if (input === null || typeof input !== \"object\") return;\n const holder = input as Input;\n for (const f of node.fields.values()) {\n const value = holder[f.name];\n if (value === null || value === undefined) continue;\n if (f.kind === \"scalar\") {\n out.field(node.name, f, holder, path);\n } else if (f.kind === \"relationship\" && typeof value === \"object\") {\n walkRelationship(f, value as Input, [...path, f.name], out);\n }\n }\n const schema = schemaFor(out.validators[node.name], kind);\n if (schema) out.jobs.push({ schema, node, input: holder, path });\n}\n\n// Dates and times travel to the database as { kind, iso }. A validator is\n// shown what the client sent, an ISO string, and a string it returns for\n// such a field is given its kind back.\nconst TEMPORAL: Partial<Record<ScalarField[\"type\"], string>> = {\n Date: \"date\",\n Time: \"time\",\n LocalTime: \"localtime\",\n DateTime: \"datetime\",\n LocalDateTime: \"localdatetime\",\n Duration: \"duration\",\n};\n\nconst mapItems = (value: unknown, each: (item: unknown) => unknown) =>\n Array.isArray(value) ? value.map(each) : each(value);\n\nfunction temporalFields(node: NodeType): ScalarField[] {\n return [...node.fields.values()].filter(\n (f): f is ScalarField => f.kind === \"scalar\" && f.type in TEMPORAL,\n );\n}\n\n/** Run one type's validator; its issues become violations at its path. */\nasync function runValidator(job: Job, out: Collector): Promise<void> {\n const { schema, node, input, path } = job;\n const temporal = temporalFields(node);\n const shown: Input = { ...input };\n for (const f of temporal) {\n shown[f.name] = mapItems(input[f.name], (item) =>\n item !== null && typeof item === \"object\" && \"iso\" in item\n ? (item as { iso: unknown }).iso\n : item,\n );\n }\n const result = await schema[\"~standard\"].validate(shown);\n if (result.issues) {\n for (const issue of result.issues) {\n // A segment is a key or an object holding one, and a library may\n // give a list index as a string.\n const keys = (issue.path ?? []).map((segment) => {\n const key =\n segment !== null && typeof segment === \"object\"\n ? segment.key\n : segment;\n return typeof key === \"number\" ? key : String(key);\n });\n const first = keys[0];\n out.add({\n path: [...path, ...keys],\n coordinate:\n typeof first === \"string\" && node.fields.has(first)\n ? `${node.name}.${first}`\n : node.name,\n rule: \"custom\",\n params: {},\n message: issue.message,\n });\n }\n return;\n }\n // A validator may transform: what it returns is what is written.\n const value: unknown = result.value;\n if (value === null || typeof value !== \"object\") return;\n for (const key of Object.keys(input)) delete input[key];\n Object.assign(input, value);\n for (const f of temporal) {\n input[f.name] = mapItems(input[f.name], (item) =>\n typeof item === \"string\" ? { kind: TEMPORAL[f.type], iso: item } : item,\n );\n }\n}\n\n/**\n * Refuse a mutation whose input breaks a field's rule or its type's\n * validator, with every violation in one `BAD_USER_INPUT`. Values\n * computed during the write (an `adjust`, a `@populatedBy` callback) are\n * checked where they appear.\n */\nexport async function validateInput(\n model: GraphModel,\n validators: Validators,\n op: MutationKind,\n node: NodeType,\n args: Record<string, unknown>,\n): Promise<void> {\n const out = new Collector(model, validators);\n if (op === \"CREATE\" || op === \"UPSERT\") {\n const kind = op === \"CREATE\" ? \"create\" : \"upsert\";\n for (const [input, path] of items(args[\"input\"], [\"input\"])) {\n walkNode(node, input, path, kind, out);\n }\n } else if (op === \"UPDATE\" || op === \"UPDATE_MANY\") {\n walkNode(node, args[\"update\"], [\"update\"], \"update\", out);\n }\n // A validator sees an input the field rules accept: after them, and\n // only when they all hold, so it need not defend against what they refuse.\n if (out.total === 0) {\n for (const job of out.jobs) await runValidator(job, out);\n }\n if (out.total > 0) {\n throw validationError(\"BAD_USER_INPUT\", out.violations, out.total);\n }\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//\n// This file is the entry point; the parts live in `mutate/`: the write plan\n// (plan.ts), the runner that applies it (runner.ts, delete.ts), and the\n// checks that follow the writes (checks.ts, unique-together.ts).\n\nimport type { FieldNode, GraphQLObjectType, SelectionSetNode } from \"graphql\";\nimport {\n authFilter,\n authValidate,\n checkAuthentication,\n claim,\n forbidden,\n} from \"../compile/auth.js\";\nimport { bind, newContext, type CompileContext } from \"../compile/context.js\";\nimport { name, printExpr } from \"../compile/cypher.js\";\nimport { keyOf } from \"../compile/read/by-keys.js\";\nimport { collectFields, subSelections } from \"../compile/selection.js\";\nimport type { DriverTransaction, RunOptions } from \"../driver.js\";\nimport { requestError } from \"../errors.js\";\nimport type { NodeType, ScalarField } from \"../model/types.js\";\nimport {\n mutationNames,\n settable,\n type MutationKind,\n} from \"../schema/mutations.js\";\nimport { fillChange, type WriteChange } from \"./changes.js\";\nimport { assertUniqueTogether, checkUniqueTogether } from \"./mutate/checks.js\";\nimport { deleteNodes } from \"./mutate/delete.js\";\nimport { runStatement, type MutationEnv } from \"./mutate/env.js\";\nimport { andText } from \"./mutate/fragments.js\";\nimport type { Input, WritePlan } from \"./mutate/plan.js\";\nimport { held, Runner } from \"./mutate/runner.js\";\nimport {\n hasTriggerFunctions,\n hasTriggers,\n runWriteTriggers,\n} from \"./mutate/triggers.js\";\nimport {\n LazyTransaction,\n NOT_THERE,\n readCanBeRefused,\n refused,\n supportsAssert,\n} from \"./mutate/single-call.js\";\nimport { existingRows } from \"./mutate/unchanged.js\";\nimport { validateInput } from \"./mutate/validate.js\";\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\n/** Whether a mutation must look up the caller's node key first. */\nfunction needsViewerKey(env: MutationEnv): boolean {\n const mapping = env.model.viewer;\n const viewerNode = mapping && env.model.nodes.get(mapping.type);\n return !!(\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}\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 (!needsViewerKey(env) || !mapping || !viewerNode) return undefined;\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\n/**\n * Start the `@populatedBy` callbacks of the mutation's own inputs\n * together, before anything else: of each created node whose key the\n * input gives, and of a keyed update. A create's nested inputs and\n * generated keys are computed with its plan, still before the\n * transaction begins; upserts and bulk updates in the transaction, where\n * their key or operation is known.\n */\nfunction startCallbacks(\n env: MutationEnv,\n op: MutationKind,\n node: NodeType,\n args: Record<string, unknown>,\n): MutationEnv[\"computed\"] {\n const operation = op === \"CREATE\" || op === \"UPDATE\" ? op : undefined;\n const fields = [...node.fields.values()].filter(\n (f): f is ScalarField =>\n f.kind === \"scalar\" &&\n !f.key &&\n !!operation &&\n !!f.populatedBy?.operations.has(operation),\n );\n if (!operation || fields.length === 0) return undefined;\n const inputs: Array<{ key: unknown; input: Input }> =\n operation === \"CREATE\"\n ? ((args[\"input\"] as Input[] | undefined) ?? []).map((input) => ({\n key: input[node.key.name],\n input,\n }))\n : args[\"update\"]\n ? [{ key: args[node.key.name], input: args[\"update\"] as Input }]\n : [];\n const computed = new WeakMap<object, Map<string, Promise<unknown>>>();\n for (const { key, input } of inputs) {\n if (key === undefined || key === null) continue;\n const started = new Map<string, Promise<unknown>>();\n for (const f of fields) {\n // A create computes a field the input leaves out or null; an\n // update, one the input does not name.\n const given =\n operation === \"CREATE\"\n ? input[f.name] !== undefined && input[f.name] !== null\n : f.name in input;\n if (given) continue;\n started.set(\n f.name,\n held(\n (async () =>\n env.callbacks[f.populatedBy!.callback]!({\n operation,\n type: node.name,\n field: f.name,\n key,\n input,\n context: env.requestContext,\n }))(),\n ),\n );\n }\n if (started.size > 0) computed.set(input, started);\n }\n return computed;\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 statistics: env.statistics,\n requestContext: env.requestContext,\n maxFilterDepth: env.maxFilterDepth,\n maxListFilter: env.maxListFilter,\n maxStringFilter: env.maxStringFilter,\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 // Value rules next, still before the transaction: a request with a bad\n // value never waits for, or holds, the writer lock.\n await validateInput(env.model, env.validators ?? {}, op, node, args);\n // An update left out is an empty one: the same object from here on, so\n // a callback started for it now is the one awaited later, once.\n if (op === \"UPDATE\" && !args[\"update\"]) args = { ...args, update: {} };\n env = { ...env, computed: startCallbacks(env, op, node, args) };\n\n const begin: RunOptions = {\n mode: \"write\",\n timeoutMs: env.timeoutMs,\n signal: env.signal,\n };\n // A create (with what it creates and connects under it), or an update\n // of one node by key, may be one call into the database, committed as\n // it returns:\n // when nothing needs a decision between its statements and its commit\n // that an assertion cannot make. The runner opens a real transaction\n // if the plan turns out to need more than one round trip.\n const single =\n (op === \"CREATE\" || op === \"UPDATE\") &&\n !owned &&\n env.singleCall !== false &&\n !hasTriggers(env) &&\n !readCanBeRefused(env.model) &&\n !needsViewerKey(env) &&\n (await supportsAssert(env.driver));\n // Otherwise the transaction begins with the mutation's first statement.\n const tx = owned ?? new LazyTransaction(env.driver, begin, single);\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 // The @uniqueTogether check, when a case issued it with its last\n // statements.\n let unique: Promise<void> | undefined;\n // With triggers, nothing of the mutation's ending is issued ahead of\n // its checks: a trigger runs only for a write every rule has passed, so\n // a denied write fails with its own error whatever a trigger would hit.\n const late = hasTriggers(env);\n let checked: Promise<void> | undefined;\n const checks = () =>\n (checked ??= held(\n (async () => {\n await (unique ?? checkUniqueTogether(runner));\n await runner.settle();\n })(),\n ));\n // The CREATE and UPDATE triggers of everything the mutation wrote, once.\n let triggered: Promise<void> | undefined;\n // A create under a hidden key or a taken unique value is refused at the\n // end whatever happens: no trigger runs for it.\n const triggers = () =>\n (triggered ??= held(\n runner.hiddenKey || runner.takenUnique\n ? Promise.resolve()\n : runWriteTriggers(runner),\n ));\n const payloadFor = async (\n payloadTypeName: string,\n field: string,\n keys: unknown[],\n ) => {\n const payloadType = schema.getType(payloadTypeName) as GraphQLObjectType;\n const sets = payloadSelections(env, payloadType, fieldNodes, field);\n if (!late) return runner.payload(node, keys, sets);\n await checks();\n // The payload shows what the triggers wrote: their statements are\n // issued first, and the read right behind them shares their round trip.\n const fired = triggers();\n // A trigger function may write anything: wait for it before reading.\n if (hasTriggerFunctions(env)) await fired;\n const read = held(runner.payload(node, keys, sets));\n await fired;\n return read;\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 // The payload read and the last check share the creates' round\n // trip when the plan only creates nodes.\n let created: Promise<unknown[]> | undefined;\n const read = () =>\n payloadFor(\n mutationNames.createPayload(node),\n mutationNames.createdField(node),\n keys,\n );\n await runner.apply(plan, () => {\n // In a single call the rules are assertions ahead of the read\n // in the batch. In a transaction they are rows judged\n // afterwards: the read waits for them, so its own failure never\n // outranks a rule's.\n // In a transaction the payload is read before this is awaited:\n // a combination that is taken must not abandon that read, whose\n // error (\"the mutation was abandoned\") would be the one reported.\n unique = runner.single\n ? runner.watch(checkUniqueTogether(runner))\n : held(checkUniqueTogether(runner));\n if (runner.single) created = runner.watch(read());\n runner.assertNothingMoved();\n });\n payload = {\n [mutationNames.createdField(node)]: await (created ?? read()),\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 input = (args[\"update\"] as Input | undefined) ?? {};\n const adjust = args[\"adjust\"] as Input | undefined;\n // One statement that matches, checks and writes, with the payload\n // read behind it: one call, when the update is that simple.\n let reading!: Promise<unknown[]>;\n const one = await runner.updateInOne(\n plan,\n node,\n key,\n input,\n adjust,\n () => {\n // The node may not be there: the check then finds nothing.\n unique = runner.watch(\n Promise.all([\n assertUniqueTogether(runner, [{ node, keys: [key] }]),\n checkUniqueTogether(runner),\n ]).then(() => undefined),\n );\n reading = runner.watch(\n payloadFor(mutationNames.updatePayload(node), field, [key]),\n );\n // A node created under the update may have taken a key a\n // hidden node held: the batch fails here, before it commits.\n runner.assertNothingMoved();\n },\n );\n if (one) {\n let found: unknown[];\n let value: unknown;\n try {\n found = await one.done;\n [value] = await reading;\n } catch (err) {\n if (runner.assertions.refusedBy(err) !== NOT_THERE) throw err;\n // No node to update: the call rolled back, and the answer is\n // the one a transaction gives after finding nothing.\n runner.nothingWritten();\n unique = Promise.resolve();\n found = [];\n }\n payload = {\n [field]: found.length > 0 ? (value ?? null) : null,\n info: runner.info,\n };\n break;\n }\n // The single call may have planned on `plan` before giving up.\n const rest = runner.plan();\n const done = await runner.update(rest, node, [{ key, input }], adjust);\n let validating!: Promise<void>;\n const read = () =>\n done.length > 0\n ? payloadFor(mutationNames.updatePayload(node), field, [key])\n : Promise.resolve([null]);\n await runner.apply(rest, () => {\n validating = held(runner.validateUpdated());\n unique = held(checkUniqueTogether(runner));\n });\n // The payload is read once the rules have answered: its own\n // failure never outranks theirs.\n await validating;\n const [value] = await read();\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 let validating!: Promise<void>;\n const read = () =>\n payloadFor(\n mutationNames.updateManyPayload(node),\n mutationNames.createdField(node),\n done,\n );\n await runner.apply(plan, () => {\n validating = held(runner.validateUpdated());\n unique = held(checkUniqueTogether(runner));\n });\n await validating;\n payload = {\n [mutationNames.createdField(node)]: await read(),\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\", \"READ\")) +\n andText(authFilter(ctx, node, \"n\", \"DELETE\")) +\n `\\nRETURN n.${name(node.key.property)} AS key`,\n ctx,\n );\n await deleteNodes(\n runner,\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 deleteNodes(runner, node, keys);\n payload = runner.info;\n break;\n }\n }\n await checks();\n await triggers();\n // A trigger function that swallowed a failed statement leaves the\n // transaction rolled back: the mutation must not report success.\n if (runner.triggerFunctionRan && !tx.isOpen) {\n throw requestError(\n \"DATABASE_ERROR\",\n \"a trigger left the transaction closed: a statement it ran failed, which rolled the mutation back\",\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 runner.abandon(err);\n if (tx.isOpen) await tx.rollback();\n if (tx instanceof LazyTransaction && tx.committed) {\n // Everything that can refuse a single-call mutation is a statement\n // of the call. Reaching this means something refused it afterwards,\n // when the write was already committed: a bug, and never silent.\n throw new Error(\n `lora-graphql: a single-call mutation failed after its commit (${err instanceof Error ? err.message : String(err)}); the write is in the database. Set singleCallMutations: false and report this`,\n { cause: err },\n );\n }\n // A rule that refused inside the database, as the error it stands\n // for. Only this path writes such assertions: a developer's own\n // assert() in a transaction keeps its message.\n throw tx instanceof LazyTransaction && tx.single\n ? (runner.assertions.refusedBy(err) ?? refused(env.model, err))\n : 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 // Every input writes a node, whether it turns out a create or an update.\n if (inputs.length > runner.env.maxBatch) {\n throw requestError(\n \"LIMIT_EXCEEDED\",\n `the upsert writes ${inputs.length} nodes; the limit is ${runner.env.maxBatch} nodes per mutation`,\n );\n }\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 // Fields and relationships set only on create keep the value they were\n // created with, so an update writes the rest.\n const kept = inputs.map((input) =>\n 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 );\n // The same read finds the rows that would write nothing: no SET, no\n // relationship work, no update counted or reported (G-57).\n const { existing, same } = await existingRows(\n runner,\n node,\n keys.map((key, i) => ({ key, input: kept[i]! })),\n );\n const updates: Array<{ key: unknown; input: Input }> = [];\n for (const [i, input] of inputs.entries()) {\n const k = keyOf(keys[i]);\n if (!existing.has(k)) plan.create(node, input);\n else if (!same.has(k)) updates.push({ key: keys[i], input: kept[i]! });\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 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","// `lora.worker()`: the side effects of an `@outbox` type (a push, an\n// e-mail, a webhook), after the commit. Each pending node is claimed with\n// one write, handed to the handler, and marked done or scheduled again.\n// Delivery is at least once: a handler may run twice for one node (a\n// crash after the side effect, before the node is marked), so it must be\n// idempotent; the node's key is its idempotency key.\n\nimport { name } from \"../compile/cypher.js\";\nimport { keyOf } from \"../compile/read/by-keys.js\";\nimport type { LoraDriver } from \"../driver.js\";\nimport type { WriteChange } from \"../execute/changes.js\";\nimport type { NodeType } from \"../model/types.js\";\nimport type { DatabaseErrorEvent } from \"../options.js\";\nimport { OUTBOX } from \"./outbox.js\";\n\nexport interface WorkerOptions {\n /**\n * Called with the node's stored scalar fields, by field name, read\n * without read rules. Resolving marks the node done; throwing (or\n * rejecting) schedules it again, up to `maxAttempts`.\n */\n handle: (\n node: Record<string, unknown>,\n info: {\n /** The node's @key value: the idempotency key of the work. */\n key: unknown;\n /** 1 for the first call, 2 for the first retry, ... */\n attempt: number;\n /** Aborted when the worker stops. */\n signal: AbortSignal;\n },\n ) => unknown;\n /** Handlers running at once. Default 4. */\n concurrency?: number;\n /**\n * Calls before a node is given up as `FAILED` and reported to\n * `onError`. A call that never returned (its worker died, or it\n * outlived `leaseMs`) counts. Default 8.\n */\n maxAttempts?: number;\n /**\n * Milliseconds to wait before attempt `attempt + 1`. Default: one\n * second doubling per attempt, at most five minutes.\n */\n backoffMs?: (attempt: number) => number;\n /**\n * How often the worker looks for pending nodes it was not told about:\n * work left by a restart, retries that are due, claims whose worker\n * died. Milliseconds, default 30 000.\n */\n sweepMs?: number;\n /**\n * How long a claim holds, in milliseconds. Past it another worker may\n * take the node, and what the first handler then returns is ignored:\n * give a handler a timeout shorter than this. Default 60 000.\n */\n leaseMs?: number;\n}\n\nexport interface Worker {\n /**\n * Resolves once nothing is pending: after a look at the database, with\n * no handler running and no node due. For tests and for shutdown.\n */\n idle(): Promise<void>;\n /** Stop taking work; resolves when the running handlers have ended. */\n stop(): Promise<void>;\n}\n\nexport interface WorkerHost {\n driver: LoraDriver;\n node: NodeType;\n timeoutMs: number;\n /** Committed writes, from the change hub. */\n listen: (listener: (change: WriteChange) => void) => () => unknown;\n onError: ((event: DatabaseErrorEvent) => void) | undefined;\n}\n\n/** Most nodes one sweep takes on. */\nconst SWEEP_LIMIT = 1000;\n\nexport class OutboxWorker implements Worker {\n readonly #host: WorkerHost;\n readonly #options: Required<Omit<WorkerOptions, \"handle\">> &\n Pick<WorkerOptions, \"handle\">;\n readonly #label: string;\n readonly #key: string;\n readonly #queue = new Map<string, unknown>();\n readonly #abort = new AbortController();\n readonly #unlisten: () => unknown;\n readonly #timer: ReturnType<typeof setInterval>;\n /** Keys this worker is handling: one handler per node at a time. */\n readonly #active = new Set<string>();\n /** Timers that look again when a retry is due. */\n readonly #retries = new Set<ReturnType<typeof setTimeout>>();\n #running = 0;\n /** Whether the last sweep hit its limit: there is more to take. */\n #more = false;\n /** Nodes in a row whose claim or finishing write threw. */\n #failures = 0;\n #sweeping: Promise<void> | undefined;\n #waiters: Array<() => void> = [];\n\n constructor(host: WorkerHost, options: WorkerOptions) {\n this.#host = host;\n for (const [option, least] of [\n [\"concurrency\", 1],\n [\"maxAttempts\", 1],\n [\"sweepMs\", 1],\n [\"leaseMs\", 1],\n ] as const) {\n const value = options[option];\n if (value !== undefined && !(Number.isFinite(value) && value >= least)) {\n throw new Error(\n `worker(\"${host.node.name}\"): ${option} must be a number of at least ${least}, got ${String(value)}`,\n );\n }\n }\n this.#options = {\n concurrency: 4,\n maxAttempts: 8,\n backoffMs: (attempt) => Math.min(1000 * 2 ** (attempt - 1), 300_000),\n sweepMs: 30_000,\n leaseMs: 60_000,\n ...options,\n };\n this.#label = name(host.node.labels[0]!);\n this.#key = name(host.node.key.property);\n this.#unlisten = host.listen((change) => {\n if (this.#abort.signal.aborted) return;\n // A broad change may have created anything: look.\n if (change.broad) return void this.#sweep();\n for (const ref of change.created) {\n if (ref.type === host.node.name) this.#enqueue(ref.key);\n }\n });\n this.#timer = setInterval(() => void this.#sweep(), this.#options.sweepMs);\n // A waiting worker does not keep the process alive.\n (this.#timer as { unref?: () => void }).unref?.();\n void this.#sweep();\n }\n\n async idle(): Promise<void> {\n for (;;) {\n await this.#sweep();\n if (this.#queue.size === 0 && this.#running === 0) return;\n await new Promise<void>((resolve) => this.#waiters.push(resolve));\n }\n }\n\n async stop(): Promise<void> {\n this.#abort.abort();\n this.#unlisten();\n clearInterval(this.#timer);\n for (const timer of this.#retries) clearTimeout(timer);\n this.#retries.clear();\n this.#queue.clear();\n while (this.#running > 0) {\n await new Promise<void>((resolve) => this.#waiters.push(resolve));\n }\n }\n\n /** Take on the nodes that are due: pending ones, and dead claims. */\n #sweep(): Promise<void> {\n if (this.#abort.signal.aborted) return Promise.resolve();\n this.#sweeping ??= (async () => {\n try {\n const [result] = await this.#host.driver.run(\n [\n {\n text:\n `MATCH (n:${this.#label}) WHERE ${this.#due(\"n\")}\\n` +\n `RETURN n.${this.#key} AS key LIMIT ${SWEEP_LIMIT}`,\n params: { now: Date.now() },\n },\n ],\n { mode: \"read\", timeoutMs: this.#host.timeoutMs },\n );\n this.#more = result!.rows.length >= SWEEP_LIMIT;\n for (const row of result!.rows) this.#enqueue(row[\"key\"]);\n } catch (err) {\n this.#report(err);\n } finally {\n this.#sweeping = undefined;\n }\n })();\n return this.#sweeping;\n }\n\n /** Pending and due, or claimed by a worker whose lease ran out. */\n #due(n: string): string {\n return (\n `((${n}.${OUTBOX.state} = \"PENDING\" AND coalesce(${n}.${OUTBOX.at}, 0) <= $now)` +\n ` OR (${n}.${OUTBOX.state} = \"CLAIMED\" AND ${n}.${OUTBOX.lease} <= $now))`\n );\n }\n\n #enqueue(key: unknown): void {\n if (this.#abort.signal.aborted) return;\n const id = keyOf(key);\n // Its handler is still running here: the lease is not this worker's\n // to break.\n if (this.#active.has(id)) return;\n this.#queue.set(id, key);\n this.#pump();\n }\n\n #pump(): void {\n while (this.#running < this.#options.concurrency && this.#queue.size > 0) {\n const [id, key] = this.#queue.entries().next().value!;\n this.#queue.delete(id);\n this.#running++;\n this.#active.add(id);\n void this.#process(key)\n .then(\n () => true,\n (err: unknown) => {\n this.#report(err);\n return false;\n },\n )\n .then((ok) => {\n this.#running--;\n this.#active.delete(id);\n if (ok) this.#failures = 0;\n else this.#failures++;\n this.#pump();\n // A sweep that hit its limit left work behind: take the rest,\n // at once while the database answers, after a pause that grows\n // while it does not (a write that times out must not be\n // retried in a loop).\n if (this.#more && this.#queue.size === 0 && this.#running === 0) {\n if (this.#failures === 0) void this.#sweep();\n else this.#lookIn(Math.min(250 * 2 ** this.#failures, 30_000));\n }\n for (const wake of this.#waiters.splice(0)) wake();\n });\n }\n }\n\n async #process(key: unknown): Promise<void> {\n const now = Date.now();\n const until = now + this.#options.leaseMs;\n // One write claims the node and counts the attempt: with one writer\n // at a time, two workers on one database never both get a row back,\n // and a handler that never returns has still used its attempt.\n const claimed = await this.#write(\n `MATCH (n:${this.#label}) WHERE n.${this.#key} = $key AND ${this.#due(\"n\")}\\n` +\n `SET n.${OUTBOX.state} = \"CLAIMED\", n.${OUTBOX.lease} = $until, ` +\n `n.${OUTBOX.attempts} = coalesce(n.${OUTBOX.attempts}, 0) + 1\\n` +\n `RETURN properties(n) AS props`,\n { key, now, until },\n );\n const props = claimed[0]?.[\"props\"] as Record<string, unknown> | undefined;\n if (!props) return;\n const attempt = Number(props[OUTBOX.attempts]);\n // Every later write is this claim's only: it names the lease it took,\n // so a handler that outlived it cannot undo the next worker's claim.\n const mine = `n.${this.#key} = $key AND n.${OUTBOX.state} = \"CLAIMED\" AND n.${OUTBOX.lease} = $until`;\n const fail = (err: unknown, final: boolean, at: number) =>\n this.#write(\n `MATCH (n:${this.#label}) WHERE ${mine}\\n` +\n `SET n.${OUTBOX.state} = $state, n.${OUTBOX.at} = $at, n.${OUTBOX.error} = $error\\n` +\n `REMOVE n.${OUTBOX.lease}`,\n {\n key,\n until,\n state: final ? \"FAILED\" : \"PENDING\",\n at,\n error: (err instanceof Error ? err.message : String(err)).slice(\n 0,\n 1000,\n ),\n },\n );\n if (attempt > this.#options.maxAttempts) {\n // Its earlier calls never returned: give it up without another.\n const err = new Error(\n `no call returned in ${this.#options.maxAttempts} attempts (each outlived its lease of ${this.#options.leaseMs} ms, or its worker stopped)`,\n );\n await fail(err, true, now);\n this.#report(err);\n return;\n }\n const node: Record<string, unknown> = {};\n for (const f of this.#host.node.fields.values()) {\n if (f.kind === \"scalar\") node[f.name] = props[f.property] ?? null;\n }\n try {\n await this.#options.handle(node, {\n key,\n attempt,\n signal: this.#abort.signal,\n });\n } catch (err) {\n const final = attempt >= this.#options.maxAttempts;\n const asked = this.#options.backoffMs(attempt);\n // A backoff that is not a time would park the node for good.\n const wait = Number.isFinite(asked) && asked >= 0 ? asked : 1000;\n // The handler's error is reported whatever becomes of this write.\n if (final) this.#report(err);\n else this.#lookIn(wait);\n await fail(err, final, Date.now() + wait);\n return;\n }\n await this.#write(\n `MATCH (n:${this.#label}) WHERE ${mine}\\n` +\n `SET n.${OUTBOX.state} = \"DONE\"\\n` +\n `REMOVE n.${OUTBOX.lease}, n.${OUTBOX.at}, n.${OUTBOX.error}`,\n { key, until },\n );\n }\n\n /** Look for work again in `ms`: when a retry comes due. */\n #lookIn(ms: number): void {\n if (this.#abort.signal.aborted) return;\n const timer = setTimeout(() => {\n this.#retries.delete(timer);\n void this.#sweep();\n }, ms + 1);\n (timer as { unref?: () => void }).unref?.();\n this.#retries.add(timer);\n }\n\n async #write(\n text: string,\n params: Record<string, unknown>,\n ): Promise<Array<Record<string, unknown>>> {\n const [result] = await this.#host.driver.run([{ text, params }], {\n mode: \"write\",\n timeoutMs: this.#host.timeoutMs,\n });\n return result!.rows;\n }\n\n #report(err: unknown): void {\n try {\n this.#host.onError?.({\n id: globalThis.crypto.randomUUID(),\n field: `worker:${this.#host.node.name}`,\n message: err instanceof Error ? err.message : String(err),\n error: err,\n });\n } catch {\n // A failing error hook must not stop the worker.\n }\n }\n}\n","// The validation rules as JSON Schema, for clients. Introspection shows a\n// field's type and not the directives on it, so a client cannot learn\n// from the API that a name takes at most 80 characters. This writes the\n// rules down in a form every form library reads: one JSON Schema\n// (2020-12) per generated input type, from which zod, yup or valibot\n// schemas can be built.\n\nimport { jsonSchemaKeywords } from \"../model/constraints.js\";\nimport type { GraphModel, ScalarField, ScalarType } from \"../model/types.js\";\nimport {\n mutationNames,\n requiredOnCreate,\n settable,\n} from \"../schema/mutations.js\";\n\nexport type JsonSchema = Record<string, unknown>;\n\nconst TYPES: Partial<Record<ScalarType, JsonSchema>> = {\n String: { type: \"string\" },\n ID: { type: \"string\" },\n Int: { type: \"integer\" },\n Float: { type: \"number\" },\n Boolean: { type: \"boolean\" },\n // Serialised as a decimal string; a small one may be sent as a number.\n BigInt: { type: [\"integer\", \"string\"] },\n Date: { type: \"string\", format: \"date\" },\n DateTime: { type: \"string\", format: \"date-time\" },\n Time: { type: \"string\", format: \"time\" },\n LocalTime: { type: \"string\" },\n LocalDateTime: { type: \"string\" },\n Duration: { type: \"string\", format: \"duration\" },\n Point: { type: \"object\" },\n CartesianPoint: { type: \"object\" },\n};\n\nfunction fieldSchema(\n model: GraphModel,\n f: ScalarField,\n nullable: boolean,\n): JsonSchema {\n const { item, list } = jsonSchemaKeywords(f.constraints);\n const base: JsonSchema =\n f.type === \"Enum\"\n ? {\n enum: (model.enums.get(f.enumName ?? \"\")?.values ?? []).map(\n (v) => v.name,\n ),\n }\n : { ...TYPES[f.type] };\n const value = { ...base, ...item };\n let out: JsonSchema = f.list\n ? { type: \"array\", items: value, ...list }\n : value;\n if (nullable) out = { anyOf: [out, { type: \"null\" }] };\n if (f.description) out = { description: f.description, ...out };\n return out;\n}\n\nfunction objectSchema(\n model: GraphModel,\n title: string,\n fields: Iterable<ScalarField>,\n op: \"CREATE\" | \"UPDATE\",\n): JsonSchema {\n const properties: Record<string, JsonSchema> = {};\n const required: string[] = [];\n for (const f of fields) {\n if (!settable(f, op)) continue;\n properties[f.name] = fieldSchema(model, f, op === \"UPDATE\" && !f.required);\n if (op === \"CREATE\" && requiredOnCreate(f)) required.push(f.name);\n }\n return {\n $schema: \"https://json-schema.org/draft/2020-12/schema\",\n title,\n type: \"object\",\n properties,\n ...(required.length > 0 ? { required } : {}),\n // Relationship fields (connect, create, ...) are not described here.\n additionalProperties: true,\n };\n}\n\nconst scalarFields = (fields: ReadonlyMap<string, { kind: string }>) =>\n [...fields.values()].filter((f): f is ScalarField => f.kind === \"scalar\");\n\n/**\n * A JSON Schema per generated create and update input, by input type\n * name (`PersonCreateInput`), describing the scalar fields a client may\n * set and the rules on them. A pattern is anchored, since here it must\n * match the whole value; a format is given both by name and, where it is\n * an expression, as a pattern, since validators treat `format` as a\n * remark by default.\n */\nexport function inputSchemas(model: GraphModel): Record<string, JsonSchema> {\n const out: Record<string, JsonSchema> = {};\n for (const node of model.nodes.values()) {\n const fields = scalarFields(node.fields);\n if (node.mutations.has(\"CREATE\")) {\n const title = mutationNames.createInput(node.name);\n out[title] = objectSchema(model, title, fields, \"CREATE\");\n }\n if (node.mutations.has(\"UPDATE\")) {\n const title = mutationNames.updateInput(node.name);\n out[title] = objectSchema(model, title, fields, \"UPDATE\");\n }\n }\n for (const props of model.relationshipProperties.values()) {\n const fields = scalarFields(props.fields);\n if (fields.length === 0) continue;\n for (const op of [\"CREATE\", \"UPDATE\"] as const) {\n if (!fields.some((f) => settable(f, op))) continue;\n const title = `${props.name}${op === \"CREATE\" ? \"Create\" : \"Update\"}Input`;\n out[title] = objectSchema(model, title, fields, op);\n }\n }\n return out;\n}\n","// Stored values against the validation rules. A rule is checked when a\n// value is written through the API: one added or tightened later does\n// not revisit what is already in the database, and raw Cypher is never\n// checked. This reads the nodes of every type that has rules and reports\n// the values that would be refused today, with the same code that\n// refuses them on write. It also reports values a full-text index cannot\n// hold: the engine indexes strings and skips anything else without a\n// word, so a number written by raw Cypher is simply never found.\n\nimport { name } from \"../compile/cypher.js\";\nimport type { LoraDriver } from \"../driver.js\";\nimport { checkValue, normalizeValue } from \"../model/constraints.js\";\nimport type { GraphModel, ScalarField } from \"../model/types.js\";\n\n/** A stored value that breaks a rule of its field. */\nexport interface StoredViolation {\n type: string;\n /** The node's `@key`; for a relationship property, the declaring node's. */\n key: unknown;\n field: string;\n /**\n * The rule, as in a request's `violations`; `normalize` for a value not\n * in its stored form; `fulltext` for one a full-text index skips.\n */\n rule: string;\n message: string;\n}\n\nexport interface StoredReport {\n violations: StoredViolation[];\n /**\n * Nodes read per type, and relationships per `Owner.field` whose\n * properties have rules; one with more than `limit` is read in part.\n */\n scanned: Record<string, number>;\n /** Types with more nodes than were read. */\n partial: string[];\n}\n\n/** Most violations one report lists. */\nconst MAX_REPORTED = 200;\n\nexport async function scanStored(\n driver: LoraDriver,\n model: GraphModel,\n options: { limit?: number; timeoutMs?: number } = {},\n): Promise<StoredReport> {\n const limit = options.limit ?? 10_000;\n const report: StoredReport = { violations: [], scanned: {}, partial: [] };\n for (const node of model.nodes.values()) {\n // Fields of a full-text index, by the index that holds them.\n const indexed = new Map<ScalarField, string>();\n for (const index of node.search) {\n if (index.kind !== \"fulltext\") continue;\n for (const f of index.fields) indexed.set(f, index.name);\n }\n const fields = [...node.fields.values()].filter(\n (f): f is ScalarField =>\n f.kind === \"scalar\" && (!!f.constraints || indexed.has(f)),\n );\n if (fields.length === 0) continue;\n const key = node.key.property;\n const [result] = await driver.run(\n [\n {\n text:\n `MATCH (n:${name(node.labels[0]!)})\\n` +\n `RETURN n.${name(key)} AS key, ${fields.map((f, i) => `n.${name(f.property)} AS f${i}`).join(\", \")}\\n` +\n `ORDER BY n.${name(key)} LIMIT $limit`,\n params: { limit: limit + 1 },\n },\n ],\n { mode: \"read\", timeoutMs: options.timeoutMs },\n );\n const rows = result?.rows ?? [];\n if (rows.length > limit) report.partial.push(node.name);\n report.scanned[node.name] = Math.min(rows.length, limit);\n for (const row of rows.slice(0, limit)) {\n for (const [i, f] of fields.entries()) {\n const value = row[`f${i}`];\n if (value === null || value === undefined) continue;\n const found: Array<{ rule: string; message: string }> = [];\n const index = indexed.get(f);\n if (\n index !== undefined &&\n (Array.isArray(value) ? value : [value]).some(\n (item) => typeof item !== \"string\",\n )\n ) {\n found.push({\n rule: \"fulltext\",\n message: `is not text: the full-text index ${index} skips it, so a search never finds the node by this value`,\n });\n }\n found.push(...violationsOf(f, value));\n for (const { rule, message } of found) {\n if (report.violations.length >= MAX_REPORTED) continue;\n report.violations.push({\n type: node.name,\n key: row[\"key\"],\n field: f.name,\n rule,\n message,\n });\n }\n }\n }\n }\n // Relationship properties with rules: each relationship type once,\n // from the side that declares it, named by that node's key.\n const seen = new Set<string>();\n for (const node of model.nodes.values()) {\n for (const rel of node.fields.values()) {\n if (rel.kind !== \"relationship\" || !rel.properties) continue;\n const id = `${rel.type}\\0${rel.properties}`;\n if (seen.has(id)) continue;\n const fields = [\n ...(model.relationshipProperties.get(rel.properties)?.fields.values() ??\n []),\n ].filter((f) => !!f.constraints);\n if (fields.length === 0) continue;\n seen.add(id);\n const pattern =\n rel.direction === \"OUT\"\n ? `(a:${name(node.labels[0]!)})-[r:${name(rel.type)}]->()`\n : `(a:${name(node.labels[0]!)})<-[r:${name(rel.type)}]-()`;\n const [result] = await driver.run(\n [\n {\n text:\n `MATCH ${pattern}\\n` +\n `RETURN a.${name(node.key.property)} AS key, ${fields.map((f, i) => `r.${name(f.property)} AS f${i}`).join(\", \")}\\n` +\n `LIMIT $limit`,\n params: { limit: limit + 1 },\n },\n ],\n { mode: \"read\", timeoutMs: options.timeoutMs },\n );\n const rows = result?.rows ?? [];\n const scope = `${node.name}.${rel.name}`;\n if (rows.length > limit) report.partial.push(scope);\n report.scanned[scope] = Math.min(rows.length, limit);\n for (const row of rows.slice(0, limit)) {\n for (const [i, f] of fields.entries()) {\n const value = row[`f${i}`];\n if (value === null || value === undefined) continue;\n for (const { rule, message } of violationsOf(f, value)) {\n if (report.violations.length >= MAX_REPORTED) continue;\n report.violations.push({\n type: node.name,\n key: row[\"key\"],\n field: `${rel.name}.${f.name}`,\n rule,\n message,\n });\n }\n }\n }\n }\n }\n return report;\n}\n\n/** What a stored value breaks of its field's rules. */\nfunction violationsOf(\n f: ScalarField,\n value: unknown,\n): Array<{ rule: string; message: string }> {\n const found: Array<{ rule: string; message: string }> = [];\n if (!f.constraints) return found;\n if (\n f.constraints.normalize &&\n JSON.stringify(normalizeValue(f.constraints, value)) !==\n JSON.stringify(value)\n ) {\n found.push({\n rule: \"normalize\",\n message: \"is not in the form @normalize stores\",\n });\n }\n found.push(...checkValue(f.constraints, value));\n return found;\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 GraphQLSchema,\n Kind,\n ValidationContext,\n type ASTVisitor,\n type FragmentDefinitionNode,\n type ParseOptions,\n type SelectionSetNode,\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 *\n * It also checks, once, that the server runs the same `graphql` copy as\n * this library (see `graphqlRealmProblem`), and reports a mismatch\n * through `onRealmMismatch` (default: `console.error`).\n */\nexport function envelopPlugin(\n guards: DocumentGuards = {},\n onRealmMismatch: (message: string) => void = defaultRealmReport,\n) {\n const rules = validationRules(guards);\n const options = parseOptions(guards);\n let reported = false;\n const check = (value: unknown, what: RealmProbe) => {\n if (reported) return;\n const problem = graphqlRealmProblem(value, what);\n if (!problem) return;\n reported = true;\n onRealmMismatch(problem);\n };\n const realmRule: ValidationRule = (context) => {\n check(context, \"validation\");\n return {};\n };\n return {\n onSchemaChange({ schema }: { schema: unknown }) {\n check(schema, \"schema\");\n },\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 if (!reported) addValidationRule(realmRule);\n for (const rule of rules) addValidationRule(rule);\n },\n };\n}\n\ntype RealmProbe = \"schema\" | \"validation\";\n\n/**\n * When `value` (a schema, or the context a validation rule receives)\n * comes from a different `graphql` module than the one this library\n * imports, the message explaining it; otherwise undefined. Two copies\n * break `instanceof GraphQLError`, so servers such as Yoga mask the\n * library's errors (FORBIDDEN, BAD_USER_INPUT, ...) as \"Unexpected\n * error\".\n */\nexport function graphqlRealmProblem(\n value: unknown,\n what: RealmProbe,\n): string | undefined {\n if (typeof value !== \"object\" || value === null) return undefined;\n const expected = what === \"schema\" ? GraphQLSchema : ValidationContext;\n if (value instanceof expected) return undefined;\n const tag = (value as { [Symbol.toStringTag]?: unknown })[Symbol.toStringTag];\n const name = what === \"schema\" ? \"GraphQLSchema\" : \"ValidationContext\";\n // Not a graphql object at all (a test double, a proxy): nothing to say.\n if (tag !== name && value.constructor?.name !== name) return undefined;\n return (\n `@loradb/lora-graphql: the server's ${name} comes from a different copy of the \"graphql\" ` +\n \"package than the one @loradb/lora-graphql imports. With two copies, errors the library \" +\n \"raises are not instances of the server's GraphQLError, so they are masked (Yoga reports \" +\n '\"Unexpected error\") and their extensions.code is lost. Fix: install a single graphql ' +\n \"version (npm dedupe, or pin it with pnpm.overrides / yarn resolutions / npm overrides) \" +\n \"and check that `npm ls graphql` shows one copy.\"\n );\n}\n\nfunction defaultRealmReport(message: string): void {\n console.error(message);\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","// 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 \"No two nodes of this type (among those matching where) share the values of fields: scalar fields, single relationships (by the target's @key) and at most one list relationship (by the set of target keys). Enforced by every generated mutation, for every caller.\"\n directive @uniqueTogether(\n fields: [String!]!\n where: NodeWhere\n ) repeatable on OBJECT\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 \"UPDATE changes a connected node and its relationship properties in place; UPDATE_EDGE only the properties.\"\n enum NestedOperation {\n CREATE\n CONNECT\n DISCONNECT\n UPDATE\n UPDATE_EDGE\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. Client-settable only with an explicit @settable(onCreate: true) or (onUpdate: true) and a field-level @authorization(validate:) rule for that operation.\"\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 \"How many items a list holds, with unique refusing the same item twice. On a list field: checked on every write. On a list argument of a @cypher field: checked before the statement runs (without max, maxListArgument applies). On a list @relationship field, max alone: the most items each nested connect, create, disconnect and update list of one input takes, checked before anything is written.\"\n directive @size(\n min: Int\n max: Int\n unique: Boolean\n \"Replaces the default message of this rule.\"\n message: String\n ) on ARGUMENT_DEFINITION | FIELD_DEFINITION\n\n \"Bounds of a number: min and max are inclusive, exclusiveMin and exclusiveMax are not. On an Int, Float or BigInt field (each item, for a list): checked on every write. On an argument of a @cypher field: checked before the statement runs.\"\n directive @range(\n min: Float\n max: Float\n exclusiveMin: Float\n exclusiveMax: Float\n \"Replaces the default message of this rule.\"\n message: String\n ) on ARGUMENT_DEFINITION | FIELD_DEFINITION | SCALAR\n\n \"How long a String or ID is, in Unicode code points (each item, for a list). On a custom scalar: for every field of that type.\"\n directive @length(\n min: Int\n max: Int\n \"Replaces the default message of this rule.\"\n message: String\n ) on FIELD_DEFINITION | SCALAR | ARGUMENT_DEFINITION\n\n \"An expression the whole value of a String or ID must match (each item, for a list). Needs @length(max:) on the same field.\"\n directive @pattern(\n regex: String!\n \"Replaces the default message of this rule.\"\n message: String\n ) on FIELD_DEFINITION | SCALAR | ARGUMENT_DEFINITION\n\n \"A named shape a String or ID must have: email, email-strict, url, uuid, hostname, ipv4, ipv6, slug, hex-color, ulid or e164.\"\n directive @format(\n as: String!\n \"Replaces the default message of this rule.\"\n message: String\n ) on FIELD_DEFINITION | SCALAR | ARGUMENT_DEFINITION\n\n \"Changes a String or ID before it is validated and stored (each item, for a list): trim removes surrounding whitespace, unicode normalises, case maps, in that order; emptyToNull then stores no value for an empty string. Opt in: nothing is changed without it.\"\n directive @normalize(\n trim: Boolean\n case: TextCase\n unicode: UnicodeForm\n emptyToNull: Boolean\n ) on FIELD_DEFINITION | SCALAR | ARGUMENT_DEFINITION\n\n enum TextCase {\n LOWER\n UPPER\n }\n\n enum UnicodeForm {\n NFC\n NFD\n NFKC\n NFKD\n }\n\n \"An Int or Float must be a whole multiple of value (each item, for a list).\"\n directive @multipleOf(\n value: Float!\n \"Replaces the default message of this rule.\"\n message: String\n ) on FIELD_DEFINITION | SCALAR | ARGUMENT_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 \"\"\"\n How long, in seconds, a result over this type or field may be served from a\n cache. An operation's policy (\\`cacheControl\\` on \\`execute()\\`'s result) is the\n smallest maxAge of the fields it selects, each field's own hint or else its\n type's; it has none when it selects a type or a scalar root field without one.\n \"\"\"\n directive @cacheControl(\n maxAge: Int!\n scope: CacheScope = PUBLIC\n ) on OBJECT | INTERFACE | UNION | FIELD_DEFINITION\n\n \"Who may share a cached result.\"\n enum CacheScope {\n \"Any reader with the same variables.\"\n PUBLIC\n \"Only the reader it was computed for.\"\n PRIVATE\n }\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 A query word shorter than this matches as a whole word even when it ends\n in \\`*\\`: \\`lo*\\` becomes \\`lo\\`, so a two-letter prefix can't expand to\n most of the index. Default: every \\`*\\` word is a prefix.\n \"\"\"\n minPrefixLength: Int\n \"\"\"\n The most matches one query ranks: the index keeps its best \\`maxMatches\\`\n (by score) and \\`where\\`, \\`sort\\`, pages and \\`totalCount\\` apply within\n them. Bounds a broad query's time and memory, and its cost. Default: every\n match.\n \"\"\"\n maxMatches: Int\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 \"A Cypher statement run inside the transaction of every generated mutation that creates, updates or deletes nodes of this type, before the commit. this is each written node; $jwt, $viewer and $operation are bound. Nodes it returns as created or updated join the mutation's write-set. Raw Cypher and @cypher mutations fire no trigger. With on: [CONNECT] or [DISCONNECT] and field: it runs once per relationship a mutation created or removed through that relationship (from either side), with this the node of this type and target the node at the other end.\"\n directive @trigger(\n on: [TriggerOperation!]!\n statement: String!\n \"Fire an UPDATE trigger only for nodes whose update set one of these fields.\"\n fields: [String!]\n \"The relationship field a CONNECT or DISCONNECT trigger fires for.\"\n field: String\n ) repeatable on OBJECT\n\n enum TriggerOperation {\n CREATE\n UPDATE\n DELETE\n \"A relationship of field: was created.\"\n CONNECT\n \"A relationship of field: was removed, both ends still there.\"\n DISCONNECT\n }\n\n \"Nodes of this type are work for lora.worker(): each one created by a generated mutation or returned as created by a @trigger is handed to the worker's handler after the commit, at least once, with retries. The delivery state is stored on the node, outside the API.\"\n directive @outbox 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. Client-settable only with an explicit @settable(onCreate: true) or (onUpdate: true) and a field-level @authorization(validate:) rule for that operation.\"\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, $jwt holds the request's claims, and $viewer the caller's @viewer node key.\"\n directive @cypher(\n statement: String!\n columnName: String\n \"Rows the statement examines each time it runs, charged against maxCost: once for a root field, once per parent node for a field of a type. Without it only the rows the field returns are charged.\"\n cost: Int\n ) 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; true lets it skip them, as without the argument, and tells check() that was meant.\"\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 \"Default true: without a token every rule denies. false: a rule with a branch that reads no claims decides that branch for anonymous requests too; a rule that needs claims still asks for a token.\"\n requireAuthentication: Boolean\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 where: AuthorizationWhere!\n }\n\n input AuthorizationValidateRule {\n operations: [AuthOperation!]! = [READ, CREATE, UPDATE, DELETE]\n when: [AuthorizationWhen!]! = [BEFORE, AFTER]\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 \"A <Type>Where-shaped filter over the type the directive is on.\"\n scalar NodeWhere\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 \"TextCase\",\n \"UnicodeForm\",\n \"AuthorizationMask\",\n \"AuthorizationRuleDefinition\",\n \"QueryDirection\",\n \"OnDelete\",\n \"FulltextIndex\",\n \"FulltextAnalyzer\",\n \"CacheScope\",\n \"VectorSimilarity\",\n \"MutationOperation\",\n \"TimestampOperation\",\n \"AuthOperation\",\n \"AuthorizationWhen\",\n \"AuthorizationFilterRule\",\n \"AuthorizationValidateRule\",\n \"DefaultValue\",\n \"AuthorizationWhere\",\n \"NodeWhere\",\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/** Directives on arguments of @cypher fields. */\nconst ARGUMENT_DIRECTIVES: ReadonlySet<string> = new Set([\n \"size\",\n \"range\",\n \"length\",\n \"pattern\",\n \"format\",\n \"multipleOf\",\n \"normalize\",\n]);\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 \"uniqueTogether\",\n \"trigger\",\n \"outbox\",\n \"cacheControl\",\n ],\n \"relationship properties type\": [\"relationshipProperties\"],\n \"@jwt type\": [\"jwt\"],\n \"object type without @node\": [\"cacheControl\"],\n \"Query or Mutation type\": [],\n interface: [\"query\", \"plural\", \"limit\", \"cacheControl\"],\n union: [\"query\", \"plural\", \"limit\", \"cacheControl\"],\n \"node field\": [\n \"cacheControl\",\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 \"length\",\n \"pattern\",\n \"format\",\n \"range\",\n \"multipleOf\",\n \"size\",\n \"normalize\",\n // Refused with \"@relationship target must be a @node type\".\n \"relationship\",\n ],\n \"relationship field\": [\n \"cacheControl\",\n \"relationship\",\n \"authorization\",\n \"authentication\",\n \"settable\",\n \"readonly\",\n \"filterable\",\n \"cardinality\",\n \"limit\",\n \"size\",\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 \"cacheControl\",\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 \"cacheControl\",\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 \"cacheControl\",\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 \"length\",\n \"pattern\",\n \"format\",\n \"range\",\n \"multipleOf\",\n \"size\",\n \"normalize\",\n // Refused with a specific message.\n \"key\",\n \"unique\",\n \"relayId\",\n \"index\",\n \"vector\",\n \"groupBy\",\n ],\n \"interface field\": [\n \"cacheControl\",\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\": [\"cacheControl\"],\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 // Argument directives (`@size`, `@range`) apply to arguments of @cypher fields:\n // every other argument is generated, or passed to a resolver as is.\n for (const t of ctx.userTypes) {\n if (!isObjectType(t) && !isInterfaceType(t)) continue;\n for (const f of Object.values(t.getFields())) {\n const cypher = has(f as GraphQLField<unknown, unknown>, \"cypher\");\n for (const a of f.args) {\n for (const dir of a.astNode?.directives ?? []) {\n const name = dir.name.value;\n if (!ours.has(name) || (cypher && ARGUMENT_DIRECTIVES.has(name)))\n continue;\n problems.push({\n type: t.name,\n field: f.name,\n message: `argument ${a.name}: @${name} applies to arguments of @cypher fields`,\n });\n }\n }\n }\n }\n}\n","// Page limits: the model options that set them, the global default and\n// maximum, and what `@limit` resolves to on a type or a list field.\n\nimport { ModelError, type ModelProblem } from \"../../errors.js\";\nimport type { PageLimit } from \"../types.js\";\n\nexport interface ModelOptions {\n /** Page size used when a list or connection gets no `limit` / `first`. */\n defaultLimit?: number;\n /** Hard cap on any page size; `@limit(max:)` may only lower it. */\n maxLimit?: number;\n /**\n * Sign cursors with HMAC-SHA-256 under this secret, and reject cursors\n * whose signature does not match. Without it cursors are only tagged\n * with their sort. Changing the secret invalidates every cursor.\n */\n cursorSecret?: string;\n}\n\nexport const DEFAULT_LIMIT = 25;\nexport const MAX_LIMIT = 100;\n\nexport function 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\nexport function 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","// @length, @pattern, @format, @range, @multipleOf and @size on a field:\n// read, checked against the field's type, and compiled.\n\nimport type { GraphQLDirective, GraphQLScalarType } from \"graphql\";\nimport {\n checkValue,\n FORMATS,\n normalizeValue,\n probePattern,\n type FieldConstraints,\n} from \"../constraints.js\";\nimport type { ScalarType } from \"../types.js\";\nimport { directive } from \"./directive-args.js\";\n\nconst TEXT = new Set<ScalarType>([\"String\", \"ID\"]);\nconst NUMBERS = new Set<ScalarType>([\"Int\", \"Float\", \"BigInt\"]);\n\nconst num = (args: Record<string, unknown>, key: string): number | undefined =>\n typeof args[key] === \"number\" ? (args[key] as number) : undefined;\nconst text = (args: Record<string, unknown>): { message?: string } =>\n typeof args[\"message\"] === \"string\"\n ? { message: args[\"message\"] as string }\n : {};\n\n/** The value rules of field `f`, with every problem reported through `at`. */\nexport function readConstraints(\n d: (n: string) => GraphQLDirective,\n f: { astNode?: unknown; extensionASTNodes?: unknown },\n at: (message: string) => void,\n field: {\n type: ScalarType;\n list: boolean;\n vector: boolean;\n timestamp: boolean;\n defaultValue: { value: unknown } | undefined;\n /** The field's custom scalar, whose rules it inherits. */\n scalar?: GraphQLScalarType | undefined;\n /** How a problem names the default: an argument's is not a directive. */\n defaultLabel?: string | undefined;\n /** Directives another reader handles (an argument's plain @size, @range). */\n skip?: ReadonlySet<string> | undefined;\n },\n): FieldConstraints | undefined {\n // A rule on the field wins; one on the field's custom scalar applies to\n // every field of that type, which is how a constrained type is reused.\n const read = (name: string) =>\n field.skip?.has(name)\n ? undefined\n : (directive(d(name), f, at) ??\n (field.scalar\n ? directive(d(name), field.scalar, (message) =>\n at(`${message} (on scalar ${field.scalar!.name})`),\n )\n : undefined));\n const lengthArgs = read(\"length\");\n const patternArgs = read(\"pattern\");\n const formatArgs = read(\"format\");\n const rangeArgs = read(\"range\");\n const multipleArgs = read(\"multipleOf\");\n const sizeArgs = field.skip?.has(\"size\")\n ? undefined\n : directive(d(\"size\"), f, at);\n const normalizeArgs = read(\"normalize\");\n const used = (\n [\n [\"length\", lengthArgs],\n [\"pattern\", patternArgs],\n [\"format\", formatArgs],\n [\"range\", rangeArgs],\n [\"multipleOf\", multipleArgs],\n [\"size\", sizeArgs],\n [\"normalize\", normalizeArgs],\n ] as const\n ).filter(([, args]) => args !== undefined);\n if (used.length === 0) return undefined;\n const names = used.map(([n]) => `@${n}`).join(\", \");\n if (field.timestamp) {\n at(`${names}: a @timestamp is set by the database, not validated`);\n return undefined;\n }\n if (field.vector) {\n at(`${names}: a @vector is bounded by its dimensions`);\n return undefined;\n }\n\n const out: FieldConstraints = {};\n const isText = TEXT.has(field.type);\n const isNumber = NUMBERS.has(field.type);\n\n if (lengthArgs) {\n const min = num(lengthArgs, \"min\");\n const max = num(lengthArgs, \"max\");\n if (!isText) at(\"@length applies to String and ID fields\");\n else if (min === undefined && max === undefined) {\n at(\"@length needs min, max or both\");\n } else if ((min ?? 0) < 0 || (max ?? 0) < 0) {\n at(\"@length bounds cannot be negative\");\n } else if (min !== undefined && max !== undefined && min > max) {\n at(\"@length(min:) is greater than max\");\n } else {\n out.length = {\n ...(min !== undefined ? { min } : {}),\n ...(max !== undefined ? { max } : {}),\n ...text(lengthArgs),\n };\n }\n }\n\n if (formatArgs) {\n const name = formatArgs[\"as\"] as string;\n if (!isText) at(\"@format applies to String and ID fields\");\n else if (!Object.hasOwn(FORMATS, name)) {\n at(\n `@format(as: \"${name}\") is not a known format (${Object.keys(FORMATS).join(\", \")})`,\n );\n } else {\n out.format = { name, ...text(formatArgs) };\n }\n }\n\n if (patternArgs) {\n const source = patternArgs[\"regex\"] as string;\n const max = out.length?.max;\n if (!isText) at(\"@pattern applies to String and ID fields\");\n else if (max === undefined) {\n // The length bound is what keeps a match cheap on hostile input.\n at(\n \"@pattern needs @length(max:) on the same field: an expression is only run on input of bounded length\",\n );\n } else {\n let regex: RegExp | undefined;\n try {\n // The whole value must match, as with Cypher's `=~`.\n regex = new RegExp(`^(?:${source})$`, \"u\");\n } catch (err) {\n at(\n `@pattern(regex:) is not a valid expression: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n if (regex) {\n const unsafe = probePattern(regex, source, max);\n if (unsafe) at(`@pattern(regex:) ${unsafe}`);\n else out.pattern = { source, regex, ...text(patternArgs) };\n }\n }\n }\n\n if (rangeArgs) {\n const min = num(rangeArgs, \"min\");\n const max = num(rangeArgs, \"max\");\n const exclusiveMin = num(rangeArgs, \"exclusiveMin\");\n const exclusiveMax = num(rangeArgs, \"exclusiveMax\");\n const lower = min ?? exclusiveMin;\n const upper = max ?? exclusiveMax;\n if (!isNumber) at(\"@range applies to Int, Float and BigInt fields\");\n else if (lower === undefined && upper === undefined) {\n at(\"@range needs a bound: min, max, exclusiveMin or exclusiveMax\");\n } else if (min !== undefined && exclusiveMin !== undefined) {\n at(\"@range takes min or exclusiveMin, not both\");\n } else if (max !== undefined && exclusiveMax !== undefined) {\n at(\"@range takes max or exclusiveMax, not both\");\n } else if (\n lower !== undefined &&\n upper !== undefined &&\n (lower > upper ||\n (lower === upper &&\n (exclusiveMin !== undefined || exclusiveMax !== undefined)))\n ) {\n at(\"@range admits no value: its lower bound is above its upper bound\");\n } else {\n out.range = {\n ...(min !== undefined ? { min } : {}),\n ...(max !== undefined ? { max } : {}),\n ...(exclusiveMin !== undefined ? { exclusiveMin } : {}),\n ...(exclusiveMax !== undefined ? { exclusiveMax } : {}),\n ...text(rangeArgs),\n };\n }\n }\n\n if (multipleArgs) {\n const value = multipleArgs[\"value\"] as number;\n if (field.type !== \"Int\" && field.type !== \"Float\") {\n at(\"@multipleOf applies to Int and Float fields\");\n } else if (!(value > 0)) {\n at(\"@multipleOf(value:) must be greater than 0\");\n } else if (field.type === \"Int\" && !Number.isInteger(value)) {\n at(\"@multipleOf(value:) on an Int field must be an integer\");\n } else {\n out.multipleOf = { value, ...text(multipleArgs) };\n }\n }\n\n if (sizeArgs) {\n const min = num(sizeArgs, \"min\");\n const max = num(sizeArgs, \"max\");\n const unique = sizeArgs[\"unique\"] === true;\n if (!field.list) at(\"@size applies to list fields\");\n else if (min === undefined && max === undefined && !unique) {\n at(\"@size needs min, max or unique\");\n } else if ((min ?? 0) < 0 || (max ?? 0) < 0) {\n at(\"@size bounds cannot be negative\");\n } else if (min !== undefined && max !== undefined && min > max) {\n at(\"@size(min:) is greater than max\");\n } else {\n out.size = {\n ...(min !== undefined ? { min } : {}),\n ...(max !== undefined ? { max } : {}),\n unique,\n ...text(sizeArgs),\n };\n }\n }\n\n if (normalizeArgs) {\n const trim = normalizeArgs[\"trim\"] === true;\n const emptyToNull = normalizeArgs[\"emptyToNull\"] === true;\n const unicode = normalizeArgs[\"unicode\"] as\n | NonNullable<FieldConstraints[\"normalize\"]>[\"unicode\"]\n | null\n | undefined;\n const textCase = normalizeArgs[\"case\"] as\n | \"LOWER\"\n | \"UPPER\"\n | null\n | undefined;\n if (!isText) at(\"@normalize applies to String and ID fields\");\n else if (!trim && !emptyToNull && !unicode && !textCase) {\n at(\"@normalize needs trim, case, unicode or emptyToNull\");\n } else if (emptyToNull && field.list) {\n at(\n \"@normalize(emptyToNull:) applies to a single value, not to list items\",\n );\n } else {\n out.normalize = {\n trim,\n emptyToNull,\n ...(unicode ? { unicode } : {}),\n ...(textCase ? { case: textCase } : {}),\n };\n }\n }\n\n if (Object.keys(out).length === 0) return undefined;\n if (field.defaultValue) {\n const value = field.defaultValue.value;\n const defaultLabel = field.defaultLabel ?? \"@default(value:)\";\n // A default is stored as written: it has to be in the stored form\n // already, and pass the rules a client's value would.\n if (JSON.stringify(normalizeValue(out, value)) !== JSON.stringify(value)) {\n at(`${defaultLabel} is not in the form @normalize stores`);\n }\n const [broken] = checkValue(out, value);\n if (broken) at(`${defaultLabel} ${broken.message}`);\n }\n return out;\n}\n","// `@fulltext` and `@vector`: the search indexes of a node type and the\n// root fields that query them.\n\nimport type { ModelProblem } from \"../../errors.js\";\nimport type { SearchIndex, ScalarField } from \"../types.js\";\nimport { upperFirst, snakeCase } from \"./shapes.js\";\n\nexport const vectorQueryNames = new WeakMap<ScalarField, string>();\n\nexport function 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 minPrefixLength?: number | null;\n maxMatches?: number | null;\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 if (guardedRead(field)) {\n // The index matches on stored values whatever the rules say, so\n // a search would answer \"which rows contain this word\" for a\n // value the reader may not read (or reads masked).\n at(\n `@fulltext: ${f} has field-level read rules (${guardedRead(field)}); a search over it would reveal the hidden values. Leave it out of the index`,\n );\n } else fields.push(field);\n }\n if (raw.fields.length === 0) at(\"@fulltext: an index needs fields\");\n const minPrefixLength = raw.minPrefixLength ?? undefined;\n if (minPrefixLength !== undefined && minPrefixLength < 1)\n at(`@fulltext(${name}): minPrefixLength must be at least 1`);\n const maxMatches = raw.maxMatches ?? undefined;\n if (maxMatches !== undefined && maxMatches < 1)\n at(`@fulltext(${name}): maxMatches must be at least 1`);\n out.push({\n kind: \"fulltext\",\n name,\n fields,\n analyzer: raw.analyzer,\n minPrefixLength,\n maxMatches,\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\n/** What guards reading `field` per request or row, if anything. */\nfunction guardedRead(field: ScalarField): string | undefined {\n if (field.authorization?.mask?.length) return \"@authorization(mask:)\";\n if (field.authorization?.validate?.some((r) => r.operations.has(\"READ\"))) {\n return \"@authorization(validate:) for READ\";\n }\n if (field.authentication?.has(\"READ\")) return \"@authentication for READ\";\n return undefined;\n}\n","// A stored field of a @node or @relationshipProperties type: its storage\n// type, key, filters, indexes, defaults and computed values, each checked\n// against the directives that may stand next to it.\n\nimport {\n getNamedType,\n isEnumType,\n isScalarType,\n Kind,\n type GraphQLDirective,\n type GraphQLField,\n type GraphQLObjectType,\n} from \"graphql\";\nimport { RANGE_UNINDEXABLE } from \"../../analyze/indexes.js\";\nimport type { ModelProblem } from \"../../errors.js\";\nimport type {\n AuthOperation,\n AuthorizationWhere,\n FilterOperator,\n IndexKind,\n ScalarField,\n ScalarType,\n} from \"../types.js\";\nimport { BUILTIN_SCALARS, unwrap, storageOf } from \"./shapes.js\";\nimport { directive } from \"./directive-args.js\";\nimport { readAuthorization } from \"./authorization.js\";\nimport { readConstraints } from \"./constraints.js\";\nimport { vectorQueryNames } from \"./search.js\";\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\"]);\n\nexport function 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 // A computed field (@timestamp, @populatedBy) is never client-settable,\n // unless `@settable(onCreate: true)` / `onUpdate: true` says so\n // explicitly and a field-level rule decides who may supply it: then the\n // input offers it, and the computation fills it when it is omitted.\n const computed = timestamp !== undefined || !!populatedArgs;\n const supplied = {\n create: computed && explicitlyTrue(f, \"settable\", \"onCreate\"),\n update: computed && !key && explicitlyTrue(f, \"settable\", \"onUpdate\"),\n };\n if ((supplied.create || supplied.update) && !opts.allowKey) {\n at(\n \"a @timestamp or @populatedBy relationship property cannot be made @settable\",\n );\n supplied.create = supplied.update = false;\n }\n for (const [op, arg] of [\n [\"CREATE\", \"onCreate\"],\n [\"UPDATE\", \"onUpdate\"],\n ] as const) {\n if (!supplied[op === \"CREATE\" ? \"create\" : \"update\"]) continue;\n if (!fieldAuthorization?.validate.some((r) => r.operations.has(op))) {\n at(\n `@settable(${arg}: true) on a @timestamp or @populatedBy field needs a field-level @authorization(validate:) rule for ${op}: it decides who may supply the value (the schema's bypass is no such rule)`,\n );\n }\n }\n\n const constraints = readConstraints(d, f, at, {\n type,\n list: shape.list,\n vector: vector !== undefined,\n timestamp: timestamp !== undefined,\n defaultValue,\n scalar: customScalar && isScalarType(named) ? named : undefined,\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 ...(constraints ? { constraints } : {}),\n timestamp,\n readonly:\n readonlyFlag ||\n isPrivate ||\n (computed && !supplied.create && !supplied.update),\n settableOn: {\n create:\n !(readonlyFlag || isPrivate) &&\n (computed\n ? supplied.create\n : ((settableArgs?.[\"onCreate\"] as boolean | undefined) ?? true)),\n update:\n !key &&\n !(readonlyFlag || isPrivate) &&\n (computed\n ? supplied.update\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\n/** The directive on `f` spells out `arg: true` (a default does not count). */\nfunction explicitlyTrue(\n f: GraphQLField<unknown, unknown>,\n directiveName: string,\n arg: string,\n): boolean {\n const dir = f.astNode?.directives?.find(\n (x) => x.name.value === directiveName,\n );\n const value = dir?.arguments?.find((a) => a.name.value === arg)?.value;\n return value?.kind === Kind.BOOLEAN && value.value;\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\nexport function 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","// A `@relationship` field of a @node type, and an interface's\n// `@declareRelationship` checked against its implementations.\n\nimport {\n getNamedType,\n type GraphQLDirective,\n type GraphQLField,\n type GraphQLObjectType,\n} from \"graphql\";\nimport type { ModelProblem } from \"../../errors.js\";\nimport type {\n AuthorizationWhere,\n DeclaredRelationship,\n NestedOperation,\n NodeType,\n PageLimit,\n RelationshipField,\n} from \"../types.js\";\nimport { resolveLimit } from \"./limits.js\";\nimport { unwrap } from \"./shapes.js\";\nimport { directive } from \"./directive-args.js\";\nimport { authOps, readOnlyRules } from \"./authorization.js\";\n\nconst RELATIONSHIP_TYPE = /^[A-Z][A-Z0-9_]*$/;\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 */\nexport function 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\nexport function 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 // How many items one nested list takes: about the input, where\n // @cardinality is about what is stored (and refuses nothing).\n const sizeArgs = directive(d(\"size\"), f, at);\n const maxItems = (sizeArgs?.[\"max\"] ?? undefined) as number | undefined;\n if (sizeArgs) {\n if (!shape.list) at(\"@size only applies to list relationships\");\n if (sizeArgs[\"min\"] != null || sizeArgs[\"unique\"] != null) {\n at(\n \"@size on a relationship field takes max: it bounds each nested connect, create, disconnect and update list\",\n );\n }\n if (maxItems === undefined) at(\"@size on a relationship field needs max\");\n else if (maxItems < 1) at(\"@size(max:) must be at least 1\");\n }\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 ...(sizeArgs && maxItems !== undefined\n ? {\n maxItems: {\n max: maxItems,\n ...(typeof sizeArgs[\"message\"] === \"string\"\n ? { message: sizeArgs[\"message\"] }\n : {}),\n },\n }\n : {}),\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","// Reading `@trigger` off a node type (repeatable), checked against the\n// type: the operations it mutates, the fields it names, the parameters\n// its statement may use.\n\nimport type { GraphQLDirective, GraphQLObjectType } from \"graphql\";\nimport type { ModelProblem } from \"../../errors.js\";\nimport { codeOnly, maskLiterals, scanParams } from \"../cypher-lexer.js\";\nimport type { NodeType, Trigger, TriggerOperation } from \"../types.js\";\nimport { directive, directiveNodes } from \"./directive-args.js\";\n\nconst WRITE_CLAUSES = /\\b(CREATE|MERGE|SET|DELETE|REMOVE|DETACH)\\b/i;\n\n/**\n * Whether the statement's last RETURN names a `created` or `updated`\n * column, read from its text: a result that matched no row has no\n * columns to ask. Names are case-sensitive, as the columns are; an alias\n * in an earlier WITH does not count.\n */\nexport function reportsWrites(statement: string): boolean {\n const code = maskLiterals(statement);\n const returns = [...code.matchAll(/\\bRETURN\\b/gi)];\n const last = returns[returns.length - 1];\n if (!last) return false;\n return (\n // Strings, comments and quoted names are blanked here.\n /\\b[Aa][Ss]\\s+(created|updated)(?![A-Za-z0-9_])/.test(\n code.slice(last.index),\n ) || /\\b[Aa][Ss]\\s+`(created|updated)`/.test(statement.slice(last.index))\n );\n}\n\n/** What a trigger statement may read as a `$parameter`. */\nexport const TRIGGER_PARAMS: readonly string[] = [\"jwt\", \"viewer\", \"operation\"];\n\n/** Every `@trigger` of a node type, in the order written, checked. */\nexport function readTriggers(\n t: GraphQLObjectType,\n node: NodeType,\n d: (name: string) => GraphQLDirective,\n problems: ModelProblem[],\n /** Whether the @jwt type has a @viewer claim (enables `$viewer`). */\n viewer: boolean,\n): Trigger[] {\n const out: Trigger[] = [];\n for (const { node: dir } of directiveNodes(\"trigger\", t)) {\n let ok = true;\n const at = (message: string) => {\n ok = false;\n problems.push({ type: t.name, message: `@trigger: ${message}` });\n };\n const args = directive(\n d(\"trigger\"),\n { astNode: { directives: [dir] } },\n at,\n );\n if (!args) continue;\n const operations = new Set(args[\"on\"] as TriggerOperation[]);\n const statement = (args[\"statement\"] as string).trim();\n const fields = (args[\"fields\"] ?? undefined) as string[] | undefined;\n const field = (args[\"field\"] ?? undefined) as string | undefined;\n if (operations.size === 0) at(\"on is empty\");\n if (!statement) at(\"statement is empty\");\n const ofRelationship = [...operations].filter(\n (op) => op === \"CONNECT\" || op === \"DISCONNECT\",\n );\n if (ofRelationship.length > 0) {\n // It runs per relationship, with `target` bound: another statement\n // than one that runs per node.\n if (ofRelationship.length < operations.size) {\n at(\n \"CONNECT and DISCONNECT run per relationship, the others per node: declare two triggers\",\n );\n }\n if (fields !== undefined)\n at(\n \"fields narrows UPDATE; a CONNECT or DISCONNECT trigger takes field\",\n );\n const f = field === undefined ? undefined : node.fields.get(field);\n if (field === undefined) {\n at(\n `${ofRelationship.join(\" and \")} needs field: the relationship field it fires for`,\n );\n } else if (!f) at(`${t.name} has no field ${field}`);\n else if (f.kind !== \"relationship\") {\n at(`${field} is not a @relationship field`);\n }\n } else if (field !== undefined) {\n at(\n \"field names the relationship of a CONNECT or DISCONNECT trigger; fields narrows UPDATE\",\n );\n }\n // A trigger fires for what generated mutations write.\n for (const op of operations) {\n if (op === \"CONNECT\" || op === \"DISCONNECT\") continue;\n if (!node.mutations.has(op)) {\n at(\n `on lists ${op}, but ${t.name} has no generated ${op} mutation (@mutation(operations:)) to fire it`,\n );\n }\n }\n if (fields !== undefined && ofRelationship.length === 0) {\n if (!operations.has(\"UPDATE\")) {\n at(\"fields narrows UPDATE, which on does not list\");\n }\n if (fields.length === 0) at(\"fields is empty\");\n for (const name of fields) {\n const f = node.fields.get(name);\n if (!f) at(`${t.name} has no field ${name}`);\n else if (f.kind === \"cypher\" || f.kind === \"custom\") {\n at(`${name} is computed, not written: an update never sets it`);\n }\n }\n }\n const params = [...new Set(scanParams(statement).map((p) => p.name))];\n for (const p of params) {\n if (!TRIGGER_PARAMS.includes(p)) {\n at(\n `the statement uses $${p}; a trigger statement has $jwt, $viewer and $operation`,\n );\n } else if (p === \"viewer\" && !viewer) {\n at(\"the statement uses $viewer, but no @jwt claim has @viewer\");\n }\n }\n if (!ok) continue;\n out.push({\n operations,\n ...(field !== undefined ? { field } : {}),\n statement,\n fields,\n params,\n writes: WRITE_CLAUSES.test(codeOnly(statement)),\n reports: reportsWrites(statement),\n });\n }\n return out;\n}\n","// A `@cypher` field: its statement, the column it returns, its arguments\n// and parameters, and the checks on what the statement may do where.\n\nimport {\n getNamedType,\n isInterfaceType,\n isUnionType,\n valueFromAST,\n type ConstValueNode,\n type GraphQLArgument,\n type GraphQLDirective,\n type GraphQLField,\n type GraphQLObjectType,\n type GraphQLSchema,\n isEnumType,\n isScalarType,\n} from \"graphql\";\nimport type { ModelProblem } from \"../../errors.js\";\nimport { codeOnly, maskLiterals, scanParams } from \"../cypher-lexer.js\";\nimport type {\n AuthorizationWhere,\n CypherArgument,\n CypherField,\n ModelWarning,\n ScalarField,\n} from \"../types.js\";\nimport { outOfRange } from \"../inputs.js\";\nimport {\n BUILTIN_SCALARS,\n unwrap,\n isScalarLike,\n shapeOf,\n storageOf,\n unwrapInput,\n} from \"./shapes.js\";\nimport { readConstraints } from \"./constraints.js\";\nimport { directive } from \"./directive-args.js\";\nimport { buildScalarField } from \"./scalar-field.js\";\nimport { authOps, readOnlyRules, rootFieldRules } from \"./authorization.js\";\nimport { reportsWrites } from \"./trigger.js\";\n\nconst WRITE_CLAUSES = /\\b(CREATE|MERGE|SET|DELETE|REMOVE|DETACH)\\b/;\n\nexport function 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 /** Whether the @jwt type has a @viewer claim (enables `$viewer`). */\n viewer: boolean;\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 = ctx.root\n ? rootFieldRules(directive(d(\"authorization\"), f, at), at)\n : 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 cost = (args[\"cost\"] as number | null | undefined) ?? 0;\n if (cost < 0) at(\"cost must not be negative\");\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 if (a.name === \"viewer\")\n at(\"argument `viewer` is reserved for the caller's @viewer key\");\n const argShape = unwrapInput(a.type);\n // A plain `@size(max:)` or `@range(min:, max:)` keeps its own check\n // and message; any other rule, or argument of these two, is read as\n // on a field.\n const quiet = () => undefined;\n const sizeArgs = directive(d(\"size\"), a, quiet);\n const rangeArgs = directive(d(\"range\"), a, quiet);\n const plainSize =\n sizeArgs !== undefined &&\n sizeArgs[\"min\"] == null &&\n sizeArgs[\"unique\"] == null &&\n sizeArgs[\"message\"] == null;\n const plainRange =\n rangeArgs !== undefined &&\n rangeArgs[\"exclusiveMin\"] == null &&\n rangeArgs[\"exclusiveMax\"] == null &&\n rangeArgs[\"message\"] == null;\n let size: number | undefined;\n if (plainSize) {\n directive(d(\"size\"), a, at);\n size = (sizeArgs[\"max\"] ?? undefined) as number | undefined;\n if (size === undefined) {\n at(`argument ${a.name}: @size needs max, min or unique`);\n } else if (!argShape.list) {\n at(`argument ${a.name}: @size applies to list arguments`);\n } else if (size < 1) {\n at(`argument ${a.name}: @size(max:) must be at least 1`);\n }\n }\n const range = plainRange\n ? cypherArgumentRange(a, argNamed, d(\"range\"), at)\n : undefined;\n const defaultValue = argumentDefault(a);\n if (range && outOfRange(defaultValue, range) !== undefined) {\n at(`argument ${a.name}: its default is outside @range`);\n }\n const argType = ctx.schema.getType(argNamed);\n const constraints = readConstraints(\n d,\n a,\n (message) => at(`argument ${a.name}: ${message}`),\n {\n type:\n BUILTIN_SCALARS[argNamed] ??\n (argType && isEnumType(argType)\n ? \"Enum\"\n : ((argType && storageOf(argType)) ?? \"String\")),\n list: argShape.list,\n vector: false,\n timestamp: false,\n defaultValue:\n defaultValue === undefined ? undefined : { value: defaultValue },\n defaultLabel: \"its default\",\n scalar:\n argType && isScalarType(argType) && !(argNamed in BUILTIN_SCALARS)\n ? argType\n : undefined,\n skip: new Set([\n ...(plainSize ? [\"size\"] : []),\n ...(plainRange ? [\"range\"] : []),\n ]),\n },\n );\n // The statement would get a null for an argument declared non-null.\n if (constraints?.normalize?.emptyToNull && argShape.required) {\n at(\n `argument ${a.name}: @normalize(emptyToNull:) needs a nullable argument`,\n );\n }\n cypherArgs.push({\n name: a.name,\n type: { named: argNamed, ...argShape },\n defaultValue,\n description: a.description ?? undefined,\n ...(size !== undefined ? { maxItems: size } : {}),\n ...(range ? { range } : {}),\n ...(constraints ? { constraints } : {}),\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\", \"viewer\"]);\n for (const p of params) {\n if (p === \"viewer\" && !ctx.viewer) {\n at(\n \"the statement uses $viewer, which needs a @viewer claim on the @jwt type\",\n );\n } else 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 cost,\n type: { named, ...shapeOf(shape) },\n node,\n abstract,\n object,\n args: cypherArgs,\n params,\n writes: WRITE_CLAUSES.test(code),\n reports: ctx.root === \"Mutation\" && reportsWrites(statement),\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 */\n/** `@range(min:, max:)` of a @cypher argument, checked against its type. */\nfunction cypherArgumentRange(\n a: GraphQLArgument,\n named: string,\n def: GraphQLDirective,\n at: (message: string) => void,\n): { min?: number; max?: number } | undefined {\n const args = directive(def, a, at);\n if (!args) return undefined;\n const min = args[\"min\"] as number | null | undefined;\n const max = args[\"max\"] as number | null | undefined;\n if (named !== \"Int\" && named !== \"Float\") {\n at(`argument ${a.name}: @range applies to Int and Float arguments`);\n return undefined;\n }\n if (min == null && max == null) {\n at(`argument ${a.name}: @range needs min, max or both`);\n return undefined;\n }\n if (min != null && max != null && min > max) {\n at(`argument ${a.name}: @range(min:) is greater than max`);\n return undefined;\n }\n return {\n ...(min != null ? { min } : {}),\n ...(max != null ? { max } : {}),\n };\n}\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","// The strings of a rule: `$jwt.claim` references and `${source.path}`\n// placeholders, checked for form and for what they may read where they\n// stand.\n\nimport type { Field, NodeType, RelationshipPropertiesType } from \"../types.js\";\nimport { PLACEHOLDER, RULE_REFERENCES } from \"../types.js\";\n\n/**\n * Claim names referenced anywhere in a value: as \"$jwt.name…\" strings and\n * as ${jwt.name…} placeholders.\n */\nexport function 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. */\nexport function 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\n/** What a rule's `${node.…}`, `${source.…}`, `${target.…}`, `${edge.…}` may read. */\nexport interface RuleReferences {\n node?: NodeType;\n source?: NodeType;\n target?: NodeType;\n edge?: RelationshipPropertiesType | undefined;\n}\n\n/**\n * `${node.path}`-style placeholders: the source must be available where\n * the string stands (`node` in a type's rules, `source` / `target` /\n * `edge` in a relationship field's), the path must reach a scalar through\n * single relationships to node types, and it stands for one value.\n */\nexport function ruleReferenceProblems(\n value: unknown,\n refs: RuleReferences,\n nodes: ReadonlyMap<string, NodeType>,\n inList = false,\n): string[] {\n if (typeof value === \"string\") {\n const out: string[] = [];\n for (const m of value.matchAll(PLACEHOLDER)) {\n const [ref, source, path] = m as unknown as [string, string, string];\n if (!RULE_REFERENCES.has(source)) continue;\n if (inList) {\n out.push(`\"${value}\": ${ref} stands for one value, not inside a list`);\n continue;\n }\n if (source === \"edge\") {\n if (!refs.edge) {\n out.push(\n `\"${value}\": \\${edge.…} reads a relationship rule's properties; there are none here`,\n );\n } else if (!refs.edge.fields.has(path)) {\n out.push(`\"${value}\": ${refs.edge.name} has no property ${path}`);\n }\n continue;\n }\n const start = refs[source as \"node\" | \"source\" | \"target\"];\n if (!start) {\n out.push(\n source === \"node\" && refs.source\n ? `\"${value}\": a relationship rule reads its ends: \\${source.…} or \\${target.…}`\n : source === \"node\"\n ? `\"${value}\": viewer: { … } tests the caller's node alone; read the rule's node in a node part`\n : refs.node\n ? `\"${value}\": \\${${source}.…} reads a relationship rule's ends; here the rule's node is \\${node.…}`\n : `\"${value}\": viewer: { … } tests the caller's node alone; read the rule's node in a node part`,\n );\n continue;\n }\n let node: NodeType = start;\n const steps = path.split(\".\");\n for (const [i, step] of steps.entries()) {\n const f: Field | undefined = node.fields.get(step);\n if (i === steps.length - 1) {\n if (f?.kind !== \"scalar\") {\n out.push(\n `\"${value}\": ${node.name}.${step} is not a scalar field: a reference ends on one`,\n );\n }\n break;\n }\n const target: NodeType | undefined =\n f?.kind === \"relationship\" ? nodes.get(f.target) : undefined;\n if (f?.kind !== \"relationship\" || f.list || !target) {\n out.push(\n `\"${value}\": ${node.name}.${step} is not a single relationship to a node type: a reference steps through those only`,\n );\n break;\n }\n node = target;\n }\n }\n return out;\n }\n if (Array.isArray(value)) {\n return value.flatMap((v) => ruleReferenceProblems(v, refs, nodes, true));\n }\n if (value !== null && typeof value === \"object\") {\n return Object.values(value).flatMap((v) =>\n ruleReferenceProblems(v, refs, nodes, inList),\n );\n }\n return [];\n}\n\nexport function 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 ? [\n `\"${value}\": a placeholder is \\${jwt.<claim>}, \\${context.<path>}, \\${viewer.<field>} or \\${node.<path>}`,\n ]\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","// Startup checks of a rule's where against the model: the keys allowed at\n// each level, the fields and operators of node, edge, connection and\n// abstract filters, and the claims the @jwt type declares.\n\nimport type { ModelProblem } from \"../../errors.js\";\nimport { UNEXPANDED } from \"../desugar.js\";\nimport type {\n AbstractType,\n NodeType,\n RelationshipField,\n RelationshipPropertiesType,\n} from \"../types.js\";\nimport { isRecord, isRelationshipRule } from \"./authorization.js\";\nimport {\n claimRefs,\n viewerRefProblems,\n ruleReferenceProblems,\n ruleStringProblems,\n type RuleReferences,\n} from \"./rule-references.js\";\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 \"isNull\",\n]);\n\nconst JWT_OPS = new Set([...SCALAR_WHERE_OPS, \"includes\", \"exists\"]);\nconst COUNT_WHERE_OPS = new Set([\"eq\", \"lt\", \"lte\", \"gt\", \"gte\"]);\n\n/** Check an `@authorization` where against the model, at startup. */\nexport function 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. */\nexport interface RuleEnds {\n source: NodeType;\n target: NodeType;\n edge: RelationshipPropertiesType | undefined;\n}\n\nexport function 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 nodeless = \"rules on relationship properties test claims (jwt) only; node rules belong on the node types\",\n) {\n const at = (message: string) =>\n problems.push({\n type,\n ...(field ? { field } : {}),\n message: `@authorization: ${message}`,\n });\n // What `${node.…}`-style placeholders may read here: the rule's own\n // node, or a relationship rule's ends and edge.\n const references: RuleReferences = ends\n ? { source: ends.source, target: ends.target, edge: ends.edge }\n : node\n ? { node }\n : {};\n // A filter over a node type, with the strings and claims it uses.\n const nodePart = (\n t: NodeType,\n value: unknown,\n here: string,\n refs: RuleReferences = references,\n ) => {\n checkNodeWhere(nodes, props, t, value, here, at);\n for (const problem of ruleStringProblems(value)) at(`${here}: ${problem}`);\n for (const problem of ruleReferenceProblems(value, refs, nodes))\n 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 for (const problem of ruleReferenceProblems(value, references, nodes))\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(`${here}: ${nodeless}`);\n } else if (k === \"node\" && node) {\n nodePart(node, value, here);\n } else if (k === \"viewer\") {\n // Desugaring already reported a missing @viewer. The caller's node\n // is found by the claim alone: nothing of the rule's node to read.\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\n/**\n * Check the relationship rules of a field to an interface or union: each\n * member's copy, with that member as the target.\n */\nexport function checkMemberRules(\n nodes: ReadonlyMap<string, NodeType>,\n props: ReadonlyMap<string, RelationshipPropertiesType>,\n source: NodeType,\n f: RelationshipField,\n problems: ModelProblem[],\n jwtShape?: ReadonlyMap<string, string>,\n viewerNode?: NodeType,\n) {\n if (!f.memberAuthorization) return;\n const edge = f.properties ? props.get(f.properties) : undefined;\n const same = (a: ModelProblem, b: ModelProblem) =>\n a.type === b.type && a.field === b.field && a.message === b.message;\n for (const [member, authorization] of f.memberAuthorization) {\n const target = nodes.get(member)!;\n const found: ModelProblem[] = [];\n for (const rule of authorization.validate) {\n if (!isRelationshipRule(rule)) continue;\n checkRuleWhere(\n nodes,\n props,\n undefined,\n source.name,\n f.name,\n rule.where,\n found,\n jwtShape,\n viewerNode,\n { source, target, edge },\n );\n }\n // What is wrong for every member is said once; what is wrong for one\n // (a field the others have and it lacks) names it.\n for (const problem of found) {\n const named = {\n ...problem,\n message: `${problem.message} (with ${f.target} member ${member} as the target)`,\n };\n if (!problems.some((p) => same(p, problem) || same(p, named))) {\n problems.push(named);\n }\n }\n }\n}\n\nexport function 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 const exists = k.endsWith(\"Exists\")\n ? node.fields.get(k.slice(0, -\"Exists\".length))\n : undefined;\n if (!field && exists?.kind === \"relationship\" && !exists.list) {\n // `<field>Exists: Boolean`: whether the single relationship is set.\n if (typeof value !== \"boolean\") at(`${here} must be true or false`);\n } else 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 else if (op === \"isNull\" && typeof operand !== \"boolean\")\n at(`${here}.isNull must be true or false`);\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 */\nexport const 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 else if (op === \"isNull\" && typeof operand !== \"boolean\")\n at(`${here}.isNull must be true or false`);\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 else if (op === \"isNull\" && typeof operand !== \"boolean\")\n at(`${here}.isNull must be true or false`);\n }\n }\n }\n}\n","// `@cacheControl`: how long a result over a type or a field may be served\n// from a cache (read by `operationCachePolicy`).\n\nimport {\n isInterfaceType,\n isObjectType,\n type GraphQLDirective,\n type GraphQLNamedType,\n} from \"graphql\";\nimport type { CacheHint, CacheHints } from \"../types.js\";\nimport { directive } from \"./directive-args.js\";\n\nexport function readCacheHints(\n userTypes: readonly GraphQLNamedType[],\n def: GraphQLDirective,\n at: (type: string) => (message: string) => void,\n): CacheHints {\n const types = new Map<string, CacheHint>();\n const fields = new Map<string, CacheHint>();\n const hint = (\n node: { astNode?: unknown; extensionASTNodes?: unknown },\n where: string,\n report: (message: string) => void,\n ): CacheHint | undefined => {\n const args = directive(def, node, report);\n if (!args) return undefined;\n const maxAge = args[\"maxAge\"] as number;\n if (maxAge < 0) {\n report(`@cacheControl on ${where}: maxAge must be 0 or more seconds`);\n return undefined;\n }\n return {\n maxAge,\n scope: (args[\"scope\"] as CacheHint[\"scope\"] | undefined) ?? \"PUBLIC\",\n };\n };\n for (const type of userTypes) {\n const report = at(type.name);\n const own = hint(type, type.name, report);\n if (own) types.set(type.name, own);\n if (!isObjectType(type) && !isInterfaceType(type)) continue;\n for (const field of Object.values(type.getFields())) {\n const where = `${type.name}.${field.name}`;\n const fieldHint = hint(field, where, report);\n if (fieldHint) fields.set(where, fieldHint);\n }\n }\n return { types, fields };\n}\n","// Reading `@uniqueTogether` off a node type (repeatable), checked against\n// its fields. Which types a hand-written statement may write is in\n// `../unique-together.ts`.\n\nimport type { GraphQLDirective, GraphQLObjectType } from \"graphql\";\nimport type { ModelProblem } from \"../../errors.js\";\nimport type {\n NodeType,\n RelationshipField,\n RelationshipPropertiesType,\n ScalarField,\n UniqueTogether,\n} from \"../types.js\";\nimport { directive, directiveNodes } from \"./directive-args.js\";\nimport { checkNodeWhere } from \"./rule-checks.js\";\n\n/** Every `@uniqueTogether` of a node type (repeatable), checked. */\nexport function readUniqueTogether(\n t: GraphQLObjectType,\n node: NodeType,\n nodes: ReadonlyMap<string, NodeType>,\n props: ReadonlyMap<string, RelationshipPropertiesType>,\n d: (name: string) => GraphQLDirective,\n problems: ModelProblem[],\n): UniqueTogether[] {\n const out: UniqueTogether[] = [];\n for (const { node: dir } of directiveNodes(\"uniqueTogether\", t)) {\n let ok = true;\n const at = (message: string) => {\n ok = false;\n problems.push({ type: t.name, message: `@uniqueTogether: ${message}` });\n };\n const args = directive(\n d(\"uniqueTogether\"),\n { astNode: { directives: [dir] } },\n at,\n );\n if (!args) continue;\n const names = args[\"fields\"] as string[];\n const where = (args[\"where\"] ?? undefined) as\n | Record<string, unknown>\n | undefined;\n if (names.length === 0) at(\"fields is empty\");\n if (new Set(names).size < names.length) at(\"fields names a field twice\");\n const scalars: ScalarField[] = [];\n const singles: RelationshipField[] = [];\n const sets: RelationshipField[] = [];\n for (const n of names) {\n const f = node.fields.get(n);\n if (!f) at(`${t.name} has no field ${n}`);\n else if (f.kind === \"cypher\" || f.kind === \"custom\") {\n at(\n `${n} is ${f.kind === \"cypher\" ? \"a @cypher\" : \"a @customResolver\"} field; only stored fields and relationships can be unique`,\n );\n } else if (f.kind === \"scalar\") {\n if (f.list) at(`${n} is a list; list scalar fields cannot be unique`);\n else scalars.push(f);\n } else if (!nodes.has(f.target)) {\n at(\n `${n} reaches an interface or union; only relationships to a @node type can be unique`,\n );\n } else if (f.list) sets.push(f);\n else singles.push(f);\n }\n if (sets.length > 1) {\n at(\n `fields names ${sets.length} list relationships (${sets.map((f) => f.name).join(\", \")}); at most one is compared as a set`,\n );\n }\n if (where !== undefined) {\n checkNodeWhere(nodes, props, node, where, \"where\", at);\n }\n if (!ok) continue;\n out.push({ fields: names, scalars, singles, set: sets[0], where });\n }\n return out;\n}\n","import {\n buildASTSchema,\n concatAST,\n getNamedType,\n isEnumType,\n isInterfaceType,\n isObjectType,\n isScalarType,\n isUnionType,\n parse,\n type DocumentNode,\n type GraphQLField,\n type GraphQLInterfaceType,\n type GraphQLUnionType,\n type GraphQLObjectType,\n type GraphQLSchema,\n} from \"graphql\";\nimport { ModelError, type ModelProblem } from \"../errors.js\";\nimport { directiveTypeDefs, PRELUDE_TYPES } from \"./directives.js\";\nimport { checkDirectivePositions } from \"./positions.js\";\nimport {\n checkViewer,\n desugarRule,\n testsRelationshipEnds,\n type DesugarContext,\n type NamedRules,\n type ViewerMapping,\n} from \"./desugar.js\";\nimport { uniqueTogetherTouched } from \"./unique-together.js\";\nimport type {\n AbstractType,\n AuthOperation,\n Authorization,\n AuthorizationWhere,\n CypherField,\n EnumType,\n Field,\n ModelWarning,\n MutationOperation,\n TypeShape,\n FilterOperator,\n GraphModel,\n DeclaredRelationship,\n NodeType,\n PlainObjectType,\n RelationshipField,\n RelationshipPropertiesType,\n ScalarField,\n ScalarType,\n Trigger,\n UniqueTogether,\n} from \"./types.js\";\nimport { RELATIONSHIP_OPERATIONS } from \"./types.js\";\nimport { isUpdatable } from \"./inputs.js\";\nimport {\n resolveGlobalLimit,\n resolveLimit,\n type ModelOptions,\n} from \"./build/limits.js\";\nimport {\n BUILTIN_SCALARS,\n unwrap,\n isScalarLike,\n storageOf,\n lowerFirst,\n defaultPlural,\n shapeOf,\n} from \"./build/shapes.js\";\nimport { directive, directiveNodes } from \"./build/directive-args.js\";\nimport { buildScalarField, defaultMatches } from \"./build/scalar-field.js\";\nimport {\n declareRelationship,\n buildRelationshipField,\n} from \"./build/relationship-field.js\";\nimport { buildCypherField } from \"./build/cypher-field.js\";\nimport {\n authOps,\n readAuthorization,\n PROPERTY_OPS,\n passableWithoutClaims,\n claimsOnlyViolations,\n relationshipRuleOperations,\n isRelationshipRule,\n memberAuthorization,\n} from \"./build/authorization.js\";\nimport {\n checkAuthorizationWhere,\n checkMemberRules,\n checkRuleWhere,\n abstractsOf,\n type RuleEnds,\n} from \"./build/rule-checks.js\";\nimport { readCacheHints } from \"./build/cache-control.js\";\nimport { readSearch } from \"./build/search.js\";\nimport { readTriggers } from \"./build/trigger.js\";\nimport { readUniqueTogether } from \"./build/unique-together.js\";\n\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 requireAuthentication?: boolean;\n } = {};\n const defaultArgs = directive(d(\"authorizationDefaults\"), schema, (message) =>\n problems.push({ type: \"schema\", message }),\n );\n if (defaultArgs?.[\"bypass\"] != null)\n defaults.bypass = defaultArgs[\"bypass\"] as AuthorizationWhere;\n if (defaultArgs?.[\"mutations\"] != null)\n defaults.mutations = defaultArgs[\"mutations\"] as AuthorizationWhere;\n if (defaultArgs?.[\"requireAuthentication\"] != null)\n defaults.requireAuthentication = defaultArgs[\n \"requireAuthentication\"\n ] as boolean;\n // `extend schema @authorizationRules(rules: [...])`: claims-only rules.\n const schemaRules = new Map<string, AuthorizationWhere>();\n for (const { node: dir } of directiveNodes(\"authorizationRules\", schema)) {\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 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 viewer: viewer !== 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 // A single relationship's `<field>Exists` filter takes that name.\n for (const f of fields.values()) {\n if (\n f.kind === \"relationship\" &&\n !f.list &&\n fields.has(`${f.name}Exists`)\n ) {\n problems.push({\n type: t.name,\n field: `${f.name}Exists`,\n message: `collides with the ${f.name}Exists filter of the single relationship ${f.name}; rename one`,\n });\n }\n }\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 uniqueTogether: [],\n triggers: [],\n outbox: directive(d(\"outbox\"), t, atType(t.name)) !== undefined,\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 if (f.nestedOperations.has(\"UPDATE_EDGE\") && !f.properties) {\n problems.push({\n type: node.name,\n field: f.name,\n message:\n \"UPDATE_EDGE updates relationship properties, and this relationship has none\",\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 viewer: viewer !== undefined,\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 { node: dir } of directiveNodes(\"authorizationRule\", t)) {\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 // Per operation: the default guards each write the type's own rules\n // leave uncovered. A filter rule never covers CREATE (there is no\n // node to filter before it exists).\n const uncovered = WRITES.filter(\n (op) =>\n !(node.authorization?.validate ?? []).some((r) =>\n r.operations.has(op),\n ) &&\n (op === \"CREATE\" ||\n !(node.authorization?.filter ?? []).some((r) =>\n r.operations.has(op),\n )),\n );\n if (uncovered.length === 0) continue;\n (node as { authorization: Authorization }).authorization = {\n ...(node.authorization ?? { filter: [] }),\n validate: [\n ...(node.authorization?.validate ?? []),\n {\n operations: new Set<AuthOperation>(uncovered),\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 (masks.length > 0 && f.kind === \"scalar\" && f.vector) {\n // The vector index ranks by the stored vector, mask or not.\n at(\n \"@authorization(mask:) does not fit a @vector field: similarity search ranks by the stored vector. Guard it with READ validate rules\",\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 for (const t of nodeTypes) {\n const node = nodes.get(t.name);\n if (!node) continue;\n (node as { uniqueTogether: readonly UniqueTogether[] }).uniqueTogether =\n readUniqueTogether(t, node, nodes, relationshipProperties, d, problems);\n (node as { triggers: readonly Trigger[] }).triggers = readTriggers(\n t,\n node,\n d,\n problems,\n viewer !== undefined,\n );\n }\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 member?: NodeType,\n ) => {\n const ctx: DesugarContext = {\n nodes,\n ...(member ? { member } : {}),\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 if (\"requireAuthentication\" in rule) {\n // A rule no anonymous request can pass asks for a token either\n // way: the caller is told to sign in, not that they are refused.\n const r = rule as {\n requireAuthentication: boolean;\n requireAuthenticationDefaulted?: boolean;\n };\n r.requireAuthentication =\n (defaults.requireAuthentication ?? true) ||\n !passableWithoutClaims(rule.where);\n r.requireAuthenticationDefaulted =\n defaults.requireAuthentication === undefined;\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 else if (\n f.kind === \"relationship\" &&\n rel.length > 0 &&\n abstracts.has(f.target)\n ) {\n // To an interface or union: the rules hold per member, each with\n // that member as its target.\n (\n f as { memberAuthorization?: ReadonlyMap<string, Authorization> }\n ).memberAuthorization = memberAuthorization(f, nodes, (own, target) =>\n desugar(\n undefined,\n node.name,\n f.name,\n own,\n { source: node, target },\n target,\n ),\n );\n }\n }\n }\n // A relationship property's rules may test the relationship's ends\n // when every relationship field using its type declares the same ones.\n const propertyEnds = new Map<string, RuleEnds | string>();\n for (const props of relationshipProperties.values()) {\n const users: RelationshipField[] = [];\n for (const node of nodes.values()) {\n for (const f of node.fields.values()) {\n if (f.kind === \"relationship\" && f.properties === props.name) {\n users.push(f);\n }\n }\n }\n const pairs = [...new Set(users.map((f) => `${f.owner} → ${f.target}`))];\n const first = users[0] && ruleEnds(users[0]);\n propertyEnds.set(\n props.name,\n users.length === 0\n ? `no relationship field uses ${props.name}`\n : pairs.length > 1\n ? `the relationship fields using ${props.name} declare different ends (${users.map((f) => `${f.owner}.${f.name}: ${f.owner} → ${f.target}`).join(\", \")})`\n : (first ??\n `${pairs[0]} has an interface or union end; source and target need @node types`),\n );\n }\n for (const props of relationshipProperties.values()) {\n for (const f of props.fields.values()) {\n if (!f.authorization) continue;\n const ends = propertyEnds.get(props.name);\n const row = f.authorization.validate.filter((r) =>\n testsRelationshipEnds(r.where),\n );\n desugar(\n undefined,\n props.name,\n f.name,\n f.authorization.validate.filter((r) => !row.includes(r)),\n );\n if (typeof ends === \"object\") {\n desugar(undefined, props.name, f.name, row, ends);\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 }\n // To an interface or union: checked per member below.\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 if (f.kind === \"relationship\") {\n checkMemberRules(\n nodes,\n relationshipProperties,\n node,\n f,\n problems,\n jwtShape,\n viewerNode,\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 // A relationship's rules hold from either side, so one side declares\n // them: the same operation ruled on both would silently need both.\n for (const node of nodes.values()) {\n for (const f of node.fields.values()) {\n if (f.kind !== \"relationship\") continue;\n const own = relationshipRuleOperations(f);\n if (own.size === 0) continue;\n const across = f.members.flatMap((member) => [\n ...(nodes.get(member)?.fields.values() ?? []),\n ]);\n for (const g of across) {\n if (\n g.kind !== \"relationship\" ||\n g === f ||\n g.type !== f.type ||\n !g.members.includes(f.owner) ||\n g.direction === f.direction ||\n // Each pair once: reported on the field that sorts first.\n `${g.owner}.${g.name}` < `${f.owner}.${f.name}`\n ) {\n continue;\n }\n const both = [...relationshipRuleOperations(g)].filter((op) =>\n own.has(op),\n );\n if (both.length > 0) {\n problems.push({\n type: node.name,\n field: f.name,\n message: `@authorization: ${both.join(\", \")} ${both.length === 1 ? \"rules are\" : \"rules are each\"} declared on both ${f.owner}.${f.name} and ${g.owner}.${g.name}, the two sides of ${f.type}; a relationship's rules hold from either side, so declare each operation on one (combine with AND where both must pass)`,\n });\n }\n }\n }\n }\n\n // Rules on root @cypher fields: claims and the caller's node, no node.\n for (const f of [...queries, ...mutationFields]) {\n if (!f.authorization) continue;\n desugar(undefined, f.owner, f.name, f.authorization.validate);\n for (const rule of f.authorization.validate) {\n checkRuleWhere(\n nodes,\n relationshipProperties,\n undefined,\n f.owner,\n f.name,\n rule.where,\n problems,\n jwtShape,\n viewerNode,\n undefined,\n \"a root @cypher field has no node: its rules test jwt and viewer\",\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 const ends = testsRelationshipEnds(rule.where)\n ? propertyEnds.get(props.name)\n : undefined;\n if (typeof ends === \"string\") {\n at(\n `@authorization: source, target and edge need every relationship field using ${props.name} to declare the same ends, but ${ends}`,\n );\n continue;\n }\n if (ends && [...rule.operations].some((op) => op !== \"READ\")) {\n at(\n \"@authorization: source, target and edge decide per relationship, so they take READ rules only; CREATE and UPDATE rules on a relationship property test claims\",\n );\n continue;\n }\n checkRuleWhere(\n nodes,\n relationshipProperties,\n undefined,\n props.name,\n f.name,\n rule.where,\n problems,\n jwtShape,\n ends ? viewerNode : undefined,\n ends,\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 const cacheHints = readCacheHints(userTypes, d(\"cacheControl\"), atType);\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 maxLimit: globalLimit.max,\n cacheHints,\n };\n // A @cypher mutation's write-set is unknown: @uniqueTogether types it\n // may write are checked by comparing every node of the type.\n for (const field of model.mutations) {\n const touched = uniqueTogetherTouched(model, field.statement);\n if (touched.length === 0) continue;\n warnings.push({\n type: \"Mutation\",\n field: field.name,\n message: `the statement may write ${touched.map((n) => n.name).join(\", \")} (@uniqueTogether): each call compares every node of ${touched.length === 1 ? \"that type\" : \"those types\"} after the statement (a scan); a generated mutation checks only the nodes it writes`,\n });\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\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","// 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 (raw) => {\n const span = quiet(raw);\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\", (raw) => body(quiet(raw)))\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\n/**\n * `span` with every call guarded: observers must not fail the request. A\n * span that throws when it ends (an exporter that is down) would\n * otherwise turn a committed write into an error.\n */\nfunction quiet(span: SpanLike): SpanLike {\n const guard =\n <A extends unknown[]>(call: (...args: A) => unknown) =>\n (...args: A): void => {\n try {\n call(...args);\n } catch {\n // Dropped: the request's outcome is the database's, not the tracer's.\n }\n };\n return {\n setAttribute: guard((key, value) => span.setAttribute(key, value)),\n setStatus: guard((status) => span.setStatus(status)),\n recordException: guard((exception) => span.recordException(exception)),\n end: guard(() => span.end()),\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","// The check of `@customResolver(requires:)` selections against the\n// generated schema, made once when the schema is built.\n\nimport {\n Kind,\n parse,\n specifiedRules,\n validate,\n type DocumentNode,\n type GraphQLSchema,\n type OperationDefinitionNode,\n} from \"graphql\";\nimport { ModelError } from \"../errors.js\";\nimport type { GraphModel, NodeType } from \"../model/types.js\";\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 */\nexport function checkCustomRequires(\n model: GraphModel,\n schema: GraphQLSchema,\n): 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","// How an error thrown while a root field runs reaches the client: mapped\n// to a request error where the package knows the cause, reported to\n// `onError` and masked (see `maskErrors`) when it is the database's own.\n\nimport { GraphQLError } from \"graphql\";\nimport { requestError } from \"../errors.js\";\nimport { mapWriteError } from \"../execute/mutate/errors.js\";\nimport type { GraphModel } from \"../model/types.js\";\nimport type { DatabaseErrorEvent } from \"../options.js\";\n\nexport interface DatabaseErrorEnv {\n model: GraphModel;\n /** Hide database error details from clients (the `maskErrors` option). */\n maskErrors: boolean;\n onError: ((event: DatabaseErrorEvent) => void) | undefined;\n}\n\n/** The error to throw for `err`, raised while `field` ran. */\nexport function databaseError(\n env: DatabaseErrorEnv,\n field: string,\n err: unknown,\n): unknown {\n let error: unknown;\n if (err instanceof GraphQLError) error = err;\n else {\n const mapped = mapWriteError(env.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 env.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 env.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 env.maskErrors && error.originalError\n ? new GraphQLError(error.message, { extensions: error.extensions })\n : error;\n}\n","// An operation's cache policy from the `@cacheControl` hints: what\n// `execute()` reports as `cacheControl` for a response cache or a\n// `Cache-Control` header to use.\n\nimport {\n getNamedType,\n getOperationAST,\n isCompositeType,\n isInterfaceType,\n isObjectType,\n Kind,\n type DocumentNode,\n type FragmentDefinitionNode,\n type GraphQLCompositeType,\n type GraphQLSchema,\n type SelectionSetNode,\n} from \"graphql\";\nimport type { CacheHint, GraphModel } from \"../model/types.js\";\nimport { names } from \"../schema/names.js\";\n\n/** How long an operation's result may be cached, and by whom. */\nexport interface CachePolicy {\n /** Seconds: the smallest `maxAge` among the fields it selects. */\n readonly maxAge: number;\n /** `PRIVATE` when any field it selects is. */\n readonly scope: \"PUBLIC\" | \"PRIVATE\";\n}\n\n/**\n * The policy of a query: every selected field takes its own hint, else\n * its type's (a generated wrapper, such as `<T>Connection`, `<T>Match` or\n * `<T>Aggregate`, takes T's), and the smallest `maxAge` wins. A scalar\n * takes its parent's. There is no policy, so nothing may be cached by\n * hint, when the operation is not a query, selects a declared type with no\n * hint, or a root field contributes none (an unhinted scalar `@cypher`\n * root, say).\n */\nexport function operationCachePolicy(\n schema: GraphQLSchema,\n model: GraphModel,\n document: DocumentNode,\n operationName: string | null | undefined,\n): CachePolicy | undefined {\n const hints = model.cacheHints;\n if (!hints || (hints.types.size === 0 && hints.fields.size === 0)) {\n return undefined;\n }\n const operation = getOperationAST(document, operationName);\n const root = schema.getQueryType();\n if (operation?.operation !== \"query\" || !root) return undefined;\n\n const fragments = new Map<string, FragmentDefinitionNode>();\n for (const d of document.definitions) {\n if (d.kind === Kind.FRAGMENT_DEFINITION) fragments.set(d.name.value, d);\n }\n const declared = new Set<string>([\n ...model.nodes.keys(),\n ...model.abstracts.keys(),\n ...model.objects.keys(),\n ]);\n const wrapped = wrapperTypes(model);\n const typeHint = (name: string): CacheHint | undefined =>\n hints.types.get(wrapped.get(name) ?? name);\n\n let maxAge = Infinity;\n let scope: CachePolicy[\"scope\"] = \"PUBLIC\";\n let hinted = 0;\n const take = (hint: CacheHint) => {\n hinted++;\n maxAge = Math.min(maxAge, hint.maxAge);\n if (hint.scope === \"PRIVATE\") scope = \"PRIVATE\";\n };\n\n // False as soon as something is selected that no hint covers.\n const visit = (\n parent: GraphQLCompositeType,\n set: SelectionSetNode,\n isRoot: boolean,\n ): boolean => {\n for (const selection of set.selections) {\n if (selection.kind === Kind.FIELD) {\n const name = selection.name.value;\n if (name.startsWith(\"__\")) continue;\n if (!isObjectType(parent) && !isInterfaceType(parent)) continue;\n const field = parent.getFields()[name];\n if (!field) continue;\n const type = getNamedType(field.type);\n const before = hinted;\n const hint =\n model.cacheHints!.fields.get(`${parent.name}.${name}`) ??\n (isCompositeType(type) ? typeHint(type.name) : undefined);\n if (hint) take(hint);\n else if (isCompositeType(type) && declared.has(type.name)) return false;\n if (\n selection.selectionSet &&\n isCompositeType(type) &&\n !visit(type, selection.selectionSet, false)\n ) {\n return false;\n }\n if (isRoot && hinted === before) return false;\n continue;\n }\n const condition =\n selection.kind === Kind.INLINE_FRAGMENT\n ? selection.typeCondition\n : fragments.get(selection.name.value)?.typeCondition;\n const target = condition ? schema.getType(condition.name.value) : parent;\n const body =\n selection.kind === Kind.INLINE_FRAGMENT\n ? selection.selectionSet\n : fragments.get(selection.name.value)?.selectionSet;\n if (!body || !isCompositeType(target)) continue;\n if (!visit(target, body, isRoot)) return false;\n }\n return true;\n };\n if (!visit(root, operation.selectionSet, true) || hinted === 0) {\n return undefined;\n }\n return { maxAge, scope };\n}\n\n/** The generated types that stand for a node or abstract type: name → its type. */\nfunction wrapperTypes(model: GraphModel): Map<string, string> {\n const out = new Map<string, string>();\n for (const type of [...model.nodes.keys(), ...model.abstracts.keys()]) {\n for (const wrap of [\n names.connection,\n names.edge,\n names.aggregate,\n names.match,\n names.searchConnection,\n names.searchEdge,\n ]) {\n out.set(wrap(type), type);\n }\n }\n return out;\n}\n","// The documents a `LoraGraphQL` instance runs: sources parsed and\n// validated once and cached by text, and persisted operations by id.\n\nimport {\n GraphQLError,\n Kind,\n parse,\n specifiedRules,\n validate,\n type DocumentNode,\n type ExecutionResult,\n type GraphQLSchema,\n type OperationDefinitionNode,\n type ValidationRule,\n} from \"graphql\";\nimport type { OperationManifest } from \"../codegen.js\";\nimport { parseOptions, type DocumentGuards } from \"../guards.js\";\nimport type { ExecuteArgs } from \"../options.js\";\n\nconst DOCUMENT_CACHE_SIZE = 500;\n/**\n * A parsed document's approximate size: measured at about 100 bytes of\n * AST, locations and tokens per source character.\n */\nconst documentBytes = (source: string) => 100 * source.length;\n\nexport interface DocumentsOptions {\n guards: DocumentGuards | false;\n persistedOnly: boolean;\n /** Approximate bytes the parsed document cache may hold. */\n bytesMax: number;\n /** The executable schema, built on first use. */\n schema: () => GraphQLSchema;\n /** The configured document guards as validation rules. */\n rules: () => ValidationRule[];\n}\n\nexport class Documents {\n readonly #guards: DocumentGuards | false;\n readonly #persistedOnly: boolean;\n readonly #schema: () => GraphQLSchema;\n readonly #rules: () => ValidationRule[];\n /** Persisted operation ids by operation node, for statement events. */\n readonly #persistedIds = new WeakMap<OperationDefinitionNode, string>();\n readonly #documents = new Map<string, DocumentNode>();\n readonly #persisted = new Map<string, DocumentNode>();\n readonly #documentBytesMax: number;\n #documentBytes = 0;\n\n constructor(options: DocumentsOptions) {\n this.#guards = options.guards;\n this.#persistedOnly = options.persistedOnly;\n this.#documentBytesMax = options.bytesMax;\n this.#schema = options.schema;\n this.#rules = options.rules;\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.#schema(), document, [\n ...specifiedRules,\n ...this.#rules(),\n ]);\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 /** Register a manifest's operations, without parsing or validating. */\n load(manifest: OperationManifest): void {\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 /** A persisted operation's document, by id. */\n persisted(id: string): DocumentNode | undefined {\n return this.#persisted.get(id);\n }\n\n /** The persisted id an operation node was registered under. */\n persistedId(operation: OperationDefinitionNode): string | undefined {\n return this.#persistedIds.get(operation);\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 // Least recently used goes first: a hit moves to the back.\n this.#documents.delete(args.source);\n this.#documents.set(args.source, document);\n } else {\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 const bytes = documentBytes(args.source);\n if (bytes <= this.#documentBytesMax) {\n while (\n this.#documents.size > 0 &&\n (this.#documents.size >= DOCUMENT_CACHE_SIZE ||\n this.#documentBytes + bytes > this.#documentBytesMax)\n ) {\n const oldest = this.#documents.keys().next().value!;\n this.#documents.delete(oldest);\n this.#documentBytes -= documentBytes(oldest);\n }\n this.#documents.set(args.source, document);\n this.#documentBytes += bytes;\n }\n }\n } else {\n return {\n errors: [new GraphQLError(\"a source or an id is needed\")],\n };\n }\n return document;\n }\n}\n","// What one operation may spend: the estimated cost charged to it (per\n// execution, or per event of a subscription) against `maxCost` or the\n// request's `budget`, and the deadline and statement slots its root\n// fields share (see `execute/budget.ts`).\n\nimport type { GraphQLResolveInfo, OperationDefinitionNode } from \"graphql\";\nimport { requestError } from \"../errors.js\";\nimport { OperationBudget } from \"../execute/budget.js\";\nimport type { LoraGraphQLOptions } from \"../options.js\";\n\nexport interface OperationLimitsOptions {\n operationTimeoutMs: number;\n maxConcurrentStatements: number;\n maxCost: number;\n budget: LoraGraphQLOptions[\"budget\"];\n onCost: LoraGraphQLOptions[\"onCost\"];\n}\n\nexport class OperationLimits {\n readonly #operationTimeoutMs: number;\n readonly #maxConcurrentStatements: number;\n /** Deadline and statement slots per request context and operation. */\n readonly #operations = new WeakMap<\n object,\n Map<OperationDefinitionNode, OperationBudget>\n >();\n readonly #maxCost: number;\n /**\n * Estimated cost spent per execution: keyed by `execute()`'s root value,\n * else by graphql-js's per-execution variable values, never by the\n * context, which a server may reuse across requests.\n */\n readonly #spent = new WeakMap<object, number>();\n /** Root values `execute()` made, one per execution. */\n readonly #executions = new WeakSet<object>();\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 #budget: LoraGraphQLOptions[\"budget\"];\n readonly #onCost: LoraGraphQLOptions[\"onCost\"];\n\n constructor(options: OperationLimitsOptions) {\n this.#operationTimeoutMs = options.operationTimeoutMs;\n this.#maxConcurrentStatements = options.maxConcurrentStatements;\n this.#maxCost = options.maxCost;\n this.#budget = options.budget;\n this.#onCost = options.onCost;\n }\n\n /** Mark `execution` as a root value `execute()` made. */\n track(execution: object): void {\n this.#executions.add(execution);\n }\n\n /** The estimated cost charged to an execution so far. */\n spent(execution: object): number | undefined {\n return this.#spent.get(execution);\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) {\n const root: unknown = info.rootValue;\n const execution: unknown =\n root !== null && typeof root === \"object\" && this.#executions.has(root)\n ? root\n : info.variableValues;\n if (execution !== null && typeof execution === \"object\") {\n total = (this.#spent.get(execution) ?? 0) + cost;\n this.#spent.set(execution, total);\n }\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 /**\n * The deadline and statement slots of the query `info` belongs to,\n * started by its first root field. Subscriptions run indefinitely and\n * are bounded per statement only.\n */\n operationBudget(\n context: unknown,\n info: GraphQLResolveInfo | undefined,\n ): OperationBudget | undefined {\n if (!info || info.operation.operation === \"subscription\") return undefined;\n if (context === null || typeof context !== \"object\") return undefined;\n let byOperation = this.#operations.get(context);\n if (!byOperation) {\n byOperation = new Map();\n this.#operations.set(context, byOperation);\n }\n let budget = byOperation.get(info.operation);\n if (!budget) {\n budget = new OperationBudget(\n this.#operationTimeoutMs,\n this.#maxConcurrentStatements,\n );\n byOperation.set(info.operation, budget);\n }\n budget.active++;\n return budget;\n }\n\n /**\n * A root field is done. When none is left in flight after the current\n * turn (graphql-js starts a query's root fields together, and the next\n * root field of a mutation in a microtask), the operation is over: a\n * context reused for another request starts a fresh budget.\n */\n leaveOperation(\n context: object,\n info: GraphQLResolveInfo,\n budget: OperationBudget,\n ): void {\n budget.active--;\n if (budget.active > 0) return;\n setTimeout(() => {\n if (budget.active > 0) return;\n budget.dispose();\n const byOperation = this.#operations.get(context);\n if (byOperation?.get(info.operation) === budget) {\n byOperation.delete(info.operation);\n }\n }, 0);\n }\n}\n","// Helpers for reading a request: which operation a document selects and\n// what kind it is, which root field of the model a field name stands for,\n// and the selection context of a resolver call.\n\nimport {\n getOperationAST,\n GraphQLError,\n Kind,\n type DocumentNode,\n type ExecutionResult,\n type GraphQLResolveInfo,\n type OperationDefinitionNode,\n} from \"graphql\";\nimport type { RootKind } from \"../compile/read/types.js\";\nimport type { SelectionContext } from \"../compile/selection.js\";\nimport type { QueryResult, Statement } from \"../driver.js\";\nimport type { LoraTransaction } from \"../execute/transaction.js\";\nimport type { GraphModel, NodeType, SearchIndex } from \"../model/types.js\";\nimport { names } from \"../schema/names.js\";\n\n/** The read root field of a node type that `fieldName` names, if any. */\nexport function rootOf(\n model: GraphModel,\n fieldName: string,\n): { kind: RootKind; node: NodeType } | undefined {\n for (const node of 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\nexport function searchOf(\n model: GraphModel,\n fieldName: string,\n): { node: NodeType; index: SearchIndex; connection: boolean } | undefined {\n for (const node of 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/**\n * A mutation with several root fields; a fragment at the root counts as\n * several, since it may hold more than one.\n */\nexport function multiRoot(operation: OperationDefinitionNode): boolean {\n const selections = operation.selectionSet.selections;\n return (\n selections.length +\n (selections.some((s) => s.kind !== Kind.FIELD) ? 1 : 0) >\n 1\n );\n}\n\nexport function 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 */\nexport function 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/** A variable graphql-js could not coerce: a request error with no code. */\nexport function isVariableError(e: GraphQLError): boolean {\n return (\n e.extensions?.[\"code\"] === undefined &&\n e.path === undefined &&\n e.message.startsWith('Variable \"$')\n );\n}\n\nexport function 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\nexport function infoContext(info: GraphQLResolveInfo): SelectionContext {\n return {\n schema: info.schema,\n fragments: info.fragments,\n variables: info.variableValues,\n };\n}\n\n/** Run statements one after the other in a caller-owned transaction. */\nexport async 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","// Request timing (the `timing` option): per-root-field entries collected\n// while a request runs, reported as `extensions.timing`.\n\nimport type { GraphQLResolveInfo } from \"graphql\";\n\n/** A request's timing entry for a root field, created on first use. */\nexport function 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. */\nexport function rootKey(\n info: GraphQLResolveInfo | undefined,\n): 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. */\nexport const ms = (value: number) => Math.round(value * 100) / 100;\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\n/**\n * A value this scalar refuses. Coded here, so that it is BAD_USER_INPUT\n * whichever way it arrived: as a variable, as a literal in the document\n * (which fails GraphQL validation, before any resolver), through\n * `execute()` or through another server on `getSchema()`.\n */\nexport function badInput(message: string, nodes?: ValueNode): GraphQLError {\n return new GraphQLError(message, {\n ...(nodes ? { nodes } : {}),\n extensions: { code: \"BAD_USER_INPUT\" },\n });\n}\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 badInput(`${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 badInput(`${name} must be an ISO-8601 string`, ast);\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\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 badInput(\"BigInt must be an integer or a decimal string\");\n}\n\n// The Node binding types a JavaScript number as an INTEGER only inside\n// [-2^31, 2^32): a larger one, although an integer, is stored as a FLOAT.\n// So only values in that range travel as numbers, and the rest as bigint,\n// which the binding always takes as an INTEGER.\nconst NUMBER_MIN = -(2n ** 31n);\nconst NUMBER_END = 2n ** 32n;\n\nfunction toParam(n: bigint): number | bigint {\n return n >= NUMBER_MIN && n < NUMBER_END ? 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 badInput(\"BigInt must be an integer or a decimal string\", ast);\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","// The types every part of the schema builds on: the fixed ones (sort\n// direction, page info, points), the model's enums and custom scalars,\n// and the GraphQL type of a stored field.\n\nimport {\n GraphQLError,\n GraphQLBoolean,\n GraphQLEnumType,\n GraphQLFloat,\n GraphQLID,\n GraphQLInputObjectType,\n GraphQLInt,\n GraphQLInterfaceType,\n GraphQLList,\n GraphQLNonNull,\n GraphQLObjectType,\n GraphQLString,\n type GraphQLInputType,\n type GraphQLOutputType,\n GraphQLScalarType,\n} from \"graphql\";\nimport type { GraphModel, ScalarField, ScalarType } from \"../model/types.js\";\nimport type { SchemaHooks } from \"./hooks.js\";\nimport { CUSTOM_SCALARS } from \"./scalars.js\";\n\nexport const nonNull = <T extends GraphQLOutputType | GraphQLInputType>(t: T) =>\n new GraphQLNonNull(t);\nexport const listOf = <T extends GraphQLOutputType | GraphQLInputType>(t: T) =>\n new GraphQLList(t);\n\nexport function buildBaseTypes(model: GraphModel, hooks: SchemaHooks) {\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 // A value the implementation refuses is BAD_USER_INPUT, as a\n // literal and as a variable, like the built-in scalars.\n const config = given.toConfig();\n const coded =\n <A extends unknown[], R>(parse: (...args: A) => R) =>\n (...args: A): R => {\n try {\n return parse(...args);\n } catch (err) {\n if (\n err instanceof GraphQLError &&\n err.extensions[\"code\"] === undefined\n ) {\n throw new GraphQLError(err.message, {\n ...(err.nodes ? { nodes: err.nodes } : {}),\n originalError: err,\n extensions: { ...err.extensions, code: \"BAD_USER_INPUT\" },\n });\n }\n if (err instanceof GraphQLError) throw err;\n throw new GraphQLError(\n err instanceof Error ? err.message : String(err),\n {\n originalError: err instanceof Error ? err : undefined,\n extensions: { code: \"BAD_USER_INPUT\" },\n },\n );\n }\n };\n t = new GraphQLScalarType({\n ...config,\n description: documented ?? config.description,\n parseValue: coded(config.parseValue),\n parseLiteral: coded(config.parseLiteral),\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 return {\n sortDirection,\n pageInfo,\n countFilter,\n enums,\n nodeInterface,\n customScalar,\n scalarType,\n baseType,\n scalarOutput,\n };\n}\n\nexport type BaseTypes = ReturnType<typeof buildBaseTypes>;\n","// Aggregates: which fields take part, the `{ min max avg sum }` type per\n// scalar, and the aggregate and group types of @query(aggregate: true)\n// nodes.\n\nimport {\n GraphQLEnumType,\n GraphQLFloat,\n GraphQLInt,\n GraphQLObjectType,\n type GraphQLFieldConfigMap,\n GraphQLScalarType,\n} from \"graphql\";\nimport type { GraphModel, ScalarField } from \"../model/types.js\";\nimport { nonNull, type BaseTypes } from \"./base.js\";\nimport { names } from \"./names.js\";\n\n/** Fields whose values can be aggregated: ordered scalars, not lists. */\nexport 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);\nexport const isNumeric = (f: ScalarField) =>\n f.type === \"Int\" || f.type === \"Float\" || f.type === \"BigInt\";\n\n/** The memoized `<Scalar>Aggregate` type of a field, shared by every aggregate. */\nexport function buildAggregateFieldType(base: BaseTypes) {\n const { scalarType } = base;\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 return aggregateFieldType;\n}\n\nexport type AggregateFieldType = ReturnType<typeof buildAggregateFieldType>;\n\nexport function buildAggregates(\n model: GraphModel,\n base: BaseTypes,\n aggregateFieldType: AggregateFieldType,\n) {\n const { scalarType } = base;\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 return { aggregates, groups };\n}\n\nexport type AggregateTypes = ReturnType<typeof buildAggregates>;\n","// The `where` inputs: one filter per @filterable field, relationship\n// quantifiers, connection filters over relationship properties, and\n// filters on aggregates of related nodes.\n\nimport {\n GraphQLBoolean,\n GraphQLEnumType,\n GraphQLFloat,\n GraphQLInputObjectType,\n GraphQLInt,\n GraphQLString,\n type GraphQLInputFieldConfigMap,\n type GraphQLInputType,\n GraphQLScalarType,\n} from \"graphql\";\nimport type {\n FilterOperator,\n GraphModel,\n NodeType,\n RelationshipField,\n RelationshipPropertiesType,\n ScalarField,\n} from \"../model/types.js\";\nimport { aggregatable, isNumeric } from \"./aggregates.js\";\nimport { listOf, nonNull, type BaseTypes } from \"./base.js\";\nimport { names } from \"./names.js\";\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 buildFilters(model: GraphModel, base: BaseTypes) {\n const { countFilter, scalarType, baseType } = base;\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 if (op === \"INCLUDES\") {\n fields[\"includesAny\"] = {\n type: listOf(nonNull(base)),\n description:\n \"The list contains any of these values. Seeks each value in the list's index.\",\n };\n }\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) {\n fields[`${f.name}Exists`] = {\n type: GraphQLBoolean,\n description: `true: ${f.name} is set; false: it is not (a related ${f.target} the reader can't see counts as none).`,\n };\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 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 return { inputTypeOf, whereOf, polymorphic, connectionWhere };\n}\n\nexport type Filters = ReturnType<typeof buildFilters>;\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","// Resolvers shared by the generated types: values are read under their\n// response keys (the compiler projects each alias), failing on what a\n// READ rule refused, and connection pages come out in the requested order.\n\nimport type { GraphQLFieldResolver, GraphQLResolveInfo } from \"graphql\";\nimport type { RawConnection, RawEdge } from \"../compile/read/types.js\";\nimport { requestError } from \"../errors.js\";\nimport { assertReadable } from \"./guard.js\";\n\nexport type SortedEdge = RawEdge & { __sort: string };\n\n/** The rows of a page in the requested order. */\nexport function pageOf(src: RawConnection): RawEdge[] {\n const page = src.__rows.slice(0, src.__first);\n return src.__backward ? page.reverse() : page;\n}\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. */\nexport const byResponseKey: 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 value;\n};\n\n/** A stored VECTOR as its numbers. */\nexport const 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. */\nexport const 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","// The output side: interfaces and unions, one object and connection per\n// @node type, relationship connections with their properties and\n// aggregates, and the types and arguments of @cypher fields.\n\nimport {\n GraphQLID,\n GraphQLInputObjectType,\n GraphQLInt,\n GraphQLInterfaceType,\n GraphQLObjectType,\n GraphQLString,\n GraphQLUnionType,\n type GraphQLFieldConfig,\n type GraphQLFieldConfigArgumentMap,\n type GraphQLFieldConfigMap,\n type GraphQLInputType,\n type GraphQLOutputType,\n} from \"graphql\";\nimport { encodeCursor } from \"../compile/cursor.js\";\nimport type { RawConnection, RawEdge } from \"../compile/read/types.js\";\nimport { requestError } from \"../errors.js\";\nimport type {\n CypherField,\n GraphModel,\n NodeType,\n RelationshipField,\n RelationshipPropertiesType,\n ScalarField,\n ScalarType,\n} from \"../model/types.js\";\nimport { aggregatable, type AggregateFieldType } from \"./aggregates.js\";\nimport { listOf, nonNull, type BaseTypes } from \"./base.js\";\nimport type { Filters } from \"./filters.js\";\nimport { toGlobalId } from \"./global-id.js\";\nimport { assertReadable } from \"./guard.js\";\nimport type { SchemaHooks } from \"./hooks.js\";\nimport { hasOwnConnection, names } from \"./names.js\";\nimport {\n byResponseKey,\n nodesByResponseKey,\n pageOf,\n vectorByResponseKey,\n type SortedEdge,\n} from \"./resolvers.js\";\nimport type { Sorts } from \"./sorts.js\";\n\nexport function buildObjects(\n model: GraphModel,\n hooks: SchemaHooks,\n base: BaseTypes,\n filters: Filters,\n sorts: Sorts,\n aggregateFieldType: AggregateFieldType,\n) {\n const {\n sortDirection,\n pageInfo,\n enums,\n nodeInterface,\n customScalar,\n baseType,\n scalarOutput,\n } = base;\n const { whereOf, polymorphic, connectionWhere } = filters;\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 return {\n objects,\n connections,\n abstractTypes,\n plainObjects,\n connectionResolvers,\n listArgs,\n connectionArgs,\n cypherOutput,\n cypherArgs,\n };\n}\n\nexport type ObjectTypes = ReturnType<typeof buildObjects>;\n","// The Query fields: list, connection, single, aggregate and grouped roots\n// per readable @node type, search over its indexes, Relay's node / nodes,\n// interface and union roots, and top-level @cypher queries.\n\nimport {\n GraphQLFloat,\n GraphQLID,\n GraphQLInt,\n GraphQLObjectType,\n GraphQLString,\n type GraphQLFieldConfigMap,\n type GraphQLFieldResolver,\n type GraphQLInputType,\n} from \"graphql\";\nimport { encodeCursor } from \"../compile/cursor.js\";\nimport type { RootKind } from \"../compile/read/types.js\";\nimport type { SearchResult } from \"../compile/read/search.js\";\nimport { requestError } from \"../errors.js\";\nimport { MAX_LIMIT } from \"../model/build/limits.js\";\nimport type { GraphModel, NodeType } from \"../model/types.js\";\nimport type { AggregateTypes } from \"./aggregates.js\";\nimport { listOf, nonNull, type BaseTypes } from \"./base.js\";\nimport type { Filters } from \"./filters.js\";\nimport { assertReadable } from \"./guard.js\";\nimport type { SchemaHooks } from \"./hooks.js\";\nimport { names } from \"./names.js\";\nimport type { ObjectTypes } from \"./objects.js\";\nimport type { SortedEdge } from \"./resolvers.js\";\n\nexport function buildQuery(\n model: GraphModel,\n hooks: SchemaHooks,\n base: BaseTypes,\n filters: Filters,\n objectTypes: ObjectTypes,\n aggregateTypes: AggregateTypes,\n) {\n const { resolveRoot, resolveNode } = hooks;\n const { pageInfo, nodeInterface, scalarType } = base;\n const { whereOf } = filters;\n const {\n objects,\n connections,\n abstractTypes,\n connectionResolvers,\n listArgs,\n connectionArgs,\n cypherOutput,\n cypherArgs,\n } = objectTypes;\n const { aggregates, groups } = aggregateTypes;\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 (or in \\`sort\\` order), 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 // `sort` orders the matches by the type's @sortable fields instead\n // of by score.\n const sortArg = listArgs(node.name)[\"sort\"];\n const sort = sortArg ? { sort: sortArg } : {};\n for (const index of node.search) {\n const common = {\n where: { type: whereOf(node.name) },\n ...sort,\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 ...sort,\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 const maxIds = model.maxLimit ?? MAX_LIMIT;\n query[\"nodes\"] = {\n type: nonNull(listOf(nodeInterface)),\n description: `Fetch objects by their global ids, at most ${maxIds}: one entry per id, in order, null where an id is unknown or not readable.`,\n args: { ids: { type: nonNull(listOf(nonNull(GraphQLID))) } },\n resolve: (_src, args, context, info) => {\n const ids = (args as { ids: string[] }).ids;\n if (ids.length > maxIds) {\n throw requestError(\n \"BAD_USER_INPUT\",\n `nodes: takes at most ${maxIds} ids, got ${ids.length}`,\n );\n }\n // Each id resolves as node(id:) does, its type's READ rules\n // included: a filtered-out node is null, and an error (a failed\n // validate rule) nulls its own entry only.\n return ids.map((id) => resolveNode(id, info, context));\n },\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 return query;\n}\n","// The `sort` inputs: one per @node type and per interface with @sortable\n// fields, by type name.\n\nimport {\n GraphQLInputObjectType,\n type GraphQLInputFieldConfigMap,\n} from \"graphql\";\nimport type { GraphModel } from \"../model/types.js\";\nimport type { BaseTypes } from \"./base.js\";\nimport { names } from \"./names.js\";\n\nexport function buildSorts(model: GraphModel, base: BaseTypes) {\n const { sortDirection } = base;\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 return sorts;\n}\n\nexport type Sorts = ReturnType<typeof buildSorts>;\n","// The Subscription fields: `<type>Changed` per @node type with\n// @subscription, its change event, and the previous state of the node.\n\nimport {\n GraphQLEnumType,\n GraphQLObjectType,\n GraphQLString,\n type GraphQLFieldConfigMap,\n type GraphQLInputType,\n type GraphQLOutputType,\n} from \"graphql\";\nimport { lowerFirst } from \"../model/build/shapes.js\";\nimport type { GraphModel, ScalarField } from \"../model/types.js\";\nimport { listOf, nonNull, type BaseTypes } from \"./base.js\";\nimport type { Filters } from \"./filters.js\";\nimport type { ChangeEvent, SchemaHooks } from \"./hooks.js\";\nimport type { ObjectTypes } from \"./objects.js\";\n\nexport function buildSubscriptions(\n model: GraphModel,\n hooks: SchemaHooks,\n base: BaseTypes,\n filters: Filters,\n objectTypes: ObjectTypes,\n) {\n const { scalarType, scalarOutput } = base;\n const { whereOf } = filters;\n const { objects } = objectTypes;\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 validate rules (they cannot be checked\n // after the write). Masks and @authentication apply on resolve.\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: (\n src: Record<string, unknown>,\n _args: unknown,\n context: unknown,\n ) =>\n hooks.previousValue(\n node,\n f,\n src[f.property] ?? null,\n context,\n ),\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 return subscription;\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 GraphQLObjectType,\n GraphQLSchema,\n type GraphQLFieldConfigMap,\n} from \"graphql\";\nimport { ModelError } from \"../errors.js\";\nimport type { GraphModel } from \"../model/types.js\";\nimport { buildAggregateFieldType, buildAggregates } from \"./aggregates.js\";\nimport { buildBaseTypes } from \"./base.js\";\nimport { buildFilters } from \"./filters.js\";\nimport type { SchemaHooks } from \"./hooks.js\";\nimport { buildMutations } from \"./mutations.js\";\nimport { buildObjects } from \"./objects.js\";\nimport { buildQuery } from \"./query.js\";\nimport { buildSorts } from \"./sorts.js\";\nimport { buildSubscriptions } from \"./subscriptions.js\";\n\nexport function buildSchema(\n model: GraphModel,\n hooks: SchemaHooks,\n): GraphQLSchema {\n const base = buildBaseTypes(model, hooks);\n const filters = buildFilters(model, base);\n const { inputTypeOf, whereOf } = filters;\n const sorts = buildSorts(model, base);\n // Made here, before the objects whose connection aggregates use it.\n const aggregateFieldType = buildAggregateFieldType(base);\n const objectTypes = buildObjects(\n model,\n hooks,\n base,\n filters,\n sorts,\n aggregateFieldType,\n );\n const { objects, abstractTypes, plainObjects, cypherOutput, cypherArgs } =\n objectTypes;\n const aggregateTypes = buildAggregates(model, base, aggregateFieldType);\n\n const query = buildQuery(\n model,\n hooks,\n base,\n filters,\n objectTypes,\n aggregateTypes,\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 = buildSubscriptions(\n model,\n hooks,\n base,\n filters,\n objectTypes,\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","// 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/by-keys.js\";\nimport type {\n GraphModel,\n NodeType,\n RelationshipField,\n} from \"../model/types.js\";\nimport { isOutboxProperty } from \"../events/outbox.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 // A worker's delivery-state write changes nothing a client can see.\n if (c.kind === \"nodeUpdated\" && outboxOnly(c)) continue;\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/** Whether an update set or removed only delivery-state properties. */\nfunction outboxOnly(change: DriverChange): boolean {\n const keys = [...(change.setKeys ?? []), ...(change.removedKeys ?? [])];\n return (\n keys.length > 0 &&\n keys.every(isOutboxProperty) &&\n (change.addedLabels ?? []).length === 0 &&\n (change.removedLabels ?? []).length === 0\n );\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","// Where committed writes go: the `onWrite` listeners, the `changes()`\n// iterators and the subscriptions' dispatcher, fed by this instance's\n// mutations or, with `changeFeed`, by the engine's change feed.\n\nimport type { LoraDriver } from \"../driver.js\";\nimport { requestError } from \"../errors.js\";\nimport type { WriteChange } from \"../execute/changes.js\";\nimport { EngineFeed } from \"../execute/feed.js\";\nimport type { GraphModel } from \"../model/types.js\";\nimport type { LoraGraphQLOptions } from \"../options.js\";\n\nexport interface ChangeHubOptions {\n driver: LoraDriver;\n model: GraphModel;\n /** The `changeFeed` option. */\n changeFeed: boolean | undefined;\n /** The `maxQueuedChanges` option, defaulted. */\n maxQueued: number;\n onError: LoraGraphQLOptions[\"onError\"];\n /**\n * The owning instance's public `onWrite`: `changes()` and the\n * subscriptions register through it, like any other listener.\n */\n onWrite: (listener: (change: WriteChange) => void) => () => void;\n}\n\nexport class ChangeHub {\n readonly #maxQueued: number;\n readonly #onWrite: ChangeHubOptions[\"onWrite\"];\n readonly #listeners = new Set<(change: WriteChange) => void>();\n /** Consumers of `changes()` when the engine feed is on. */\n readonly #feedListeners = new Set<(change: WriteChange) => void>();\n readonly #feed: EngineFeed | undefined;\n #feedReady: Promise<void> | undefined;\n\n constructor(options: ChangeHubOptions) {\n this.#maxQueued = options.maxQueued;\n this.#onWrite = options.onWrite;\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 options.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 options.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 }\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 * Register a consumer of committed writes: of the engine feed when it\n * is on, else of this instance's mutations. Returns its removal.\n */\n listen(listener: (change: WriteChange) => void): () => unknown {\n if (this.#feed) {\n this.#feedListeners.add(listener);\n return () => this.#feedListeners.delete(listener);\n }\n return this.#onWrite(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>(\n (listener) => this.listen(listener),\n options,\n );\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 /** Hand a committed mutation's write-set to the `onWrite` listeners. */\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 /** Stop the engine change feed (with `changeFeed: true`). */\n close(): void {\n this.#feed?.stop();\n this.#feedReady = undefined;\n }\n}\n","// The events a subscriber receives, built from a write-set: one per node\n// of a type, plus CONNECT / DISCONNECT events when the type offers them.\n\nimport { keyOf } from \"../compile/read/by-keys.js\";\nimport type { WriteChange } from \"../execute/changes.js\";\nimport type { NodeType } from \"../model/types.js\";\nimport type { ChangeEvent } from \"../schema/hooks.js\";\n\n/** The write an event came from, for reads shared across its subscribers. */\nexport const CHANGE = Symbol(\"change\");\n/** On a CONNECT / DISCONNECT event: whether its node owns the field. */\nexport const SELF_OWNS = Symbol(\"selfOwns\");\n\n/** A write's events for one node type, one per node, most specific first. */\nexport function changeEvents(\n change: WriteChange,\n node: NodeType,\n): 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 const event = 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 // The declaring field's owner is `from`: whose rules guard it.\n Object.defineProperty(event, SELF_OWNS, { value: self === r.from });\n events.push(event);\n }\n }\n }\n }\n return events;\n}\n","// Statements a subscription compiles once and runs for every change, with\n// one parameter (the changed keys) filled in per run.\n\nimport { lookupPath } from \"../compile/auth.js\";\nimport { stableKey } from \"../compile/cache.js\";\nimport type { Statement } from \"../driver.js\";\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 */\nexport interface 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\n/** A cached compile still holds for these `$context` values. */\nexport function 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 */\nexport function 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","// What a subscription's `where` costs: it runs on every change, so its\n// relationship filters are bounded in depth and charged once, up front.\n\nimport { requestError } from \"../errors.js\";\nimport type { GraphModel, NodeType } from \"../model/types.js\";\n\nexport interface FilterCostEnv {\n model: GraphModel;\n /** Measured maximum degrees, by `Owner.field` (see `analyze()`). */\n degrees: ReadonlyMap<string, number>;\n /** The `maxSubscriptionFilterDepth` option. */\n maxDepth: number;\n}\n\n/**\n * Estimated rows one changed node's `where` check touches: each\n * relationship filter scans the relationship (its measured degree, else\n * its cardinality, else a page of the target), times what it nests.\n * Nesting deeper than `maxSubscriptionFilterDepth` is LIMIT_EXCEEDED.\n */\nexport function filterCost(\n env: FilterCostEnv,\n node: NodeType,\n where: Record<string, unknown> | null | undefined,\n depth: number,\n): number {\n let cost = 0;\n for (const [key, value] of Object.entries(where ?? {})) {\n if (value === null || value === undefined) continue;\n if (key === \"AND\" || key === \"OR\") {\n for (const w of value as Array<Record<string, unknown>>) {\n cost += filterCost(env, node, w, depth);\n }\n continue;\n }\n if (key === \"NOT\") {\n cost += filterCost(env, node, value as Record<string, unknown>, depth);\n continue;\n }\n let field = node.fields.get(key);\n let shape: \"direct\" | \"connection\" | \"flat\" = \"direct\";\n if (!field) {\n for (const [suffix, s] of [\n [\"Connection\", \"connection\"],\n [\"Aggregate\", \"flat\"],\n [\"Exists\", \"flat\"],\n ] as const) {\n if (key.endsWith(suffix)) {\n field = node.fields.get(key.slice(0, -suffix.length));\n shape = s;\n break;\n }\n }\n }\n if (field?.kind !== \"relationship\") continue;\n if (depth + 1 > env.maxDepth) {\n throw requestError(\n \"LIMIT_EXCEEDED\",\n `a subscription's where may nest relationship filters ${env.maxDepth} deep (${node.name}.${key})`,\n );\n }\n const target = env.model.nodes.get(field.target);\n const fan = field.list\n ? Math.max(\n 1,\n env.degrees.get(`${field.owner}.${field.name}`) ??\n field.cardinality ??\n target?.limit.max ??\n 100,\n )\n : 1;\n let inner = 0;\n if (target && shape !== \"flat\" && typeof value === \"object\") {\n const parts: unknown[] = field.list\n ? Object.values(value as Record<string, unknown>)\n : [value];\n for (const part of parts) {\n if (part === null || typeof part !== \"object\") continue;\n const w =\n shape === \"connection\"\n ? (part as Record<string, unknown>)[\"node\"]\n : part;\n inner += filterCost(\n env,\n target,\n w as Record<string, unknown> | null | undefined,\n depth + 1,\n );\n }\n } else if (!target && shape !== \"flat\" && typeof value === \"object\") {\n // An abstract target: a filter by member (`{ Person: {...} }`) or\n // on the shared fields; the costliest member counts.\n const parts: unknown[] = field.list\n ? Object.values(value as Record<string, unknown>)\n : [value];\n for (const part of parts) {\n if (part === null || typeof part !== \"object\") continue;\n let worst = 0;\n for (const member of field.members) {\n const m = env.model.nodes.get(member);\n const p = part as Record<string, unknown>;\n const w = (shape === \"connection\" ? p[\"node\"] : p) as\n | Record<string, unknown>\n | null\n | undefined;\n if (!m || !w || typeof w !== \"object\") continue;\n const own = (w[member] ?? w) as Record<string, unknown>;\n worst = Math.max(worst, filterCost(env, m, own, depth + 1));\n }\n inner += worst;\n }\n }\n cost += fan * (1 + inner);\n }\n return cost;\n}\n","// Subscriptions: the subscribers of each node type, the delivery of every\n// committed change to those it concerns, and the checks that keep an\n// event from reaching a subscriber who may not read its node (visibility\n// after the write, deletions inside the deleting transaction, the related\n// node of a CONNECT / DISCONNECT).\n\nimport type { FieldNode, GraphQLResolveInfo, GraphQLSchema } from \"graphql\";\nimport {\n authFilter,\n authValidate,\n checkAuthentication,\n checkFieldAuthentication,\n fieldReadGuard,\n} from \"../compile/auth.js\";\nimport { stableKey } from \"../compile/cache.js\";\nimport { bind, type CompileContext } from \"../compile/context.js\";\nimport {\n and,\n bin,\n fn,\n lit,\n printClauses,\n prop,\n v,\n type Expr,\n} from \"../compile/cypher.js\";\nimport { compileNodeWhere } from \"../compile/filter.js\";\nimport { compileRoot } from \"../compile/read/root.js\";\nimport { keyOf } from \"../compile/read/by-keys.js\";\nimport { type CompiledRead } from \"../compile/read/types.js\";\nimport {\n coercedVariables,\n type SelectionContext,\n} from \"../compile/selection.js\";\nimport type { LoraDriver, QueryResult, Statement } from \"../driver.js\";\nimport { requestError } from \"../errors.js\";\nimport type { WriteChange } from \"../execute/changes.js\";\nimport type { GraphModel, NodeType } from \"../model/types.js\";\nimport type { LoraGraphQLContext } from \"../options.js\";\nimport { infoContext } from \"../runtime/request.js\";\nimport type { ChangeEvent } from \"../schema/hooks.js\";\nimport type { ChangeHub } from \"./change-hub.js\";\nimport {\n sameContextReads,\n slotCompile,\n type SubscriptionCompile,\n} from \"./compiles.js\";\nimport { CHANGE, changeEvents, SELF_OWNS } from \"./events.js\";\nimport { filterCost } from \"./filter-cost.js\";\n\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\n/** A subscription's visibility check (see `#visibleCheck`). */\ninterface VisibilityCheck {\n statement(keys: unknown[]): Statement;\n settled(): boolean;\n run(keys: unknown[], change: object): Promise<Set<string>>;\n}\n\n/** A subscriber whose DELETE events are checked inside the transaction. */\ninterface DeleteProbe {\n check: VisibilityCheck;\n}\n\ninterface SubscriberGroup {\n node: NodeType;\n all: Set<SubscriberSink>;\n byKey: Map<string, Set<SubscriberSink>>;\n}\n\n/**\n * What subscriptions need of the `LoraGraphQL` instance that owns them:\n * its limits, and the request machinery they share with queries.\n */\nexport interface SubscriptionHost {\n model: GraphModel;\n driver: LoraDriver;\n changes: ChangeHub;\n /** The `maxSubscriptions` option, defaulted. */\n maxSubscriptions: number;\n /** The `subscriptionScope` option, defaulted. */\n subscriptionScope: (context: unknown) => object | undefined;\n /** The `maxSubscriptionFilterDepth` option, defaulted. */\n maxSubscriptionFilterDepth: number;\n /** The `subscriptionTimeoutMs` option, defaulted. */\n subscriptionTimeoutMs: number;\n /** The executable schema. */\n schema(): GraphQLSchema;\n /** The request's verified claims. */\n jwt(context: unknown): Record<string, unknown> | undefined;\n /** A compile context for the request. */\n context(base: SelectionContext, context: unknown): CompileContext;\n /** Measured maximum degrees, by `Owner.field`. */\n degrees(): ReadonlyMap<string, number>;\n /** Bumped when statistics change. */\n statisticsVersion(): number;\n /** Charge `cost` to the operation; COST_EXCEEDED past its limit. */\n charge(field: string, cost: number, context: unknown): void;\n /** Run a compiled read as the root field `field`. */\n run(\n field: string,\n compiled: CompiledRead,\n context: unknown,\n info?: GraphQLResolveInfo,\n change?: object,\n shareKey?: string,\n ): Promise<unknown>;\n}\n\nexport class Subscriptions {\n readonly #host: SubscriptionHost;\n readonly #model: GraphModel;\n readonly #driver: LoraDriver;\n readonly #changes: ChangeHub;\n readonly #maxSubscriptions: number;\n readonly #subscriptionScope: (context: unknown) => object | undefined;\n readonly #maxSubscriptionFilterDepth: number;\n readonly #subscriptionTimeoutMs: number;\n /** Live subscriptions per scope. */\n readonly #subscriptionCounts = new WeakMap<object, number>();\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 /** Subscribers following a key whose deletions need a check. */\n readonly #probes = new WeakMap<SubscriberSink, DeleteProbe>();\n /** Per change: the doomed keys each probed subscriber could read. */\n readonly #deleteSeen = new WeakMap<\n WriteChange,\n Map<DeleteProbe, Set<string>>\n >();\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 /**\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\n constructor(host: SubscriptionHost) {\n this.#host = host;\n this.#model = host.model;\n this.#driver = host.driver;\n this.#changes = host.changes;\n this.#maxSubscriptions = host.maxSubscriptions;\n this.#subscriptionScope = host.subscriptionScope;\n this.#maxSubscriptionFilterDepth = host.maxSubscriptionFilterDepth;\n this.#subscriptionTimeoutMs = host.subscriptionTimeoutMs;\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 and could read the node before it went (checked in\n * the deleting transaction).\n */\n subscribe(\n node: NodeType,\n args: Record<string, unknown>,\n context: unknown,\n ): AsyncIterableIterator<ChangeEvent> {\n const base: SelectionContext = {\n schema: this.#host.schema(),\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.#host.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 // `where` runs on every change: bound its nesting, charge it once.\n const field = `${node.name[0]!.toLowerCase()}${node.name.slice(1)}Changed`;\n const where = args[\"where\"] as Record<string, unknown> | null | undefined;\n this.#host.charge(\n field,\n 1 +\n filterCost(\n {\n model: this.#model,\n degrees: this.#host.degrees(),\n maxDepth: this.#maxSubscriptionFilterDepth,\n },\n node,\n where,\n 0,\n ),\n context,\n );\n const scope = this.#subscriptionScope(context);\n const live = scope ? (this.#subscriptionCounts.get(scope) ?? 0) : 0;\n if (scope && live >= this.#maxSubscriptions) {\n throw requestError(\n \"LIMIT_EXCEEDED\",\n `at most ${this.#maxSubscriptions} subscriptions at a time`,\n );\n }\n if (scope) this.#subscriptionCounts.set(scope, live + 1);\n let counted = !!scope;\n const release = () => {\n if (!counted || !scope) return;\n counted = false;\n const n = (this.#subscriptionCounts.get(scope) ?? 1) - 1;\n if (n > 0) this.#subscriptionCounts.set(scope, n);\n else this.#subscriptionCounts.delete(scope);\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 release();\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 related = (events: ChangeEvent[]) =>\n this.#relatedVisible(node, events, base, context, signal);\n // A deleted node cannot be checked after the fact: a follower of its\n // key without a `where` is checked inside the deleting transaction,\n // on the node as it was; other checked subscribers get no deletions.\n const probe: DeleteProbe | undefined =\n visible && key != null && !where && wanted.has(\"DELETE\")\n ? { check: visible }\n : undefined;\n const deliveries = this.#changes.queue<SubscriberDelivery>(\n (sink) =>\n this.#addSubscriber(\n node,\n key == null ? undefined : keyOf(key),\n sink,\n probe,\n ),\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 const probed = probe && this.#deleteSeen.get(change)?.get(probe);\n const deletions = events.filter(\n (e) =>\n e.operation === \"DELETE\" &&\n (!check ||\n (probe !== undefined &&\n (probed?.has(keyOf(e.key)) ?? probe.check.settled()))),\n );\n const live = events.filter((e) => e.operation !== \"DELETE\");\n const seen = visible\n ? await visible.run(\n live.map((e) => e.key),\n change,\n )\n : undefined;\n const relationships = live.filter(\n (e) =>\n e.relationship !== undefined && (!seen || seen.has(keyOf(e.key))),\n );\n const named =\n relationships.length > 0\n ? await related(relationships)\n : new Set<ChangeEvent>();\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 if (event.relationship && !named.has(event)) continue;\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 probe?: DeleteProbe,\n ): () => void {\n if (probe) this.#probes.set(sink, probe);\n // One listener serves every subscriber, registered while any exist.\n if (!this.#undispatch) {\n const dispatch = (change: WriteChange) => this.#dispatch(change);\n this.#undispatch = this.#changes.listen(dispatch);\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. `statement` gives the check for\n * other uses (a deletion is checked inside its transaction); `settled`\n * says whether the claims alone grant reading every node of the type.\n */\n #visibleCheck(\n node: NodeType,\n where: Record<string, unknown> | null | undefined,\n base: SelectionContext,\n context: unknown,\n ): VisibilityCheck {\n let cached:\n | (SubscriptionCompile<Statement> & { settled: boolean })\n | undefined;\n const compile = () => {\n const claims = stableKey(this.#host.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.#host.context(base, context);\n const slot: unknown[] = [];\n const rules = and(\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 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 rules,\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 = {\n ...slotCompile(\n { text, params: ctx.params },\n slot,\n claims,\n 0,\n undefined,\n ctx.contextReads,\n )!,\n settled: rules === undefined,\n };\n cached = claims === undefined ? undefined : entry;\n }\n return entry;\n };\n const statement = (keys: unknown[]) => {\n const entry = compile();\n return {\n statement: {\n text: entry.compiled.text,\n params: { ...entry.compiled.params, [entry.param]: keys },\n },\n share:\n entry.share === undefined\n ? undefined\n : `${entry.share}\\0${keys.map(keyOf).join(\"\\0\")}`,\n };\n };\n return {\n statement: (keys) => statement(keys).statement,\n settled: () => {\n try {\n return compile().settled;\n } catch {\n return false;\n }\n },\n run: async (keys, change) => {\n if (keys.length === 0) return new Set();\n const { statement: s, share } = statement(keys);\n const statements = [s];\n const [result] = await this.shared(\n change,\n statements,\n () =>\n this.#driver.run(statements, {\n mode: \"read\",\n timeoutMs: this.#subscriptionTimeoutMs,\n verified: true,\n }),\n share,\n );\n return new Set(result!.rows.map((r) => keyOf(r[\"key\"])));\n },\n };\n }\n\n /**\n * The CONNECT / DISCONNECT events whose related node the subscriber may\n * read (its type's READ rules) through a field it may read (the\n * declaring field's READ rules), checked after the write. The others are\n * dropped, so an event never names a node the subscriber could not\n * read; a related node that is gone, which cannot be checked, drops the\n * event unless the claims alone settle every rule.\n */\n async #relatedVisible(\n node: NodeType,\n events: ChangeEvent[],\n base: SelectionContext,\n context: unknown,\n signal: AbortSignal,\n ): Promise<Set<ChangeEvent>> {\n type Group =\n | { kind: \"deny\" }\n | { kind: \"allow\"; events: ChangeEvent[] }\n | {\n kind: \"check\";\n statement: Statement;\n slot: string;\n events: ChangeEvent[];\n };\n const groups = new Map<string, Group>();\n for (const event of events) {\n const rel = event.relationship!;\n const selfOwns = (event as { [SELF_OWNS]?: boolean })[SELF_OWNS] ?? true;\n const id = `${rel.field}\\0${rel.relatedType}\\0${selfOwns}`;\n const known = groups.get(id);\n if (known) {\n if (known.kind !== \"deny\") known.events.push(event);\n continue;\n }\n groups.set(\n id,\n this.#relatedGroup(node, rel, selfOwns, base, context, event),\n );\n }\n const out = new Set<ChangeEvent>();\n const checks: Array<Extract<Group, { kind: \"check\" }>> = [];\n for (const g of groups.values()) {\n if (g.kind === \"allow\") for (const e of g.events) out.add(e);\n else if (g.kind === \"check\") checks.push(g);\n }\n if (checks.length === 0) return out;\n const results = await this.#driver.run(\n checks.map((g) => ({\n text: g.statement.text,\n params: {\n ...g.statement.params,\n [g.slot]: g.events.map((e) => ({\n i: events.indexOf(e),\n s: e.key,\n r: e.relationship!.relatedKey,\n })),\n },\n })),\n {\n mode: \"read\",\n timeoutMs: this.#subscriptionTimeoutMs,\n signal,\n verified: true,\n },\n );\n for (const result of results) {\n for (const row of result.rows) {\n const event = events[row[\"i\"] as number];\n if (event) out.add(event);\n }\n }\n return out;\n }\n\n /** How one field and related type's relationship events are checked. */\n #relatedGroup(\n node: NodeType,\n rel: NonNullable<ChangeEvent[\"relationship\"]>,\n selfOwns: boolean,\n base: SelectionContext,\n context: unknown,\n first: ChangeEvent,\n ):\n | { kind: \"deny\" }\n | { kind: \"allow\"; events: ChangeEvent[] }\n | {\n kind: \"check\";\n statement: Statement;\n slot: string;\n events: ChangeEvent[];\n } {\n const related = this.#model.nodes.get(rel.relatedType);\n if (!related) return { kind: \"deny\" };\n const [ownerName, fieldName] = rel.field.split(\".\");\n const owner = ownerName ? this.#model.nodes.get(ownerName) : undefined;\n const field = fieldName ? owner?.fields.get(fieldName) : undefined;\n const ctx = this.#host.context(base, context);\n let condition: Expr | undefined;\n let selfGuard: Expr | undefined;\n try {\n checkAuthentication(ctx, related, \"READ\");\n condition = and(\n authFilter(ctx, related, \"m\", \"READ\"),\n authValidate(ctx, related, \"m\", \"READ\", \"BEFORE\"),\n );\n if (owner && field?.kind === \"relationship\") {\n checkFieldAuthentication(ctx, owner.name, field);\n const guard = fieldReadGuard(ctx, owner, field, selfOwns ? \"n\" : \"m\");\n const when = guard && fn(\"coalesce\", guard.when, lit(false));\n if (selfOwns) selfGuard = when;\n else condition = and(condition, when);\n }\n } catch {\n // The claims alone refuse: the events are not sent.\n return { kind: \"deny\" };\n }\n if (condition === undefined && selfGuard === undefined) {\n // Nothing depends on the nodes: no check needed.\n return { kind: \"allow\", events: [first] };\n }\n const slot: unknown[] = [];\n const pairs = bind(ctx, slot);\n const match = (\n variable: string,\n type: NodeType,\n end: \"r\" | \"s\",\n where: Expr | undefined,\n ) => ({\n kind: \"match\" as const,\n pattern: { start: { variable, labels: [type.labels[0]!] }, hops: [] },\n where: and(\n bin(\"=\", prop(v(variable), type.key.property), prop(v(\"p\"), end)),\n where,\n ),\n });\n const text = printClauses([\n { kind: \"unwind\", expr: pairs, alias: \"p\" },\n match(\"m\", related, \"r\", condition),\n ...(selfGuard ? [match(\"n\", node, \"s\", selfGuard)] : []),\n { kind: \"return\", items: [{ expr: prop(v(\"p\"), \"i\"), alias: \"i\" }] },\n ]);\n const param = Object.keys(ctx.params).find((k) => ctx.params[k] === slot)!;\n return {\n kind: \"check\",\n statement: { text, params: ctx.params },\n slot: param,\n events: [first],\n };\n }\n\n /**\n * Inside a deleting transaction, before anything is deleted: which of\n * the doomed nodes each subscriber following one of their keys may\n * read, kept for the change's DELETE events. A node cannot be checked\n * once it is gone, so a deletion nobody checked reaches nobody whose\n * rules depend on the node.\n */\n async probeDeletes(\n change: WriteChange,\n doomed: ReadonlyArray<{ node: NodeType; keys: unknown[] }>,\n run: (statement: Statement) => Promise<QueryResult>,\n ): Promise<void> {\n const wanted = new Map<DeleteProbe, unknown[]>();\n for (const { node, keys } of doomed) {\n const group = this.#subscribers.get(node.name);\n if (!group || group.byKey.size === 0) continue;\n for (const key of keys) {\n for (const sink of group.byKey.get(keyOf(key)) ?? []) {\n const probe = this.#probes.get(sink);\n if (!probe) continue;\n const list = wanted.get(probe);\n if (list) list.push(key);\n else wanted.set(probe, [key]);\n }\n }\n }\n if (wanted.size === 0) return;\n let seen = this.#deleteSeen.get(change);\n if (!seen) {\n seen = new Map();\n this.#deleteSeen.set(change, seen);\n }\n // Subscribers whose checks compile to the same statement share it.\n const results = new Map<string, Promise<Set<string>>>();\n for (const [probe, keys] of wanted) {\n let visible: Promise<Set<string>>;\n if (probe.check.settled()) {\n visible = Promise.resolve(new Set(keys.map(keyOf)));\n } else {\n let statement: Statement;\n try {\n statement = probe.check.statement(keys);\n } catch {\n // The claims alone decide against reading: nothing is visible.\n continue;\n }\n const id = stableKey(statement);\n const shared = id === undefined ? undefined : results.get(id);\n visible =\n shared ??\n run(statement).then(\n (r) => new Set(r.rows.map((row) => keyOf(row[\"key\"]))),\n );\n if (id !== undefined && !shared) results.set(id, visible);\n }\n const own = seen.get(probe) ?? new Set<string>();\n for (const k of await visible) own.add(k);\n seen.set(probe, own);\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.#host.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.#host.statisticsVersion() ||\n !sameContextReads(entry.contextReads, context)\n ) {\n const ctx = this.#host.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.#host.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.#host.context(infoContext(info), context),\n \"single\",\n node,\n { [node.key.name]: key },\n info.fieldNodes,\n );\n return this.#host.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.#host.run(\n info.fieldName,\n compiled,\n context,\n info,\n change,\n share,\n );\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","// The `LoraGraphQL` class: one annotated SDL document as a GraphQL API on\n// LoraDB. It builds the model and the schema, compiles and runs root\n// fields, and owns the pieces that do the rest: documents\n// (`runtime/documents.ts`), cost and deadlines (`runtime/limits.ts`),\n// committed writes and subscriptions (`subscriptions/`).\n\nimport {\n execute as graphqlExecute,\n type ExecutionArgs,\n subscribe as graphqlSubscribe,\n getOperationAST,\n getVariableValues,\n GraphQLError,\n Kind,\n lexicographicSortSchema,\n parse,\n printSchema,\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 ValidationRule,\n} from \"graphql\";\nimport {\n assertSchema,\n unusedIndexes,\n type SchemaEnv,\n} from \"./analyze/assert-schema.js\";\nimport { checkCypherFields } from \"./analyze/cypher-check.js\";\nimport {\n inferRequirements,\n type SchemaRequirement,\n} from \"./analyze/indexes.js\";\nimport {\n checkPlans,\n checkStatements,\n type PlanReport,\n} from \"./analyze/plans.js\";\nimport { lintModel, unguardedMutations } from \"./analyze/lint.js\";\nimport { accessLints } from \"./analyze/access-lint.js\";\nimport {\n accessMatrix,\n operationAccess,\n type OperationAccess,\n} from \"./analyze/access.js\";\nimport { type AccessEntry } from \"./analyze/verdicts.js\";\nimport { analyze, type Statistics } from \"./analyze/statistics.js\";\nimport { newContext, type CompileContext } from \"./compile/context.js\";\nimport {\n COMPILE_CACHE_BYTES,\n COMPILED_TOTAL,\n CompileCache,\n} from \"./compile/cache.js\";\nimport { compileAbstractRoot } from \"./compile/read/abstract.js\";\nimport {\n compileCypherRoot,\n MAX_LIST_ARGUMENT,\n} from \"./compile/read/cypher-field.js\";\nimport { compileRoot, rebindableVariables } from \"./compile/read/root.js\";\nimport { compileSearch } from \"./compile/read/search.js\";\nimport {\n type CompiledRead,\n type ReadSet,\n type RootKind,\n} from \"./compile/read/types.js\";\nimport {\n coercedVariables,\n fieldArgs,\n variableValuesOf,\n withVariables,\n type SelectionContext,\n} from \"./compile/selection.js\";\nimport {\n boundedWrites,\n type DriverSnapshot,\n type LoraDriver,\n type QueryResult,\n type Statement,\n} from \"./driver.js\";\nimport { affects, type WriteChange } from \"./execute/changes.js\";\nimport { executeCypherMutation } from \"./execute/cypher-mutation.js\";\nimport type { Reported } from \"./execute/mutate/reported.js\";\nimport { LoraTransaction } from \"./execute/transaction.js\";\nimport {\n anySignal,\n nativeSignal,\n MAX_CONCURRENT_STATEMENTS,\n OPERATION_TIMEOUT_FACTOR,\n} from \"./execute/budget.js\";\nimport type { MutationKind } from \"./schema/mutations.js\";\nimport { executeMutation } from \"./execute/mutate.js\";\nimport {\n type MutationEnv,\n type PopulatedByCallback,\n type TriggerFunctions,\n} from \"./execute/mutate/env.js\";\nimport { collapseErrors, ModelError, requestError } from \"./errors.js\";\nimport {\n OutboxWorker,\n type Worker,\n type WorkerOptions,\n} from \"./events/worker.js\";\nimport { isStandardSchema } from \"./standard-schema.js\";\nimport { inputSchemas, type JsonSchema } from \"./analyze/input-schemas.js\";\nimport { scanStored, type StoredReport } from \"./analyze/stored.js\";\nimport {\n buildManifest,\n generateTypes,\n schemaHash,\n type OperationManifest,\n} from \"./codegen.js\";\nimport {\n envelopPlugin,\n nodeEnv,\n validationRules,\n type DocumentGuards,\n} from \"./guards.js\";\nimport { emptyQuantifierRule } from \"./quantifier-rule.js\";\nimport { buildModel } from \"./model/build.js\";\nimport { Observer, type StatementMeta } from \"./observe.js\";\nimport type {\n CypherField,\n GraphModel,\n NodeType,\n SearchIndex,\n} from \"./model/types.js\";\nimport type {\n AssertSchemaOptions,\n CheckOptions,\n ExecuteArgs,\n LoraGraphQLContext,\n LoraGraphQLOptions,\n StatementEvent,\n} from \"./options.js\";\nimport type {\n CheckReport,\n ExecutionTiming,\n LoraExecutionResult,\n SchemaAssertion,\n} from \"./results.js\";\nimport { checkCustomRequires } from \"./runtime/custom-requires.js\";\nimport { databaseError } from \"./runtime/database-error.js\";\nimport {\n operationCachePolicy,\n type CachePolicy,\n} from \"./execute/cache-policy.js\";\nimport { Documents } from \"./runtime/documents.js\";\nimport { OperationLimits } from \"./runtime/limits.js\";\nimport {\n findOperation,\n infoContext,\n isDocument,\n isVariableError,\n multiRoot,\n operationType,\n rootOf,\n runInOrder,\n searchOf,\n} from \"./runtime/request.js\";\nimport { ms, rootKey, timingEntry } from \"./runtime/timing.js\";\nimport { buildSchema } from \"./schema/build.js\";\nimport {\n checkFieldAuthentication,\n claimsMaskedValue,\n rootFieldGuard,\n} from \"./compile/auth.js\";\nimport { printExpr } from \"./compile/cypher.js\";\nimport { MAX_FILTER_DEPTH } from \"./compile/cost.js\";\nimport { fromGlobalId } from \"./schema/global-id.js\";\nimport { assertReadable } from \"./schema/guard.js\";\nimport { ChangeHub } from \"./subscriptions/change-hub.js\";\nimport { CHANGE } from \"./subscriptions/events.js\";\nimport { Subscriptions } from \"./subscriptions/subscriptions.js\";\n\n/** Read-sets being collected, by GraphQL context (see `ExecuteArgs.readSet`). */\ninterface ReadCollector {\n labels: Set<string>;\n relationships: Set<string>;\n opaque: boolean;\n /** Concurrent `execute()` calls sharing the context. */\n active: number;\n}\n\nexport class LoraGraphQL {\n readonly model: GraphModel;\n readonly #driver: LoraDriver;\n readonly #timeoutMs: number;\n /** Cost charged and deadlines held, per operation. */\n readonly #limits: OperationLimits;\n readonly #maxBatch: number;\n readonly #maxListArgument: number;\n readonly #maxFilterDepth: number;\n readonly #maxTotalCount: number | undefined;\n readonly #maxListFilter: number | undefined;\n readonly #maxStringFilter: number | undefined;\n readonly #callbacks: Record<string, PopulatedByCallback>;\n readonly #triggers: Record<string, TriggerFunctions>;\n readonly #triggerTimeoutMs: number;\n readonly #singleCall: boolean;\n readonly #workers = new Set<OutboxWorker>();\n /** Statements of a mutation `check()` is running, by its context. */\n readonly #collected = new WeakMap<object, StatementEvent[]>();\n readonly #validators: NonNullable<LoraGraphQLOptions[\"validators\"]>;\n readonly #resolvers: NonNullable<LoraGraphQLOptions[\"resolvers\"]>;\n readonly #scalars: LoraGraphQLOptions[\"scalars\"];\n readonly #jwt: (context: unknown) => Record<string, unknown> | undefined;\n readonly #onStatement: LoraGraphQLOptions[\"onStatement\"];\n readonly #maskErrors: boolean;\n readonly #observer: Observer;\n readonly #guards: DocumentGuards | false;\n readonly #onError: LoraGraphQLOptions[\"onError\"];\n /** Committed writes: `onWrite`, `changes()` and the engine feed. */\n readonly #changes: ChangeHub;\n /** Subscribers and the delivery of changes to them. */\n readonly #subscriptions: Subscriptions;\n /** Parsed and persisted documents. */\n readonly #documents: Documents;\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: CompileCache;\n #statistics: Statistics | undefined;\n #schema: GraphQLSchema | undefined;\n readonly #mutationTransaction: \"field\" | \"operation\";\n #warnedNotAtomic = false;\n readonly #timing: LoraGraphQLOptions[\"timing\"];\n /** Per-request read-set collectors, by GraphQL context. */\n readonly #readSets = new WeakMap<object, ReadCollector>();\n /** `@cacheControl` policies, by document and operation name. */\n readonly #cachePolicies = new WeakMap<\n DocumentNode,\n Map<string, CachePolicy | null>\n >();\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 = boundedWrites(\n options.driver,\n options.maxQueuedWrites ?? 512,\n (waiting) =>\n requestError(\n \"OVERLOADED\",\n `${waiting} writes are waiting for the database; try again shortly`,\n ),\n );\n this.#timeoutMs = options.timeoutMs ?? 10_000;\n const cacheBytes = options.compileCacheBytes ?? COMPILE_CACHE_BYTES;\n this.#compiled = new CompileCache(COMPILED_TOTAL, cacheBytes);\n this.#limits = new OperationLimits({\n operationTimeoutMs:\n options.operationTimeoutMs ??\n this.#timeoutMs * OPERATION_TIMEOUT_FACTOR,\n maxConcurrentStatements:\n options.maxConcurrentStatements ?? MAX_CONCURRENT_STATEMENTS,\n maxCost: options.maxCost ?? 50_000,\n budget: options.budget,\n onCost: options.onCost,\n });\n this.#maxBatch = options.maxBatch ?? 1000;\n this.#maxListArgument = options.maxListArgument ?? MAX_LIST_ARGUMENT;\n this.#maxFilterDepth = options.maxFilterDepth ?? MAX_FILTER_DEPTH;\n if (\n options.maxTotalCount !== undefined &&\n !(Number.isInteger(options.maxTotalCount) && options.maxTotalCount > 0)\n ) {\n throw new Error(\n `maxTotalCount must be a positive integer, got ${String(options.maxTotalCount)}`,\n );\n }\n this.#maxTotalCount = options.maxTotalCount;\n this.#maxListFilter = options.maxListFilter;\n this.#maxStringFilter = options.maxStringFilter;\n this.#callbacks = options.callbacks ?? {};\n this.#triggers = options.triggers ?? {};\n this.#triggerTimeoutMs = options.triggerTimeoutMs ?? 1000;\n this.#singleCall = options.singleCallMutations ?? true;\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 this.#validators = options.validators ?? {};\n for (const [type, validator] of Object.entries(this.#validators)) {\n if (!this.model.nodes.has(type)) {\n missing.push(`validators.${type}: there is no @node type ${type}`);\n } else if (\n !isStandardSchema(validator) &&\n !Object.values(validator).every(isStandardSchema)\n ) {\n missing.push(\n `validators.${type}: not a Standard Schema validator (zod, valibot, arktype and yup schemas are), nor { create, update, upsert } of them`,\n );\n }\n }\n for (const [type, fns] of Object.entries(this.#triggers)) {\n const n = this.model.nodes.get(type);\n if (!n) {\n missing.push(`triggers.${type}: no @node type ${type}`);\n continue;\n }\n for (const [key, fn] of Object.entries(fns)) {\n const op = key.toUpperCase();\n if (key !== \"create\" && key !== \"update\" && key !== \"delete\") {\n missing.push(\n `triggers.${type}.${key}: not an operation (create, update, delete)`,\n );\n } else if (typeof fn !== \"function\") {\n missing.push(`triggers.${type}.${key}: not a function`);\n } else if (!n.mutations.has(op as \"CREATE\" | \"UPDATE\" | \"DELETE\")) {\n missing.push(\n `triggers.${type}.${key}: ${type} has no generated ${op} mutation (@mutation(operations:)) to fire it`,\n );\n }\n }\n }\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 this.#changes = new ChangeHub({\n driver: options.driver,\n model: this.model,\n changeFeed: options.changeFeed,\n maxQueued: options.maxQueuedChanges ?? 1000,\n onError: this.#onError,\n onWrite: (listener) => this.onWrite(listener),\n });\n this.#subscriptions = new Subscriptions({\n model: this.model,\n driver: this.#driver,\n changes: this.#changes,\n maxSubscriptions: options.maxSubscriptions ?? 100,\n subscriptionScope:\n options.subscriptionScope ??\n ((context) =>\n context !== null && typeof context === \"object\"\n ? context\n : undefined),\n maxSubscriptionFilterDepth: options.maxSubscriptionFilterDepth ?? 1,\n subscriptionTimeoutMs:\n options.subscriptionTimeoutMs ?? Math.min(2000, this.#timeoutMs),\n schema: () => this.getSchema(),\n jwt: (context) => this.#jwt(context),\n context: (base, context) => this.#context(base, context),\n degrees: () => this.#degrees,\n statisticsVersion: () => this.#statisticsVersion,\n charge: (field, cost, context) =>\n this.#limits.charge(field, cost, context),\n run: (field, compiled, context, info, change, shareKey) =>\n this.#run(field, compiled, context, info, change, shareKey),\n });\n this.#observer = new Observer(options);\n this.#documents = new Documents({\n guards: this.#guards,\n persistedOnly: options.persistedOnly ?? false,\n bytesMax: cacheBytes,\n schema: () => this.getSchema(),\n rules: () => this.validationRules(),\n });\n this.#mutationTransaction = options.mutationTransaction ?? \"field\";\n this.#timing = options.timing;\n }\n\n /**\n * The validation rules to add to the standard ones: the configured\n * document guards, and the refusal of a literal empty relationship\n * quantifier (`some: {}`), which would match every row.\n */\n validationRules(): ValidationRule[] {\n return [\n emptyQuantifierRule,\n ...(this.#guards === false ? [] : validationRules(this.#guards)),\n ];\n }\n\n /**\n * The configured document guards as an Envelop / Yoga plugin. With\n * `mutationTransaction: \"operation\"` it also runs a mutation with\n * several root fields in one transaction, and it collapses identical\n * errors across list indices, as `execute()` does.\n */\n envelopPlugin(): ReturnType<typeof envelopPlugin> & {\n onExecute(payload: {\n args: ExecutionArgs;\n executeFn: (args: ExecutionArgs) => unknown;\n setExecuteFn: (fn: (args: ExecutionArgs) => unknown) => void;\n }): {\n onExecuteDone(payload: {\n result: unknown;\n setResult: (result: ExecutionResult) => void;\n }): void;\n };\n } {\n const guards = 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 return {\n ...guards,\n onValidate(payload) {\n guards.onValidate(payload);\n payload.addValidationRule(emptyQuantifierRule);\n },\n onExecute: ({ args, executeFn, setExecuteFn }) => {\n const operation = getOperationAST(\n args.document,\n args.operationName ?? undefined,\n );\n if (this.#atomic(operation, args.contextValue)) {\n setExecuteFn(async (execArgs) => {\n const { tx, context } = await this.#openAtomic(\n execArgs.contextValue,\n );\n let result: ExecutionResult;\n try {\n result = (await executeFn({\n ...execArgs,\n contextValue: context,\n })) as ExecutionResult;\n } catch (err) {\n await tx.rollback();\n throw err;\n }\n return (await this.#closeAtomic(tx, result)).result;\n });\n }\n return {\n onExecuteDone({ result, setResult }) {\n // A streamed (incremental) result is left as it is.\n if (\n result === null ||\n typeof result !== \"object\" ||\n Symbol.asyncIterator in result\n ) {\n return;\n }\n const plain = result as ExecutionResult;\n if (plain.errors && plain.errors.length > 1) {\n setResult({ ...plain, errors: collapseErrors(plain.errors) });\n }\n },\n };\n },\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) =>\n this.#subscriptions.subscribe(node, args, context),\n resolveChangedNode: (node, event, info, context) =>\n event.operation === \"DELETE\"\n ? Promise.resolve(null)\n : span(info, context, () =>\n this.#subscriptions.resolveByKey(\n node,\n event.key,\n info,\n context,\n (event as { [CHANGE]?: WriteChange })[CHANGE],\n ),\n ),\n previousValue: (node, field, value, context) => {\n const ctx = this.#context(\n { schema: this.getSchema(), fragments: {}, variables: {} },\n context,\n );\n checkFieldAuthentication(ctx, node.name, field);\n return claimsMaskedValue(ctx, node, field, value);\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 assertSchema(options: AssertSchemaOptions = {}): Promise<SchemaAssertion> {\n return assertSchema(this.#schemaEnv(), options);\n }\n\n /** What the checks of the database's constraints and indexes need. */\n #schemaEnv(): SchemaEnv {\n return {\n driver: this.#driver,\n timeoutMs: this.#timeoutMs,\n requirements: () => this.requirements(),\n };\n }\n\n // -------------------------------------------------------------------------\n // Analysis\n // -------------------------------------------------------------------------\n\n /**\n * Count nodes and measure relationship degrees (S6). Cost estimates then\n * use each relationship's maximum degree, capped by its page limit,\n * instead of the page limit alone; filters use node counts and mean\n * degrees (see `src/compile/cost.ts`).\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 // The maximum: the caller chooses the parents (see statistics.ts).\n Object.entries(stats.degrees).map(([k, d]) => [k, d.max]),\n );\n this.#statisticsVersion++;\n }\n\n get statistics(): Statistics | undefined {\n return this.#statistics;\n }\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 /**\n * Who may run an operation: per root field, the verdict for each kind\n * of caller, from the same rules as `accessMatrix()`, plus the most\n * restrictive verdict per caller. Takes a document (source or parsed)\n * or the id of a persisted operation; `operationName` picks one of\n * several operations. A mutation's inputs are read for the\n * relationship writes they make (a nested connect, disconnect, create,\n * update or delete), which count towards its root field's verdict.\n * Pass `variables` for inputs the document takes as variables; a\n * variable without a value is listed in the field's `unresolved`.\n */\n operationAccess(\n document: string | DocumentNode,\n operationName?: string,\n variables?: Readonly<Record<string, unknown>>,\n ): OperationAccess {\n const doc =\n typeof document !== \"string\"\n ? document\n : (this.#documents.persisted(document) ?? parse(document));\n const operation = getOperationAST(doc, operationName);\n if (!operation) {\n throw new Error(\n operationName\n ? `operationAccess: no operation named ${operationName}`\n : \"operationAccess: the document has no single operation; pass operationName\",\n );\n }\n const fragments = new Map<string, FragmentDefinitionNode>();\n for (const def of doc.definitions) {\n if (def.kind === Kind.FRAGMENT_DEFINITION)\n fragments.set(def.name.value, def);\n }\n return operationAccess(\n this.model,\n this.getSchema(),\n operation,\n fragments,\n variables,\n );\n }\n\n /**\n * The validation rules as JSON Schema (2020-12), one per generated\n * create and update input type, for clients: introspection does not\n * show directives. Build zod, yup or valibot schemas from it, or\n * validate with any JSON Schema library.\n */\n inputSchemas(): Record<string, JsonSchema> {\n return inputSchemas(this.model);\n }\n\n /**\n * Stored values that break a validation rule of their field: rules are\n * checked on write through the API, so a rule added later, or a value\n * written with raw Cypher, is only found by reading. Reads at most\n * `limit` nodes per type (default 10 000).\n */\n storedViolations(options: { limit?: number } = {}): Promise<StoredReport> {\n return scanStored(this.#driver, this.model, {\n ...options,\n timeoutMs: this.#timeoutMs,\n });\n }\n\n /**\n * The CI gate: @cypher statements plan, the database has what the API\n * needs, and each operation's statements seek where they should.\n */\n async check(options: CheckOptions = {}): Promise<CheckReport> {\n const report: CheckReport = {\n ok: true,\n warnings: this.model.warnings,\n cypher: await checkCypherFields(this.#driver, this.model),\n // 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 unusedIndexes(this.#schemaEnv()),\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 stored: (await scanStored(this.#driver, this.model)).violations,\n };\n for (const [i, op] of (options.operations ?? []).entries()) {\n const operation = op.name ?? `operation ${i + 1}`;\n try {\n const document =\n typeof op.document === \"string\" ? parse(op.document) : op.document;\n const fields =\n findOperation(document, undefined).operation === \"mutation\"\n ? await this.#explainMutation(document, op, options.rowBudget)\n : await this.explain(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 /**\n * Plan a mutation's statements for `check()`. What a mutation runs\n * depends on what it finds, so it is run, in a transaction that is\n * always rolled back: nothing is written and no change is reported.\n * Its `@populatedBy` callbacks and trigger functions do run.\n */\n async #explainMutation(\n document: DocumentNode,\n op: NonNullable<CheckOptions[\"operations\"]>[number],\n rowBudget: number | undefined,\n ): Promise<Array<{ field: string; reports: PlanReport[] }>> {\n const tx = await this.begin();\n const context = {\n ...((op.context as object | undefined) ?? {}),\n transaction: tx,\n };\n const collected: StatementEvent[] = [];\n this.#collected.set(context, collected);\n try {\n const result = await graphqlExecute({\n schema: this.getSchema(),\n document,\n variableValues: op.variables ?? {},\n contextValue: context,\n });\n if (result.errors?.length) throw result.errors[0]!;\n } finally {\n this.#collected.delete(context);\n if (tx.isOpen) await tx.rollback();\n }\n const byField = new Map<string, Statement[]>();\n for (const { field, statement } of collected) {\n byField.set(field, [...(byField.get(field) ?? []), statement]);\n }\n const out: Array<{ field: string; reports: PlanReport[] }> = [];\n for (const [field, statements] of byField) {\n out.push({\n field,\n reports: await checkStatements(this.#driver, statements, {\n ...(rowBudget !== undefined ? { rowBudget } : {}),\n }),\n });\n }\n return out;\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 = rootOf(this.model, sel.name.value);\n const search = searchOf(this.model, 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 this.#documents.persist(operations);\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 this.#documents.load(manifest);\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<LoraExecutionResult> {\n const result = await this.#executeReading(args);\n const policy = this.#cachePolicy(args);\n if (!policy) return result;\n const out = { ...result };\n if (result.readSet) {\n Object.defineProperty(out, \"readSet\", {\n value: result.readSet,\n enumerable: false,\n });\n }\n return Object.defineProperty(out, \"cacheControl\", {\n value: policy,\n enumerable: false,\n }) as LoraExecutionResult;\n }\n\n /**\n * The operation's `@cacheControl` policy (see `operationCachePolicy`),\n * once per document and operation name.\n */\n #cachePolicy(args: ExecuteArgs): CachePolicy | undefined {\n const hints = this.model.cacheHints;\n if (!hints || (hints.types.size === 0 && hints.fields.size === 0)) {\n return undefined;\n }\n const document = this.#documents.document(args);\n if (!isDocument(document)) return undefined;\n let byName = this.#cachePolicies.get(document);\n if (!byName) {\n byName = new Map();\n this.#cachePolicies.set(document, byName);\n }\n const key = args.operationName ?? \"\";\n if (!byName.has(key)) {\n byName.set(\n key,\n operationCachePolicy(\n this.getSchema(),\n this.model,\n document,\n args.operationName,\n ) ?? null,\n );\n }\n return byName.get(key) ?? undefined;\n }\n\n async #executeReading(args: ExecuteArgs): Promise<LoraExecutionResult> {\n if (!args.readSet) return this.#execute(args);\n const context = args.context ?? {};\n if (typeof context !== \"object\" || context === null) {\n return this.#execute(args);\n }\n // Calls sharing a context share one collector: the union of their\n // reads over-approximates each, which is safe for invalidation.\n let collector = this.#readSets.get(context);\n if (collector) collector.active++;\n else {\n collector = {\n labels: new Set(),\n relationships: new Set(),\n opaque: false,\n active: 1,\n };\n this.#readSets.set(context, collector);\n }\n let result: ExecutionResult;\n try {\n result = await this.#execute({ ...args, context });\n } finally {\n if (--collector.active === 0) this.#readSets.delete(context);\n }\n const document = this.#documents.document(args);\n const operation = isDocument(document)\n ? getOperationAST(document, args.operationName)\n : undefined;\n const readSet: ReadSet = {\n labels: [...collector.labels].sort(),\n relationships: [...collector.relationships].sort(),\n // A mutation's reads follow its writes; nobody caches it.\n ...(collector.opaque || operation?.operation === \"mutation\"\n ? { opaque: true }\n : {}),\n };\n return Object.defineProperty({ ...result }, \"readSet\", {\n value: readSet,\n enumerable: false,\n }) as LoraExecutionResult;\n }\n\n async #execute(args: ExecuteArgs): Promise<ExecutionResult> {\n const started = performance.now();\n const document = this.#documents.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 let tx: LoraTransaction | undefined;\n if (\n this.#atomic(getOperationAST(document, args.operationName), contextValue)\n ) {\n ({ tx, context: contextValue } = await this.#openAtomic(contextValue));\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 // This execution's own root value: cost is charged to it.\n const execution = {};\n this.#limits.track(execution);\n let result: ExecutionResult;\n try {\n result = (await graphqlExecute({\n schema: this.getSchema(),\n document,\n rootValue: execution,\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 // One error per path pattern, not one per row of every list.\n if (result.errors && result.errors.length > 1) {\n result = { ...result, errors: collapseErrors(result.errors) };\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 const closed = await this.#closeAtomic(tx, result);\n // A failed commit answers with its error alone.\n if (!closed.committed && !result.errors?.length) return closed.result;\n result = closed.result;\n }\n // The operation's cost estimate, so clients can tune their queries.\n const cost = this.#limits.spent(execution);\n if (cost !== undefined) {\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.#documents.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 // Change tracking (S5)\n // -------------------------------------------------------------------------\n\n /** Called after every committed mutation with its exact write-set. */\n onWrite(listener: (change: WriteChange) => void): () => void {\n return this.#changes.onWrite(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.#changes.changes(options);\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 #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 statistics: this.#statistics,\n requestContext: context,\n maxListArgument: this.#maxListArgument,\n maxFilterDepth: this.#maxFilterDepth,\n maxListFilter: this.#maxListFilter,\n maxStringFilter: this.#maxStringFilter,\n maxTotalCount: this.#maxTotalCount,\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 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.#limits.charge(field, compiled.cost, context, info);\n const collector =\n typeof context === \"object\" && context !== null\n ? this.#readSets.get(context)\n : undefined;\n if (collector) {\n for (const l of compiled.reads.labels) collector.labels.add(l);\n for (const r of compiled.reads.relationships)\n collector.relationships.add(r);\n if (compiled.reads.opaque) collector.opaque = true;\n }\n for (const statement of compiled.statements) {\n this.#onStatement?.({ field, statement });\n }\n const signal = nativeSignal(\n (context as LoraGraphQLContext | undefined)?.signal,\n );\n const owned = (context as LoraGraphQLContext | undefined)?.transaction;\n const budget = this.#limits.operationBudget(context, info);\n let results;\n const timing = this.#timingOf(context);\n const dbStart = timing ? performance.now() : 0;\n try {\n const run = (opSignal?: AbortSignal) =>\n this.#driver.run(compiled.statements, {\n mode: compiled.mode,\n timeoutMs:\n budget && this.#timeoutMs > 0\n ? Math.max(1, Math.min(this.#timeoutMs, budget.remaining()))\n : this.#timeoutMs,\n signal: opSignal ? anySignal(signal, opSignal) : 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 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.#subscriptions.shared(\n change,\n compiled.statements,\n // A bounded lookup streams synchronously: no slot needed.\n () => (budget && !compiled.bounded ? budget.run(run) : run()),\n shareKey,\n ),\n );\n } catch (err) {\n throw this.#databaseError(field, err);\n } finally {\n if (budget) this.#limits.leaveOperation(context as object, info!, budget);\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.#documents.persistedId(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 /** Variables one compile serves every value of (see the cache). */\n rebindable?: readonly string[],\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 rebindable,\n },\n (jwt, variables) => {\n const ctx = this.#context(\n variables ? withVariables(base, variables) : base,\n context,\n jwt,\n );\n return { ctx, compiled: compile(ctx) };\n },\n );\n }\n\n #databaseError(field: string, err: unknown): unknown {\n return databaseError(\n {\n model: this.model,\n maskErrors: this.#maskErrors,\n onError: this.#onError,\n },\n field,\n err,\n );\n }\n\n #resolveRoot(\n kind: RootKind,\n node: NodeType,\n info: GraphQLResolveInfo,\n context: unknown,\n ): Promise<unknown> {\n const compiled = this.#cachedCompile(\n info,\n context,\n (ctx) =>\n compileRoot(\n ctx,\n kind,\n node,\n this.#args(ctx, info.parentType, info.fieldNodes),\n info.fieldNodes,\n ),\n rebindableVariables(kind, node, info.fieldNodes),\n );\n return this.#run(info.fieldName, compiled, context, info);\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 // @authorization: the claims decide here; a `viewer` test is left for\n // the database, before the statement runs.\n const rule = rootFieldGuard(ctx, field);\n const guard: Statement | undefined = rule && {\n text: `RETURN coalesce(${printExpr(rule)}, false) AS allowed`,\n params: ctx.params,\n };\n const args = this.#args(ctx, info.parentType, info.fieldNodes);\n if (field.owner !== \"Mutation\") {\n if (guard) await this.#checkGuard(field, guard, context);\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 this.#warnNotAtomic(info, context);\n let value: unknown;\n let written: Reported;\n try {\n ({ value, written } = await executeCypherMutation(\n this.#mutationEnv(info, context, ctx.jwt),\n field,\n args,\n info.fieldNodes,\n guard,\n ));\n } catch (err) {\n throw this.#databaseError(info.fieldName, err);\n }\n // A hand-written write is what its statement returns as `created`\n // and `updated`. One that names neither has no known write-set: it\n // is reported broadly. Either way when its transaction commits.\n const entities = [...written.created, ...written.updated];\n const change: WriteChange = {\n operation: \"CYPHER\",\n field: field.name,\n created: written.created,\n updated: written.updated,\n deleted: [],\n connected: [],\n disconnected: [],\n entities,\n types: [...new Set(entities.map((e) => e.type))].sort(),\n relationshipTypes: [],\n broad: written.broad,\n };\n const owned = (context as LoraGraphQLContext | undefined)?.transaction;\n if (owned) owned.record(change);\n else this.#changes.emit(change);\n return value;\n }\n\n /** Run a root @cypher field's `viewer` guard; FORBIDDEN when it fails. */\n async #checkGuard(\n field: CypherField,\n guard: Statement,\n context: unknown,\n ): Promise<void> {\n this.#onStatement?.({ field: field.name, statement: guard });\n const owned = (context as LoraGraphQLContext | undefined)?.transaction;\n let result: QueryResult | undefined;\n try {\n [result] = owned\n ? await runInOrder(owned, [guard])\n : await this.#driver.run([guard], {\n mode: \"read\",\n timeoutMs: this.#timeoutMs,\n signal: nativeSignal(\n (context as LoraGraphQLContext | undefined)?.signal,\n ),\n });\n } catch (err) {\n throw this.#databaseError(field.name, err);\n }\n if (result?.rows[0]?.[\"allowed\"] !== true) {\n throw requestError(\n \"FORBIDDEN\",\n `not allowed to run ${field.owner}.${field.name}`,\n );\n }\n }\n\n async #resolveMutation(\n op: MutationKind,\n node: NodeType,\n info: GraphQLResolveInfo,\n context: unknown,\n ): Promise<unknown> {\n this.#warnNotAtomic(info, context);\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 // A mutation that wrote nothing (an upsert of unchanged rows, an\n // update that matched none) reports nothing either.\n if (change.entities.length === 0 && !change.broad) return payload;\n const owned = (context as LoraGraphQLContext | undefined)?.transaction;\n if (owned) owned.record(change);\n else this.#changes.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: nativeSignal((context as LoraGraphQLContext | undefined)?.signal),\n degrees: this.#degrees,\n maxBatch: this.#maxBatch,\n maxListArgument: this.#maxListArgument,\n maxFilterDepth: this.#maxFilterDepth,\n maxListFilter: this.#maxListFilter,\n maxStringFilter: this.#maxStringFilter,\n statistics: this.#statistics,\n requestContext: context,\n callbacks: this.#callbacks,\n triggers: this.#triggers,\n triggerTimeoutMs: this.#triggerTimeoutMs,\n singleCall: this.#singleCall,\n inTrigger: (context as LoraGraphQLContext | undefined)?.transaction\n ?.inTrigger,\n validators: this.#validators,\n transaction: (context as LoraGraphQLContext | undefined)?.transaction\n ?.driverTransaction,\n onStatement: (statement) => {\n this.#onStatement?.({ field: info.fieldName, statement });\n // check() collects what a mutation runs, to plan it afterwards.\n this.#collected\n .get(context as object)\n ?.push({ field: rootKey(info) ?? info.fieldName, statement });\n },\n observe: this.#mutationObserve(info, context),\n beforeDelete: (change, doomed, run) =>\n this.#subscriptions.probeDeletes(change, doomed, run),\n };\n }\n\n /**\n * Whether `operation` runs in one transaction: a mutation with several\n * root fields (a fragment at the root may hold several) under\n * `mutationTransaction: \"operation\"`, with no transaction in the context.\n */\n #atomic(\n operation: OperationDefinitionNode | null | undefined,\n context: unknown,\n ): boolean {\n return (\n this.#mutationTransaction === \"operation\" &&\n operation?.operation === \"mutation\" &&\n multiRoot(operation) &&\n !(context as LoraGraphQLContext | undefined)?.transaction &&\n this.#driver.begin !== undefined\n );\n }\n\n /** The operation's transaction, and a context carrying it. */\n async #openAtomic(\n context: unknown,\n ): Promise<{ tx: LoraTransaction; context: object }> {\n const tx = await this.begin();\n const base = (context ?? {}) as object;\n const opened = Object.assign(\n Object.create(Object.getPrototypeOf(base) as object) as object,\n base,\n { transaction: tx },\n );\n // The read-set collector follows the operation into its transaction.\n const collector = this.#readSets.get(base);\n if (collector) this.#readSets.set(opened, collector);\n return { tx, context: opened };\n }\n\n /**\n * Commit the operation's transaction when it reported no error; roll it\n * back otherwise, with `data: null`: nothing of it was written.\n */\n async #closeAtomic(\n tx: LoraTransaction,\n result: ExecutionResult,\n ): Promise<{ result: ExecutionResult; committed: boolean }> {\n if (result.errors?.length) {\n await tx.rollback();\n return { result: { ...result, data: null }, committed: false };\n }\n try {\n await tx.commit();\n return { result, committed: true };\n } catch (err) {\n await tx.rollback().catch(() => undefined);\n const error = this.#databaseError(\"commit\", err);\n return {\n result: {\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 committed: false,\n };\n }\n }\n\n /**\n * Warn once when a multi-root mutation runs outside a transaction while\n * `mutationTransaction: \"operation\"` asks for one: graphql-js on\n * `getSchema()` without `envelopPlugin()` commits each root field alone.\n */\n #warnNotAtomic(info: GraphQLResolveInfo, context: unknown): void {\n if (\n this.#warnedNotAtomic ||\n this.#mutationTransaction !== \"operation\" ||\n !multiRoot(info.operation) ||\n (context as LoraGraphQLContext | undefined)?.transaction\n ) {\n return;\n }\n this.#warnedNotAtomic = true;\n console.warn(\n 'lora-graphql: mutationTransaction: \"operation\" is set, but a mutation with several root fields ran outside a transaction, so each root field commits on its own. Run operations through lora.execute(), add lora.envelopPlugin() to your Envelop/Yoga server, or put a lora.begin() transaction in the 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(\n tx,\n (change) => this.#changes.emit(change),\n false,\n (type) => this.model.nodes.has(type),\n );\n }\n\n /**\n * Hand the nodes of an `@outbox` type to `options.handle`, after the\n * commit that made them: for the side effects a transaction cannot\n * hold (a push, an e-mail, a webhook). Delivery is at least once, with\n * retries and backoff; work left by a restart is picked up when the\n * worker starts. With `changeFeed: true` it also hears of nodes\n * created outside this instance, otherwise it finds those on its next\n * sweep. `close()` stops it.\n */\n worker(type: string, options: WorkerOptions): Worker {\n const node = this.model.nodes.get(type);\n if (!node?.outbox) {\n throw new Error(\n node\n ? `worker(\"${type}\"): ${type} has no @outbox`\n : `worker(\"${type}\"): no @node type ${type}`,\n );\n }\n const worker = new OutboxWorker(\n {\n driver: this.#driver,\n node,\n timeoutMs: this.#timeoutMs,\n listen: (listener) => this.#changes.listen(listener),\n onError: this.#onError,\n },\n options,\n );\n this.#workers.add(worker);\n return worker;\n }\n\n /**\n * Write an online copy of the database into `targetDir` (missing or\n * empty) while requests keep running: the graph as of one committed\n * transaction, as `<targetDir>/<name>.loradb`, which opens with\n * `createDatabase(name, { databaseDir: targetDir })`. Mutations wait\n * only while the graph is taken, not while it is written. For an\n * off-host backup of a database this process owns.\n *\n * Needs a driver with `snapshot()`: `loraDriver(db)` over a lora-node\n * database opened with a name and `databaseDir`.\n */\n async snapshot(targetDir: string): Promise<DriverSnapshot> {\n // `driver` is absent in an offline instance (schema tooling).\n const driver = this.#driver as LoraDriver | undefined;\n if (!driver?.snapshot) {\n throw new Error(\n \"snapshot() needs a driver with snapshot(): pass loraDriver(db) over a lora-node database opened with a name and databaseDir\",\n );\n }\n return driver.snapshot(targetDir);\n }\n\n /** Stop the workers, and the engine change feed (with `changeFeed: true`). */\n close(): void {\n for (const worker of this.#workers) void worker.stop();\n this.#workers.clear();\n this.#changes.close();\n }\n}\n"],"names":["OUTBOX","isOutboxProperty","property","RANGE_OPS","RANGE_UNINDEXABLE","TEXT_OPS","inferRequirements","model","out","node","label","f","at","schemaName","hasUnique","kinds","ops","range","op","rootSortable","spatial","text","k","index","reason","field","abstract","suffix","snake","s","requirementId","r","describeRequirement","requirementDdl","quote","name","props","p","options","kind","id","assertSchema","env","required","indexes","constraints","byName","row","differs","type","wantedProps","same","a","b","analyzer","present","wanted","sameTarget","missing","mismatched","created","recreated","quoteName","unusedIndexes","owned","labels","v","param","lit","value","prop","target","key","bin","left","right","not","expr","isNull","negated","fn","args","and","operands","fold","or","e","acc","SIMPLE_NAME","RESERVED","w","printExpr","printOperand","precedence","NOT_PRECEDENCE","m","entries","where","printPattern","l","PRECEDENCE","parentOp","parent","own","printNode","n","rel","inner","printItems","items","i","printTail","orderBy","limit","o","printClauses","clauses","indent","c","printClause","yields","y","line","ModelError","problems","formatProblem","LORA_GRAPHQL_ERROR_CODES","ERROR_CODES","isLoraGraphQLError","err","ext","code","requestError","message","cause","extensions","GraphQLError","MAX_VIOLATIONS","pathText","path","part","validationError","violations","total","shown","more","collapseErrors","errors","groups","error","pattern","group","item","first","count","RELATIONSHIP_OPERATIONS","PLACEHOLDER","RULE_REFERENCES","UNEXPANDED","VIEWER_TEST","isRecord","x","QUANTIFIERS","desugarRule","ctx","owner","ends","keys","expandRule","extra","expanded","desugarNode","viewerType","schema","def","withinRule","expand","stack","cycle","reported","id_","expandNodeRule","toNodeFilter","parts","test","isViewer","desugarAbstract","quantified","pair","member","visit","map","q","checkViewer","viewer","nodes","jwtType","ruleParts","testsRelationshipEnds","copies","isPolymorphic","memberFields","list","declared","abstractOf","newContext","base","noteClaim","bound","seen","EXPR","exprValue","bind","freshVar","candidate","toLoraPoint","input","toStored","listAggregate","lengths","values","init","step","durationSum","distinctCount","VALUE_COUNTS","COMMON_VALUES","COUNTED_TYPES","countedFields","valueKey","analyze","driver","sample","stats","statements","rels","arrow","counted","results","rest","degrees","rows","all","kept","counts","summary","summarize","max","params","plan","largestEstimate","child","MAX_FILTER_DEPTH","MAX_LIST_FILTER","MAX_STRING_FILTER","SEEK_OPS","labelRows","fallback","filterDegree","chosen","perRowCost","cost","relationshipCost","d","nodeWhere","targetCost","quantifier","memberWhere","rootFilterCost","keyed","keyedRows","anchoredRows","valueRows","hasPredicate","seeks","anchor","anchorOf","inverse","narrow","includesOr","branches","fieldRows","branch","tests","used","held","sum","vs","operand","SCALAR_OPS","COUNT_OPS","compileNodeWhere","variable","compileWhere","nodeKeys","checkFieldAuthentication","rule","fieldValidate","pred","scalarPredicate","maskedValue","guarded","descend","relationshipPredicate","relationshipExists","connectionPredicate","depth","outer","compilePropsWhere","checkPropertyAccess","lookup","compile","checkOperand","maxList","maxString","tooLong","stringTooLong","ciOp","ciValue","box","lowered","cypherOp","lower","relationshipPattern","from","targetLabel","to","relVariable","related","projection","authFilter","compileMemberWhere","mine","typename","members","checkAuthentication","distinct","lists","nonEmpty","probe","failing","compareCount","aggregatePredicate","exists","edges","anyOrNone","pairWhere","negate","nonEmptyPair","refuseEdgeRowRules","AGGREGATE_KEYS","side","onEdge","fieldName","aggs","maskSettled","agg","bounds","aggregate","claimsSatisfy","compileRulePart","MissingClaim","bypassed","rules","folded","compileRule","toExpr","foldOr","authValidate","when","validateRules","fieldReadGuard","forbidden","propertyAccess","propertyReadAccess","access","rulePartsHaveViewer","propertyReadGuard","vars","source","bypass","raw","masks","unless","substitute","claimsMaskedValue","checkKeyScope","viewerKey","scope","mapping","viewerNode","claim","prefix","rootFieldGuard","underNot","foldAnd","viewerTest","end","inRule","edge","matchClaims","plain","withoutViewer","wasInAuth","refs","relationshipRules","mode","perMember","isMember","flipped","relationshipRuleFields","refusedEdgeRead","hasRules","back","exprs","head","full","lookupPath","root","cur","sameValue","ka","kb","referenceString","ok","last","flush","read","ruleReference","resolved","unknownContext","start","steps","hops","decides","NOBODY","built","_","expected","claimOp","finish","columns","shape","expectation","readSet","refuseRowRules","what","deniedItem","assertNoneDenied","collectOne","coalesceFalse","countCap","cap","INSTEAD","literallyEmpty","Kind","emptyQuantifier","t","getNullableType","isListType","found","isInputObjectType","fields","instead","refusal","emptyQuantifierRule","context","arg","GRAPHQL_17","versionInfo","withVariables","coercedVariables","variables","variableValuesOf","result","collectFields","selectionSets","visited","set","sel","included","applies","frag","subSelections","fieldArgs","argDef","getArgumentValues","getDirectiveValues","GraphQLSkipDirective","GraphQLIncludeDirective","condition","cond","isAbstractType","isObjectType","K","sha256","data","h","padded","view","bits","off","s0","rotr","s1","g","hh","t1","t2","outView","hmacSha256","block","constantTimeEqual","diff","SIGNATURE_BYTES","encodeCursor","sort","secret","json","_k","val","payload","toBase64Url","bytesToBase64Url","sign","decodeCursor","cursor","arity","encoded","dot","given","base64UrlToBytes","fromBase64Url","nodeCrypto","bytes","b64","keyExpr","resolveLimit","argument","resolveSort","tieBreak","one","direction","propName","dir","resolvePage","backward","requested","signature","sortSignature","sortItems","cursorValues","leadBound","keysetPredicate","equal","lead","after","disjunction","FORMAT_MAX_LENGTH","LABEL","EMAIL","EMAIL_STRICT","HOSTNAME","IPV4","HEX_GROUP","UUID","SLUG","HEX_COLOR","ULID","E164","isIpv6","halves","tail","isHttpUrl","protocol","FORMATS","normalizeText","normalizeValue","codePoints","plural","word","isMultiple","divisor","quotient","checkScalar","min","format","exclusiveMin","exclusiveMax","fail","comparison","checkValue","unique","failure","PROBE_BUDGET_MS","now","probePattern","regex","maxLength","seeds","ch","candidates","pairs","slow","attempt","started","unit","body","FORMAT_EXPORT","jsonSchemaKeywords","patterns","exported","sentence","describeConstraints","each","compareConstraints","before","tightened","changed","loosened","old","stored","scanParams","skipQuoted","renameParams","rename","ref","codeOnly","maskLiterals","close","nl","settable","isUpdatable","offersNested","update","allows","hasSettable","outOfRange","bad","resolveAbstractSort","memberList","sets","filter","sortExprs","projectNode","tagged","mergedOrder","compileAbstractRoot","fieldNodes","limitValue","calls","slice","projectPolymorphic","projectAbstract","pre","chain","otherwise","compileCypherRoot","call","bindStatement","column","normalized","checkListArguments","texts","MAX_LIST_ARGUMENT","projectCypher","gather","per","nested","unknownInputFields","named","isNonNullType","directive","directiveNodes","unknown","known","ast","BUILTIN_SCALARS","unwrap","itemRequired","isScalarLike","isEnumType","storageOf","STORAGE_TYPES","isScalarType","lowerFirst","defaultPlural","typeName","shapeOf","unwrapInput","upperFirst","snakeCase","names","hasOwnConnection","connectionTypeNames","EXACT_OPS","POINT_OPS","rootMatch","computed","computedFields","carry","computedClauses","predicate","seekFromWhere","findRelatedAnchor","keyset","walk","eq","inList","seek","dedupe","includes","other","seekFromOps","family","keyOf","AGGREGATES","nativeAggregate","aggregateReturn","native","order","carried","alias","compileAggregate","aggType","aggregateWanted","aggregateRow","compileGrouped","by","groupType","aggSets","fieldType","getNamedType","sub","bucket","projectRelationshipConnection","typeNames","connType","edgeType","connectionSelections","edgeRead","whereArg","edgeWhere","filterFor","nv","rv","fanOut","edgeEntries","projectProperties","rowsVar","connection","matching","cx","cr","sides","fns","propsType","guard","objType","guardedValue","properties","totalCount","page","sideName","sideType","existing","edgeNodes","edgeField","requiresCache","requiresSelection","requires","cached","parse","defs","selected","connectionOf","masked","projectRelationship","connected","validate","degree","userSort","limitParam","compileByKeys","byKey","NAME","unquote","WRITES","CLAUSES","uniqueTogetherTouched","statement","constrained","mask","keyword","writeClauses","colonNames","dotNames","assigned","deleted","boundNames","touchedBy","u","filtered","whereFields","open","upper","NOT_VARIABLES","escaped","fillChange","change","wrote","entities","affects","reads","labelsOf","LoraTransaction","#tx","#emit","#pending","#inTrigger","#isType","tx","emit","inTrigger","isType","query","written","types","relationshipTypes","#notInTrigger","action","refId","reportedWrites","entityOf","outboxStatements","work","runStatement","NOW","timestamps","edgeStamps","labelTest","seekThenExpand","orFresh","andText","inverseFields","readable","memberTest","relRef","notUniqueTogether","checkUniqueTogetherOf","uniqueTogetherStatement","nWhere","mWhere","theirs","anyTriggers","hasTriggers","any","hasTriggerFunctions","triggerBody","trigger","operation","triggerStatement","relationshipTriggerPrefix","pairsFor","runner","gone","via","self","runWriteTriggers","fresh","updated","fired","perNode","creates","updates","setOneOf","fire","runDeleteTriggers","doomed","transaction","timer","running","changeSoFar","reject","merge","into","drop","wasCreated","pending","touched","made","report","checkCypherFields","findings","SEEK_OPERATORS","checkPlans","compiled","reports","flatten","flattenOuter","notes","sameColumns","scans","estimates","estimatedRows","SEEKS","BIND_NOTHING","scanExpands","sourceScan","checkStatements","children","INDEXED_OPS","settableOn","lintModel","unguardedMutations","authOps","readOnlyRules","relationship","readAuthorization","rootFieldRules","PROPERTY_OPS","passableWithoutClaims","readsClaims","polarity","claimsOnlyViolations","here","relationshipRuleOperations","isRelationshipRule","memberAuthorization","desugar","authorization","nodeAs","fieldAs","propertyAs","principalsOf","subject","token","tested","claims","viewerModel","always","namesViewer","rewrite","dropped","relationshipProperties","user","rootFieldVerdict","allowedBy","failed","fieldWriteGuarded","ruleLabels","fieldWriteVerdict","propertyVerdict","typeVerdict","verdict","typeRuleVerdict","rulesFor","isFalse","fieldVerdict","relationshipAuthentication","relationshipVerdict","authentication","accessLints","authenticated","alone","anonymousLints","bypassReach","rewritableRuleFields","maskOracles","refusedNestedWrites","reached","testedFields","referencedFields","nodeTests","pinned","pinsOne","REPOINT","repointable","updatable","updateRules","updateTests","createTested","once","opsOf","refuses","createOpen","updateOpen","offered","targets","refused","TYPE_WRITES","RELATIONSHIP_WRITES","advice","claimFreeBranch","authenticationCovers","guardOf","has","usesClaims","mutationNames","nonNull","GraphQLNonNull","listOf","GraphQLList","requiredOnCreate","adjustable","buildMutations","resolve","inputs","description","GraphQLInputObjectType","inputDescription","note","scalarInputs","propsCreate","propsUpdate","propsRequired","connectInput","nestedCreateInput","createInput","nestedUpdateInput","updateInput","canCreate","atMost","polymorphicFields","byMember","connect","create","GraphQLBoolean","relationFields","GraphQLInt","scalarsOf","upsertInput","numericAdjust","adjustType","GraphQLFloat","adjustInput","info","GraphQLObjectType","listPayload","obj","run","_src","_args","adjust","updateArgs","RESTRICTIVENESS","strictest","verdicts","best","rootTargets","mutation","subscription","write","relay","asList","ruled","nestedWrites","adds","operationAccess","fragments","principals","rootSelections","operations","unresolved","valueFromASTUntyped","accessMatrix","ruleOps","COMPILED_PER_FIELD","COMPILED_TOTAL","COMPILE_CACHE_BYTES","MAX_CACHED_VARIABLES","ENTRY_OVERHEAD","CompileCache","#byField","#live","#variableNames","#bindHints","#notRebindable","#collected","#drop","#total","#maxBytes","#bytes","maxBytes","entry","request","rebindable","#uses","rebindableValue","#variablesKey","reboundKey","stableKey","claimAt","bindable","rebind","miss","#compileMiss","slots","variableSlots","entryBytes","oldest","jwt","hint","hinted","claimMarkers","MARKER","marked","withPath","variableMarkers","NUMBER_MARKER","VARIABLE_MARKER","real","findSlots","findVariableSlots","rebound","picked","variableNames","chars","VARIABLE_MARKER_KEYED","markers","inside","slot","paths","copy","copied","st","exact","fragment","proto","compileRoot","compileList","compileSingle","compileConnection","rebindableVariables","capped","statsColumns","statsCtx","statsRoot","returned","setPath","SEARCH_SORT","compileSearch","sorted","matches","shortPrefixesWhole","vector","pool","exclude","searchConnectionSelections","searchCount","searchCandidatesCost","selections","searchNodeSelections","whole","matchType","loraDriver","db","execute","stream","single","runLimits","begin","limits","bounded","many","explain","boundedWrites","onFull","waiting","queued","lockHeldByTransaction","targetDir","timeoutMs","signal","settled","abandon","onAbort","assertReadable","executeCypherMutation","MAX_CONCURRENT_STATEMENTS","OPERATION_TIMEOUT_FACTOR","OperationBudget","#controller","#deadline","#timeoutMs","#timer","#maxConcurrent","#waiting","#expired","#running","maxConcurrent","expire","#timeoutError","wake","anySignal","nativeSignal","both","abort","abortedGetter","followers","follower","controller","notConnected","noTarget","refusedRule","tooMany","HIDDEN","requiredMissing","who","mapWriteError","checkCardinality","singlesTouched","relatedSeen","assertCardinality","detail","add","link","checks","checkUniqueTogether","touch","ownerName","assertUniqueTogether","issued","checkRequired","byField","deleteNodes","queue","next","batch","declaredField","isDoomed","keysByNode","restricting","blocking","orphans","orphan","relIds","ids","neighbours","pctx","compileAdjust","current","LazyTransaction","#driver","#options","#single","#real","#opening","#ran","#succeeded","#open","withoutPosition","asserts","supportsAssert","readValidated","readCanBeRefused","NOT_THERE","linksInOne","PREFIX","Assertions","#errors","linkGroups","linkInOne","issue","links","endsStatement","linked","linkStatement","rulesStatement","ending","lctx","onCreate","onMatch","applyLinks","checkEnds","byPair","checkRelationshipRules","endRules","holds","WritePlan","storedDefault","satisfied","failures","ownerKey","pick","adding","replace","disconnect","nestedDelete","spec","keep","edgeProps","remove","defaults","onUpdate","propertyError","TEMPORAL_KIND","tag","assertUniqueKeys","Runner","#moved","#issued","#linking","#queue","#unchecked","#deferred","#abandoned","#flush","nextTurn","inOrder","observe","outcome","#prepareRow","#setItems","adjustments","suppliable","relating","ctx0","prepared","#inOne","task","previous","refusedUpdate","gctx","done","#updatedNodes","applied","creating","createsOnly","validating","updating","relationships","moving","visible","moves","placeholderKey","moved","stamped","bKey","matchText","todo","actx","adjusted","broken","brokenTotal","shapes","sctx","rowsParam","removes","hi","lo","existingRows","comparable","statementRows","stated","relTests","there","connects","connectable","connectsOf","isStandardSchema","standard","Collector","validators","violation","holder","schemaFor","validator","walkEdge","walkRelationship","itemPath","walkNode","TEMPORAL","mapItems","temporalFields","runValidator","job","temporal","segment","validateInput","payloadSelections","payloadType","settleClaims","needsViewerKey","lookupViewerKey","startCallbacks","executeMutation","planCtx","authOp","emptyChange","late","checked","triggered","triggers","payloadFor","payloadTypeName","reading","bulkLimit","upsert","taken","SWEEP_LIMIT","OutboxWorker","#host","#label","#key","#abort","#unlisten","#active","#retries","#more","#failures","#sweeping","#waiters","host","option","least","#sweep","#enqueue","#due","#report","#pump","#process","#lookIn","until","#write","final","asked","wait","ms","TYPES","fieldSchema","nullable","objectSchema","title","scalarFields","inputSchemas","MAX_REPORTED","scanStored","indexed","violationsOf","schemaHash","printSchema","lexicographicSortSchema","buildManifest","doc","specifiedRules","SCALAR_TS","generateTypes","manifest","storage","lines","scalar","enumType","inputNamed","optional","inputInner","typeFromAST","output","outputInner","selection","on","conditional","possible","isInterfaceType","declarations","isUnionType","usedFragments","spread","DEFAULT_GUARDS","resolveGuards","guards","nodeEnv","validationRules","depthRule","aliasRule","rootFieldRule","noIntrospection","parseOptions","envelopPlugin","onRealmMismatch","defaultRealmReport","check","problem","graphqlRealmProblem","realmRule","parseFn","setParseFn","parseOpts","addValidationRule","GraphQLSchema","ValidationContext","guardError","fragmentsOf","depthOf","memo","deepest","INTROSPECTION_ROOTS","introspectionDepthOf","maxIntrospection","rootFields","directiveTypeDefs","PRELUDE_TYPES","ARGUMENT_DIRECTIVES","DIRECTIVE_POSITIONS","HINTS","libraryDirectives","checkDirectivePositions","ours","directives","position","allowed","typeDirectives","typePosition","fieldPosition","cypher","DEFAULT_LIMIT","MAX_LIMIT","resolveGlobalLimit","global","TEXT","NUMBERS","num","readConstraints","lengthArgs","patternArgs","formatArgs","rangeArgs","multipleArgs","sizeArgs","normalizeArgs","isText","isNumber","unsafe","trim","emptyToNull","unicode","textCase","defaultLabel","vectorQueryNames","readSearch","defaultName","scalars","fulltext","Plural","guardedRead","minPrefixLength","maxMatches","vectors","ALLOWED_OPS","KEY_TYPES","UNSORTABLE","buildScalarField","opts","enumName","customScalar","isPrivate","relayId","sortable","groupBy","filterable","defaultArgs","timestampArgs","readonlyFlag","settableArgs","selectableArgs","populatedArgs","fieldAuthorization","vectorArgs","dimensions","vectorQuery","generate","keyArgs","scopeArgs","keyScope","timestamp","defaultValue","defaultMatches","filters","supplied","explicitlyTrue","directiveName","RELATIONSHIP_TYPE","declareRelationship","iface","mf","buildRelationshipField","propsNames","globalLimit","cardinality","limitArgs","maxItems","WRITE_CLAUSES","reportsWrites","returns","TRIGGER_PARAMS","readTriggers","ofRelationship","buildCypherField","warnings","warn","namedType","object","columnName","inferColumn","cypherArgs","argNamed","argShape","quiet","plainSize","plainRange","size","cypherArgumentRange","argumentDefault","argType","valueFromAST","depths","topLevel","re","stop","offset","bare","claimRefs","REFERENCE_PATH","viewerRefProblems","ruleReferenceProblems","ruleStringProblems","_source","SCALAR_WHERE_OPS","JWT_OPS","COUNT_WHERE_OPS","checkAuthorizationWhere","jwtShape","checkRuleWhere","nodeless","references","nodePart","checkNodeWhere","checkEdgeWhere","checkMemberRules","checkConnectionWhere","abstractsOf","checkAbstractWhere","readCacheHints","userTypes","maxAge","fieldHint","readUniqueTogether","singles","ROOT_TYPES","buildModel","typeDefs","buildASTSchema","concatAST","atType","schemaRules","enums","scalarDescriptions","nodeTypes","propsTypes","plainTypes","rootTypes","interfaceTypes","unionTypes","viewerArgs","isNode","isProps","nodeNames","plainNames","objects","targetNames","checkPropertyCollisions","at0","primaryLabels","rootFieldOwners","nodeArgs","primary","custom","search","mutations","abstracts","declaredRel","queries","mutationFields","typeRules","namedRules","schemaDesugar","uncovered","ruleEnds","propertyEnds","users","misplaced","across","unsupported","cacheHints","dedupeProblems","STATUS_ERROR","Observer","meta","tracer","span","durationMs","countRows","onStatementEnd","metrics","attributes","status","exception","checkCustomRequires","requiredCustomFields","databaseError","mapped","operationCachePolicy","document","operationName","hints","getOperationAST","wrapped","wrapperTypes","typeHint","take","isRoot","isCompositeType","wrap","DOCUMENT_CACHE_SIZE","documentBytes","Documents","#guards","#persistedOnly","#schema","#rules","#persistedIds","#documents","#persisted","#documentBytesMax","#documentBytes","#parse","#validate","OperationLimits","#operationTimeoutMs","#maxConcurrentStatements","#operations","#maxCost","#spent","#executions","#eventSpent","#budget","#onCost","execution","event","byOperation","budget","rootOf","searchOf","multiRoot","isDocument","operationType","isVariableError","findOperation","infoContext","runInOrder","timingEntry","timing","rootKey","badInput","GraphQLScalarType","GraphQLDate","GraphQLTime","GraphQLLocalTime","GraphQLDateTime","GraphQLLocalDateTime","GraphQLDuration","parseBigInt","NUMBER_MIN","NUMBER_END","toParam","GraphQLBigInt","CUSTOM_SCALARS","buildBaseTypes","hooks","sortDirection","GraphQLEnumType","pageInfo","GraphQLString","countFilter","point","cartesianPoint","nodeInterface","GraphQLInterfaceType","GraphQLID","customScalars","documented","config","coded","baseType","scalarType","aggregatable","isNumeric","buildAggregateFieldType","aggregateFieldTypes","numeric","buildAggregates","aggregateFieldType","aggregates","OPERATOR_FIELDS","OPERATOR_DOCS","buildFilters","pointInput","cartesianPointInput","spatialInputs","cartesian","inputTypeOf","caseInsensitiveFilter","fieldFilter","wheres","whereOf","relationFilter","polymorphic","connectionFilter","implementation","relationAggregateFilter","connectionWheres","connectionWhere","propsWhere","comparisons","aggregateFieldFilters","aggregateFieldFilter","aggregateWheres","aggregateWhere","usable","propsWheres","toGlobalId","fromGlobalId","decoded","pageOf","src","assertFieldReadable","byResponseKey","_ctx","vectorByResponseKey","nodesByResponseKey","buildObjects","sorts","scalarOutput","connections","abstractTypes","resolveType","impl","GraphQLUnionType","outputOf","connectionResolvers","makeConnection","edgeName","nodeType","propertiesType","connectionAggregates","aggregateSides","relationshipCount","connectionAggregate","propsObjects","propsObject","listArgs","edgeSorts","edgeSortOf","connectionArgs","_a","_c","cypherOutput","relationshipConnectionField","conn","plainObjects","buildQuery","objectTypes","aggregateTypes","resolveRoot","resolveNode","grouped","match","searchEdge","searchConnection","sortArg","common","maxIds","buildSorts","buildSubscriptions","changeOperation","changeRelationship","keyType","previousFields","previousState","buildSchema","ID_CACHE","EngineFeed","#model","#onError","#byLabel","#ids","#lastLsn","onError","feed","backoffMs","delay","#toChange","sleep","outboxOnly","#entity","#remember","#resolveEnds","#relationship","fill","owners","ChangeHub","#maxQueued","#onWrite","#listeners","#feedListeners","#feed","#feedReady","listener","register","overflow","unregister","ready","iterator","CHANGE","SELF_OWNS","changeEvents","make","events","sameContextReads","slotCompile","statistics","contextReads","fixed","filterCost","fan","worst","Subscriptions","#changes","#maxSubscriptions","#subscriptionScope","#maxSubscriptionFilterDepth","#subscriptionTimeoutMs","#subscriptionCounts","#subscribers","#probes","#deleteSeen","#undispatch","#byKeyCompiles","#sharedReads","live","release","#events","#visibleCheck","#relatedVisible","deliveries","sink","#addSubscriber","probed","deletions","dispatch","#dispatch","sinks","deliver","share","selfOwns","#relatedGroup","selfGuard","shared","direct","shareKey","LoraGraphQL","#limits","#maxBatch","#maxListArgument","#maxFilterDepth","#maxTotalCount","#maxListFilter","#maxStringFilter","#callbacks","#triggers","#triggerTimeoutMs","#singleCall","#workers","#validators","#resolvers","#scalars","#jwt","#onStatement","#maskErrors","#observer","#subscriptions","#degrees","#statisticsVersion","#compiled","#statistics","#mutationTransaction","#warnedNotAtomic","#timing","#readSets","#cachePolicies","#timings","cacheBytes","#context","#run","executeFn","setExecuteFn","#atomic","execArgs","#openAtomic","#closeAtomic","setResult","traced","#timingOf","#cachedCompile","#args","#resolveSearch","#resolveRoot","#resolveNode","#resolveCypher","#resolveMutation","invalid","validateSchema","#schemaEnv","#explainMutation","rowBudget","collected","graphqlExecute","coerced","getVariableValues","queryType","hash","#executeReading","policy","#cachePolicy","#execute","collector","contextValue","closed","databaseMs","executionTiming","graphqlSubscribe","dbStart","opSignal","#meta","#databaseError","#checkGuard","#warnNotAtomic","#mutationEnv","#mutationObserve","opened","worker"],"mappings":"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AA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA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"}
|