@loradb/lora-graphql 0.24.1 → 0.25.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/README.md +151 -31
  2. package/dist/analyze/input-schemas.d.ts +11 -0
  3. package/dist/analyze/plans.d.ts +8 -0
  4. package/dist/analyze/stored.d.ts +29 -0
  5. package/dist/cli.js +263 -244
  6. package/dist/cli.js.map +1 -1
  7. package/dist/compile/cache.d.ts +9 -1
  8. package/dist/compile/context.d.ts +3 -0
  9. package/dist/compile/read/common.d.ts +2 -0
  10. package/dist/compile/read/root.d.ts +7 -0
  11. package/dist/compile/selection.d.ts +5 -0
  12. package/dist/diff-CdZZG-N1.js +134 -0
  13. package/dist/diff-CdZZG-N1.js.map +1 -0
  14. package/dist/driver.d.ts +36 -1
  15. package/dist/errors.d.ts +21 -1
  16. package/dist/events/outbox.d.ts +14 -0
  17. package/dist/events/worker.d.ts +67 -0
  18. package/dist/execute/mutate/checks.d.ts +16 -0
  19. package/dist/execute/mutate/env.d.ts +50 -0
  20. package/dist/execute/mutate/errors.d.ts +6 -0
  21. package/dist/execute/mutate/links.d.ts +38 -0
  22. package/dist/execute/mutate/plan.d.ts +5 -0
  23. package/dist/execute/mutate/runner.d.ts +101 -25
  24. package/dist/execute/mutate/single-call.d.ts +92 -0
  25. package/dist/execute/mutate/triggers.d.ts +21 -0
  26. package/dist/execute/mutate/unique-together.d.ts +5 -1
  27. package/dist/execute/mutate/validate.d.ts +11 -0
  28. package/dist/execute/transaction.d.ts +13 -2
  29. package/dist/index.d.ts +7 -2
  30. package/dist/index.js +16 -15
  31. package/dist/lora-graphql-D11QFUkf.js +17222 -0
  32. package/dist/lora-graphql-D11QFUkf.js.map +1 -0
  33. package/dist/lora-graphql.d.ts +30 -1
  34. package/dist/model/build/authorization.d.ts +11 -1
  35. package/dist/model/build/constraints.d.ts +22 -0
  36. package/dist/model/build/rule-checks.d.ts +6 -1
  37. package/dist/model/build/trigger.d.ts +9 -0
  38. package/dist/model/constraints.d.ts +112 -0
  39. package/dist/model/desugar.d.ts +7 -0
  40. package/dist/model/directives.d.ts +1 -1
  41. package/dist/model/types.d.ts +34 -0
  42. package/dist/options.d.ts +76 -3
  43. package/dist/results.d.ts +12 -1
  44. package/dist/schema/scalars.d.ts +8 -1
  45. package/dist/standard-schema.d.ts +37 -0
  46. package/dist/testing.js +1 -1
  47. package/package.json +2 -2
  48. package/dist/diff-K8-GSeKH.js +0 -100
  49. package/dist/diff-K8-GSeKH.js.map +0 -1
  50. package/dist/driver-CXKPLfkz.js +0 -14447
  51. package/dist/driver-CXKPLfkz.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"driver-CXKPLfkz.js","sources":["../src/analyze/indexes.ts","../src/analyze/assert-schema.ts","../src/compile/cypher.ts","../src/model/cypher-lexer.ts","../src/analyze/cypher-check.ts","../src/analyze/plans.ts","../src/analyze/lint.ts","../src/errors.ts","../src/model/types.ts","../src/model/desugar.ts","../src/compile/context.ts","../src/model/points.ts","../src/model/relations.ts","../src/compile/aggregate.ts","../src/compile/cost.ts","../src/compile/filter.ts","../src/compile/auth.ts","../src/model/build/authorization.ts","../src/analyze/principals.ts","../src/analyze/verdicts.ts","../src/analyze/access-lint.ts","../src/model/build/directive-args.ts","../src/model/build/shapes.ts","../src/schema/names.ts","../src/model/inputs.ts","../src/schema/mutations.ts","../src/analyze/access.ts","../src/analyze/statistics.ts","../src/compile/cache.ts","../src/compile/selection.ts","../src/compile/read/common.ts","../src/compile/hmac.ts","../src/compile/cursor.ts","../src/compile/read/sort.ts","../src/compile/read/cypher-field.ts","../src/compile/read/by-keys.ts","../src/compile/read/match.ts","../src/compile/read/aggregates.ts","../src/compile/read/connection.ts","../src/compile/read/project.ts","../src/compile/read/abstract.ts","../src/compile/read/root.ts","../src/compile/read/search.ts","../src/execute/changes.ts","../src/schema/guard.ts","../src/model/unique-together.ts","../src/execute/mutate/env.ts","../src/execute/mutate/fragments.ts","../src/execute/mutate/unique-together.ts","../src/execute/cypher-mutation.ts","../src/execute/transaction.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/plan.ts","../src/execute/mutate/runner.ts","../src/execute/mutate.ts","../src/codegen.ts","../src/guards.ts","../src/model/directives.ts","../src/model/positions.ts","../src/model/build/limits.ts","../src/model/build/search.ts","../src/model/build/scalar-field.ts","../src/model/build/relationship-field.ts","../src/model/build/cypher-field.ts","../src/model/build/rule-references.ts","../src/model/build/rule-checks.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/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","../src/driver.ts"],"sourcesContent":["// S1: the indexes and constraints an API needs, inferred from how it lets\n// clients query each property. The author declares the API; the library\n// derives the storage it needs to be fast.\n\nimport type {\n FilterOperator,\n GraphModel,\n IndexKind,\n ScalarType,\n} from \"../model/types.js\";\n\nexport type SchemaRequirement =\n | {\n kind: \"constraint\";\n constraint: \"NODE_KEY\" | \"UNIQUE\" | \"NOT_NULL\";\n name: string;\n label: string;\n property: string;\n /** Why the library needs it, e.g. `Festival.key is the @key`. */\n reason: string;\n }\n | {\n kind: \"index\";\n index: IndexKind;\n name: string;\n label: string;\n property: string;\n reason: string;\n }\n | {\n /** Queried by name, so matched by name. */\n kind: \"fulltext\";\n name: string;\n label: string;\n properties: string[];\n analyzer: \"STANDARD\" | \"SIMPLE\";\n reason: string;\n }\n | {\n /** Queried by name, so matched by name. */\n kind: \"vector\";\n name: string;\n label: string;\n property: string;\n dimensions: number;\n similarity: \"COSINE\" | \"EUCLIDEAN\";\n reason: string;\n };\n\nconst RANGE_OPS = new Set<FilterOperator>([\"LT\", \"LTE\", \"GT\", \"GTE\"]);\n\n/**\n * Types a RANGE index must not be inferred for. LoraDB keeps durations out\n * of its sorted index (they have no total order); other temporals are\n * indexed by the instant they denote (E17).\n */\nexport const RANGE_UNINDEXABLE = new Set<ScalarType>([\"Duration\"]);\nconst TEXT_OPS = new Set<FilterOperator>([\n \"CONTAINS\",\n \"STARTS_WITH\",\n \"ENDS_WITH\",\n]);\n\n/**\n * Derive every constraint and index the model's API needs.\n *\n * - `@key` → node key constraint (unique + present); it also serves\n * exact-match, range and ordered scans, so no extra index.\n * - `@unique` → uniqueness constraint (backed by a RANGE index).\n * - `@sortable` on a non-null field → existence constraint: keyset\n * pagination may then bound the scan with `>=` without losing nulls.\n * - `EQ` / `IN` → nothing: LoraDB builds exact-match indexes lazily.\n * - `LT` / `LTE` / `GT` / `GTE` or `@sortable` → RANGE.\n * - `CONTAINS` / `STARTS_WITH` / `ENDS_WITH` → TEXT.\n * - `WITHIN_BBOX` / `DISTANCE` on a Point → POINT.\n * - `@index(kind:)` → that index.\n */\nexport function inferRequirements(model: GraphModel): SchemaRequirement[] {\n const out: SchemaRequirement[] = [];\n for (const node of model.nodes.values()) {\n const label = node.labels[0]!;\n for (const s of node.search) {\n out.push(\n s.kind === \"fulltext\"\n ? {\n kind: \"fulltext\",\n name: s.name,\n label,\n properties: s.fields.map((f) => f.property),\n analyzer: s.analyzer,\n reason: `${node.name} has @fulltext ${s.name} (${s.queryName})`,\n }\n : {\n kind: \"vector\",\n name: s.name,\n label,\n property: s.field.property,\n dimensions: s.dimensions,\n similarity: s.similarity,\n reason: `${node.name}.${s.field.name} is a @vector (${s.queryName})`,\n },\n );\n }\n for (const f of node.fields.values()) {\n if (f.kind !== \"scalar\") continue;\n const at = `${node.name}.${f.name}`;\n if (f.key) {\n out.push({\n kind: \"constraint\",\n constraint: \"NODE_KEY\",\n name: schemaName(label, f.property, \"key\"),\n label,\n property: f.property,\n reason: `${at} is the @key`,\n });\n // A node key is backed by a RANGE index: nothing else to add.\n continue;\n }\n const hasUnique = f.unique;\n if (hasUnique) {\n out.push({\n kind: \"constraint\",\n constraint: \"UNIQUE\",\n name: schemaName(label, f.property, \"unique\"),\n label,\n property: f.property,\n reason: `${at} is @unique`,\n });\n }\n if (f.sortable && f.required && !f.list) {\n out.push({\n kind: \"constraint\",\n constraint: \"NOT_NULL\",\n name: schemaName(label, f.property, \"exists\"),\n label,\n property: f.property,\n reason: `${at} is non-null and @sortable`,\n });\n }\n const kinds = new Map<IndexKind, string>();\n const ops = [...f.filters];\n if (!hasUnique && !RANGE_UNINDEXABLE.has(f.type)) {\n const range = ops.filter((op) => RANGE_OPS.has(op));\n if (range.length > 0) {\n kinds.set(\"RANGE\", `${at} is @filterable by ${range.join(\", \")}`);\n } else if (f.sortable) {\n kinds.set(\"RANGE\", `${at} is @sortable`);\n }\n }\n const spatial = ops.filter(\n (op) => op === \"WITHIN_BBOX\" || op === \"DISTANCE\",\n );\n if (spatial.length > 0) {\n kinds.set(\"POINT\", `${at} is @filterable by ${spatial.join(\", \")}`);\n }\n const text = ops.filter((op) => TEXT_OPS.has(op));\n if (text.length > 0) {\n kinds.set(\"TEXT\", `${at} is @filterable by ${text.join(\", \")}`);\n }\n for (const k of f.indexes) {\n if (!kinds.has(k) && !(k === \"RANGE\" && hasUnique)) {\n kinds.set(k, `${at} has @index(kind: ${k})`);\n }\n }\n for (const [index, reason] of kinds) {\n out.push({\n kind: \"index\",\n index,\n name: schemaName(label, f.property, index.toLowerCase()),\n label,\n property: f.property,\n reason,\n });\n }\n }\n }\n return out;\n}\n\nfunction schemaName(label: string, property: string, suffix: string): string {\n return `${snake(label)}_${snake(property)}_${suffix}`;\n}\n\nfunction snake(s: string): string {\n return s\n .replace(/([a-z0-9])([A-Z])/g, \"$1_$2\")\n .replace(/[^A-Za-z0-9]+/g, \"_\")\n .toLowerCase();\n}\n\n/** A stable identity: equal ids need no change between two models. */\nexport function requirementId(r: SchemaRequirement): string {\n switch (r.kind) {\n case \"index\":\n return `index:${r.index}:${r.label}:${r.property}`;\n case \"constraint\":\n return `constraint:${r.constraint}:${r.label}:${r.property}`;\n case \"fulltext\":\n return `fulltext:${r.name}:${r.label}:${r.properties.join(\",\")}:${r.analyzer}`;\n case \"vector\":\n return `vector:${r.name}:${r.label}:${r.property}:${r.dimensions}:${r.similarity}`;\n }\n}\n\n/** One line for humans, e.g. `RANGE index on :Festival(name)`. */\nexport function describeRequirement(r: SchemaRequirement): string {\n switch (r.kind) {\n case \"index\":\n return `${r.index} index on :${r.label}(${r.property})`;\n case \"constraint\":\n return `${r.constraint} constraint on :${r.label}(${r.property})`;\n case \"fulltext\":\n return `FULLTEXT index ${r.name} on :${r.label}(${r.properties.join(\", \")})`;\n case \"vector\":\n return `VECTOR index ${r.name} on :${r.label}(${r.property}), ${r.dimensions} dimensions, ${r.similarity.toLowerCase()}`;\n }\n}\n\n/** The DDL statement that creates a requirement, idempotently. */\nexport function requirementDdl(r: SchemaRequirement): string {\n const label = quote(r.label);\n const name = quote(r.name);\n if (r.kind === \"fulltext\") {\n const props = r.properties.map((p) => `n.${quote(p)}`).join(\", \");\n const options =\n r.analyzer === \"SIMPLE\"\n ? \" OPTIONS {indexConfig: {`fulltext.analyzer`: 'simple'}}\"\n : \"\";\n return `CREATE FULLTEXT INDEX ${name} IF NOT EXISTS FOR (n:${label}) ON EACH [${props}]${options}`;\n }\n if (r.kind === \"vector\") {\n return `CREATE VECTOR INDEX ${name} IF NOT EXISTS FOR (n:${label}) ON (n.${quote(r.property)}) OPTIONS {indexConfig: {\\`vector.dimensions\\`: ${r.dimensions}, \\`vector.similarity_function\\`: '${r.similarity.toLowerCase()}'}}`;\n }\n const property = quote(r.property);\n if (r.kind === \"constraint\") {\n const kind = {\n NODE_KEY: \"IS NODE KEY\",\n UNIQUE: \"IS UNIQUE\",\n NOT_NULL: \"IS NOT NULL\",\n }[r.constraint];\n return `CREATE CONSTRAINT ${name} IF NOT EXISTS FOR (n:${label}) REQUIRE n.${property} ${kind}`;\n }\n const kind = r.index === \"RANGE\" ? \"\" : `${r.index} `;\n return `CREATE ${kind}INDEX ${name} IF NOT EXISTS FOR (n:${label}) ON (n.${property})`;\n}\n\nfunction quote(id: string): string {\n return \"`\" + id.replace(/`/g, \"``\") + \"`\";\n}\n","// 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 /** `reduce(acc = init, v IN list | step)` */\n | {\n kind: \"reduce\";\n accumulator: string;\n init: Expr;\n variable: string;\n list: Expr;\n step: Expr;\n }\n /** `v:Label1:Label2` */\n | { kind: \"hasLabels\"; variable: string; labels: string[] };\n\nexport interface MapEntry {\n key: string;\n value: Expr;\n}\n\nexport type ProjectionEntry =\n | { kind: \"property\"; key: string }\n | { kind: \"entry\"; key: string; value: Expr };\n\nexport interface NodePattern {\n variable?: string;\n labels: string[];\n /** Inline `{key: value}` properties: a start node seeks on them. */\n properties?: Array<{ key: string; value: Expr }>;\n}\n\nexport interface RelPattern {\n variable?: string;\n type: string;\n /** BOTH: an undirected pattern, `-[:T]-`. */\n direction: \"OUT\" | \"IN\" | \"BOTH\";\n}\n\n/** A linear pattern: node (rel node)*. */\nexport interface Pattern {\n start: NodePattern;\n hops: Array<{ rel: RelPattern; node: NodePattern }>;\n}\n\nexport interface SortItem {\n expr: Expr;\n direction: \"ASC\" | \"DESC\";\n}\n\nexport interface ReturnItem {\n expr: Expr;\n alias?: string;\n}\n\nexport type Clause =\n | { kind: \"match\"; pattern: Pattern; where: Expr | undefined }\n | { kind: \"unwind\"; expr: Expr; alias: string }\n /** `CALL proc(args) YIELD item AS alias, … [WHERE …]` */\n | {\n kind: \"procedure\";\n procedure: string;\n args: Expr[];\n yields: Array<{ item: string; alias?: string }>;\n where?: Expr | undefined;\n }\n /** A hand-written statement (`@cypher`), parameters already renamed. */\n | { kind: \"raw\"; text: string }\n | {\n kind: \"with\";\n distinct?: boolean;\n items: ReturnItem[];\n where?: Expr | undefined;\n orderBy?: SortItem[] | undefined;\n limit?: Expr | undefined;\n }\n | { kind: \"call\"; imports: string[]; body: Clause[] }\n | {\n kind: \"return\";\n items: ReturnItem[];\n orderBy?: SortItem[] | undefined;\n limit?: Expr | undefined;\n };\n\n// ---------------------------------------------------------------------------\n// Constructors\n// ---------------------------------------------------------------------------\n\nexport const v = (name: string): Expr => ({ kind: \"var\", name });\nexport const param = (name: string): Expr => ({ kind: \"param\", name });\nexport const lit = (value: null | boolean | number | string): Expr => ({\n kind: \"literal\",\n value,\n});\nexport const prop = (target: Expr, key: string): Expr => ({\n kind: \"prop\",\n target,\n key,\n});\nexport const bin = (op: BinaryOp, left: Expr, right: Expr): Expr => ({\n kind: \"binary\",\n op,\n left,\n right,\n});\nexport const not = (expr: Expr): Expr => ({ kind: \"not\", expr });\nexport const isNull = (expr: Expr, negated = false): Expr => ({\n kind: \"isNull\",\n expr,\n negated,\n});\nexport const fn = (name: string, ...args: Expr[]): Expr => ({\n kind: \"call\",\n fn: name,\n args,\n});\n\n/** AND of every defined operand; undefined when there are none. */\nexport function and(...operands: Array<Expr | undefined>): Expr | undefined {\n return fold(\"AND\", operands);\n}\n\n/** OR of every defined operand; undefined when there are none. */\nexport function or(...operands: Array<Expr | undefined>): Expr | undefined {\n return fold(\"OR\", operands);\n}\n\nfunction fold(\n op: \"AND\" | \"OR\",\n operands: Array<Expr | undefined>,\n): Expr | undefined {\n const present = operands.filter((e): e is Expr => e !== undefined);\n if (present.length === 0) return undefined;\n return present.reduce((acc, e) => bin(op, acc, e));\n}\n\n// ---------------------------------------------------------------------------\n// Printer\n// ---------------------------------------------------------------------------\n\nconst SIMPLE_NAME = /^[A-Za-z_][A-Za-z0-9_]*$/;\n\n// Words that may not appear bare where the grammar expects a name.\nconst RESERVED = new Set(\n [\n \"all\",\n \"and\",\n \"any\",\n \"as\",\n \"asc\",\n \"ascending\",\n \"by\",\n \"call\",\n \"case\",\n \"contains\",\n \"count\",\n \"create\",\n \"delete\",\n \"desc\",\n \"descending\",\n \"detach\",\n \"distinct\",\n \"else\",\n \"end\",\n \"ends\",\n \"exists\",\n \"false\",\n \"in\",\n \"is\",\n \"limit\",\n \"match\",\n \"merge\",\n \"none\",\n \"not\",\n \"null\",\n \"on\",\n \"optional\",\n \"or\",\n \"order\",\n \"remove\",\n \"return\",\n \"set\",\n \"single\",\n \"skip\",\n \"starts\",\n \"then\",\n \"true\",\n \"union\",\n \"unwind\",\n \"when\",\n \"where\",\n \"with\",\n \"xor\",\n \"yield\",\n ].map((w) => w.toLowerCase()),\n);\n\n/** Escape an identifier (variable, label, type, property or map key). */\nexport function name(id: string): string {\n if (SIMPLE_NAME.test(id) && !RESERVED.has(id.toLowerCase())) return id;\n return \"`\" + id.replace(/`/g, \"``\") + \"`\";\n}\n\nexport function printExpr(e: Expr): string {\n switch (e.kind) {\n case \"var\":\n return name(e.name);\n case \"param\":\n return \"$\" + name(e.name);\n case \"literal\":\n if (e.value === null) return \"null\";\n if (typeof e.value === \"string\") return JSON.stringify(e.value);\n return String(e.value);\n case \"prop\":\n return `${printOperand(e.target)}.${name(e.key)}`;\n case \"binary\":\n return `${printOperand(e.left, e.op)} ${e.op} ${printOperand(e.right, e.op)}`;\n case \"not\":\n return `NOT ${precedence(e.expr) <= NOT_PRECEDENCE || e.expr.kind === \"binary\" ? `(${printExpr(e.expr)})` : printExpr(e.expr)}`;\n case \"isNull\":\n return `${printOperand(e.expr)} IS ${e.negated ? \"NOT \" : \"\"}NULL`;\n case \"call\":\n return `${e.fn}(${e.args.map(printExpr).join(\", \")})`;\n case \"list\":\n return `[${e.items.map(printExpr).join(\", \")}]`;\n case \"map\":\n return `{ ${e.entries.map((m) => `${name(m.key)}: ${printExpr(m.value)}`).join(\", \")} }`;\n case \"mapProjection\": {\n const entries = e.entries.map((p) =>\n p.kind === \"property\"\n ? `.${name(p.key)}`\n : `${name(p.key)}: ${printExpr(p.value)}`,\n );\n return entries.length === 0\n ? `${name(e.variable)} {}`\n : `${name(e.variable)} { ${entries.join(\", \")} }`;\n }\n case \"comprehension\": {\n const where = e.where ? ` WHERE ${printExpr(e.where)}` : \"\";\n return `[${printPattern(e.pattern)}${where} | ${printExpr(e.projection)}]`;\n }\n case \"listComprehension\":\n return `[${name(e.variable)} IN ${printExpr(e.list)}${e.where ? ` WHERE ${printExpr(e.where)}` : \"\"}${e.projection ? ` | ${printExpr(e.projection)}` : \"\"}]`;\n case \"reduce\":\n return `reduce(${name(e.accumulator)} = ${printExpr(e.init)}, ${name(e.variable)} IN ${printExpr(e.list)} | ${printExpr(e.step)})`;\n case \"hasLabels\":\n return `${name(e.variable)}${e.labels.map((l) => \":\" + name(l)).join(\"\")}`;\n case \"case\":\n return `CASE WHEN ${printExpr(e.when)} THEN ${printExpr(e.then)} ELSE ${printExpr(e.else)} END`;\n case \"slice\":\n return `${printOperand(e.target)}[${e.from ? printExpr(e.from) : \"\"}..${e.to ? printExpr(e.to) : \"\"}]`;\n }\n}\n\n// Operator precedence, loosest first. An operand is parenthesised only\n// when it binds looser than its parent, or equally loose under a\n// non-associative parent (comparisons).\nconst PRECEDENCE: Record<BinaryOp, number> = {\n OR: 1,\n AND: 2,\n \"=\": 4,\n \"<>\": 4,\n \"<\": 4,\n \"<=\": 4,\n \">\": 4,\n \">=\": 4,\n IN: 4,\n CONTAINS: 4,\n \"STARTS WITH\": 4,\n \"ENDS WITH\": 4,\n \"+\": 5,\n \"-\": 5,\n \"*\": 6,\n \"/\": 6,\n};\nconst NOT_PRECEDENCE = 3;\n\nfunction precedence(e: Expr): number {\n if (e.kind === \"binary\") return PRECEDENCE[e.op];\n if (e.kind === \"not\") return NOT_PRECEDENCE;\n if (e.kind === \"isNull\") return 4;\n return 10;\n}\n\nfunction printOperand(e: Expr, parentOp?: BinaryOp): string {\n const s = printExpr(e);\n const parent = parentOp ? PRECEDENCE[parentOp] : 10;\n const own = precedence(e);\n // Bracket AND under OR anyway: correct either way, easier to read.\n if (parentOp === \"OR\" && e.kind === \"binary\" && e.op === \"AND\") {\n return `(${s})`;\n }\n if (own > parent || own === 10) return s;\n if (own === parent && parentOp && (parentOp === \"AND\" || parentOp === \"OR\")) {\n return s;\n }\n return `(${s})`;\n}\n\nfunction printNode(n: NodePattern): string {\n const labels = n.labels.map((l) => \":\" + name(l)).join(\"\");\n const props = n.properties?.length\n ? ` {${n.properties.map((p) => `${name(p.key)}: ${printExpr(p.value)}`).join(\", \")}}`\n : \"\";\n return `(${n.variable ? name(n.variable) : \"\"}${labels}${props})`;\n}\n\nexport function printPattern(p: Pattern): string {\n let s = printNode(p.start);\n for (const { rel, node } of p.hops) {\n const inner = `[${rel.variable ? name(rel.variable) : \"\"}:${name(rel.type)}]`;\n s +=\n rel.direction === \"OUT\"\n ? `-${inner}->`\n : rel.direction === \"IN\"\n ? `<-${inner}-`\n : `-${inner}-`;\n s += printNode(node);\n }\n return s;\n}\n\nfunction printItems(items: ReturnItem[]): string {\n return items\n .map((i) => {\n const expr = printExpr(i.expr);\n if (i.alias === undefined) return expr;\n if (i.expr.kind === \"var\" && i.expr.name === i.alias) return expr;\n return `${expr} AS ${name(i.alias)}`;\n })\n .join(\", \");\n}\n\nfunction printTail(\n orderBy: SortItem[] | undefined,\n limit: Expr | undefined,\n): string {\n let s = \"\";\n if (orderBy && orderBy.length > 0) {\n s +=\n \" ORDER BY \" +\n orderBy.map((o) => `${printExpr(o.expr)} ${o.direction}`).join(\", \");\n }\n if (limit) s += ` LIMIT ${printExpr(limit)}`;\n return s;\n}\n\nexport function printClauses(clauses: Clause[], indent = \"\"): string {\n return clauses.map((c) => indent + printClause(c, indent)).join(\"\\n\");\n}\n\nfunction printClause(c: Clause, indent: string): string {\n switch (c.kind) {\n case \"match\":\n return (\n `MATCH ${printPattern(c.pattern)}` +\n (c.where ? `\\n${indent}WHERE ${printExpr(c.where)}` : \"\")\n );\n case \"unwind\":\n return `UNWIND ${printExpr(c.expr)} AS ${name(c.alias)}`;\n case \"procedure\": {\n const yields = c.yields\n .map((y) =>\n y.alias && y.alias !== y.item\n ? `${name(y.item)} AS ${name(y.alias)}`\n : name(y.item),\n )\n .join(\", \");\n return (\n `CALL ${c.procedure}(${c.args.map(printExpr).join(\", \")}) YIELD ${yields}` +\n (c.where ? `\\n${indent}WHERE ${printExpr(c.where)}` : \"\")\n );\n }\n case \"raw\":\n return c.text\n .trim()\n .split(\"\\n\")\n .map((line, i) => (i === 0 ? line : indent + line.trimEnd()))\n .join(\"\\n\");\n case \"with\":\n return (\n `WITH ${c.distinct ? \"DISTINCT \" : \"\"}${printItems(c.items)}` +\n (c.where ? ` WHERE ${printExpr(c.where)}` : \"\") +\n printTail(c.orderBy, c.limit)\n );\n case \"call\": {\n const inner = indent + \" \";\n const imports =\n c.imports.length > 0\n ? `${inner}WITH ${c.imports.map(name).join(\", \")}\\n`\n : \"\";\n return `CALL {\\n${imports}${printClauses(c.body, inner)}\\n${indent}}`;\n }\n case \"return\":\n return `RETURN ${printItems(c.items)}` + printTail(c.orderBy, c.limit);\n }\n}\n","// Just enough lexing of hand-written Cypher to find `$parameters`\n// (skipping strings, backtick-quoted names and comments), rename them,\n// and spot constructs the translation rules avoid. The engine's own\n// parser checks everything else, through `explain()`.\n\nexport interface ParamRef {\n name: string;\n start: number;\n end: number;\n}\n\nexport function scanParams(text: string): ParamRef[] {\n const out: ParamRef[] = [];\n let i = 0;\n while (i < text.length) {\n const c = text[i]!;\n if (c === \"'\" || c === '\"') {\n i = skipQuoted(text, i, c);\n } else if (c === \"`\") {\n const end = text.indexOf(\"`\", i + 1);\n i = end < 0 ? text.length : end + 1;\n } else if (c === \"/\" && text[i + 1] === \"/\") {\n const end = text.indexOf(\"\\n\", i);\n i = end < 0 ? text.length : end + 1;\n } else if (c === \"/\" && text[i + 1] === \"*\") {\n const end = text.indexOf(\"*/\", i + 2);\n i = end < 0 ? text.length : end + 2;\n } else if (c === \"$\") {\n const start = i;\n i++;\n let name: string;\n if (text[i] === \"`\") {\n const end = text.indexOf(\"`\", i + 1);\n name = text.slice(i + 1, end < 0 ? text.length : end);\n i = end < 0 ? text.length : end + 1;\n } else {\n const m = /^[A-Za-z_][A-Za-z0-9_]*/.exec(text.slice(i));\n name = m ? m[0] : \"\";\n i += name.length;\n }\n if (name) out.push({ name, start, end: i });\n } else {\n i++;\n }\n }\n return out;\n}\n\nfunction skipQuoted(text: string, start: number, quote: string): number {\n let i = start + 1;\n while (i < text.length) {\n if (text[i] === \"\\\\\") i += 2;\n else if (text[i] === quote) return i + 1;\n else i++;\n }\n return i;\n}\n\n/** Replace every `$name` with `$<rename(name)>`. */\nexport function renameParams(\n text: string,\n rename: (name: string) => string,\n): string {\n let out = \"\";\n let last = 0;\n for (const ref of scanParams(text)) {\n out += text.slice(last, ref.start) + \"$\" + rename(ref.name);\n last = ref.end;\n }\n return out + text.slice(last);\n}\n\n/** Code outside strings and comments, uppercased, for construct checks. */\nexport function codeOnly(text: string): string {\n let out = \"\";\n let i = 0;\n while (i < text.length) {\n const c = text[i]!;\n if (c === \"'\" || c === '\"') {\n i = skipQuoted(text, i, c);\n out += \" \";\n } else if (c === \"/\" && text[i + 1] === \"/\") {\n const end = text.indexOf(\"\\n\", i);\n i = end < 0 ? text.length : end + 1;\n out += \" \";\n } else if (c === \"/\" && text[i + 1] === \"*\") {\n const end = text.indexOf(\"*/\", i + 2);\n i = end < 0 ? text.length : end + 2;\n out += \" \";\n } else {\n out += c;\n i++;\n }\n }\n return out.toUpperCase().replace(/\\s+/g, \" \");\n}\n\n/**\n * `text` with the same length and offsets, strings and comments blanked\n * and the insides of backtick-quoted names replaced by `_`, so structure\n * (brackets, commas, keywords) can be read without being fooled by them.\n */\nexport function maskLiterals(text: string): string {\n let out = \"\";\n let i = 0;\n while (i < text.length) {\n const c = text[i]!;\n let end: number;\n if (c === \"'\" || c === '\"') {\n end = skipQuoted(text, i, c);\n out += \" \".repeat(end - i);\n } else if (c === \"`\") {\n const close = text.indexOf(\"`\", i + 1);\n end = close < 0 ? text.length : close + 1;\n out +=\n \"`\" + \"_\".repeat(Math.max(0, end - i - 2)) + (close < 0 ? \"\" : \"`\");\n } else if (c === \"/\" && text[i + 1] === \"/\") {\n const nl = text.indexOf(\"\\n\", i);\n end = nl < 0 ? text.length : nl;\n out += \" \".repeat(end - i);\n } else if (c === \"/\" && text[i + 1] === \"*\") {\n const close = text.indexOf(\"*/\", i + 2);\n end = close < 0 ? text.length : close + 2;\n out += text.slice(i, end).replace(/[^\\n]/g, \" \");\n } else {\n end = i + 1;\n out += c;\n }\n i = end;\n }\n return out;\n}\n","// S4, online half: every @cypher statement is planned with `explain()`\n// before any request runs it, so a broken statement fails `check()` with\n// its location and the engine's message.\n\nimport { name } from \"../compile/cypher.js\";\nimport type { LoraDriver } from \"../driver.js\";\nimport { renameParams } from \"../model/cypher-lexer.js\";\nimport type { CypherField, GraphModel } from \"../model/types.js\";\n\nexport interface CypherFinding {\n type: string;\n field: string;\n message: string;\n}\n\nexport async function checkCypherFields(\n driver: LoraDriver,\n model: GraphModel,\n): Promise<CypherFinding[]> {\n if (!driver.explain) return [];\n const findings: CypherFinding[] = [];\n const fields: CypherField[] = [\n ...model.queries,\n ...model.mutations,\n ...[...model.nodes.values()].flatMap((n) =>\n [...n.fields.values()].filter(\n (f): f is CypherField => f.kind === \"cypher\",\n ),\n ),\n ];\n for (const field of fields) {\n const params: Record<string, unknown> = {};\n const statement = renameParams(field.statement, (p) => {\n params[`a_${p}`] = null;\n return `a_${p}`;\n });\n const owner = model.nodes.get(field.owner);\n const text = owner\n ? `MATCH (this:${name(owner.labels[0]!)}) WITH this LIMIT 1\\nCALL {\\n WITH this\\n${statement}\\n}\\nRETURN ${name(field.columnName)} AS value`\n : `CALL {\\n${statement}\\n}\\nRETURN ${name(field.columnName)} AS value`;\n const at = (message: string) =>\n findings.push({ type: field.owner, field: field.name, message });\n try {\n const plan = await driver.explain({ text, params: params as never });\n if (plan.shape === \"mutating\" && field.owner !== \"Mutation\") {\n at(\"the statement writes; only Mutation fields may\");\n }\n } catch (err) {\n at(err instanceof Error ? err.message : String(err));\n }\n }\n return findings;\n}\n","// 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};\n\nexport async function checkPlans(\n driver: LoraDriver,\n compiled: CompiledRead,\n options: { rowBudget?: number } = {},\n): Promise<PlanReport[]> {\n if (!driver.explain) {\n throw new Error(\n \"the driver has no explain(); plan checks need @loradb/lora-node\",\n );\n }\n const reports: PlanReport[] = [];\n for (const [i, statement] of compiled.statements.entries()) {\n const plan = await driver.explain(statement);\n const nodes = flatten(plan.tree);\n // The root field's access path is the part of the plan outside every\n // CALL { } body; scans inside one belong to that subquery (a @cypher\n // statement, a nested list) and are reported as notes, not blamed on\n // the root.\n const outer = flattenOuter(plan.tree);\n const inner = nodes.filter((n) => !outer.includes(n));\n const findings: PlanFinding[] = [];\n const notes: PlanFinding[] = inner\n .filter((n) => n.operator === \"NodeByLabelScan\")\n .map((n) => ({\n rule: \"full-scan\" as const,\n message: `a subquery scans :${n.details[\"labels\"] ?? \"?\"} (NodeByLabelScan), e.g. a @cypher statement's own MATCH`,\n statement: statement.text,\n }));\n if (plan.shape !== \"readOnly\") {\n findings.push({\n rule: \"mutating-read\",\n message: \"a read statement has a mutating plan\",\n statement: statement.text,\n });\n }\n if (i === 0 && !sameColumns(plan.resultColumns, compiled.columns)) {\n findings.push({\n rule: \"result-columns\",\n message: `expected columns [${compiled.columns.join(\", \")}], plan returns [${plan.resultColumns.join(\", \")}]`,\n statement: statement.text,\n });\n }\n for (const e of compiled.expectations.filter((x) => x.statement === i)) {\n const scans = outer.filter(\n (n) =>\n n.operator === \"NodeByLabelScan\" &&\n n.details[\"labels\"]?.split(/[,:|&\\s]+/).includes(e.label),\n );\n const seeks = outer.filter(\n (n) =>\n SEEK_OPERATORS[e.access].includes(n.operator) &&\n n.details[\"labels\"]?.split(/[,:|&\\s]+/).includes(e.label),\n );\n if (scans.length > 0 || seeks.length === 0) {\n findings.push({\n rule: \"full-scan\",\n message: `expected an index ${e.access} seek on :${e.label} (${e.reason}), plan uses ${\n scans.length > 0 ? \"NodeByLabelScan\" : \"no seek\"\n }`,\n statement: statement.text,\n });\n }\n }\n const estimates = nodes\n .filter((n) => n.operator.endsWith(\"Scan\") && n.estimatedRows !== null)\n .map((n) => n.estimatedRows!);\n const estimatedRows = estimates.length > 0 ? Math.max(...estimates) : null;\n if (\n options.rowBudget !== undefined &&\n estimatedRows !== null &&\n estimatedRows > options.rowBudget\n ) {\n findings.push({\n rule: \"row-budget\",\n message: `the engine estimates ${estimatedRows} rows scanned; the budget is ${options.rowBudget}`,\n statement: statement.text,\n });\n }\n reports.push({\n statement,\n plan,\n operators: nodes.map((n) => n.operator),\n estimatedRows,\n findings,\n notes,\n });\n }\n return reports;\n}\n\nconst SEEKS = new Set(Object.values(SEEK_OPERATORS).flat());\nconst BIND_NOTHING = new Set([\"Argument\", \"Unwind\", \"Filter\", \"Projection\"]);\n\n/**\n * Expansions that start from a full scan: an `Expand` whose source is a\n * `NodeByLabelScan`, or a `NodeScan` with nothing below it that binds the\n * node. A key test in the same pattern as the expansion plans this way,\n * and the statement then walks every relationship of the type. Statements\n * that start from keys (every mutation statement) must have none.\n */\nexport function scanExpands(\n statement: Statement,\n plan: QueryPlan,\n): PlanFinding[] {\n return flatten(plan.tree)\n .filter((n) => n.operator === \"Expand\")\n .flatMap((expand) => {\n const source = sourceScan(expand);\n return source\n ? [\n {\n rule: \"scan-expand\" as const,\n message: `Expand ${expand.details[\"types\"] ?? \"\"} starts from ${source.operator}${\n source.details[\"labels\"] ? ` :${source.details[\"labels\"]}` : \"\"\n } instead of a seek`,\n statement: statement.text,\n },\n ]\n : [];\n });\n}\n\n/** The full scan feeding `expand`, if its source is one. */\nfunction sourceScan(expand: PlanNode): PlanNode | undefined {\n for (let n = expand.children[0]; n; n = n.children[0]) {\n if (SEEKS.has(n.operator)) return undefined;\n if (n.operator === \"NodeByLabelScan\") return n;\n // A NodeScan over operators that bind no nodes scans every node;\n // over anything else it re-reads a node bound earlier.\n if (\n n.operator === \"NodeScan\" &&\n flatten(n)\n .slice(1)\n .every((m) => BIND_NOTHING.has(m.operator))\n ) {\n return n;\n }\n }\n return undefined;\n}\n\nfunction flatten(node: PlanNode): PlanNode[] {\n return [node, ...node.children.flatMap(flatten)];\n}\n\n/** Like flatten, without the bodies of `CallSubquery` (its later children). */\nfunction flattenOuter(node: PlanNode): PlanNode[] {\n const children =\n node.operator === \"CallSubquery\"\n ? node.children.slice(0, 1)\n : node.children;\n return [node, ...children.flatMap(flattenOuter)];\n}\n\nfunction sameColumns(a: string[], b: string[]): boolean {\n return a.length === b.length && a.every((x, i) => x === b[i]);\n}\n","// Schema lint for `check`: choices that are valid but costly or risky.\n// Warnings, not failures: each may be intended.\n\nimport type { GraphModel, ModelWarning } from \"../model/types.js\";\n\nexport interface LintOptions {\n /** Statistics are loaded: relationship degrees are known. */\n statistics?: boolean;\n}\n\nexport function lintModel(\n model: GraphModel,\n options: LintOptions = {},\n): ModelWarning[] {\n const out: ModelWarning[] = [];\n for (const node of model.nodes.values()) {\n for (const f of node.fields.values()) {\n if (f.kind === \"scalar\") {\n if (f.filters.has(\"CASE_INSENSITIVE\")) {\n out.push({\n type: node.name,\n field: f.name,\n message:\n \"CASE_INSENSITIVE compares lowercased values and cannot use an index: every such filter scans the label\",\n });\n }\n if (f.filters.has(\"IS_NULL\")) {\n out.push({\n type: node.name,\n field: f.name,\n message:\n \"IS_NULL cannot use an index: a filter on absence scans the label\",\n });\n }\n }\n if (\n f.kind === \"relationship\" &&\n f.list &&\n f.cardinality === undefined &&\n !options.statistics\n ) {\n out.push({\n type: node.name,\n field: f.name,\n message:\n \"no @cardinality and no statistics: cost estimates assume each parent has a full page of these; run analyze() or declare @cardinality(max:)\",\n });\n }\n }\n }\n return out;\n}\n\n/**\n * `@mutation` types with a generated write no rule guards: any caller\n * that reaches the API can make it. An error in `check()`, unless the type\n * declares the operation open with `@authorization(public: [...])`. A\n * write is guarded by `@authentication` for it, a filter or validate rule\n * for it (a `@authorizationDefaults(mutations:)` default included), or a\n * schema bypass alone does not count: it only lets some callers skip rules.\n */\nexport function unguardedMutations(model: GraphModel): ModelWarning[] {\n const out: ModelWarning[] = [];\n for (const node of model.nodes.values()) {\n // 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","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 \"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/**\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\nexport type ScalarType =\n | \"String\"\n | \"ID\"\n | \"Int\"\n | \"Float\"\n | \"Boolean\"\n | \"BigInt\"\n | \"Date\"\n | \"Time\"\n | \"LocalTime\"\n | \"DateTime\"\n | \"LocalDateTime\"\n | \"Duration\"\n | \"Point\"\n | \"CartesianPoint\"\n /** A user-declared enum, stored as its value name. */\n | \"Enum\";\n\nexport type FilterOperator =\n | \"EQ\"\n | \"IN\"\n | \"LT\"\n | \"LTE\"\n | \"GT\"\n | \"GTE\"\n | \"CONTAINS\"\n | \"STARTS_WITH\"\n | \"ENDS_WITH\"\n | \"WITHIN_BBOX\"\n | \"DISTANCE\"\n | \"INCLUDES\"\n | \"IS_NULL\"\n | \"CASE_INSENSITIVE\";\n\nexport type IndexKind = \"RANGE\" | \"TEXT\" | \"POINT\";\n\nexport type MutationOperation = \"CREATE\" | \"UPDATE\" | \"DELETE\";\nexport type AuthOperation =\n | \"READ\"\n | MutationOperation\n | \"CREATE_RELATIONSHIP\"\n | \"DELETE_RELATIONSHIP\"\n | \"SUBSCRIBE\"\n | RelationshipOperation;\n\n/** Operations of rules on a relationship field, over `source`, `target`, `edge`. */\nexport type RelationshipOperation =\n | \"CONNECT\"\n | \"DISCONNECT\"\n | \"UPDATE_EDGE\"\n | \"READ_EDGE\";\n\nexport const RELATIONSHIP_OPERATIONS: ReadonlySet<AuthOperation> = new Set([\n \"CONNECT\",\n \"DISCONNECT\",\n \"UPDATE_EDGE\",\n \"READ_EDGE\",\n]);\n\n/** Field-level options shared by every field kind. */\ninterface FieldBase {\n /** Operations on which reading this field needs an authenticated request. */\n authentication: ReadonlySet<AuthOperation> | undefined;\n /** Claims `@authentication(jwt:)` requires, when set. */\n authenticationJwt?: AuthorizationWhere | undefined;\n /** Field-level `@authorization` (validate rules only). */\n authorization?: Authorization | undefined;\n}\n\nexport interface ScalarField extends FieldBase {\n kind: \"scalar\";\n /** API field name. */\n name: string;\n /** Stored property name (differs from `name` under `@alias`). */\n property: string;\n type: ScalarType;\n /** Enum type name when `type` is `Enum`. */\n enumName: string | undefined;\n /** The custom scalar clients see, when the field is one (`@storedAs`). */\n customScalar?: string | undefined;\n list: boolean;\n required: boolean;\n key: boolean;\n unique: boolean;\n private: boolean;\n relayId: boolean;\n filters: ReadonlySet<FilterOperator>;\n sortable: boolean;\n /** `@groupBy`: a grouping key of `<plural>Grouped`. */\n groupBy: boolean;\n /** Indexes requested explicitly with `@index`. */\n indexes: readonly IndexKind[];\n /** `@key(generate: true)`: creates fill a UUID when the input omits it. */\n generate: boolean;\n /**\n * `@key(scope: VIEWER)`: a created key starts with the caller's `@viewer`\n * claim and `separator`.\n */\n keyScope?: { separator: string } | undefined;\n /** `@default(value:)`, stored on create when the input omits the field. */\n defaultValue: { value: unknown } | undefined;\n /** `@timestamp`: set to the current time by these operations. */\n timestamp: ReadonlySet<\"CREATE\" | \"UPDATE\"> | undefined;\n /** Never client-settable (`@readonly`, `@timestamp`, `@private`). */\n readonly: boolean;\n /** `@settable`: which mutations may set it (both false when readonly). */\n settableOn: { create: boolean; update: boolean };\n /** `@selectable`: readable (false: write-only), and aggregatable. */\n selectableOn: { read: boolean; aggregate: boolean };\n /** `@populatedBy`: a named callback computes it on these operations. */\n populatedBy:\n | { callback: string; operations: ReadonlySet<\"CREATE\" | \"UPDATE\"> }\n | undefined;\n /**\n * Set on the stand-in for a `@filterable` / `@sortable` `@cypher` field:\n * its value is the statement's, computed per row, not a property.\n */\n computedBy?: CypherField;\n /** `@vector`: stored as a VECTOR, searchable by similarity. */\n vector:\n | { dimensions: number; similarity: \"COSINE\" | \"EUCLIDEAN\" }\n | undefined;\n description: string | undefined;\n}\n\nexport type NestedOperation =\n | \"CREATE\"\n | \"CONNECT\"\n | \"DISCONNECT\"\n /** `update: [{ 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 filterable: boolean;\n /** UNDIRECTED: reads follow the relationship both ways. */\n queryDirection: \"DIRECTED\" | \"UNDIRECTED\";\n /** What deleting the owner does to nodes reached through the field. */\n onDelete: \"DETACH\" | \"CASCADE\" | \"RESTRICT\";\n /** Nested writes mutation inputs offer for the field. */\n nestedOperations: ReadonlySet<NestedOperation>;\n /**\n * `@settable` / `@readonly`: whether create and update inputs offer the\n * field at all (an upsert of an existing node keeps its relationship).\n */\n settableOn: { create: boolean; update: boolean };\n /** Whether the field's connection and filters offer aggregates. */\n aggregate: boolean;\n cardinality: number | undefined;\n limit: PageLimit | undefined;\n description: string | undefined;\n}\n\n/** How a `@cypher` field's value, or one of its arguments, is typed. */\nexport interface TypeShape {\n /** Named type: a scalar, enum or (for results) node type name. */\n named: string;\n list: boolean;\n required: boolean;\n itemRequired: boolean;\n}\n\nexport interface CypherArgument {\n name: string;\n type: TypeShape;\n defaultValue: unknown;\n description: string | undefined;\n /** `@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}\n\nexport interface CypherField extends FieldBase {\n kind: \"cypher\";\n name: string;\n /** Node type name, or `Query` / `Mutation` for root fields. */\n owner: string;\n statement: string;\n /** The result column holding the field's value. */\n columnName: string;\n /** The field's type; `node` names a @node type when it returns nodes. */\n type: TypeShape;\n node: string | undefined;\n /** An interface or union over @node types, when it returns those. */\n abstract: string | undefined;\n /** A plain object type (no @node), when it returns maps. */\n object: string | undefined;\n args: readonly CypherArgument[];\n /** `$parameters` the statement uses, in order of first use. */\n params: readonly string[];\n /**\n * `@filterable` / `@sortable`: a scalar stand-in for filters and sorts,\n * whose value the statement computes per row (never through an index).\n */\n computed: ScalarField | undefined;\n description: string | undefined;\n}\n\n/**\n * A field computed in JavaScript (`@customResolver`): never stored or\n * filtered; `requires` is fetched with the node so the resolver can use it.\n */\nexport interface CustomField extends FieldBase {\n kind: \"custom\";\n name: string;\n owner: string;\n /** Selection on the owner type, e.g. `name genre { name }`. */\n requires: string | undefined;\n type: TypeShape;\n description: string | undefined;\n}\n\nexport type Field = ScalarField | RelationshipField | CypherField | CustomField;\n\n/**\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 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 }\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}\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 at: (message: string) => void;\n}\n\ntype Where = Record<string, unknown>;\n\nconst isRecord = (x: unknown): x is Where =>\n typeof x === \"object\" && x !== null && !Array.isArray(x);\n\nconst QUANTIFIERS = new Set([\"some\", \"all\", \"none\", \"single\"]);\n\n/**\n * A rule's where, sugar expanded. `owner` is the type the rule's `node`\n * part tests (undefined on relationship properties: claims only).\n */\nexport function desugarRule(\n ctx: DesugarContext,\n owner: NodeType | undefined,\n where: AuthorizationWhere,\n ends?: { source: NodeType; target: NodeType },\n): AuthorizationWhere {\n if (!isRecord(where)) return where;\n const keys = Object.keys(where);\n if (keys.length === 1 && keys[0] === \"rule\") {\n // Alone, the reference is its rule: exactly the hand-written form.\n return expandRule(ctx, owner, where[\"rule\"]) ?? UNEXPANDED;\n }\n const out: Where = {};\n const extra: Where[] = [];\n for (const [key, value] of Object.entries(where)) {\n if (key === \"rule\") {\n const expanded = expandRule(ctx, owner, value);\n if (expanded) extra.push(expanded);\n } else if (key === \"AND\" || key === \"OR\") {\n out[key] = Array.isArray(value)\n ? value.map((w) => desugarRule(ctx, owner, w as Where, ends))\n : value;\n } else if (key === \"NOT\") {\n out[key] = desugarRule(ctx, owner, value as Where, ends);\n } else if (ends && (key === \"source\" || key === \"target\")) {\n out[key] = desugarNode(ctx, ends[key], value);\n } else if (key === \"node\" && owner) {\n out[key] = desugarNode(ctx, owner, value);\n } else if (key === \"viewer\") {\n const viewerType = ctx.viewer && ctx.nodes.get(ctx.viewer.type);\n if (!viewerType) {\n ctx.at(\"`viewer` needs a @viewer claim on the @jwt type\");\n out[key] = value;\n } else out[key] = desugarNode(ctx, viewerType, value);\n } else {\n out[key] = value;\n }\n }\n if (extra.length > 0) {\n out[\"AND\"] = [...(Array.isArray(out[\"AND\"]) ? out[\"AND\"] : []), ...extra];\n }\n return out;\n}\n\n/**\n * The where of the rule `name` names, where it stands: a rule of `owner`\n * (`@authorizationRule`), else a schema rule. Its own references expand\n * too; a cycle is reported with its chain.\n */\nfunction expandRule(\n ctx: DesugarContext,\n owner: NodeType | undefined,\n name: unknown,\n): Where | undefined {\n if (typeof name !== \"string\") {\n ctx.at(\"`rule` takes the name of a rule\");\n return undefined;\n }\n const own = owner && ctx.rules?.byType.get(owner.name)?.get(name);\n const schema = ctx.rules?.schema.get(name);\n const id = own ? `${owner.name}.${name}` : name;\n const def = own ?? schema;\n if (!def) {\n ctx.at(\n `unknown rule \"${name}\"${owner ? ` (not a rule of ${owner.name} or of the schema)` : \" (not a schema rule)\"}`,\n );\n return undefined;\n }\n return withinRule(ctx, id, () =>\n desugarRule(ctx, own ? owner : undefined, def),\n );\n}\n\n/** Expand a named rule's body, refusing a cycle. */\nfunction withinRule(\n ctx: DesugarContext,\n id: string,\n expand: () => Where,\n): Where | undefined {\n const stack = (ctx.expanding ??= []);\n const at = stack.indexOf(id);\n if (at >= 0) {\n const cycle = stack.slice(at);\n const reported = (ctx.rules!.reportedCycles ??= new Set());\n const id_ = [...cycle].sort().join(\"\\0\");\n if (!reported.has(id_)) {\n reported.add(id_);\n ctx.at(`rule cycle: ${[...cycle, id].join(\" → \")}`);\n }\n return undefined;\n }\n stack.push(id);\n try {\n return expand();\n } finally {\n stack.pop();\n }\n}\n\n/**\n * A rule of `node`'s type, used inside a node filter: its `node` parts\n * become the filter itself. A rule that tests anything but `node` (claims,\n * the viewer) cannot stand inside a node filter.\n */\nfunction expandNodeRule(\n ctx: DesugarContext,\n node: NodeType,\n name: unknown,\n): unknown {\n if (typeof name !== \"string\") {\n ctx.at(\"`rule` takes the name of a rule\");\n return undefined;\n }\n const def = ctx.rules?.byType.get(node.name)?.get(name);\n if (!def) {\n ctx.at(\n ctx.rules?.schema.has(name)\n ? `rule \"${name}\" is a schema rule over claims; use it beside node, not inside it`\n : `unknown rule \"${name}\" (not a rule of ${node.name})`,\n );\n return undefined;\n }\n const expanded = withinRule(ctx, `${node.name}.${name}`, () =>\n desugarRule(ctx, node, def),\n );\n return expanded && toNodeFilter(ctx, node, name, expanded);\n}\n\nfunction toNodeFilter(\n ctx: DesugarContext,\n node: NodeType,\n name: string,\n where: Where,\n): unknown {\n const parts: unknown[] = [];\n for (const [key, value] of Object.entries(where)) {\n if (key === \"node\" && 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 ctx.at(\n `isViewer applies to ${ctx.viewer.type} (the @viewer type), not ${node.name}`,\n );\n return undefined;\n }\n return [ctx.viewer.field, { eq: `$jwt.${ctx.viewer.claim}` }];\n}\n\n/** Model problems for a `@viewer` mapping, once the node types are built. */\nexport function checkViewer(\n viewer: ViewerMapping,\n nodes: ReadonlyMap<string, NodeType>,\n jwtType: string,\n problems: ModelProblem[],\n): void {\n const at = (message: string): void => {\n problems.push({ type: jwtType, field: viewer.claim, message });\n };\n const node = nodes.get(viewer.type);\n if (!node) return at(`@viewer: ${viewer.type} is not a @node type`);\n const f = node.fields.get(viewer.field);\n if (f?.kind !== \"scalar\") {\n return at(`@viewer: ${viewer.type} has no field ${viewer.field}`);\n }\n if (!f.key && !f.unique) {\n at(\n `@viewer: ${viewer.type}.${viewer.field} must be @key or @unique, so it names one node`,\n );\n }\n if (f.list) at(`@viewer: ${viewer.type}.${viewer.field} cannot be a list`);\n}\n\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","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 /** 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 * 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 maxListArgument?: number | undefined;\n maxFilterDepth?: number | undefined;\n maxListFilter?: number | undefined;\n maxStringFilter?: 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 requestContext: options.requestContext,\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","// Relationships to interfaces and unions. A polymorphic field is handled\n// as one concrete copy per member type, so filters, projections and\n// mutations reuse the single-target machinery; `via` points back to the\n// declared field.\n\nimport type { AbstractType, GraphModel, RelationshipField } from \"./types.js\";\n\nconst copies = new WeakMap<RelationshipField, RelationshipField[]>();\n\nexport function isPolymorphic(\n model: GraphModel,\n rel: RelationshipField,\n): boolean {\n return model.abstracts.has(rel.target);\n}\n\n/** The field itself, or one concrete copy per member of its target. */\nexport function memberFields(\n model: GraphModel,\n rel: RelationshipField,\n): RelationshipField[] {\n if (!isPolymorphic(model, rel)) return [rel];\n let list = copies.get(rel);\n if (!list) {\n list = rel.members.map((member) => ({\n ...rel,\n target: member,\n members: [member],\n via: rel,\n }));\n copies.set(rel, list);\n }\n return list;\n}\n\n/** The declared field a member copy came from (or the field itself). */\nexport function declared(rel: RelationshipField): RelationshipField {\n return rel.via ?? rel;\n}\n\nexport function abstractOf(\n model: GraphModel,\n rel: RelationshipField,\n): AbstractType | undefined {\n return model.abstracts.get(rel.target);\n}\n","// Aggregates over a list expression, e.g. the ages of a node's followers\n// as a pattern comprehension. Written with `reduce` rather than aggregate\n// functions, so they work inside WHERE and map projections, per parent\n// row, without a subquery (and without LoraDB's nested-aggregate bug).\n\nimport { freshVar, type CompileContext } from \"./context.js\";\nimport { bin, fn, isNull, lit, v, type Expr } from \"./cypher.js\";\n\nexport type ListAggregate =\n | \"min\"\n | \"max\"\n | \"sum\"\n | \"avg\"\n | \"count\"\n // Strings: the shortest and longest value, and length statistics.\n | \"shortest\"\n | \"longest\"\n | \"shortestLength\"\n | \"longestLength\"\n | \"averageLength\";\n\nexport interface AggregateOptions {\n /**\n * The values are durations: sums start from the first value rather than\n * 0, and an average divides the sum (LoraDB's own `sum` / `avg` / `max`\n * over durations are wrong, see E25).\n */\n duration?: boolean;\n}\n\nexport function listAggregate(\n ctx: CompileContext,\n kind: ListAggregate,\n list: Expr,\n options: AggregateOptions = {},\n): Expr {\n if (\n kind === \"shortestLength\" ||\n kind === \"longestLength\" ||\n kind === \"averageLength\"\n ) {\n const s = freshVar(ctx, \"agg_s\");\n const lengths: Expr = {\n kind: \"listComprehension\",\n variable: s,\n list,\n where: isNull(v(s), true),\n projection: fn(\"size\", v(s)),\n };\n const of = {\n shortestLength: \"min\",\n longestLength: \"max\",\n averageLength: \"avg\",\n } as const;\n return listAggregate(ctx, of[kind], lengths);\n }\n const x = freshVar(ctx, \"agg_v\");\n // Nulls take no part, as in Cypher's aggregate functions.\n const values: Expr = {\n kind: \"listComprehension\",\n variable: x,\n list,\n where: isNull(v(x), true),\n projection: undefined,\n };\n const acc = freshVar(ctx, \"agg_acc\");\n const item = freshVar(ctx, \"agg_item\");\n const fold = (init: Expr, step: Expr): Expr => ({\n kind: \"reduce\",\n accumulator: acc,\n init,\n variable: item,\n list: values,\n step,\n });\n switch (kind) {\n case \"count\":\n return fn(\"size\", values);\n case \"min\":\n case \"max\":\n return fold(lit(null), {\n kind: \"case\",\n when: {\n kind: \"binary\",\n op: \"OR\",\n left: isNull(v(acc)),\n right: bin(kind === \"min\" ? \"<\" : \">\", v(item), v(acc)),\n },\n then: v(item),\n else: v(acc),\n });\n case \"shortest\":\n case \"longest\":\n return fold(lit(null), {\n kind: \"case\",\n when: {\n kind: \"binary\",\n op: \"OR\",\n left: isNull(v(acc)),\n right: bin(\n kind === \"shortest\" ? \"<\" : \">\",\n fn(\"size\", v(item)),\n fn(\"size\", v(acc)),\n ),\n },\n then: v(item),\n else: v(acc),\n });\n case \"sum\":\n return options.duration\n ? durationSum()\n : fold(lit(0), bin(\"+\", v(acc), v(item)));\n case \"avg\":\n return {\n kind: \"case\",\n when: bin(\"=\", fn(\"size\", values), lit(0)),\n then: lit(null),\n else: bin(\n \"/\",\n options.duration\n ? durationSum()\n : fn(\"toFloat\", fold(lit(0), bin(\"+\", v(acc), v(item)))),\n fn(\"size\", values),\n ),\n };\n }\n\n function durationSum(): Expr {\n return fold(lit(null), {\n kind: \"case\",\n when: isNull(v(acc)),\n then: v(item),\n else: bin(\"+\", v(acc), v(item)),\n });\n }\n}\n\n/**\n * The number of distinct values in a list: related nodes counted once\n * even when several relationships lead to the same node.\n */\nexport function distinctCount(ctx: CompileContext, keys: Expr): Expr {\n const acc = freshVar(ctx, \"seen\");\n const k = freshVar(ctx, \"seen_key\");\n return fn(\"size\", {\n kind: \"reduce\",\n accumulator: acc,\n init: { kind: \"list\", items: [] },\n variable: k,\n list: keys,\n step: {\n kind: \"case\",\n when: bin(\"IN\", v(k), v(acc)),\n then: v(acc),\n else: bin(\"+\", v(acc), { kind: \"list\", items: [v(k)] }),\n },\n });\n}\n","// 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// - 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 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([\"eq\", \"in\", \"startsWith\", \"withinBBox\", \"distance\"]);\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 cost += 1;\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(label, anchoredRows(ctx, node, where) ?? label);\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/** 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 (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 \"isNull\":\n parts.push(isNull(target, value === false));\n continue;\n case \"caseInsensitive\": {\n const lowered = fn(\"toLower\", target);\n for (const [ciOp, ciValue] of Object.entries(value as Where)) {\n if (ciValue === null || ciValue === undefined) continue;\n const cypherOp = SCALAR_OPS[ciOp];\n if (!cypherOp) continue;\n const lower = Array.isArray(ciValue)\n ? ciValue.map((s) => String(s).toLowerCase())\n : String(ciValue).toLowerCase();\n parts.push(bin(cypherOp, lowered, bind(ctx, lower)));\n }\n continue;\n }\n }\n const cypherOp = SCALAR_OPS[op];\n if (!cypherOp) continue;\n parts.push(bin(cypherOp, target, bind(ctx, value)));\n }\n return and(...parts);\n}\n\n/**\n * `(from)-[:TYPE]->(to:Target)` for a relationship field. Reads follow an\n * UNDIRECTED relationship both ways.\n */\nexport function relationshipPattern(\n from: string,\n rel: RelationshipField,\n targetLabel: string,\n to: string,\n relVariable?: string,\n): Pattern {\n return {\n start: { variable: from, labels: [] },\n hops: [\n {\n rel: {\n ...(relVariable !== undefined ? { variable: relVariable } : {}),\n type: rel.type,\n direction:\n rel.queryDirection === \"UNDIRECTED\" ? \"BOTH\" : rel.direction,\n },\n node: { variable: to, labels: [targetLabel] },\n },\n ],\n };\n}\n\n/**\n * Related nodes as a pattern comprehension:\n * `[(from)-[r:T]->(x:Target) WHERE <visible> AND <where> | <projection>]`.\n */\nfunction related(\n ctx: CompileContext,\n from: string,\n rel: RelationshipField,\n where: (x: string, r: string) => Expr | undefined,\n projection: (x: string, r: string) => Expr,\n): Expr {\n const target = ctx.model.nodes.get(rel.target)!;\n const x = freshVar(ctx, `${from}_${rel.name}`);\n const r = freshVar(ctx, `${x}_rel`);\n return {\n kind: \"comprehension\",\n pattern: relationshipPattern(from, rel, target.labels[0]!, x, r),\n // Related nodes the reader may not see do not count, in any quantifier.\n where: and(authFilter(ctx, target, x, \"READ\"), where(x, r)),\n projection: projection(x, r),\n };\n}\n\n/**\n * The `where` of an interface or union, for one member type: an\n * interface's filters apply to every implementation (and `typename` picks\n * implementations); a union's where names members and leaves out the\n * ones it does not name. False when `where` excludes the member.\n */\nexport function compileMemberWhere(\n ctx: CompileContext,\n abstract: AbstractType | undefined,\n member: NodeType,\n variable: string,\n where: Where | null | undefined,\n): Expr | undefined | false {\n if (!abstract) return compileNodeWhere(ctx, member, variable, where);\n if (!where) return undefined;\n if (abstract.kind === \"union\") {\n const named = Object.entries(where).filter(([, w]) => w != null);\n if (named.length === 0) return undefined;\n const mine = where[member.name] as Where | null | undefined;\n if (mine == null) return false;\n return compileNodeWhere(ctx, member, variable, mine);\n }\n const { typename, ...rest } = where;\n if (Array.isArray(typename) && !typename.includes(member.name)) return false;\n // `typename` may also sit inside AND / OR / NOT: there it is a constant\n // per member, true or false (not absent: NOT must flip it).\n const keys = nodeKeys(ctx, member, variable);\n return compileWhere(ctx, rest, (key) =>\n key === \"typename\"\n ? (value) =>\n Array.isArray(value) ? lit(value.includes(member.name)) : undefined\n : keys(key),\n );\n}\n\nfunction relationshipPredicate(\n ctx: CompileContext,\n variable: string,\n rel: RelationshipField,\n value: Where,\n): Expr | undefined {\n const abstract = abstractOf(ctx.model, rel);\n const members = memberFields(ctx.model, rel).map((field) => {\n const node = ctx.model.nodes.get(field.target)!;\n checkAuthentication(ctx, node, \"READ\");\n ctx.reads.labels.add(node.labels[0]!);\n return { field, node };\n });\n ctx.reads.relationships.add(rel.type);\n const memberWhere = (node: NodeType, x: string, where: Where | undefined) =>\n compileMemberWhere(ctx, abstract, node, x, where);\n const sum = (parts: Expr[]): Expr =>\n parts.length === 0 ? lit(0) : parts.reduce((a, b) => bin(\"+\", a, b));\n\n // size([(this)-[:T]->(x:Target) WHERE pred | 1]): LoraDB has no\n // EXISTS { } subquery, and a pattern comprehension beats OPTIONAL MATCH.\n // Over an interface or union, the members' counts add up.\n const count = (where: Where | undefined) =>\n sum(\n members.flatMap(({ field, node }) => {\n const probe = memberWhere(node, \"probe\", where);\n if (probe === false) return [];\n return [\n fn(\n \"size\",\n related(\n ctx,\n variable,\n field,\n (x) => memberWhere(node, x, where) || undefined,\n () => lit(1),\n ),\n ),\n ];\n }),\n );\n // Exact counts count related nodes, once each, however many\n // relationships lead to them.\n const distinct = (where: Where | undefined) => {\n const lists = members.flatMap(({ field, node }) => {\n if (memberWhere(node, \"probe\", where) === false) return [];\n return [\n related(\n ctx,\n variable,\n field,\n (x) => memberWhere(node, x, where) || undefined,\n (x) => ({\n kind: \"list\",\n items: [lit(node.name), prop(v(x), node.key.property)],\n }),\n ),\n ];\n });\n if (lists.length === 0) return lit(0);\n return distinctCount(\n ctx,\n lists.reduce((a, b) => bin(\"+\", a, b)),\n );\n };\n // A quantifier over an empty (or all-null) filter is left out, like any\n // absent filter; `count: { gt: 0 }` asks for \"has any\".\n const nonEmpty = (where: Where): boolean =>\n members.some(({ node }) => {\n const probe = { ...ctx, params: {}, vars: new Set(ctx.vars) };\n const w = compileMemberWhere(probe, abstract, node, \"probe\", where);\n return w !== undefined;\n });\n\n if (!rel.list) {\n // A single relationship filters by its target directly.\n return nonEmpty(value) ? bin(\">\", count(value), lit(0)) : undefined;\n }\n\n const parts: Array<Expr | undefined> = [];\n for (const [quantifier, inner] of Object.entries(value)) {\n if (inner === null || inner === undefined) continue;\n const w = inner as Where;\n switch (quantifier) {\n case \"some\":\n if (nonEmpty(w)) parts.push(bin(\">\", count(w), lit(0)));\n break;\n case \"none\":\n if (nonEmpty(w)) parts.push(bin(\"=\", count(w), lit(0)));\n break;\n case \"single\":\n if (nonEmpty(w)) parts.push(bin(\"=\", distinct(w), lit(1)));\n break;\n case \"all\": {\n // Every related node matches: none fails. Unknown (null) counts\n // as failing, so `all` never holds on missing properties. An\n // empty set satisfies `all`, as in logic and Cypher's all(). A\n // member a union's where leaves out fails.\n if (!nonEmpty(w)) break;\n const failing = sum(\n members.map(({ field, node }) =>\n fn(\n \"size\",\n related(\n ctx,\n variable,\n field,\n (x) => {\n const pred = memberWhere(node, x, w);\n if (pred === false) return undefined;\n return pred\n ? not(fn(\"coalesce\", pred, lit(false)))\n : lit(false);\n },\n () => lit(1),\n ),\n ),\n ),\n );\n parts.push(bin(\"=\", failing, lit(0)));\n break;\n }\n case \"count\":\n parts.push(compareCount(ctx, rel, distinct(undefined), w));\n break;\n case \"aggregate\":\n if (!abstract) parts.push(aggregatePredicate(ctx, variable, rel, w));\n break;\n }\n }\n return and(...parts);\n}\n\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\nfunction compareCount(\n ctx: CompileContext,\n rel: RelationshipField,\n total: Expr,\n ops: Where,\n): Expr | undefined {\n const parts: Expr[] = [];\n for (const [op, n] of Object.entries(ops)) {\n if (n === null || n === undefined) continue;\n const cypherOp = COUNT_OPS[op];\n if (!cypherOp) continue;\n if (!Number.isInteger(n) || (n as number) < 0) {\n throw requestError(\n \"BAD_USER_INPUT\",\n `${rel.name}.count.${op} must be a non-negative integer`,\n );\n }\n parts.push(bin(cypherOp, total, bind(ctx, n)));\n }\n return and(...parts);\n}\n\n/**\n * `followersConnection: { some: { node: {...}, edge: {...} } }`: the\n * quantifiers, over pairs of related node and relationship.\n */\nfunction connectionPredicate(\n ctx: CompileContext,\n variable: string,\n rel: RelationshipField,\n value: Where,\n): Expr | undefined {\n const target = ctx.model.nodes.get(rel.target)!;\n const props = ctx.model.relationshipProperties.get(rel.properties!)!;\n checkAuthentication(ctx, target, \"READ\");\n ctx.reads.labels.add(target.labels[0]!);\n ctx.reads.relationships.add(rel.type);\n const pairWhere = (w: Where) => (x: string, r: string) =>\n and(\n compileNodeWhere(ctx, target, x, w[\"node\"] as Where | undefined),\n compilePropsWhere(ctx, props, r, w[\"edge\"] as Where | undefined),\n );\n const count = (w: Where, negate: boolean) =>\n fn(\n \"size\",\n related(\n ctx,\n variable,\n rel,\n (x, r) => {\n const p = pairWhere(w)(x, r)!;\n return negate ? not(fn(\"coalesce\", p, lit(false))) : p;\n },\n () => lit(1),\n ),\n );\n const parts: Expr[] = [];\n for (const [quantifier, inner] of Object.entries(value)) {\n if (inner === null || inner === undefined) continue;\n const w = inner as Where;\n if (!nonEmptyPair(ctx, target, props, w)) continue;\n if (w[\"edge\"] != null) refuseEdgeRowRules(ctx, rel);\n switch (quantifier) {\n case \"some\":\n parts.push(bin(\">\", count(w, false), lit(0)));\n break;\n case \"none\":\n parts.push(bin(\"=\", count(w, false), lit(0)));\n break;\n case \"single\":\n parts.push(bin(\"=\", count(w, false), lit(1)));\n break;\n case \"all\":\n parts.push(bin(\"=\", count(w, true), lit(0)));\n break;\n }\n }\n return and(...parts);\n}\n\nfunction nonEmptyPair(\n ctx: CompileContext,\n target: NodeType,\n props: RelationshipPropertiesType,\n w: Where,\n): boolean {\n const probe = { ...ctx, params: {}, vars: new Set(ctx.vars) };\n return (\n and(\n compileNodeWhere(probe, target, \"x\", w[\"node\"] as Where | undefined),\n compilePropsWhere(probe, props, \"r\", w[\"edge\"] as Where | undefined),\n ) !== undefined\n );\n}\n\nconst AGGREGATE_KEYS = new Set<ListAggregate>([\n \"min\",\n \"max\",\n \"avg\",\n \"sum\",\n \"shortestLength\",\n \"longestLength\",\n \"averageLength\",\n]);\n\n/**\n * `followers: { aggregate: { node: { age: { avg: { gt: 30 } } }, edge: … } }`:\n * aggregates of related values per parent, compared to bounds.\n */\nfunction aggregatePredicate(\n ctx: CompileContext,\n variable: string,\n rel: RelationshipField,\n value: Where,\n): Expr | undefined {\n const target = ctx.model.nodes.get(rel.target)!;\n const props = rel.properties\n ? ctx.model.relationshipProperties.get(rel.properties)\n : undefined;\n const parts: Array<Expr | undefined> = [];\n const side = (\n where: Where | undefined,\n lookup: (name: string) => ScalarField | undefined,\n onEdge: boolean,\n ) => {\n for (const [fieldName, aggs] of Object.entries(where ?? {})) {\n const field = lookup(fieldName);\n if (!field || aggs === null || aggs === undefined) continue;\n if (onEdge) checkPropertyAccess(ctx, props!.name, field, \"READ\");\n else {\n checkFieldAuthentication(ctx, target.name, field);\n // An aggregate over values some rows may not read would reveal\n // them: refused unless the claims alone settle the rules.\n const probe = { ...ctx, params: {}, vars: new Set(ctx.vars) };\n if (fieldValidate(probe, target, field, \"probe\", \"READ\")) {\n throw requestError(\n \"FORBIDDEN\",\n `cannot aggregate ${target.name}.${field.name}: it has row-level read rules`,\n );\n }\n if (!maskSettled(ctx, target, field)) {\n throw requestError(\n \"FORBIDDEN\",\n `cannot aggregate ${target.name}.${field.name}: it is masked per row`,\n );\n }\n }\n for (const [agg, bounds] of Object.entries(aggs as Where)) {\n if (bounds === null || bounds === undefined) continue;\n if (!AGGREGATE_KEYS.has(agg as ListAggregate)) continue;\n const values = related(\n ctx,\n variable,\n rel,\n () => undefined,\n (x, r) => prop(v(onEdge ? r : x), field.property),\n );\n const aggregate = listAggregate(ctx, agg as ListAggregate, values, {\n duration: field.type === \"Duration\",\n });\n parts.push(scalarPredicate(ctx, aggregate, bounds as Where));\n }\n }\n };\n side(\n value[\"node\"] as Where | undefined,\n (n) => {\n const f = target.fields.get(n);\n return f?.kind === \"scalar\" ? f : undefined;\n },\n false,\n );\n if (props) {\n if (value[\"edge\"] != null) refuseEdgeRowRules(ctx, rel);\n side(value[\"edge\"] as Where | undefined, (n) => props.fields.get(n), true);\n }\n if (value[\"count\"]) {\n const total = distinctCount(\n ctx,\n related(\n ctx,\n variable,\n rel,\n () => undefined,\n (x) => prop(v(x), target.key.property),\n ),\n );\n parts.push(compareCount(ctx, rel, total, value[\"count\"] as Where));\n }\n return and(...parts);\n}\n","// @authentication and @authorization, compiled into the statements.\n//\n// A rule is `{ node, jwt, AND, OR, NOT }`. The `jwt` half only reads the\n// request's claims, so it is evaluated here, in JavaScript: role checks\n// fold to true or false and never reach Cypher. The `node` half becomes a\n// predicate, with `\"$jwt.path\"` strings bound as parameters. A claim a rule\n// needs but the request lacks makes that rule deny.\n\nimport { requestError } from \"../errors.js\";\nimport type {\n AuthOperation,\n Authorization,\n AuthorizationValidateRule,\n AuthorizationWhere,\n NodeType,\n RelationshipField,\n RelationshipOperation,\n RelationshipPropertiesType,\n} from \"../model/types.js\";\nimport { PLACEHOLDER, RULE_REFERENCES } from \"../model/types.js\";\nimport { ruleParts, testsRelationshipEnds } from \"../model/desugar.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 bound = substitute(value, 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 const parts: Folded[] = [];\n for (const { field, flipped } of relationshipRuleFields(ctx, rel)) {\n const rules = (field.authorization?.validate ?? []).filter((r) =>\n r.operations.has(op),\n );\n if (rules.length === 0) continue;\n if (bypassed(ctx, ctx.model.nodes.get(field.owner))) continue;\n const label = `${op.toLowerCase().replace(\"_\", \" \")} ${field.owner}.${field.name}`;\n if (rules.every((r) => r.requireAuthentication) && !ctx.jwt) {\n if (mode === \"read\") return false;\n throw requestError(\n \"UNAUTHENTICATED\",\n `${label} needs an authenticated request`,\n );\n }\n const source = ctx.model.nodes.get(field.owner)!;\n const target = ctx.model.nodes.get(field.target)!;\n const props = field.properties\n ? ctx.model.relationshipProperties.get(field.properties)\n : undefined;\n const ends: RuleEnds = {\n source: { node: source, variable: flipped ? vars.target : vars.owner },\n target: { node: target, variable: flipped ? vars.owner : vars.target },\n edge: props ? { props, variable: vars.rel } : undefined,\n };\n const folded = foldOr(\n rules.map((r) =>\n r.requireAuthentication && !ctx.jwt\n ? false\n : compileRule(ctx, undefined, \"\", r.where, ends),\n ),\n );\n if (folded === false && mode === \"write\") {\n throw requestError(\"FORBIDDEN\", `not allowed to ${label}`);\n }\n parts.push(folded);\n }\n const all = foldAnd(parts);\n return all === true ? undefined : all === false ? false : all;\n}\n\n/** FORBIDDEN: using a relationship's properties its READ_EDGE rules guard. */\nexport function refusedEdgeRead(rel: RelationshipField): Error {\n return requestError(\n \"FORBIDDEN\",\n `${rel.owner}.${rel.name}: its READ_EDGE rules decide per relationship, so its properties cannot be filtered, sorted or aggregated by`,\n );\n}\n\n/**\n * Throws when `rel`'s properties have READ_EDGE rules that are not settled\n * by the claims alone: filtering, sorting or aggregating by them would\n * reveal what the rules hide per relationship.\n */\nexport function refuseEdgeRowRules(\n ctx: CompileContext,\n rel: RelationshipField,\n): void {\n if (ctx.inAuth) return;\n const probe = { ...ctx, params: {}, vars: new Set(ctx.vars) };\n const rule = relationshipRules(\n probe,\n rel,\n \"READ_EDGE\",\n { owner: \"a\", target: \"b\", rel: \"r\" },\n \"read\",\n );\n if (rule !== undefined) throw refusedEdgeRead(rel);\n}\n\n/** Fields whose relationship rules cover `rel`'s relationships. */\nexport function relationshipRuleFields(\n ctx: CompileContext,\n rel: RelationshipField,\n): Array<{ field: RelationshipField; flipped: boolean }> {\n const out: Array<{ field: RelationshipField; flipped: boolean }> = [];\n const hasRules = (f: RelationshipField) =>\n f.authorization?.validate.some((r) =>\n [...r.operations].some((op) =>\n [\"CONNECT\", \"DISCONNECT\", \"UPDATE_EDGE\", \"READ_EDGE\"].includes(op),\n ),\n ) ?? false;\n if (hasRules(rel)) out.push({ field: rel, flipped: false });\n const target = ctx.model.nodes.get(rel.target);\n for (const f of target?.fields.values() ?? []) {\n if (\n f.kind === \"relationship\" &&\n f !== rel &&\n f.type === rel.type &&\n f.target === rel.owner &&\n f.direction !== rel.direction &&\n hasRules(f)\n ) {\n out.push({ field: f, flipped: true });\n }\n }\n return out;\n}\n\n/**\n * `viewer: { … }`: the caller's own node (found by the `@viewer` claim)\n * passes the filter. One seek by the claim, as a pattern comprehension so\n * it composes with the rest of the rule:\n * `size([(v:Person {subject: $claim}) WHERE <filter> | 1]) > 0`. Without\n * the claim it is unknown, like any test on a missing claim.\n */\nfunction viewerTest(ctx: CompileContext, where: unknown): Folded {\n const mapping = ctx.model.viewer;\n const node = mapping && ctx.model.nodes.get(mapping.type);\n // The model build refuses `viewer` without a @viewer claim.\n if (!mapping || !node) return false;\n const id = substitute(`$jwt.${mapping.claim}`, ctx);\n const bound = substitute(where, ctx);\n if (!id.ok || !bound.ok) throw new MissingClaim();\n const field = node.fields.get(mapping.field);\n const property = field?.kind === \"scalar\" ? field.property : mapping.field;\n const x = freshVar(ctx, \"viewer\");\n const wasInAuth = ctx.inAuth;\n ctx.inAuth = true;\n try {\n const pred = compileNodeWhere(ctx, node, x, bound.value as Where);\n return bin(\n \">\",\n fn(\"size\", {\n kind: \"comprehension\",\n pattern: {\n start: {\n variable: x,\n labels: [node.labels[0]!],\n properties: [{ key: property, value: bind(ctx, id.value) }],\n },\n hops: [],\n },\n where: pred,\n projection: lit(1),\n }),\n lit(0),\n );\n } finally {\n ctx.inAuth = wasInAuth;\n }\n}\n\nfunction foldAnd(parts: Folded[]): Folded {\n if (parts.some((p) => p === false)) return false;\n const exprs = parts.filter((p): p is Expr => typeof p !== \"boolean\");\n return and(...exprs) ?? true;\n}\n\nfunction foldOr(parts: Folded[]): Folded {\n if (parts.some((p) => p === true)) return true;\n const exprs = parts.filter((p): p is Expr => typeof p !== \"boolean\");\n return or(...exprs) ?? false;\n}\n\nfunction toExpr(f: Folded): Expr | undefined {\n if (f === true) return undefined;\n if (f === false) return lit(false);\n return f;\n}\n\n// ---------------------------------------------------------------------------\n// Claims\n// ---------------------------------------------------------------------------\n\n/**\n * A claim by name. With a `@jwt` type, the name's first segment maps to its\n * `@jwtClaim(path:)`, whether the token arrived decoded or not.\n */\nexport function claim(\n ctx: CompileContext,\n path: string,\n bound = false,\n): unknown {\n const [head, ...rest] = path.split(\".\");\n const mapped = ctx.model.jwt?.get(head!) ?? head!;\n const full = [mapped, ...rest].join(\".\");\n const value = lookupPath(ctx.jwt, full);\n noteClaim(ctx, full, value, bound);\n return value;\n}\n\n/**\n * A value by dotted path, through own properties only: `$context.x` must\n * not reach `constructor`, `__proto__` or anything else inherited.\n */\nexport function lookupPath(root: unknown, path: string): unknown {\n let cur: unknown = root;\n for (const part of path.split(\".\")) {\n if (cur === null || typeof cur !== \"object\" || !Object.hasOwn(cur, part)) {\n return undefined;\n }\n cur = (cur as Record<string, unknown>)[part];\n }\n return cur;\n}\n\n/**\n * Structural equality for claim values: arrays in order, objects by own\n * keys in any order, bigints and numbers by value.\n */\nexport function sameValue(a: unknown, b: unknown): boolean {\n if (typeof a === \"bigint\" || typeof b === \"bigint\") {\n return (\n (typeof a === \"bigint\" || typeof a === \"number\") &&\n (typeof b === \"bigint\" || typeof b === \"number\") &&\n a == b\n );\n }\n if (a === b) return true;\n if (\n a === null ||\n b === null ||\n typeof a !== \"object\" ||\n typeof b !== \"object\"\n ) {\n return false;\n }\n if (Array.isArray(a) || Array.isArray(b)) {\n return (\n Array.isArray(a) &&\n Array.isArray(b) &&\n a.length === b.length &&\n a.every((x, i) => sameValue(x, b[i]))\n );\n }\n const ka = Object.keys(a);\n const kb = Object.keys(b);\n return (\n ka.length === kb.length &&\n ka.every(\n (k) =>\n Object.hasOwn(b, k) &&\n sameValue(\n (a as Record<string, unknown>)[k],\n (b as Record<string, unknown>)[k],\n ),\n )\n );\n}\n\n/**\n * Replace `\"$jwt.path\"` and `\"$context.path\"` strings, and the\n * `${jwt.path}` / `${context.path}` placeholders inside strings; not ok\n * when a referenced value is absent (or, in a placeholder, not a scalar).\n */\n/**\n * A rule string 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 const resolved =\n source === \"jwt\"\n ? claim(ctx, path)\n : lookupPath(ctx.requestContext, path);\n if (source === \"context\") ctx.contextReads.push([path, resolved]);\n if (\n typeof resolved === \"string\" ||\n typeof resolved === \"number\" ||\n typeof resolved === \"boolean\"\n ) {\n text += String(resolved);\n } else ok = false;\n }\n text += value.slice(last);\n if (!ok) return { ok: false, value: undefined };\n if (parts.length === 0) return { ok: true, value: text };\n flush();\n return {\n ok: true,\n value: exprValue(\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\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 }\n if (\n typeof v === \"string\" ||\n typeof v === \"number\" ||\n typeof v === \"bigint\" ||\n typeof v === \"boolean\"\n ) {\n return String(v);\n }\n ok = false;\n return \"\";\n },\n );\n return ok ? { ok, value: built } : { ok, value: undefined };\n }\n if (\n typeof value === \"string\" &&\n (value.startsWith(\"$jwt.\") || value.startsWith(\"$context.\"))\n ) {\n let v: unknown;\n // Only bound as a filter value: a cached compile may rebind it.\n if (value.startsWith(\"$jwt.\")) v = claim(ctx, value.slice(5), true);\n else {\n v = lookupPath(ctx.requestContext, value.slice(9));\n ctx.contextReads.push([value.slice(9), v]);\n }\n return v === undefined || v === null\n ? { ok: false, value: undefined }\n : { ok: true, value: v };\n }\n if (Array.isArray(value)) {\n const items = value.map((x) => substitute(x, ctx, 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 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","// 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 RelationshipField,\n} from \"../types.js\";\nimport { RELATIONSHIP_OPERATIONS } from \"../types.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.\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);\n });\n}\n\nfunction readsClaims(value: unknown): 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(readsClaims);\n if (!isRecord(value)) return false;\n return Object.entries(value).some(\n ([k, v]) => k === \"jwt\" || k === \"viewer\" || readsClaims(v),\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\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","// 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","// What the generated mutation inputs offer, decided from the model alone,\n// so an input type that would have no field is left out (with whatever\n// would take it) instead of breaking the schema.\n\nimport { memberFields } from \"./relations.js\";\nimport type {\n GraphModel,\n NodeType,\n RelationshipField,\n RelationshipPropertiesType,\n ScalarField,\n} from \"./types.js\";\n\n/** Whether clients may set a field on `op` (`@settable`, `@readonly`, …). */\nexport function settable(\n f: ScalarField | RelationshipField,\n op: \"CREATE\" | \"UPDATE\",\n): boolean {\n return op === \"CREATE\" ? f.settableOn.create : f.settableOn.update;\n}\n\n/**\n * Whether an update input for `node` has any field: a scalar settable on\n * update, or a relationship offering a nested operation.\n */\nexport function isUpdatable(\n model: GraphModel,\n node: NodeType,\n seen: Set<string> = new Set(),\n): boolean {\n if (seen.has(node.name)) return false;\n seen.add(node.name);\n return [...node.fields.values()].some((f) =>\n f.kind === \"scalar\"\n ? settable(f, \"UPDATE\")\n : f.kind === \"relationship\" &&\n settable(f, \"UPDATE\") &&\n offersNested(model, f, true, seen),\n );\n}\n\n/** Whether the create or update input of `rel` offers any operation. */\nexport function offersNested(\n model: GraphModel,\n rel: RelationshipField,\n update: boolean,\n seen: Set<string> = new Set(),\n): boolean {\n const allows = (op: Parameters<typeof rel.nestedOperations.has>[0]) =>\n rel.nestedOperations.has(op);\n const members = memberFields(model, rel);\n if (allows(\"CONNECT\") && members.length > 0) return true;\n if (\n allows(\"CREATE\") &&\n members.some((m) => model.nodes.get(m.target)?.mutations.has(\"CREATE\"))\n ) {\n return true;\n }\n if (!update) return false;\n if (allows(\"DISCONNECT\") && members.length > 0) return true;\n // Interfaces and unions offer connect, create and disconnect only.\n if (model.abstracts.has(rel.target)) return false;\n const target = model.nodes.get(rel.target)!;\n if (allows(\"DELETE\") && target.mutations.has(\"DELETE\")) return true;\n if (!allows(\"UPDATE\")) return false;\n const props = rel.properties\n ? model.relationshipProperties.get(rel.properties)\n : undefined;\n return (\n (props !== undefined && hasSettable(props, \"UPDATE\")) ||\n (target.mutations.has(\"UPDATE\") && isUpdatable(model, target, seen))\n );\n}\n\n/** Whether any property of a @relationshipProperties type is settable on `op`. */\nexport function hasSettable(\n props: RelationshipPropertiesType,\n op: \"CREATE\" | \"UPDATE\",\n): boolean {\n return [...props.fields.values()].some((f) => settable(f, op));\n}\n\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","// The generated Mutation surface: only for types with @mutation, keyed\n// by @key (so every write-set is exact), with nested connect / create /\n// update / disconnect on relationships, math and list operators, and bulk\n// updates and deletes that resolve their keys first.\n\nimport {\n GraphQLBoolean,\n GraphQLFloat,\n GraphQLInputObjectType,\n GraphQLInt,\n GraphQLList,\n GraphQLNonNull,\n GraphQLObjectType,\n type GraphQLFieldConfigMap,\n type GraphQLInputFieldConfigMap,\n type GraphQLInputType,\n type GraphQLResolveInfo,\n type GraphQLScalarType,\n} from \"graphql\";\nimport type {\n GraphModel,\n MutationOperation,\n NodeType,\n NestedOperation,\n RelationshipField,\n RelationshipPropertiesType,\n ScalarField,\n} from \"../model/types.js\";\nimport { memberFields } from \"../model/relations.js\";\nimport { hasSettable, isUpdatable, settable } from \"../model/inputs.js\";\n\nexport { isUpdatable, settable };\nimport { upperFirst } from \"./names.js\";\n\n/** A generated mutation: the single-node ones, and the bulk ones by where. */\nexport type MutationKind =\n | MutationOperation\n | \"UPSERT\"\n | \"UPDATE_MANY\"\n | \"DELETE_MANY\";\n\nexport type MutationResolver = (\n operation: MutationKind,\n node: NodeType,\n info: GraphQLResolveInfo,\n context: unknown,\n) => Promise<unknown>;\n\nexport const mutationNames = {\n create: (t: NodeType) => `create${upperFirst(t.plural)}`,\n update: (t: NodeType) => `update${t.name}`,\n delete: (t: NodeType) => `delete${t.name}`,\n upsert: (t: NodeType) => `upsert${upperFirst(t.plural)}`,\n updateMany: (t: NodeType) => `update${upperFirst(t.plural)}`,\n deleteMany: (t: NodeType) => `delete${upperFirst(t.plural)}`,\n upsertInput: (t: string) => `${t}UpsertInput`,\n upsertPayload: (t: NodeType) => `Upsert${upperFirst(t.plural)}Payload`,\n createInput: (t: string) => `${t}CreateInput`,\n updateInput: (t: string) => `${t}UpdateInput`,\n adjustInput: (t: string) => `${t}AdjustInput`,\n createPayload: (t: NodeType) => `Create${upperFirst(t.plural)}Payload`,\n updatePayload: (t: NodeType) => `Update${t.name}Payload`,\n updateManyPayload: (t: NodeType) => `Update${upperFirst(t.plural)}Payload`,\n relationCreate: (t: string, f: string) =>\n `${t}${upperFirst(f)}CreateRelationInput`,\n relationUpdate: (t: string, f: string) =>\n `${t}${upperFirst(f)}UpdateRelationInput`,\n connect: (t: string, f: string) => `${t}${upperFirst(f)}ConnectInput`,\n nestedCreate: (t: string, f: string) => `${t}${upperFirst(f)}CreateNodeInput`,\n nestedUpdate: (t: string, f: string) =>\n `${t}${upperFirst(f)}UpdateConnectedInput`,\n /** Payload field holding the created nodes / the updated node. */\n createdField: (t: NodeType) => t.plural,\n updatedField: (t: NodeType) =>\n t.name.charAt(0).toLowerCase() + t.name.slice(1),\n};\n\nconst nonNull = <T extends GraphQLInputType>(t: T) => new GraphQLNonNull(t);\nconst listOf = <T extends GraphQLInputType>(t: T) => new GraphQLList(t);\n\nexport interface MutationSchemaContext {\n model: GraphModel;\n object: (typeName: string) => GraphQLObjectType;\n inputType: (f: ScalarField) => GraphQLInputType;\n where: (typeName: string) => GraphQLInputType;\n}\n\n/** Whether the create input must carry the field. */\nexport function requiredOnCreate(f: ScalarField): boolean {\n return (\n f.required &&\n !f.defaultValue &&\n !f.timestamp?.has(\"CREATE\") &&\n !f.populatedBy?.operations.has(\"CREATE\") &&\n !(f.key && f.generate)\n );\n}\n\n/** Numeric and list fields take operators in `adjust`. */\nexport function adjustable(f: ScalarField): boolean {\n if (!settable(f, \"UPDATE\") || f.vector) return false;\n if (f.list) return f.type !== \"Point\" && f.type !== \"CartesianPoint\";\n return f.type === \"Int\" || f.type === \"Float\" || f.type === \"BigInt\";\n}\n\nexport function buildMutations(\n ctx: MutationSchemaContext,\n resolve: MutationResolver,\n): GraphQLFieldConfigMap<unknown, unknown> {\n const { model } = ctx;\n const inputs = new Map<string, GraphQLInputObjectType>();\n const once = (\n name: string,\n fields: () => GraphQLInputFieldConfigMap,\n description?: string,\n ) => {\n let t = inputs.get(name);\n if (!t) {\n t = new GraphQLInputObjectType({ name, fields, description });\n inputs.set(name, t);\n }\n return t;\n };\n\n const scalarInputs = (\n fields: Iterable<ScalarField>,\n op: \"CREATE\" | \"UPDATE\",\n ): GraphQLInputFieldConfigMap => {\n const out: GraphQLInputFieldConfigMap = {};\n for (const f of fields) {\n if (!settable(f, op)) continue;\n const base = ctx.inputType(f);\n const t: GraphQLInputType = f.list ? listOf(nonNull(base)) : base;\n out[f.name] = {\n type: op === \"CREATE\" && requiredOnCreate(f) ? nonNull(t) : t,\n description:\n op === \"UPDATE\" && !f.required\n ? `${f.description ? f.description + \" \" : \"\"}null removes the value.`\n : f.description,\n };\n }\n return out;\n };\n\n const propsCreate = (props: RelationshipPropertiesType) =>\n once(`${props.name}CreateInput`, () =>\n scalarInputs(props.fields.values(), \"CREATE\"),\n );\n const propsUpdate = (props: RelationshipPropertiesType) => {\n const fields = scalarInputs(props.fields.values(), \"UPDATE\");\n return Object.keys(fields).length > 0\n ? once(`${props.name}UpdateInput`, () => fields)\n : undefined;\n };\n const propsRequired = (props: RelationshipPropertiesType) =>\n [...props.fields.values()].some(\n (f) => settable(f, \"CREATE\") && requiredOnCreate(f),\n );\n\n const edgeField = (rel: RelationshipField): GraphQLInputFieldConfigMap => {\n if (!rel.properties) return {};\n const props = model.relationshipProperties.get(rel.properties)!;\n // Nothing settable on create: no `edge` at all, not an empty input.\n if (!hasSettable(props, \"CREATE\")) return {};\n const t = propsCreate(props);\n return { edge: { type: propsRequired(props) ? nonNull(t) : t } };\n };\n\n const connectInput = (owner: NodeType, rel: RelationshipField) => {\n const target = model.nodes.get(rel.target)!;\n return once(\n mutationNames.connect(owner.name, rel.name),\n () => ({\n [target.key.name]: { type: nonNull(ctx.inputType(target.key)) },\n ...edgeField(rel),\n }),\n `Connect an existing ${target.name} by ${target.key.name}. Connecting a connected pair sets the relationship properties given and keeps the others.`,\n );\n };\n\n const nestedCreateInput = (owner: NodeType, rel: RelationshipField) =>\n once(mutationNames.nestedCreate(owner.name, rel.name), () => ({\n node: { type: nonNull(createInput(model.nodes.get(rel.target)!)) },\n ...edgeField(rel),\n }));\n\n // `update: [{ key, edge, node }]`: change a connected pair in place.\n // 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 // Over an interface or union: the same inputs, one field per member.\n const polymorphicFields = (\n owner: NodeType,\n rel: RelationshipField,\n update: boolean,\n ): GraphQLInputFieldConfigMap => {\n const members = memberFields(model, rel).map((m) => ({\n member: m.target,\n // A naming copy, so each member's inputs get their own type names.\n rel: { ...m, name: `${rel.name}${m.target}` },\n }));\n const byMember = (\n suffix: string,\n type: (m: (typeof members)[number]) => GraphQLInputType | undefined,\n ) => {\n const fields: GraphQLInputFieldConfigMap = {};\n for (const m of members) {\n const t = type(m);\n if (t) fields[m.member] = { type: t };\n }\n return Object.keys(fields).length > 0\n ? once(`${owner.name}${upperFirst(rel.name)}${suffix}`, () => fields)\n : undefined;\n };\n const out: GraphQLInputFieldConfigMap = {};\n const allows = (op: NestedOperation) => rel.nestedOperations.has(op);\n const connect = allows(\"CONNECT\")\n ? byMember(\"ConnectMembers\", (m) => {\n const t = connectInput(owner, m.rel);\n return rel.list ? listOf(nonNull(t)) : t;\n })\n : undefined;\n if (connect) out[\"connect\"] = { type: connect };\n const create = allows(\"CREATE\")\n ? byMember(\"CreateMembers\", (m) => {\n if (!model.nodes.get(m.member)!.mutations.has(\"CREATE\"))\n return undefined;\n const t = nestedCreateInput(owner, m.rel);\n return rel.list ? listOf(nonNull(t)) : t;\n })\n : undefined;\n if (create) out[\"create\"] = { type: create };\n if (update && allows(\"DISCONNECT\")) {\n out[\"disconnect\"] = rel.list\n ? {\n type: byMember(\"DisconnectMembers\", (m) =>\n listOf(nonNull(ctx.inputType(model.nodes.get(m.member)!.key))),\n )!,\n }\n : {\n type: GraphQLBoolean,\n description: `true removes the current ${rel.target}.`,\n };\n }\n return out;\n };\n\n const relationFields = (\n owner: NodeType,\n rel: RelationshipField,\n update: boolean,\n ): GraphQLInputFieldConfigMap => {\n if (model.abstracts.has(rel.target))\n return polymorphicFields(owner, rel, update);\n const target = model.nodes.get(rel.target)!;\n const allows = (op: NestedOperation) => rel.nestedOperations.has(op);\n const fields: GraphQLInputFieldConfigMap = {};\n if (allows(\"CONNECT\")) {\n const connect = connectInput(owner, rel);\n fields[\"connect\"] = {\n type: rel.list ? listOf(nonNull(connect)) : connect,\n };\n }\n if (allows(\"CREATE\") && canCreate(rel)) {\n const create = nestedCreateInput(owner, rel);\n fields[\"create\"] = { type: rel.list ? listOf(nonNull(create)) : create };\n }\n if (update && allows(\"DISCONNECT\")) {\n fields[\"disconnect\"] = rel.list\n ? {\n type: listOf(nonNull(ctx.inputType(target.key))),\n description: `${target.key.name}s of the ${target.name} nodes to disconnect.`,\n }\n : {\n type: GraphQLBoolean,\n description: `true removes the current ${target.name}.`,\n };\n }\n if (update && allows(\"DELETE\") && target.mutations.has(\"DELETE\")) {\n fields[\"delete\"] = rel.list\n ? {\n type: once(\n `${owner.name}${upperFirst(rel.name)}NestedDeleteInput`,\n () => ({\n where: {\n type: ctx.where(target.name),\n description: `Which connected ${target.name} nodes; all of them when absent.`,\n },\n limit: {\n type: GraphQLInt,\n description:\n \"At most this many (default: maxBatch); more matching is an error.\",\n },\n }),\n `Delete connected ${target.name} nodes, following their onDelete rules.`,\n ),\n }\n : {\n type: GraphQLBoolean,\n description: `true deletes the connected ${target.name}.`,\n };\n }\n if (update && (allows(\"UPDATE\") || allows(\"UPDATE_EDGE\"))) {\n const nested = nestedUpdateInput(owner, rel);\n if (nested) {\n fields[\"update\"] = {\n type: rel.list ? listOf(nonNull(nested)) : nested,\n description: `Update connected ${target.name} nodes or their relationship properties in place.`,\n };\n }\n }\n return fields;\n };\n\n const scalarsOf = (node: NodeType) =>\n [...node.fields.values()].filter(\n (f): f is ScalarField => f.kind === \"scalar\",\n );\n\n const createInput = (node: NodeType): GraphQLInputObjectType =>\n once(mutationNames.createInput(node.name), () => {\n const fields = scalarInputs(scalarsOf(node), \"CREATE\");\n for (const rel of node.fields.values()) {\n if (rel.kind !== \"relationship\" || !settable(rel, \"CREATE\")) continue;\n const inputs = relationFields(node, rel, false);\n if (Object.keys(inputs).length === 0) continue;\n const t = once(\n mutationNames.relationCreate(node.name, rel.name),\n () => inputs,\n );\n // Required single relationships are checked when the mutation\n // runs: a nested create's parent link can satisfy them.\n fields[rel.name] = {\n type: t,\n description:\n rel.required && !rel.list\n ? `Required: connect or create one, unless this ${node.name} is created under it.`\n : undefined,\n };\n }\n return fields;\n });\n\n // Like the create input, but the key is always given and nothing else\n // is required up front: required fields are checked for new nodes only.\n const upsertInput = (node: NodeType): GraphQLInputObjectType =>\n once(mutationNames.upsertInput(node.name), () => {\n const fields: GraphQLInputFieldConfigMap = {};\n for (const f of node.fields.values()) {\n if (f.kind === \"scalar\") {\n if (!settable(f, \"CREATE\")) continue;\n const base = ctx.inputType(f);\n const t: GraphQLInputType = f.list ? listOf(nonNull(base)) : base;\n fields[f.name] = {\n type: f.key ? nonNull(t) : t,\n description: f.description,\n };\n } else if (f.kind === \"relationship\" && settable(f, \"CREATE\")) {\n const inputs = relationFields(node, f, false);\n if (Object.keys(inputs).length === 0) continue;\n fields[f.name] = {\n type: once(\n mutationNames.relationCreate(node.name, f.name),\n () => inputs,\n ),\n };\n }\n }\n return fields;\n });\n\n function updateInput(node: NodeType): GraphQLInputObjectType {\n return once(mutationNames.updateInput(node.name), () => {\n const fields = scalarInputs(scalarsOf(node), \"UPDATE\");\n for (const rel of node.fields.values()) {\n if (rel.kind !== \"relationship\" || !settable(rel, \"UPDATE\")) continue;\n const inputs = relationFields(node, rel, true);\n if (Object.keys(inputs).length === 0) continue;\n fields[rel.name] = {\n type: once(\n mutationNames.relationUpdate(node.name, rel.name),\n () => inputs,\n ),\n };\n }\n return fields;\n });\n }\n\n // --- adjust: math and list operators ---------------------------------------\n\n const numericAdjust = new Map<string, GraphQLInputObjectType>();\n const adjustType = (f: ScalarField): GraphQLInputObjectType => {\n const base = ctx.inputType(f) as GraphQLScalarType;\n if (f.list) {\n const name = `${base.name}ListAdjust`;\n let t = numericAdjust.get(name);\n if (!t) {\n t = new GraphQLInputObjectType({\n name,\n fields: {\n push: {\n type: listOf(nonNull(base)),\n description: \"Append these values (a missing list starts empty).\",\n },\n pop: {\n type: GraphQLInt,\n description: \"Remove this many values from the end.\",\n },\n remove: {\n type: listOf(nonNull(base)),\n description: \"Remove every occurrence of these values.\",\n },\n },\n });\n numericAdjust.set(name, t);\n }\n return t;\n }\n const name = `${base.name}Adjust`;\n let t = numericAdjust.get(name);\n if (!t) {\n const operand = f.type === \"Float\" ? GraphQLFloat : base;\n t = new GraphQLInputObjectType({\n name,\n description:\n \"One operation, applied to the stored value atomically; a missing value counts as 0.\",\n fields: {\n add: { type: operand },\n subtract: { type: operand },\n ...(f.type === \"BigInt\"\n ? {}\n : { multiply: { type: operand }, divide: { type: operand } }),\n },\n });\n numericAdjust.set(name, t);\n }\n return t;\n };\n\n const adjustInput = (node: NodeType): GraphQLInputObjectType | undefined => {\n const fields = scalarsOf(node).filter(adjustable);\n if (fields.length === 0) return undefined;\n return once(mutationNames.adjustInput(node.name), () =>\n Object.fromEntries(fields.map((f) => [f.name, { type: adjustType(f) }])),\n );\n };\n\n const info = new GraphQLObjectType({\n name: \"MutationInfo\",\n description: \"What a mutation wrote.\",\n fields: {\n nodesCreated: { type: new GraphQLNonNull(GraphQLInt) },\n nodesUpdated: { type: new GraphQLNonNull(GraphQLInt) },\n nodesDeleted: { type: new GraphQLNonNull(GraphQLInt) },\n relationshipsCreated: { type: new GraphQLNonNull(GraphQLInt) },\n relationshipsDeleted: { type: new GraphQLNonNull(GraphQLInt) },\n },\n });\n\n const listPayload = (name: string, node: NodeType) =>\n new GraphQLNonNull(\n new GraphQLObjectType({\n name,\n fields: {\n [mutationNames.createdField(node)]: {\n type: new GraphQLNonNull(\n new GraphQLList(new GraphQLNonNull(ctx.object(node.name))),\n ),\n },\n info: { type: new GraphQLNonNull(info) },\n },\n }),\n );\n\n const out: GraphQLFieldConfigMap<unknown, unknown> = {};\n for (const node of model.nodes.values()) {\n const obj = ctx.object(node.name);\n const key = { type: nonNull(ctx.inputType(node.key)) };\n const run =\n (op: MutationKind) =>\n (\n _src: unknown,\n _args: unknown,\n context: unknown,\n i: GraphQLResolveInfo,\n ) =>\n resolve(op, node, i, context);\n const updatable = isUpdatable(model, node);\n const adjust = adjustInput(node);\n const updateArgs = {\n ...(updatable ? { update: { type: updateInput(node) } } : {}),\n ...(adjust\n ? { adjust: { type: adjust, description: \"Math and list operators.\" } }\n : {}),\n };\n\n if (node.mutations.has(\"CREATE\")) {\n out[mutationNames.create(node)] = {\n description: `Create ${node.name} nodes, with their relationships, atomically.`,\n type: listPayload(mutationNames.createPayload(node), node),\n args: { input: { type: nonNull(listOf(nonNull(createInput(node)))) } },\n resolve: run(\"CREATE\"),\n };\n }\n if (node.mutations.has(\"UPDATE\") && updatable) {\n out[mutationNames.update(node)] = {\n description: `Update the ${node.name} with this ${node.key.name}. The payload's ${mutationNames.updatedField(node)} is null when there is none.`,\n type: new GraphQLNonNull(\n new GraphQLObjectType({\n name: mutationNames.updatePayload(node),\n fields: {\n [mutationNames.updatedField(node)]: { type: obj },\n info: { type: new GraphQLNonNull(info) },\n },\n }),\n ),\n args: { [node.key.name]: key, ...updateArgs },\n resolve: run(\"UPDATE\"),\n };\n out[mutationNames.updateMany(node)] = {\n description: `Update every ${node.name} matching \\`where\\`, atomically. Fails, writing nothing, when more than \\`limit\\` match (default: the mutation batch limit). Relationships are updated one node at a time, with update${node.name}.`,\n type: listPayload(mutationNames.updateManyPayload(node), node),\n args: {\n where: { type: nonNull(ctx.where(node.name)) },\n ...updateArgs,\n limit: { type: GraphQLInt },\n },\n resolve: run(\"UPDATE_MANY\"),\n };\n }\n if (node.mutations.has(\"CREATE\") && node.mutations.has(\"UPDATE\")) {\n out[mutationNames.upsert(node)] = {\n description: `Create the ${node.name} nodes whose ${node.key.name} is new and update the others, atomically. Fields required on create are required only for new nodes.`,\n type: listPayload(mutationNames.upsertPayload(node), node),\n args: {\n input: { type: nonNull(listOf(nonNull(upsertInput(node)))) },\n },\n resolve: run(\"UPSERT\"),\n };\n }\n if (node.mutations.has(\"DELETE\")) {\n out[mutationNames.delete(node)] = {\n description: `Delete the ${node.name} with this ${node.key.name}, its relationships, and what @relationship(onDelete: CASCADE) reaches.`,\n type: new GraphQLNonNull(info),\n args: { [node.key.name]: key },\n resolve: run(\"DELETE\"),\n };\n out[mutationNames.deleteMany(node)] = {\n description: `Delete every ${node.name} matching \\`where\\`, atomically. Fails, deleting nothing, when more than \\`limit\\` match (default: the mutation batch limit).`,\n type: new GraphQLNonNull(info),\n args: {\n where: { type: nonNull(ctx.where(node.name)) },\n limit: { type: GraphQLInt },\n },\n resolve: run(\"DELETE_MANY\"),\n };\n }\n }\n return out;\n}\n","// 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 });\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 });\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","// 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\nimport type { LoraDriver } from \"../driver.js\";\nimport { name } from \"../compile/cypher.js\";\nimport type { GraphModel } from \"../model/types.js\";\n\nexport interface DegreeStats {\n sampled: number;\n mean: number;\n median: number;\n p99: number;\n /** The largest degree of any node, not only of the sample. */\n max: number;\n}\n\nexport interface Statistics {\n /** Node count per @node type. */\n nodes: Record<string, number>;\n /** Degree per list relationship, keyed `Type.field`. */\n degrees: Record<string, DegreeStats>;\n}\n\nexport async function analyze(\n driver: LoraDriver,\n model: GraphModel,\n options: { sample?: number; timeoutMs?: number } = {},\n): Promise<Statistics> {\n const sample = options.sample ?? 1000;\n const stats: Statistics = { nodes: {}, degrees: {} };\n for (const node of model.nodes.values()) {\n const label = name(node.labels[0]!);\n const statements = [\n { text: `MATCH (n:${label}) RETURN count(n) AS c`, params: {} },\n ];\n const rels = [...node.fields.values()].filter(\n (f) => f.kind === \"relationship\" && f.list,\n );\n for (const f of rels) {\n if (f.kind !== \"relationship\") continue;\n // Any member of an interface or union counts.\n const labels = f.members\n .map((m) => model.nodes.get(m)!.labels[0]!)\n .map((l) => `x:${name(l)}`)\n .join(\" OR \");\n const inner = `[:${name(f.type)}]`;\n const arrow =\n (f.direction === \"OUT\" ? `-${inner}->(x)` : `<-${inner}-(x)`) +\n ` WHERE ${labels}`;\n statements.push(\n {\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 [count, ...degrees] = await driver.run(statements, {\n mode: \"read\",\n timeoutMs: options.timeoutMs,\n });\n stats.nodes[node.name] = Number(count!.rows[0]?.[\"c\"] ?? 0);\n rels.forEach((f, i) => {\n const values = degrees[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 return stats;\n}\n\nfunction summarize(values: number[]): DegreeStats {\n const at = (q: number) =>\n values.length === 0\n ? 0\n : values[Math.min(values.length - 1, Math.floor(q * values.length))]!;\n return {\n sampled: values.length,\n mean:\n values.length === 0\n ? 0\n : values.reduce((a, b) => a + b, 0) / values.length,\n median: at(0.5),\n p99: at(0.99),\n max: values.length === 0 ? 0 : values[values.length - 1]!,\n };\n}\n","// The compile cache: compiled read root fields, reused by later requests\n// whose compile would produce the same statements.\n//\n// An entry is keyed on what the compile actually read, not on the whole\n// request: the variables the field's selection references, the claims\n// the compile looked up (recorded in `CompileContext.claimReads`), the\n// `$context` values it read, and whether the request is authenticated.\n// A claim that a rule only substitutes into a `node` filter (`\"$jwt.sub\"`)\n// is bound as a parameter: the entry keeps the statement text and swaps\n// in each request's value, so per-user tokens share one compile.\n\nimport {\n Kind,\n type ASTNode,\n type FieldNode,\n type FragmentDefinitionNode,\n} from \"graphql\";\nimport type { CompiledRead } from \"./read/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\ninterface Entry {\n variables: string;\n authenticated: boolean;\n statistics: number;\n /** Claims whose value shapes the statement: must be equal. */\n claims: Array<[path: string, key: string]>;\n /** Claims bound as parameters: any non-empty string, rebound. */\n slots: Slot[];\n /** Paths of `slots`, deduplicated. */\n slotPaths: string[];\n contextReads: Array<[string, unknown]>;\n compiled: CompiledRead;\n /** Approximate bytes the entry holds. */\n bytes: number;\n}\n\ntype Compile = (jwt: Record<string, unknown> | undefined) => {\n ctx: CompileContext;\n compiled: CompiledRead;\n};\n\nexport interface CacheRequest {\n fieldNodes: readonly FieldNode[];\n fragments: Record<string, FragmentDefinitionNode>;\n /** Coerced variable values, or undefined when there are none. */\n variables: Record<string, unknown> | undefined;\n jwt: Record<string, unknown> | undefined;\n context: unknown;\n statistics: number;\n}\n\nexport class CompileCache {\n readonly #byField = new WeakMap<FieldNode, Entry[]>();\n /**\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, string[] | null>();\n /** Claims a field's compile bound into rule filters, to try as slots. */\n readonly #bindHints = new WeakMap<FieldNode, string[]>();\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 const variables = this.#variablesKey(request);\n if (variables === undefined || variables.length > MAX_CACHED_VARIABLES) {\n return compile(request.jwt).compiled;\n }\n const authenticated = !!request.jwt;\n const entries = this.#byField.get(field) ?? [];\n for (const e of entries) {\n if (\n e.variables !== variables ||\n e.authenticated !== authenticated ||\n e.statistics !== request.statistics ||\n !e.claims.every(\n ([path, key]) => stableKey(claimAt(request.jwt, path)) === key,\n ) ||\n !e.slotPaths.every((path) => bindable(claimAt(request.jwt, path))) ||\n !e.contextReads.every(\n ([path, value]) =>\n stableKey(lookupPath(request.context, path)) === stableKey(value),\n )\n ) {\n continue;\n }\n return e.slots.length === 0 ? e.compiled : rebind(e, request.jwt);\n }\n\n const miss = this.#compileMiss(field, request.jwt, compile);\n const { ctx, compiled, slots } = miss;\n const claims: Array<[string, string]> = [];\n for (const [path, read] of ctx.claimReads) {\n if (slots.some((s) => s.path === path)) continue;\n const key = stableKey(read.value);\n if (key === undefined) return compiled;\n claims.push([path, key]);\n }\n const entry: Entry = {\n variables,\n authenticated,\n statistics: request.statistics,\n claims,\n slots,\n slotPaths: [...new Set(slots.map((s) => s.path))],\n contextReads: ctx.contextReads,\n compiled,\n 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 * Otherwise compile with the real claims, and stop trying for the field.\n */\n #compileMiss(\n field: FieldNode,\n jwt: Record<string, unknown> | undefined,\n compile: Compile,\n ): { ctx: CompileContext; compiled: CompiledRead; slots: Slot[] } {\n const hint = this.#bindHints.get(field);\n if (jwt && hint && hint.length > 0) {\n const values = hint.map((path) => lookupPath(jwt, path));\n if (values.every(bindable)) {\n const markers = hint.map((_, i) => `${MARKER}${i}X`);\n let marked: unknown = jwt;\n hint.forEach((path, i) => {\n marked = withPath(marked, path.split(\".\"), markers[i]);\n });\n let result: ReturnType<Compile> | undefined;\n try {\n result = compile(marked as Record<string, unknown>);\n } catch {\n result = undefined;\n }\n const slots = result && findSlots(result, hint, markers);\n if (result && slots) {\n const entry = { compiled: result.compiled, slots };\n return {\n ctx: result.ctx,\n compiled: rebind(entry, jwt),\n slots,\n };\n }\n this.#bindHints.set(field, []);\n }\n }\n const { ctx, compiled } = compile(jwt);\n // Learned from an authenticated compile: without claims, none are read.\n if (hint === undefined && jwt) {\n this.#bindHints.set(\n field,\n [...ctx.claimReads]\n .filter(([, read]) => read.bound && bindable(read.value))\n .map(([path]) => path),\n );\n }\n return { ctx, compiled, slots: [] };\n }\n\n /**\n * The variables the field's selection references, keyed; the whole\n * variable map when that cannot be told (fragment arguments).\n */\n #variablesKey(request: CacheRequest): string | undefined {\n const field = request.fieldNodes[0]!;\n let used = this.#variableNames.get(field);\n if (used === undefined) {\n used = variableNames(request.fieldNodes, request.fragments);\n this.#variableNames.set(field, used);\n }\n const values = request.variables;\n if (!values) return \"\";\n if (used === null) return stableKey(values);\n const picked: Record<string, unknown> = {};\n for (const name of used) {\n if (Object.hasOwn(values, name)) picked[name] = values[name];\n }\n return stableKey(picked);\n }\n}\n\n/**\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\n/**\n * The parameters holding each marker as their whole value. Undefined when\n * a marker is missing, appears anywhere else (statement text, inside a\n * value), or a hinted claim was not read as a bound value.\n */\nfunction findSlots(\n result: { ctx: CompileContext; compiled: CompiledRead },\n paths: string[],\n markers: string[],\n): Slot[] | undefined {\n for (const path of paths) {\n if (!result.ctx.claimReads.get(path)?.bound) return undefined;\n }\n const slots: Slot[] = [];\n const statements = result.compiled.statements;\n for (let s = 0; s < statements.length; s++) {\n const { text, params } = statements[s]!;\n if (text.includes(MARKER)) return undefined;\n for (const [param, value] of Object.entries(params)) {\n const i = markers.indexOf(value as string);\n if (i >= 0) slots.push({ statement: s, param, path: paths[i]! });\n else if (typeof value === \"string\" && value.includes(MARKER)) {\n return undefined;\n } else if (value !== null && typeof value === \"object\") {\n if ((stableKey(value) ?? MARKER).includes(\"lora-claim-\")) {\n return undefined;\n }\n }\n }\n }\n if (!paths.every((path) => slots.some((s) => s.path === path))) {\n return undefined;\n }\n return slots;\n}\n\n/** A copy of `root` with `value` at `path`, sharing everything else. */\nfunction withPath(root: unknown, path: string[], value: unknown): unknown {\n const [head, ...rest] = path;\n const copy: Record<string, unknown> = Array.isArray(root)\n ? ([...root] as unknown as Record<string, unknown>)\n : { ...(root as Record<string, unknown>) };\n copy[head!] =\n rest.length === 0\n ? value\n : withPath((root as Record<string, unknown>)[head!], rest, value);\n return copy;\n}\n\n/** The entry's compile with this request's claims in its slots. */\nfunction rebind(\n entry: Pick<Entry, \"compiled\" | \"slots\">,\n jwt: Record<string, unknown> | undefined,\n): CompiledRead {\n const statements = entry.compiled.statements.map((s) => ({\n text: s.text,\n params: s.params,\n }));\n const copied = new Set<number>();\n for (const slot of entry.slots) {\n const st = statements[slot.statement]!;\n if (!copied.has(slot.statement)) {\n st.params = { ...st.params };\n copied.add(slot.statement);\n }\n st.params[slot.param] = claimAt(jwt, slot.path);\n }\n return { ...entry.compiled, statements };\n}\n\n/**\n * The variables a field's selection references: in arguments, directives\n * and fragments it spreads. Null when a spread fragment declares its own\n * variables (fragment arguments), which this does not follow.\n */\nfunction variableNames(\n fieldNodes: readonly FieldNode[],\n fragments: Record<string, FragmentDefinitionNode>,\n): string[] | null {\n const names = new Set<string>();\n const visited = new Set<string>();\n let exact = true;\n const walk = (node: unknown): void => {\n if (Array.isArray(node)) {\n for (const n of node) walk(n);\n return;\n }\n if (node === null || typeof node !== \"object\") return;\n const ast = node as ASTNode;\n if (ast.kind === Kind.VARIABLE) {\n names.add(ast.name.value);\n return;\n }\n if (ast.kind === Kind.FRAGMENT_SPREAD) {\n const name = ast.name.value;\n if (!visited.has(name)) {\n visited.add(name);\n const fragment = fragments[name];\n if (fragment) {\n if (fragment.variableDefinitions?.length) exact = false;\n walk(fragment);\n }\n }\n }\n for (const [k, v] of Object.entries(ast)) {\n if (k === \"loc\") continue;\n if (v !== null && typeof v === \"object\") walk(v);\n }\n };\n walk(fieldNodes);\n return exact ? [...names].sort() : null;\n}\n\n/**\n * A deterministic key for JSON-like values (object keys sorted, bigints\n * tagged); undefined when the value cannot be keyed (functions, cycles,\n * class instances), which turns caching off for that request.\n */\nexport function stableKey(value: unknown): string | undefined {\n const seen = new Set<unknown>();\n let ok = true;\n const walk = (v: unknown): unknown => {\n if (typeof v === \"bigint\") return { $bigint: v.toString() };\n if (typeof v === \"function\" || typeof v === \"symbol\") {\n ok = false;\n return null;\n }\n if (v === null || typeof v !== \"object\") return v;\n if (seen.has(v)) {\n ok = false;\n return null;\n }\n seen.add(v);\n if (Array.isArray(v)) return v.map(walk);\n const proto = Object.getPrototypeOf(v);\n if (proto !== Object.prototype && proto !== null) {\n ok = false;\n return null;\n }\n const out: Record<string, unknown> = {};\n for (const k of Object.keys(v).sort()) {\n out[k] = walk((v as Record<string, unknown>)[k]);\n }\n return out;\n };\n const json = JSON.stringify(walk(value));\n return ok ? (json ?? \"undefined\") : undefined;\n}\n","import {\n getArgumentValues,\n getDirectiveValues,\n GraphQLIncludeDirective,\n GraphQLSkipDirective,\n isAbstractType,\n isObjectType,\n Kind,\n type FieldNode,\n type FragmentDefinitionNode,\n type GraphQLField,\n type GraphQLObjectType,\n type GraphQLSchema,\n type SelectionSetNode,\n versionInfo,\n} from \"graphql\";\n\nexport interface SelectionContext {\n schema: GraphQLSchema;\n fragments: Record<string, FragmentDefinitionNode>;\n /**\n * Variable values as graphql-js hands them to `getArgumentValues`: the\n * coerced map on graphql 16, `{ sources, coerced }` on 17. Read plain\n * values through `coercedVariables()`.\n */\n variables: Record<string, unknown>;\n}\n\nconst GRAPHQL_17 = versionInfo.major >= 17;\n\n/** The coerced variable values, on graphql 16 and 17 alike. */\nexport function coercedVariables(\n variables: unknown,\n): Record<string, unknown> | undefined {\n const v = variables as Record<string, unknown> | null | undefined;\n if (v == null) return undefined;\n return GRAPHQL_17 ? (v[\"coerced\"] as Record<string, unknown>) : v;\n}\n\n/**\n * The variable values of a `getVariableValues()` result, in the shape the\n * installed graphql's `getArgumentValues()` takes: 16 returns\n * `{ coerced }`, 17 returns `{ variableValues: { sources, coerced } }`.\n */\nexport function variableValuesOf(result: object): Record<string, unknown> {\n const r = result as Record<string, unknown>;\n return (GRAPHQL_17 ? r[\"variableValues\"] : r[\"coerced\"]) as Record<\n string,\n unknown\n >;\n}\n\n/** The fields selected on an object type, grouped by response key. */\nexport type FieldsByKey = Map<string, FieldNode[]>;\n\n/**\n * Collect the fields that apply to `type` from one or more selection\n * sets: follows fragment spreads and inline fragments whose condition\n * matches, honours `@skip` / `@include`, groups by response key.\n */\nexport function collectFields(\n ctx: SelectionContext,\n type: GraphQLObjectType,\n selectionSets: ReadonlyArray<SelectionSetNode | undefined>,\n): FieldsByKey {\n const out: FieldsByKey = new Map();\n const visited = new Set<string>();\n const visit = (set: SelectionSetNode | undefined) => {\n if (!set) return;\n for (const sel of set.selections) {\n if (!included(ctx, sel)) continue;\n if (sel.kind === Kind.FIELD) {\n const key = sel.alias?.value ?? sel.name.value;\n const list = out.get(key);\n if (list) list.push(sel);\n else out.set(key, [sel]);\n } else if (sel.kind === Kind.INLINE_FRAGMENT) {\n if (applies(ctx, type, sel.typeCondition?.name.value)) {\n visit(sel.selectionSet);\n }\n } else {\n const name = sel.name.value;\n if (visited.has(name)) continue;\n visited.add(name);\n const frag = ctx.fragments[name];\n if (frag && applies(ctx, type, frag.typeCondition.name.value)) {\n visit(frag.selectionSet);\n }\n }\n }\n };\n for (const set of selectionSets) visit(set);\n return out;\n}\n\n/** The merged sub-selections of every field node under one response key. */\nexport function subSelections(nodes: readonly FieldNode[]): SelectionSetNode[] {\n return nodes.flatMap((n) => (n.selectionSet ? [n.selectionSet] : []));\n}\n\n/** Coerced argument values of a field, variables substituted. */\nexport function fieldArgs(\n ctx: SelectionContext,\n def: GraphQLField<unknown, unknown>,\n node: FieldNode,\n): Record<string, unknown> {\n return getArgumentValues(def, node, ctx.variables) as Record<string, unknown>;\n}\n\nfunction included(\n ctx: SelectionContext,\n node: Parameters<typeof getDirectiveValues>[1],\n): boolean {\n const skip = getDirectiveValues(GraphQLSkipDirective, node, ctx.variables);\n if (skip?.[\"if\"] === true) return false;\n const include = getDirectiveValues(\n GraphQLIncludeDirective,\n node,\n ctx.variables,\n );\n return include?.[\"if\"] !== false;\n}\n\nfunction applies(\n ctx: SelectionContext,\n type: GraphQLObjectType,\n condition: string | undefined,\n): boolean {\n if (condition === undefined || condition === type.name) return true;\n const cond = ctx.schema.getType(condition);\n if (cond && isAbstractType(cond)) {\n return ctx.schema.isSubType(cond, type);\n }\n return cond !== undefined && isObjectType(cond) && cond.name === type.name;\n}\n","// 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 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","// HMAC-SHA-256, synchronous and dependency-free: cursors are signed and\n// checked inside resolvers and the compiler, which run in Node and in\n// browsers (the WASM binding), where WebCrypto is async only.\n\nconst K = new Uint32Array([\n 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1,\n 0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,\n 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, 0xe49b69c1, 0xefbe4786,\n 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,\n 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147,\n 0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,\n 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, 0xa2bfe8a1, 0xa81a664b,\n 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,\n 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a,\n 0x5b9cca4f, 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,\n 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2,\n]);\n\nexport function sha256(data: Uint8Array): Uint8Array {\n const h = new Uint32Array([\n 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c,\n 0x1f83d9ab, 0x5be0cd19,\n ]);\n // Message, a 1 bit, zeros, and the bit length: a multiple of 64 bytes.\n const padded = new Uint8Array(Math.ceil((data.length + 9) / 64) * 64);\n padded.set(data);\n padded[data.length] = 0x80;\n const view = new DataView(padded.buffer);\n const bits = data.length * 8;\n view.setUint32(padded.length - 8, Math.floor(bits / 2 ** 32));\n view.setUint32(padded.length - 4, bits >>> 0);\n const w = new Uint32Array(64);\n for (let off = 0; off < padded.length; off += 64) {\n for (let i = 0; i < 16; i++) w[i] = view.getUint32(off + i * 4);\n for (let i = 16; i < 64; i++) {\n const a = w[i - 15]!;\n const b = w[i - 2]!;\n const s0 = rotr(a, 7) ^ rotr(a, 18) ^ (a >>> 3);\n const s1 = rotr(b, 17) ^ rotr(b, 19) ^ (b >>> 10);\n w[i] = (w[i - 16]! + s0 + w[i - 7]! + s1) >>> 0;\n }\n let [a, b, c, d, e, f, g, hh] = h as unknown as number[];\n for (let i = 0; i < 64; i++) {\n const t1 =\n (hh! +\n (rotr(e!, 6) ^ rotr(e!, 11) ^ rotr(e!, 25)) +\n ((e! & f!) ^ (~e! & g!)) +\n K[i]! +\n w[i]!) >>>\n 0;\n const t2 =\n ((rotr(a!, 2) ^ rotr(a!, 13) ^ rotr(a!, 22)) +\n ((a! & b!) ^ (a! & c!) ^ (b! & c!))) >>>\n 0;\n hh = g;\n g = f;\n f = e;\n e = (d! + t1) >>> 0;\n d = c;\n c = b;\n b = a;\n a = (t1 + t2) >>> 0;\n }\n h[0] = h[0]! + a!;\n h[1] = h[1]! + b!;\n h[2] = h[2]! + c!;\n h[3] = h[3]! + d!;\n h[4] = h[4]! + e!;\n h[5] = h[5]! + f!;\n h[6] = h[6]! + g!;\n h[7] = h[7]! + hh!;\n }\n const out = new Uint8Array(32);\n const outView = new DataView(out.buffer);\n for (let i = 0; i < 8; i++) outView.setUint32(i * 4, h[i]!);\n return out;\n}\n\nexport function hmacSha256(key: Uint8Array, message: Uint8Array): Uint8Array {\n const block = new Uint8Array(64);\n block.set(key.length > 64 ? sha256(key) : key);\n const inner = new Uint8Array(64 + message.length);\n const outer = new Uint8Array(64 + 32);\n for (let i = 0; i < 64; i++) {\n inner[i] = block[i]! ^ 0x36;\n outer[i] = block[i]! ^ 0x5c;\n }\n inner.set(message, 64);\n outer.set(sha256(inner), 64);\n return sha256(outer);\n}\n\n/** Equality that takes the same time wherever the inputs differ. */\nexport function constantTimeEqual(a: Uint8Array, b: Uint8Array): boolean {\n if (a.length !== b.length) return false;\n let diff = 0;\n for (let i = 0; i < a.length; i++) diff |= a[i]! ^ b[i]!;\n return diff === 0;\n}\n\nfunction rotr(x: number, n: number): number {\n return (x >>> n) | (x << (32 - n));\n}\n","// Keyset cursors: the sort values of the last row plus the @key, tagged\n// with the sort they were produced under, so a cursor replayed against a\n// different sort is rejected instead of silently skipping rows. With a\n// `cursorSecret` they are also signed (HMAC-SHA-256), so a client cannot\n// forge one; without it they are only tagged.\n\nimport { requestError } from \"../errors.js\";\nimport { constantTimeEqual, hmacSha256 } from \"./hmac.js\";\n\ninterface CursorPayload {\n s: string;\n v: unknown[];\n}\n\n/** Bytes of the signature kept in a signed cursor. */\nconst SIGNATURE_BYTES = 16;\n\nexport function encodeCursor(\n sort: string,\n values: unknown[],\n secret?: string,\n): string {\n const json = JSON.stringify(\n { s: sort, v: values } satisfies CursorPayload,\n (_k, val) => (typeof val === \"bigint\" ? { $bigint: val.toString() } : val),\n );\n const payload = toBase64Url(json);\n return secret === undefined\n ? payload\n : `${payload}.${bytesToBase64Url(sign(secret, payload))}`;\n}\n\nexport function decodeCursor(\n cursor: string,\n sort: string,\n arity: number,\n secret?: string,\n): unknown[] {\n let encoded = cursor;\n if (secret !== undefined) {\n const dot = cursor.indexOf(\".\");\n let given: Uint8Array | undefined;\n try {\n given = dot > 0 ? base64UrlToBytes(cursor.slice(dot + 1)) : undefined;\n } catch {\n given = undefined;\n }\n encoded = cursor.slice(0, Math.max(dot, 0));\n if (!given || !constantTimeEqual(given, sign(secret, encoded))) {\n throw requestError(\"INVALID_CURSOR\", \"`after` is not a valid cursor\");\n }\n }\n let payload: CursorPayload;\n try {\n payload = JSON.parse(fromBase64Url(encoded), (_k, val) =>\n val !== null &&\n typeof val === \"object\" &&\n typeof (val as { $bigint?: unknown }).$bigint === \"string\"\n ? BigInt((val as { $bigint: string }).$bigint)\n : val,\n ) as CursorPayload;\n } catch {\n throw requestError(\"INVALID_CURSOR\", \"`after` is not a valid cursor\");\n }\n if (\n typeof payload !== \"object\" ||\n payload === null ||\n !Array.isArray(payload.v) ||\n payload.v.length !== arity\n ) {\n throw requestError(\"INVALID_CURSOR\", \"`after` is not a valid cursor\");\n }\n if (payload.s !== sort) {\n throw requestError(\n \"INVALID_CURSOR\",\n \"`after` was produced under a different sort; request the first page again\",\n );\n }\n return payload.v;\n}\n\nfunction sign(secret: string, payload: string): Uint8Array {\n const encoder = new TextEncoder();\n return hmacSha256(encoder.encode(secret), encoder.encode(payload)).slice(\n 0,\n SIGNATURE_BYTES,\n );\n}\n\n// Portable base64url (Node and browsers; the WASM binding runs in both).\nexport function toBase64Url(text: string): string {\n return bytesToBase64Url(new TextEncoder().encode(text));\n}\n\nexport function fromBase64Url(encoded: string): string {\n return new TextDecoder(\"utf-8\", { fatal: true }).decode(\n base64UrlToBytes(encoded),\n );\n}\n\nfunction bytesToBase64Url(bytes: Uint8Array): string {\n let bin = \"\";\n for (const b of bytes) bin += String.fromCharCode(b);\n return btoa(bin).replace(/\\+/g, \"-\").replace(/\\//g, \"_\").replace(/=+$/, \"\");\n}\n\nfunction base64UrlToBytes(encoded: string): Uint8Array {\n const b64 = encoded.replace(/-/g, \"+\").replace(/_/g, \"/\");\n const bin = atob(b64 + \"=\".repeat((4 - (b64.length % 4)) % 4));\n return Uint8Array.from(bin, (c) => c.charCodeAt(0));\n}\n","// 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\nfunction 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","// `@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 } from \"../../errors.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 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 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/** 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 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 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","// 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 return typeof value === \"bigint\" ? `n${value}` : JSON.stringify(value);\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 }\n }\n\n // Ordered ascending by a string that is always present (the key, or a\n // non-null @sortable field with its existence constraint) and nothing\n // else to seek on: `>= \"\"` excludes no row, and lets the planner walk the\n // index in order and stop after `limit` rows instead of sorting the label.\n let bound: Expr | undefined;\n const lead = sort[0];\n if (\n !predicate &&\n !anchor &&\n !keyset &&\n !related &&\n computed.length === 0 &&\n lead &&\n lead.direction === \"ASC\" &&\n leadBound(lead) &&\n (lead.field.type === \"String\" || lead.field.type === \"ID\")\n ) {\n bound = bin(\">=\", prop(v(\"this\"), lead.field.property), lit(\"\"));\n expectation = {\n label,\n access: \"range\",\n reason: `ordered by ${node.name}.${lead.field.name}`,\n };\n }\n\n clauses.push({\n kind: \"match\",\n pattern: related\n ? related.pattern\n : { start: { variable: \"this\", labels: [label] }, hops: [] },\n where: and(\n anchor,\n computed.length === 0 ? predicate : undefined,\n computed.length === 0 ? keyset : undefined,\n bound,\n authFilter(ctx, node, \"this\", \"READ\"),\n ),\n });\n if (related) {\n // Several relationships may lead to the same node.\n clauses.push({\n kind: \"with\",\n distinct: true,\n items: [{ expr: v(\"this\") }],\n });\n }\n if (computed.length > 0) {\n clauses.push(...computedClauses, {\n kind: \"with\",\n items: [{ expr: v(\"this\") }, ...carry.map((c) => ({ expr: v(c) }))],\n where: and(predicate, keyset),\n });\n }\n return { clauses, expectation, carry };\n}\n\n/** The computed (`@cypher`) fields a root filter or sort refers to. */\nfunction computedFields(\n node: NodeType,\n where: Where | undefined,\n sort: SortKey[],\n): CypherField[] {\n const out = new Set<CypherField>();\n const walk = (w: Where | undefined) => {\n for (const [key, value] of Object.entries(w ?? {})) {\n if (value === null || value === undefined) continue;\n if (key === \"AND\" || key === \"OR\") {\n for (const item of value as Where[]) walk(item);\n } else if (key === \"NOT\") {\n walk(value as Where);\n } else {\n const f = node.fields.get(key);\n if (f?.kind === \"cypher\" && f.computed) out.add(f);\n }\n }\n };\n walk(where);\n for (const k of sort) if (k.field.computedBy) out.add(k.field.computedBy);\n return [...out];\n}\n\ninterface RelatedAnchor {\n clauses: Clause[];\n pattern: import(\"../cypher.js\").Pattern;\n expectation: Omit<SeekExpectation, \"statement\">;\n}\n\nfunction findRelatedAnchor(\n ctx: CompileContext,\n node: NodeType,\n where: Where,\n): RelatedAnchor | undefined {\n for (const [key, value] of Object.entries(where)) {\n const rel = node.fields.get(key);\n if (rel?.kind !== \"relationship\" || value == null) continue;\n // Through an interface or union there is no single key to seek on.\n if (ctx.model.abstracts.has(rel.target)) continue;\n const target = ctx.model.nodes.get(rel.target)!;\n const inner = rel.list\n ? ((value as Where)[\"some\"] ?? (value as Where)[\"single\"])\n : value;\n if (!inner || typeof inner !== \"object\") continue;\n const ops = (inner as Where)[target.key.name] as Where | undefined;\n const eq = ops?.[\"eq\"];\n const inList = ops?.[\"in\"];\n if (eq == null && !Array.isArray(inList)) continue;\n\n const a = freshVar(ctx, `this_${rel.name}_anchor`);\n const clauses: Clause[] = [];\n let seek: Expr;\n if (eq != null) {\n seek = bin(\"=\", prop(v(a), target.key.property), bind(ctx, eq));\n } else {\n // `IN` seeks once per distinct value (E18).\n seek = bin(\n \"IN\",\n prop(v(a), target.key.property),\n bind(ctx, dedupe(inList as unknown[])),\n );\n }\n clauses.push({\n kind: \"match\",\n pattern: {\n start: { variable: a, labels: [target.labels[0]!] },\n hops: [],\n },\n where: seek,\n });\n return {\n clauses,\n // (anchor)<-[:T]-(this:Label): the field's direction, reversed.\n pattern: {\n start: { variable: a, labels: [] },\n hops: [\n {\n rel: {\n type: rel.type,\n direction: rel.direction === \"OUT\" ? \"IN\" : \"OUT\",\n },\n node: { variable: \"this\", labels: [node.labels[0]!] },\n },\n ],\n },\n expectation: {\n label: target.labels[0]!,\n access: \"exact\",\n reason: `anchored on ${target.name}.${target.key.name} through ${node.name}.${rel.name}`,\n },\n };\n }\n return undefined;\n}\n\nfunction seekFromWhere(\n node: NodeType,\n where: Where,\n): Omit<SeekExpectation, \"statement\"> | undefined {\n const label = node.labels[0]!;\n for (const access of [\"exact\", \"range\", \"text\", \"point\"] as const) {\n for (const [key, value] of Object.entries(where)) {\n const field = node.fields.get(key);\n if (field?.kind !== \"scalar\" || value == null) continue;\n const ops = Object.entries(value as Where)\n .filter(([, x]) => x != null)\n .map(([op]) => op);\n const family = {\n exact: EXACT_OPS,\n range: RANGE_OPS,\n text: TEXT_OPS,\n point: POINT_OPS,\n }[access];\n if (access === \"range\" && RANGE_UNINDEXABLE.has(field.type)) continue;\n const op = ops.find((o) => family.has(o));\n if (op) {\n return {\n label,\n access,\n reason: `${node.name}.${field.name} ${op}`,\n };\n }\n }\n }\n return undefined;\n}\n\nfunction dedupe(values: unknown[]): unknown[] {\n const seen = new Set<string>();\n return values.filter((x) => {\n const k = keyOf(x);\n if (seen.has(k)) return false;\n seen.add(k);\n return true;\n });\n}\n","// 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(\n ctx,\n matching((nv) => prop(v(nv), target.key.property)),\n ),\n },\n {\n key: \"edges\",\n value: fn(\n \"size\",\n matching(() => lit(1)),\n ),\n },\n ],\n },\n },\n ...sides,\n ],\n },\n });\n }\n if (sel.totalCount || sel.aggregate) {\n const cx = freshVar(ctx, `${x}_count`);\n const cr = freshVar(ctx, `${cx}_rel`);\n connection.push({\n key: \"__totalCount\",\n value: fn(\"size\", {\n kind: \"comprehension\",\n pattern: relationshipPattern(parent, rel, label, cx, cr),\n where: filterFor(cx, cr),\n projection: lit(1),\n }),\n });\n const rule = authValidate(ctx, target, cx, \"READ\", \"BEFORE\");\n if (rule) {\n connection.push({\n key: \"__denied\",\n value: fn(\"size\", {\n kind: \"comprehension\",\n pattern: relationshipPattern(parent, rel, label, cx, cr),\n where: and(filterFor(cx, cr), not(fn(\"coalesce\", rule, lit(false)))),\n projection: lit(1),\n }),\n });\n }\n }\n\n if (!sel.page) {\n // Only counts or aggregates: no page to read.\n connection[0] = { key: \"__rows\", value: { kind: \"list\", items: [] } };\n return { pre: [], expr: { kind: \"map\", entries: connection } };\n }\n return {\n pre: [\n {\n kind: \"call\",\n imports: [parent],\n body: [\n { kind: \"match\", pattern, where: and(filter, keyset) },\n {\n kind: \"with\",\n // A READ_EDGE rule may test the parent end: keep it in scope.\n items: [\n { expr: v(r) },\n { expr: v(x) },\n ...(edgeRead !== undefined ? [{ expr: v(parent) }] : []),\n ],\n orderBy: sortItems(x, sort, r),\n limit: bind(ctx, first + 1),\n },\n ...nested.pre,\n {\n kind: \"return\",\n items: [\n {\n expr: fn(\"collect\", { kind: \"map\", entries: edgeEntries }),\n alias: rowsVar,\n },\n ],\n },\n ],\n },\n ],\n expr: { kind: \"map\", entries: connection },\n };\n}\n\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","// 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","// 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 type { FieldNode, GraphQLObjectType, SelectionSetNode } 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 { finish, readSet, deniedItem, assertNoneDenied } 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// 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 let statsColumns: Array<{ column: string; path: string[] }> = [];\n if (stats) {\n const statsCtx: CompileContext = {\n ...ctx,\n params: {},\n vars: new Set([\"this\"]),\n computed: new Map(),\n };\n const statsRoot = rootMatch(statsCtx, node, where, []);\n expectation ??= statsRoot.expectation;\n const items: Array<{ expr: Expr; alias: string }> = [\n { expr: fn(\"count\", v(\"this\")), alias: \"totalCount\" },\n ...deniedItem(statsCtx, node, \"this\"),\n ];\n const wanted: WantedAggregate[] = [];\n for (const { field, fns } of sel.aggregate?.node ?? []) {\n for (const agg of fns) {\n const column = `node_${field.name}_${agg}`;\n wanted.push({ field, agg, column });\n statsColumns.push({ column, path: [\"node\", field.name, agg] });\n }\n }\n statements.push({\n text: printClauses([\n ...statsRoot.clauses,\n ...aggregateReturn(statsCtx, \"this\", items, wanted),\n ]),\n params: statsCtx.params,\n });\n }\n statsColumns = statsColumns.slice();\n\n return {\n statements,\n columns,\n reads: readSet(ctx),\n expectations: expectation ? [{ statement: 0, ...expectation }] : [],\n // Counting reads every match, not a page.\n cost:\n ctx.cost +\n (stats\n ? Math.max(1, rootFilterCost(ctx, node, where, first + 1, true))\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 { 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} from \"./common.js\";\nimport { resolveLimit } 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 * Vector search asks the index for more candidates than the page when a\n * filter may drop some, because the index returns the top k before WHERE.\n */\n/** The order search results come in, as a cursor signature. */\nconst SEARCH_SORT = \"score:DESC,key:ASC\";\n\n/**\n * A search as a connection (`connection: true`): pages forward by keyset\n * on (score DESC, key ASC). A vector index returns its top candidates\n * before any filter, so vector connections page within a fixed pool of\n * `4 × @limit(max:)` candidates.\n */\nexport function compileSearch(\n ctx: CompileContext,\n node: NodeType,\n index: SearchIndex,\n args: Args,\n fieldNodes: readonly FieldNode[],\n connection = false,\n): CompiledRead {\n checkAuthentication(ctx, node, \"READ\");\n const label = node.labels[0]!;\n ctx.reads.labels.add(label);\n const limit = connection\n ? resolveLimit(args[\"first\"], node.limit, \"first\")\n : resolveLimit(args[\"limit\"], node.limit, \"limit\");\n const after = connection\n ? (args[\"after\"] as string | null | undefined)\n : null;\n const cursor =\n after != null\n ? decodeCursor(after, SEARCH_SORT, 2, ctx.model.cursorSecret)\n : undefined;\n const keyset = cursor\n ? or(\n bin(\"<\", v(\"score\"), bind(ctx, cursor[0])),\n and(\n bin(\"=\", v(\"score\"), bind(ctx, cursor[0])),\n bin(\">\", prop(v(\"this\"), node.key.property), bind(ctx, cursor[1])),\n ),\n )\n : undefined;\n // The index call and its filters, for the page (with the keyset) and\n // for `totalCount` (every match, in its own parameter scope).\n const matches = (c: CompileContext, keyset: Expr | undefined): Clause[] => {\n const where = and(\n compileNodeWhere(c, node, \"this\", args[\"where\"] as Where | undefined),\n authFilter(c, node, \"this\", \"READ\"),\n keyset,\n );\n const clauses: Clause[] = [];\n if (index.kind === \"fulltext\") {\n const query = args[\"query\"] as string;\n clauses.push({\n kind: \"procedure\",\n procedure: \"db.index.fulltext.queryNodes\",\n args: [bind(c, index.name), bind(c, query)],\n yields: [{ item: \"node\", alias: \"this\" }, { item: \"score\" }],\n where,\n });\n return clauses;\n }\n const vector = args[\"vector\"] as number[] | null | undefined;\n const to = args[\"to\"];\n if ((vector == null) === (to == null)) {\n throw requestError(\n \"BAD_USER_INPUT\",\n `${index.queryName} takes exactly one of \\`vector\\` and \\`to\\``,\n );\n }\n if (vector && vector.length !== index.dimensions) {\n throw requestError(\n \"BAD_USER_INPUT\",\n `\\`vector\\` has ${vector.length} dimensions; ${node.name}.${index.field.name} has ${index.dimensions}`,\n );\n }\n // 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, matches, (rows) => ({\n __rows: [],\n __first: limit,\n __after: cursor !== undefined,\n __backward: false,\n __sort: SEARCH_SORT,\n __totalCount: rows,\n }));\n }\n const clauses = matches(ctx, keyset);\n const selections = sel\n ? sel.node\n : searchNodeSelections(ctx, node, fieldNodes);\n const projection = projectNode(ctx, node, \"this\", selections, limit);\n clauses.push(\n {\n kind: \"with\",\n items: [{ expr: v(\"this\") }, { expr: v(\"score\") }],\n orderBy: [\n { expr: v(\"score\"), direction: \"DESC\" },\n { expr: prop(v(\"this\"), node.key.property), direction: \"ASC\" },\n ],\n // One more than the page, to tell whether another follows.\n limit: bind(ctx, connection ? limit + 1 : limit),\n },\n ...projection.pre,\n {\n kind: \"return\",\n items: [\n { expr: projection.expr, alias: \"node\" },\n { expr: v(\"score\"), alias: \"score\" },\n ...(connection\n ? [\n {\n expr: {\n kind: \"list\" as const,\n items: [v(\"score\"), prop(v(\"this\"), node.key.property)],\n },\n alias: \"__cursor\",\n },\n ]\n : []),\n ],\n },\n );\n if (sel) {\n const count = sel.totalCount\n ? searchCount(ctx, node, matches, () => undefined)\n : undefined;\n const compiled = finish(\n ctx,\n clauses,\n [\"node\", \"score\", \"__cursor\"],\n ([r, c]): RawConnection => {\n const row = c?.rows[0];\n if (c) assertNoneDenied(row);\n return {\n __rows: r!.rows.map((row) => ({\n node: row[\"node\"],\n score: row[\"score\"],\n __cursor: row[\"__cursor\"] as unknown[],\n })),\n __first: limit,\n __after: cursor !== undefined,\n __backward: false,\n __sort: SEARCH_SORT,\n ...(c ? { __totalCount: Number(row?.[\"totalCount\"] ?? 0) } : {}),\n };\n },\n undefined,\n count?.statements ?? [],\n );\n if (count) compiled.cost += count.cost;\n return compiled;\n }\n return finish(\n ctx,\n clauses,\n [\"node\", \"score\"],\n ([r]): SearchResult[] =>\n r!.rows.map((row) => ({\n node: row[\"node\"],\n score: row[\"score\"] as number,\n })),\n undefined,\n );\n}\n\n/**\n * `totalCount` of a search connection: every match after \\`where\\` and the\n * read rules (a vector search counts within its candidate window), in its\n * own parameter scope. A row the READ rules would refuse makes the count\n * FORBIDDEN, as on other connections.\n */\nfunction searchCount(\n ctx: CompileContext,\n node: NodeType,\n matches: (c: CompileContext, keyset: Expr | undefined) => Clause[],\n shape: (count: number) => RawConnection | undefined,\n): CompiledRead {\n const statsCtx: CompileContext = {\n ...ctx,\n params: {},\n vars: new Set([\"this\"]),\n computed: new Map(),\n };\n const clauses: Clause[] = [\n ...matches(statsCtx, undefined),\n {\n kind: \"return\",\n items: [\n { expr: fn(\"count\", v(\"this\")), alias: \"totalCount\" },\n ...deniedItem(statsCtx, node, \"this\"),\n ],\n },\n ];\n const compiled = finish(\n statsCtx,\n clauses,\n [\"totalCount\"],\n ([r]) => {\n const row = r!.rows[0];\n assertNoneDenied(row);\n return shape(Number(row?.[\"totalCount\"] ?? 0));\n },\n undefined,\n );\n compiled.cost = 1;\n return compiled;\n}\n\n/** The `edges { node }` selections of a search connection. */\nfunction searchConnectionSelections(\n ctx: CompileContext,\n node: NodeType,\n fieldNodes: readonly FieldNode[],\n): ReturnType<typeof connectionSelections> {\n const connType = ctx.schema.getType(\n names.searchConnection(node.name),\n ) as GraphQLObjectType;\n const edgeType = ctx.schema.getType(\n names.searchEdge(node.name),\n ) as GraphQLObjectType;\n return connectionSelections(\n ctx,\n connType,\n edgeType,\n subSelections(fieldNodes),\n node,\n undefined,\n );\n}\n\n/** The `node` selections of a `<Type>Match` list, merged across aliases. */\nfunction searchNodeSelections(\n ctx: CompileContext,\n node: NodeType,\n fieldNodes: readonly FieldNode[],\n): SelectionSetNode[] {\n const matchType = ctx.schema.getType(\n names.match(node.name),\n ) as GraphQLObjectType;\n const out: SelectionSetNode[] = [];\n for (const [, nodes] of collectFields(\n ctx,\n matchType,\n subSelections(fieldNodes),\n )) {\n if (nodes[0]!.name.value === \"node\") out.push(...subSelections(nodes));\n }\n return out;\n}\n","// S5: what a write changed, and whether a read could have seen it.\n\nimport type { MutationOperation } from \"../model/types.js\";\n\nexport interface EntityRef {\n /** Node type name. */\n type: string;\n /** Its @key value. */\n key: unknown;\n}\n\nexport interface RelationshipRef {\n /** Relationship type, e.g. `FOLLOWS`. */\n type: string;\n /** `Owner.field` that declares it. */\n field: string;\n from: EntityRef;\n to: EntityRef;\n}\n\nexport interface WriteChange {\n /** `EXTERNAL`: from the engine's change feed (`changeFeed: true`). */\n operation: MutationOperation | \"UPSERT\" | \"CYPHER\" | \"EXTERNAL\";\n /** When the change was committed (ISO-8601), set when it is emitted. */\n timestamp?: string;\n /**\n * Stored properties before the write, for updated and deleted nodes of\n * types with `@subscription(previousState: true)`.\n */\n before?: Array<{\n type: string;\n key: unknown;\n properties: Record<string, unknown>;\n }>;\n /** The Mutation field that made the change. */\n field: string;\n created: EntityRef[];\n updated: EntityRef[];\n deleted: EntityRef[];\n connected: RelationshipRef[];\n disconnected: RelationshipRef[];\n /**\n * Every node whose observable state changed: created, updated and\n * deleted nodes, and both ends of every relationship written. A\n * response cache should invalidate by `types` too: lists, counts and\n * connections change without naming an entity (see the Yoga example).\n */\n entities: EntityRef[];\n /** Node types in `entities`: lists of these types may have changed. */\n types: string[];\n relationshipTypes: string[];\n /**\n * The write-set is unknown (a `@cypher` mutation): treat everything as\n * changed.\n */\n broad: boolean;\n}\n\nexport interface ReadSetLike {\n labels: readonly string[];\n relationships: readonly string[];\n /** 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","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","// 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, generously: a type is touched when the statement names one of its\n// labels, the relationship type of a constrained relationship, or a\n// constrained scalar's property (`.prop`). A superset, never a guess that\n// leaves a write out — short of a statement that builds labels or\n// property names dynamically, which LoraDB's Cypher cannot.\n\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\n/** The `@uniqueTogether` types `statement` may write. */\nexport function uniqueTogetherTouched(\n model: GraphModel,\n statement: string,\n): NodeType[] {\n const colon = new Set(\n [...statement.matchAll(new RegExp(`:\\\\s*(${NAME})`, \"g\"))].map((m) =>\n unquote(m[1]!),\n ),\n );\n const dot = new Set(\n [...statement.matchAll(new RegExp(`\\\\.\\\\s*(${NAME})`, \"g\"))].map((m) =>\n unquote(m[1]!),\n ),\n );\n return [...model.nodes.values()].filter(\n (node) =>\n node.uniqueTogether.length > 0 &&\n (node.labels.some((l) => colon.has(l)) ||\n node.uniqueTogether.some(\n (u) =>\n u.scalars.some((f) => dot.has(f.property)) ||\n [...u.singles, ...(u.set ? [u.set] : [])].some((f) =>\n colon.has(f.type),\n ),\n )),\n );\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 { 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\";\n\n/** Computes a `@populatedBy` field. */\nexport type PopulatedByCallback = (args: {\n operation: \"CREATE\" | \"UPDATE\";\n /** Node type and field being populated. */\n type: string;\n field: string;\n key: unknown;\n /** The node's input in this mutation. */\n input: Record<string, unknown>;\n /** The GraphQL context. */\n context: unknown;\n}) => unknown;\n\nexport interface MutationEnv {\n model: GraphModel;\n driver: LoraDriver;\n /** The caller's node's @key, for @key(scope: VIEWER) (see executeMutation). */\n viewerKey?: unknown;\n selection: SelectionContext;\n jwt: Record<string, unknown> | undefined;\n /** The GraphQL context, for `$context` in rules and for callbacks. */\n requestContext: unknown;\n timeoutMs: number;\n signal: AbortSignal | undefined;\n degrees: ReadonlyMap<string, number>;\n /**\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 /**\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 */\nexport function uniqueTogetherStatement(\n ctx: CompileContext,\n model: GraphModel,\n node: NodeType,\n u: UniqueTogether,\n keys: unknown[] | undefined,\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 return (\n (keys\n ? `UNWIND ${printExpr(bind(ctx, dedupe(keys)))} AS k\\n` +\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 `\\nRETURN n.${key} AS key LIMIT 1`\n );\n}\n","// A `@cypher` field on Mutation. The statement runs as written, not inside\n// a `CALL { }`: LoraDB 0.15 rejects writes in subqueries as read-only.\n// Returned nodes are then projected by @key in the same transaction. 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\";\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<unknown> {\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 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 field.type.list ? value : (value[0] ?? null);\n } catch (err) {\n if (tx.isOpen) await tx.rollback();\n throw err;\n }\n}\n","// A transaction the caller owns: GraphQL operations and the application's\n// own Cypher commit or roll back together. Change events are held until\n// the commit, so listeners never see a write that was rolled back.\n\nimport type { DriverTransaction, QueryResult } from \"../driver.js\";\nimport type { WriteChange } from \"./changes.js\";\n\nexport class LoraTransaction {\n readonly #tx: DriverTransaction;\n readonly #emit: (change: WriteChange) => void;\n readonly #pending: WriteChange[] = [];\n\n /** @internal Created by `LoraGraphQL.begin()`. */\n constructor(tx: DriverTransaction, emit: (change: WriteChange) => void) {\n this.#tx = tx;\n this.#emit = emit;\n }\n\n /** @internal The driver transaction statements run in. */\n get driverTransaction(): DriverTransaction {\n return this.#tx;\n }\n\n /** False once committed, rolled back, or failed. */\n get isOpen(): boolean {\n return this.#tx.isOpen;\n }\n\n /** Run the application's own Cypher in the transaction. */\n execute(\n query: string,\n params: Record<string, unknown> = {},\n ): Promise<QueryResult> {\n return this.#tx.execute({ text: query, params });\n }\n\n /** @internal A mutation's write-set, reported when the transaction commits. */\n record(change: WriteChange): void {\n this.#pending.push(change);\n }\n\n async commit(): Promise<void> {\n await this.#tx.commit();\n for (const change of this.#pending.splice(0)) this.#emit(change);\n }\n\n async rollback(): Promise<void> {\n this.#pending.length = 0;\n if (this.#tx.isOpen) await this.#tx.rollback();\n }\n}\n","// The 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 if (typeof AbortSignal.any === \"function\") return AbortSignal.any([a, b]);\n // Node before 20.3.\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","// Errors mutations raise for what the graph holds: a pair that is not\n// connected, a required relationship left empty, and the engine's\n// 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/** 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 } from \"../../compile/context.js\";\nimport { name, printExpr } from \"../../compile/cypher.js\";\nimport { keyOf } from \"../../compile/read/by-keys.js\";\nimport { requestError } from \"../../errors.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 } 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 interface Touched {\n field: RelationshipField;\n keys: unknown[];\n /** Links per key, for keys of nodes this plan creates. */\n fresh: Map<string, number>;\n }\n const touched = new Map<string, Touched>();\n // `type` is the node's concrete type: a node this plan creates that\n // gains exactly one link on the field cannot hold more than one.\n const add = (field: RelationshipField, key: unknown, type: string) => {\n const id = `${field.owner}.${field.name}`;\n const entry: Touched = touched.get(id) ?? {\n field,\n keys: [],\n fresh: new Map(),\n };\n entry.keys.push(key);\n if (plan.isFresh(type, key)) {\n const k = keyOf(key);\n entry.fresh.set(k, (entry.fresh.get(k) ?? 0) + 1);\n }\n touched.set(id, entry);\n };\n for (const link of plan.links) {\n if (!link.rel.list) add(declared(link.rel), link.from, link.rel.owner);\n for (const f of inverseFields(model, link.rel)) {\n if (!f.list) add(f, link.to, link.rel.target);\n }\n }\n for (const { field, keys: all, fresh } of touched.values()) {\n const keys = all.filter((k) => fresh.get(keyOf(k)) !== 1);\n if (keys.length === 0) continue;\n const owner = model.nodes.get(field.owner)!;\n const ctx = runner.ctx();\n const text =\n `UNWIND ${printExpr(bind(ctx, dedupe(keys)))} AS k\\n` +\n `MATCH (a:${name(owner.labels[0]!)}) WHERE a.${name(owner.key.property)} = k\\n` +\n `WITH a, size([(a)${arrow(field, \"\", \"x\", undefined)} WHERE ${memberTest(model, \"x\", field)} | 1]) AS c WHERE c > 1\\n` +\n `RETURN a.${name(owner.key.property)} AS key, c AS count` +\n `, 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]) AS seen`;\n const target = { name: field.target } as NodeType;\n const rows = await runner.run(text, ctx);\n if (rows.length > 0) {\n const row = rows[0]!;\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 (Number(row[\"seen\"]) < Number(row[\"count\"])) {\n throw requestError(\n \"FORBIDDEN\",\n `not allowed to replace ${owner.name}.${field.name}`,\n );\n }\n throw requestError(\n \"CONSTRAINT_VIOLATION\",\n `${owner.name}.${field.name} holds one ${target.name}, but ${owner.name} ${JSON.stringify(row[\"key\"])} would have ${String(row[\"count\"])}`,\n undefined,\n { type: owner.name, field: field.name },\n );\n }\n }\n}\n\n/**\n * `@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 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 * 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 {\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\n const relIds = new Set<number>();\n for (const [node, keysByNode] of doomed) {\n const nodeKeys = [...keysByNode.values()];\n for (const key of nodeKeys) {\n runner.disconnected.push(...(await neighbours(runner, node, key)));\n }\n const ctx = runner.ctx();\n const rows = 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 `RETURN [(n)-[r]-() | id(r)] AS ids`,\n ctx,\n );\n for (const r of rows) for (const id of r[\"ids\"] as number[]) relIds.add(id);\n }\n for (const [node, keysByNode] of doomed) {\n const nodeKeys = [...keysByNode.values()];\n if (node.subscriptionOptions.previousState) {\n const pctx = 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/** The node's current relationships in the model, for the write-set. */\nasync function neighbours(\n runner: Runner,\n node: NodeType,\n key: unknown,\n): Promise<RelationshipRef[]> {\n // Relationship fields declared on this type, and those on other types\n // that point here: a relationship may be declared on either side.\n const model = 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 if (own.length + inverse.length === 0) return [];\n const ctx = runner.ctx();\n const k = printExpr(bind(ctx, key));\n const entries = [\n ...own.map((f, i) => {\n const target = model.nodes.get(f.target)!;\n return `r${i}: [(n)${arrow(f, \"\", \"m\", target)} | m.${name(target.key.property)}]`;\n }),\n ...inverse.map((f, i) => {\n const owner = model.nodes.get(f.owner)!;\n // Seen from this node, the declared direction is reversed.\n const back = {\n ...f,\n direction: f.direction === \"OUT\" ? \"IN\" : \"OUT\",\n } as const;\n return `i${i}: [(n)${arrow(back, \"\", \"m\", owner)} | m.${name(owner.key.property)}]`;\n }),\n ];\n const rows = await runner.run(\n `MATCH (n:${name(node.labels[0]!)}) WHERE n.${name(node.key.property)} = ${k}\\nRETURN { ${entries.join(\", \")} } AS related`,\n ctx,\n );\n const related = rows[0]?.[\"related\"] as Record<string, unknown[]> | undefined;\n if (!related) return [];\n const refs = [\n ...own.flatMap((f, i) =>\n (related[`r${i}`] ?? []).map((to) => relRef(f, key, to)),\n ),\n ...inverse.flatMap((f, i) =>\n (related[`i${i}`] ?? []).map((from) => relRef(f, from, key)),\n ),\n ];\n // A relationship declared on both sides is reported once.\n const seen = new Set<string>();\n return refs.filter((r) => {\n const ends = [\n `${r.from.type}:${keyOf(r.from.key)}`,\n `${r.to.type}:${keyOf(r.to.key)}`,\n ].sort();\n const id = `${r.type}\\0${ends.join(\"\\0\")}`;\n if (seen.has(id)) return false;\n seen.add(id);\n return true;\n });\n}\n","// `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","// 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 } from \"../../errors.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 constructor(\n readonly env: MutationEnv,\n readonly ctx: CompileContext,\n ) {}\n\n get model(): GraphModel {\n return this.env.model;\n }\n\n /**\n * Whether this plan creates the `type` node with `key`. Creates run\n * before links, so such a node has only the relationships this plan\n * gives it.\n */\n isFresh(type: string, key: unknown): boolean {\n for (const [node, rows] of this.creates) {\n if (node.name !== type) continue;\n const k = keyOf(key);\n if (rows.some((r) => keyOf(r.key) === k)) return true;\n }\n return false;\n }\n\n /**\n * Plan a node creation (and its nested writes); returns its key.\n * `parent` is the relationship a nested create hangs from: it satisfies\n * the new node's required field pointing back.\n */\n create(node: NodeType, input: Input, parent?: RelationshipField): unknown {\n checkAuthentication(this.ctx, node, \"CREATE\");\n let key = input[node.key.name];\n if (key === undefined || key === null) {\n if (!node.key.generate) {\n throw requestError(\n \"BAD_USER_INPUT\",\n `${node.name}.${node.key.name} is required`,\n );\n }\n key = globalThis.crypto.randomUUID();\n }\n checkKeyScope(this.ctx, node, key, this.env.viewerKey);\n const props: Input = {};\n const written = new Set<string>();\n if (input[node.key.name] !== undefined && input[node.key.name] !== null) {\n written.add(node.key.name);\n }\n for (const f of node.fields.values()) {\n if (f.kind !== \"scalar\" || f.key) continue;\n const value = input[f.name];\n if (value !== undefined && value !== null) {\n if (!settable(f, \"CREATE\")) {\n throw requestError(\n \"BAD_USER_INPUT\",\n `${node.name}.${f.name} cannot be set on create`,\n );\n }\n checkFieldAuthentication(this.ctx, node.name, f, \"CREATE\");\n props[f.property] = toStored(f, value);\n written.add(f.name);\n } else if (f.populatedBy?.operations.has(\"CREATE\")) {\n this.pending.push(async () => {\n props[f.property] = toStored(\n f,\n await this.callback(f, \"CREATE\", node, key, input),\n );\n });\n } else if (f.defaultValue) {\n props[f.property] = storedDefault(f);\n } else if (requiredOnCreate(f) && settable(f, \"CREATE\")) {\n throw requestError(\n \"BAD_USER_INPUT\",\n `${node.name}.${f.name} is required`,\n );\n }\n }\n const list = this.creates.get(node) ?? [];\n list.push({ key, props, written });\n this.creates.set(node, list);\n for (const f of node.fields.values()) {\n if (f.kind !== \"relationship\") continue;\n const value = input[f.name] as Input | null | undefined;\n const satisfied =\n parent !== undefined && inverseFields(this.model, parent).includes(f);\n const given = (op: string) => {\n const part = value?.[op];\n if (part == null) return false;\n // Member-keyed for interfaces and unions.\n return this.model.abstracts.has(f.target)\n ? Object.values(part as Input).some((x) => x != null)\n : true;\n };\n if (\n f.required &&\n !f.list &&\n !satisfied &&\n !given(\"connect\") &&\n !given(\"create\")\n ) {\n throw requestError(\n \"BAD_USER_INPUT\",\n `${node.name}.${f.name} is required: connect or create one`,\n );\n }\n if (value && !settable(f, \"CREATE\")) {\n throw requestError(\n \"BAD_USER_INPUT\",\n `${node.name}.${f.name} cannot be set on create`,\n );\n }\n if (value) this.relate(node, key, f, value, false);\n }\n return key;\n }\n\n async callback(\n f: ScalarField,\n operation: \"CREATE\" | \"UPDATE\",\n node: NodeType,\n key: unknown,\n input: Input,\n ): Promise<unknown> {\n const cb = this.env.callbacks[f.populatedBy!.callback]!;\n const value = await cb({\n operation,\n type: node.name,\n field: f.name,\n key,\n input,\n context: this.env.requestContext,\n });\n // A required field must stay set, whatever the callback returns.\n if (f.required && (value === null || value === undefined)) {\n throw requestError(\n \"CONSTRAINT_VIOLATION\",\n `${node.name}.${f.name} is required, but its @populatedBy callback ${f.populatedBy!.callback} returned ${String(value)}`,\n undefined,\n { type: node.name, field: f.name },\n );\n }\n return value;\n }\n\n /** Plan connect / create / update / disconnect under one relationship field. */\n relate(\n owner: NodeType,\n ownerKey: unknown,\n rel: RelationshipField,\n value: Input,\n update: boolean,\n ): void {\n // `@authentication` on the relationship field covers writing it too.\n checkFieldAuthentication(\n this.ctx,\n owner.name,\n rel,\n update ? \"UPDATE\" : \"CREATE\",\n );\n if (asList(value[\"connect\"]).length + asList(value[\"create\"]).length > 0) {\n checkFieldAuthentication(\n this.ctx,\n owner.name,\n rel,\n \"CREATE_RELATIONSHIP\",\n );\n }\n if (\n (value[\"disconnect\"] != null && value[\"disconnect\"] !== false) ||\n (value[\"delete\"] != null && value[\"delete\"] !== false)\n ) {\n checkFieldAuthentication(\n this.ctx,\n owner.name,\n rel,\n \"DELETE_RELATIONSHIP\",\n );\n }\n if (this.model.abstracts.has(rel.target)) {\n // Member-keyed input: each member's part goes to its concrete copy.\n const members = memberFields(this.model, rel);\n const pick = (op: string, member: string) =>\n (value[op] as Input | null | undefined)?.[member];\n const adding = members.reduce(\n (n, m) =>\n n +\n asList(pick(\"connect\", m.target)).length +\n asList(pick(\"create\", m.target)).length,\n 0,\n );\n if (!rel.list && adding > 1) {\n throw requestError(\n \"BAD_USER_INPUT\",\n `${owner.name}.${rel.name} holds one ${rel.target}: connect or create one`,\n );\n }\n // Replacing a single relationship clears every member's edge.\n const replace =\n !rel.list && update && (adding > 0 || value[\"disconnect\"] === true);\n for (const m of members) {\n this.relate(\n owner,\n ownerKey,\n m,\n {\n connect: pick(\"connect\", m.target),\n create: pick(\"create\", m.target),\n disconnect: rel.list\n ? pick(\"disconnect\", m.target)\n : replace\n ? true\n : undefined,\n },\n update,\n );\n }\n return;\n }\n const target = this.model.nodes.get(rel.target)!;\n const connect = asList<Input>(value[\"connect\"]);\n const create = asList<Input>(value[\"create\"]);\n const updates = asList<Input>(value[\"update\"]);\n const disconnect = value[\"disconnect\"];\n const nestedDelete = value[\"delete\"] as Input | boolean | null | undefined;\n if (update && nestedDelete != null && nestedDelete !== false) {\n checkAuthentication(this.ctx, target, \"DELETE\");\n const spec = nestedDelete === true ? {} : nestedDelete;\n this.nestedDeletes.push({\n rel,\n from: ownerKey,\n where: (spec[\"where\"] as Input | null | undefined) ?? undefined,\n limit: (spec[\"limit\"] as number | null | undefined) ?? undefined,\n });\n }\n if (!rel.list && connect.length + create.length > 1) {\n throw requestError(\n \"BAD_USER_INPUT\",\n `${owner.name}.${rel.name} holds one ${target.name}: give connect or create, not both`,\n );\n }\n if (connect.length + create.length > 0) {\n checkAuthentication(this.ctx, owner, \"CREATE_RELATIONSHIP\");\n checkAuthentication(this.ctx, target, \"CREATE_RELATIONSHIP\");\n }\n if (update) {\n if (rel.list) {\n const keys = asList<unknown>(disconnect);\n if (keys.length > 0) {\n checkAuthentication(this.ctx, owner, \"DELETE_RELATIONSHIP\");\n this.disconnects.push({ rel, from: ownerKey, to: keys });\n }\n } else if (disconnect === true || connect.length + create.length > 0) {\n if (\n disconnect === true &&\n rel.required &&\n !rel.via &&\n connect.length + create.length === 0\n ) {\n throw requestError(\n \"BAD_USER_INPUT\",\n `${owner.name}.${rel.name} is required: replace it with connect or create instead`,\n );\n }\n checkAuthentication(this.ctx, owner, \"DELETE_RELATIONSHIP\");\n // A single relationship is replaced, never doubled. Re-connecting\n // the current target keeps its relationship as it is.\n const keep =\n connect.length === 1 ? connect[0]![target.key.name] : undefined;\n this.disconnects.push({\n rel,\n from: ownerKey,\n to: undefined,\n ...(keep !== undefined ? { keep } : {}),\n });\n }\n }\n for (const c of connect) {\n this.links.push({\n rel,\n from: ownerKey,\n to: c[target.key.name],\n ...edgeProps(this.ctx, rel, c[\"edge\"] as Input | undefined),\n });\n }\n for (const c of create) {\n const key = this.create(target, c[\"node\"] as Input, rel);\n this.links.push({\n rel,\n from: ownerKey,\n to: key,\n ...edgeProps(this.ctx, rel, c[\"edge\"] as Input | undefined),\n });\n }\n for (const u of updates) {\n const to = rel.list ? u[target.key.name] : undefined;\n const edge = u[\"edge\"] as Input | null | undefined;\n if (edge && rel.properties) {\n const props = this.model.relationshipProperties.get(rel.properties)!;\n const set: Input = {};\n const remove: string[] = [];\n for (const f of props.fields.values()) {\n if (!(f.name in edge) || !settable(f, \"UPDATE\")) continue;\n checkPropertyAccess(this.ctx, props.name, f, \"UPDATE\");\n if (edge[f.name] === null) {\n if (f.required) {\n throw requestError(\n \"BAD_USER_INPUT\",\n `${props.name}.${f.name} is required and cannot be null`,\n );\n }\n remove.push(f.property);\n } else {\n set[f.property] = toStored(f, edge[f.name]);\n }\n }\n this.edgeUpdates.push({ rel, from: ownerKey, to, set, remove });\n }\n const node = u[\"node\"] as Input | null | undefined;\n if (node) this.nodeUpdates.push({ rel, from: ownerKey, to, input: node });\n }\n }\n}\n\nfunction edgeProps(\n ctx: CompileContext,\n rel: RelationshipField,\n edge: Input | undefined,\n): Pick<Link, \"props\" | \"defaults\" | \"refused\"> {\n if (!rel.properties) return { props: {}, defaults: {} };\n const props = ctx.model.relationshipProperties.get(rel.properties)!;\n const out: Record<string, unknown> = {};\n const defaults: Record<string, unknown> = {};\n let refused: Link[\"refused\"];\n for (const f of props.fields.values()) {\n const value = edge?.[f.name];\n if (value !== undefined && value !== null && settable(f, \"CREATE\")) {\n // Setting a property on connect creates it on a new relationship\n // and updates it on an existing one: both rules must be known.\n const onCreate = propertyAccess(ctx, f, \"CREATE\");\n const onUpdate = propertyAccess(ctx, f, \"UPDATE\");\n if (onCreate !== \"allowed\" && onUpdate !== \"allowed\") {\n checkPropertyAccess(ctx, props.name, f, \"CREATE\");\n }\n if (onCreate !== \"allowed\") {\n refused = {\n ...refused,\n create: propertyError(props.name, f, \"CREATE\", onCreate),\n };\n }\n if (onUpdate !== \"allowed\") {\n refused = {\n ...refused,\n update: propertyError(props.name, f, \"UPDATE\", onUpdate),\n };\n } else if (!settable(f, \"UPDATE\")) {\n // Re-connecting an existing pair would update the property.\n refused = {\n ...refused,\n update: requestError(\n \"BAD_USER_INPUT\",\n `${props.name}.${f.name} is set when the relationship is created; it cannot change on a re-connect`,\n ),\n };\n }\n out[f.property] = toStored(f, value);\n } else if (f.defaultValue) {\n defaults[f.property] = storedDefault(f);\n }\n }\n return refused ? { props: out, defaults, refused } : { props: out, defaults };\n}\n\nfunction propertyError(\n type: string,\n f: ScalarField,\n op: \"CREATE\" | \"UPDATE\",\n access: \"forbidden\" | \"unauthenticated\" | \"allowed\",\n): Error {\n return access === \"unauthenticated\"\n ? requestError(\n \"UNAUTHENTICATED\",\n `${type}.${f.name} needs an authenticated request`,\n )\n : requestError(\n \"FORBIDDEN\",\n `not allowed to ${op.toLowerCase()} ${type}.${f.name}`,\n );\n}\n\nconst TEMPORAL_KIND: Partial<Record<string, string>> = {\n Date: \"date\",\n Time: \"time\",\n LocalTime: \"localtime\",\n DateTime: \"datetime\",\n LocalDateTime: \"localdatetime\",\n Duration: \"duration\",\n};\n\n/** A @default value as the engine stores it (temporals are tagged). */\nfunction storedDefault(f: ScalarField): unknown {\n const value = f.defaultValue!.value;\n const kind = TEMPORAL_KIND[f.type];\n if (!kind) return value;\n const tag = (x: unknown) => ({ kind, iso: x });\n return Array.isArray(value) ? value.map(tag) : tag(value);\n}\n\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 } from \"../../compile/cypher.js\";\nimport { compileNodeWhere } from \"../../compile/filter.js\";\nimport { compileByKeys, keyOf } from \"../../compile/read/by-keys.js\";\nimport type { DriverTransaction } from \"../../driver.js\";\nimport { requestError } from \"../../errors.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 { checkCardinality, checkRequired } from \"./checks.js\";\nimport { deleteNodes } from \"./delete.js\";\nimport { runStatement, type MutationEnv, type MutationInfo } from \"./env.js\";\nimport { notConnected } from \"./errors.js\";\nimport {\n andText,\n arrow,\n dedupe,\n edgeStamps,\n orFresh,\n relRef,\n seekThenExpand,\n timestamps,\n} from \"./fragments.js\";\nimport {\n assertUniqueKeys,\n WritePlan,\n type CreateRow,\n type Input,\n type Link,\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 /** Nodes updated per type, for AFTER validation. */\n updated = new Map<NodeType, { keys: unknown[]; fields: Set<string> }>();\n /**\n * A type this mutation creates under a key held by a node the caller\n * cannot read; see {@link Runner.moveHiddenKeys}.\n */\n hiddenKey: NodeType | undefined;\n /**\n * A @unique value this mutation creates that another node holds; see\n * {@link Runner.moveTakenUniques}.\n */\n takenUnique: { node: NodeType; field: ScalarField } | undefined;\n\n constructor(\n readonly env: MutationEnv,\n readonly tx: DriverTransaction,\n readonly change: WriteChange,\n ) {}\n\n ctx(): CompileContext {\n return newContext(this.env.selection, this.env.model, {\n jwt: this.env.jwt,\n degrees: this.env.degrees,\n 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 async run(\n text: string,\n ctx: CompileContext,\n ): Promise<Array<Record<string, unknown>>> {\n const statement = { text, params: ctx.params };\n const result = await runStatement(this.env, this.tx, statement);\n return result.rows;\n }\n\n plan(): WritePlan {\n return new WritePlan(this.env, this.ctx());\n }\n\n /** Every planned write, in order, with the checks that follow them. */\n async apply(plan: WritePlan): Promise<void> {\n for (const task of plan.pending) await task();\n this.assertBatch(plan);\n assertUniqueKeys(plan);\n await this.moveHiddenKeys(plan);\n await this.moveTakenUniques(plan);\n await this.applyCreates(plan);\n await this.applyDisconnects(plan);\n await this.applyLinks(plan);\n await this.applyEdgeUpdates(plan);\n await this.applyNodeUpdates(plan);\n await this.applyNestedDeletes(plan);\n await checkCardinality(this, plan);\n await checkRequired(this);\n await this.validateCreated(plan);\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 for (const [node, rows] of plan.creates) {\n const ctx = this.ctx();\n const visible = authFilter(ctx, node, \"n\", \"READ\");\n if (!visible) continue;\n const moves = rows.map((r) => ({ key: r.key, to: placeholderKey(node) }));\n const key = `n.${name(node.key.property)}`;\n const [moved] = await this.run(\n `UNWIND ${printExpr(bind(ctx, moves))} AS m\\n` +\n `MATCH (n:${name(node.labels[0]!)}) WHERE ${key} = m.key` +\n ` AND NOT coalesce(${printExpr(visible)}, false)\\n` +\n `SET ${key} = m.to\\nRETURN count(n) AS moved`,\n ctx,\n );\n if (Number(moved?.[\"moved\"] ?? 0) > 0) this.hiddenKey ??= node;\n }\n }\n\n /**\n * The G-20 treatment for @unique values: a create under rules whose\n * unique value another node holds would fail the constraint before the\n * rules answer, telling a caller who may not create the node that the\n * value is taken. The holder's value moves aside for the transaction,\n * so every error is the one a free value gets; when the mutation would\n * succeed, `executeMutation` fails it with the constraint violation a\n * permitted caller gets. The transaction rolls back either way. Types\n * without CREATE rules skip this: there is nothing to leak.\n */\n async moveTakenUniques(plan: WritePlan): Promise<void> {\n for (const [node, rows] of plan.creates) {\n const ruled = node.authorization?.validate.some((r) =>\n r.operations.has(\"CREATE\"),\n );\n if (!ruled) continue;\n for (const f of node.fields.values()) {\n if (f.kind !== \"scalar\" || !f.unique || f.key) continue;\n const moves = rows\n .map((r) => r.props[f.property])\n .filter((value) => value !== undefined && value !== null)\n .map((value) => ({\n value,\n to: `\\u0000taken:${globalThis.crypto.randomUUID()}`,\n }));\n if (moves.length === 0) continue;\n const ctx = this.ctx();\n const p = `n.${name(f.property)}`;\n const [moved] = await this.run(\n `UNWIND ${printExpr(bind(ctx, moves))} AS m\\n` +\n `MATCH (n:${name(node.labels[0]!)}) WHERE ${p} = m.value\\n` +\n `SET ${p} = m.to\\nRETURN count(n) AS moved`,\n ctx,\n );\n if (Number(moved?.[\"moved\"] ?? 0) > 0) {\n this.takenUnique ??= { node, field: f };\n }\n }\n }\n }\n\n async applyCreates(plan: WritePlan): Promise<void> {\n for (const [node, rows] of plan.creates) {\n // Every property goes into the CREATE itself (timestamps included):\n // existence constraints are checked there, before any SET. Rows are\n // grouped by the properties they set, so absent ones are never\n // written as null.\n const groups = new Map<string, CreateRow[]>();\n for (const row of rows) {\n const shape = Object.keys(row.props).sort().join(\"\\0\");\n const group = groups.get(shape) ?? [];\n group.push(row);\n groups.set(shape, group);\n }\n const labels = node.labels.map(name).join(\":\");\n const stamped = timestamps(node, \"CREATE\");\n for (const [shape, group] of groups) {\n const ctx = this.ctx();\n const p = printExpr(bind(ctx, group));\n const given = shape ? shape.split(\"\\0\") : [];\n const props = [\n `${name(node.key.property)}: row.key`,\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 await this.run(\n `UNWIND ${p} AS row\\nCREATE (n:${labels} { ${props.join(\", \")} })`,\n ctx,\n );\n }\n this.info.nodesCreated += rows.length;\n for (const r of rows) {\n this.change.created.push({ type: node.name, key: r.key });\n }\n }\n }\n\n async applyDisconnects(plan: WritePlan): Promise<void> {\n // One statement per field and shape (listed keys, or a single\n // relationship's current target), however many nodes it covers.\n const groups = new Map<\n string,\n { rel: RelationshipField; list: boolean; rows: typeof plan.disconnects }\n >();\n for (const d of plan.disconnects) {\n const id = `${d.rel.owner}.${d.rel.name}\\0${d.rel.target}\\0${d.to ? \"list\" : \"single\"}`;\n const group = groups.get(id) ?? { rel: d.rel, list: !!d.to, rows: [] };\n group.rows.push(d);\n groups.set(id, group);\n }\n for (const { rel, list, rows: batch } of groups.values()) {\n const owner = this.env.model.nodes.get(rel.owner)!;\n const target = this.env.model.nodes.get(rel.target)!;\n const ctx = this.ctx();\n const input = printExpr(\n bind(\n ctx,\n batch.map((d) => ({\n from: d.from,\n to: d.to ?? null,\n keep: d.keep ?? null,\n })),\n ),\n );\n // Nodes the caller cannot see keep their relationships, and both\n // ends must allow DELETE_RELATIONSHIP when their rules say so.\n const guard =\n andText(authFilter(ctx, target, \"b\", \"READ\")) +\n andText(authFilter(ctx, target, \"b\", \"DELETE_RELATIONSHIP\")) +\n andText(authFilter(ctx, owner, \"a\", \"DELETE_RELATIONSHIP\"));\n const bKey = `b.${name(target.key.property)}`;\n const matchText =\n `UNWIND ${input} AS row\\n` +\n (list ? `UNWIND row.to AS k\\n` : \"\") +\n seekThenExpand(\"a\", owner, \"row.from\", rel, \"r\", \"b\", target) +\n (list\n ? ` AND ${bKey} = k`\n : // Re-connecting the current target keeps its relationship.\n ` AND (row.keep IS NULL OR ${bKey} <> row.keep)`) +\n `${guard}\\n`;\n const returned = `row.from AS from, ${bKey} AS key`;\n const pairs = (rows: Array<Record<string, unknown>>) =>\n rows.map((r) => ({ from: r[\"from\"], to: r[\"key\"] }));\n // Rules on the relationship field, before the relationships go.\n if (\n relationshipRules(this.ctx(), rel, \"DISCONNECT\", {\n owner: \"a\",\n target: \"b\",\n rel: \"r\",\n }) !== undefined\n ) {\n const doomed = await this.run(`${matchText}RETURN ${returned}`, ctx);\n await this.checkRelationshipRules(\"DISCONNECT\", rel, pairs(doomed));\n }\n if (this.endRules(owner, target, \"DELETE_RELATIONSHIP\", \"BEFORE\")) {\n const doomed = await this.run(`${matchText}RETURN ${returned}`, ctx);\n await this.checkEnds(\n \"DELETE_RELATIONSHIP\",\n owner,\n target,\n pairs(doomed),\n \"BEFORE\",\n );\n }\n const rows = await this.run(\n `${matchText}DELETE r RETURN ${returned}`,\n ctx,\n );\n await this.checkEnds(\n \"DELETE_RELATIONSHIP\",\n owner,\n target,\n pairs(rows),\n \"AFTER\",\n );\n this.info.relationshipsDeleted += rows.length;\n for (const row of rows) {\n this.disconnected.push(relRef(rel, row[\"from\"], row[\"key\"]));\n }\n }\n }\n\n async applyLinks(plan: WritePlan): Promise<void> {\n // Connecting a pair twice in one input is one relationship: the\n // last mention's properties win.\n const unique = new Map<string, Link>();\n for (const link of plan.links) {\n unique.set(\n `${link.rel.owner}.${link.rel.name}\\0${keyOf(link.from)}\\0${keyOf(link.to)}`,\n link,\n );\n }\n const groups = new Map<RelationshipField, Link[]>();\n for (const link of unique.values()) {\n const list = groups.get(link.rel) ?? [];\n list.push(link);\n groups.set(link.rel, list);\n }\n for (const [rel, links] of groups) {\n const owner = this.env.model.nodes.get(rel.owner)!;\n const target = this.env.model.nodes.get(rel.target)!;\n const pairs = links.map((l) => ({ from: l.from, to: l.to }));\n await this.checkEnds(\n \"CREATE_RELATIONSHIP\",\n owner,\n target,\n pairs,\n \"BEFORE\",\n );\n // Connecting an already-connected pair keeps one relationship and\n // updates its properties: MERGE on both bound ends (E14 is fixed).\n // `existed` tells a new relationship from an updated one.\n const lctx = this.ctx();\n const rows = printExpr(\n bind(\n lctx,\n links.map((l) => ({\n from: l.from,\n to: l.to,\n props: l.props,\n defaults: l.defaults,\n // Created by this mutation: not a node the caller must be\n // able to see already. Its READ filter may well depend on\n // the relationship this statement creates.\n fresh: plan.isFresh(target.name, l.to),\n })),\n ),\n );\n const props = rel.properties\n ? this.env.model.relationshipProperties.get(rel.properties)\n : undefined;\n const onCreate = [\n \"r += row.defaults\",\n ...(props ? timestamps(props, \"CREATE\") : []).map(\n ([p, now]) => `r.${name(p)} = ${now}`,\n ),\n ];\n // A re-connect that sets properties updates the relationship.\n const onMatch = (props ? timestamps(props, \"UPDATE\") : []).map(\n ([p, now]) =>\n `r.${name(p)} = CASE WHEN size(keys(row.props)) > 0 THEN ${now} ELSE r.${name(p)} END`,\n );\n const text =\n `UNWIND ${rows} AS row\\n` +\n `MATCH (a:${name(owner.labels[0]!)}) WHERE a.${name(owner.key.property)} = row.from` +\n andText(authFilter(lctx, owner, \"a\", \"CREATE_RELATIONSHIP\")) +\n `\\nMATCH (b:${name(target.labels[0]!)}) WHERE b.${name(target.key.property)} = row.to` +\n andText(orFresh(authFilter(lctx, target, \"b\", \"READ\"))) +\n andText(authFilter(lctx, target, \"b\", \"CREATE_RELATIONSHIP\")) +\n `\\nWITH a, b, row, size([(a)${arrow(rel, \"\", \"b\", undefined)} | 1]) > 0 AS existed` +\n `\\nMERGE (a)${arrow(rel, \"r\", \"b\", undefined)}\\n` +\n // Defaults apply when the relationship is created, never to an\n // existing one (a re-connect keeps what it has).\n `ON CREATE SET ${onCreate.join(\", \")}\\n` +\n (onMatch.length > 0 ? `ON MATCH SET ${onMatch.join(\", \")}\\n` : \"\") +\n `SET r += row.props\\nRETURN row.from AS from, row.to AS key, existed`;\n const linked = await this.run(text, lctx);\n // Rules on the properties set, now that new and existing\n // relationships are told apart; a refusal rolls the mutation back.\n const byPair = new Map(\n links.map((l) => [`${keyOf(l.from)}\\0${keyOf(l.to)}`, l]),\n );\n for (const row of linked) {\n const refused = byPair.get(\n `${keyOf(row[\"from\"])}\\0${keyOf(row[\"key\"])}`,\n )?.refused;\n const error =\n row[\"existed\"] === true ? refused?.update : refused?.create;\n if (error) throw error;\n }\n if (linked.length < links.length) {\n const found = new Set(linked.map((r) => keyOf(r[\"key\"])));\n const missing = links\n .map((l) => l.to)\n .filter((k) => !found.has(keyOf(k)));\n throw requestError(\n \"NOT_FOUND\",\n `${owner.name}.${rel.name}: no ${target.name} with ${target.key.name} ${missing\n .map((k) => JSON.stringify(k))\n .join(\", \")}`,\n undefined,\n { type: target.name, keys: missing },\n );\n }\n // Rules on the relationship field: a new relationship is a CONNECT,\n // an existing one given properties an UPDATE_EDGE.\n await this.checkRelationshipRules(\n \"CONNECT\",\n rel,\n linked\n .filter((r) => r[\"existed\"] !== true)\n .map((r) => ({ from: r[\"from\"], to: r[\"key\"] })),\n );\n await this.checkRelationshipRules(\n \"UPDATE_EDGE\",\n rel,\n linked\n .filter(\n (r) =>\n r[\"existed\"] === true &&\n Object.keys(\n byPair.get(`${keyOf(r[\"from\"])}\\0${keyOf(r[\"key\"])}`)?.props ??\n {},\n ).length > 0,\n )\n .map((r) => ({ from: r[\"from\"], to: r[\"key\"] })),\n );\n await this.checkEnds(\n \"CREATE_RELATIONSHIP\",\n owner,\n target,\n pairs,\n \"AFTER\",\n );\n this.info.relationshipsCreated += linked.filter(\n (r) => r[\"existed\"] !== true,\n ).length;\n for (const l of links) this.connected.push(relRef(rel, l.from, l.to));\n }\n }\n\n /**\n * Rules on the relationship field (and on a field declaring the same\n * relationship from the other side) for `op`, on each pair's\n * relationship as it stands: after the write for CONNECT and\n * UPDATE_EDGE, before it for DISCONNECT. FORBIDDEN when any fails; the\n * mutation rolls back.\n */\n async checkRelationshipRules(\n op: \"CONNECT\" | \"DISCONNECT\" | \"UPDATE_EDGE\",\n rel: RelationshipField,\n pairs: Array<{ from: unknown; to: unknown }>,\n ): Promise<void> {\n if (pairs.length === 0) return;\n const ctx = this.ctx();\n const cond = relationshipRules(ctx, rel, op, {\n owner: \"a\",\n target: \"b\",\n rel: \"r\",\n });\n if (cond === undefined) return;\n const owner = this.env.model.nodes.get(rel.owner)!;\n const target = this.env.model.nodes.get(rel.target)!;\n const rows = await this.run(\n `UNWIND ${printExpr(bind(ctx, pairs))} AS row\\n` +\n `MATCH (a:${name(owner.labels[0]!)}) WHERE a.${name(owner.key.property)} = row.from\\n` +\n `MATCH (b:${name(target.labels[0]!)}) WHERE b.${name(target.key.property)} = row.to\\n` +\n `MATCH (a)${arrow(rel, \"r\", \"b\", undefined)}\\n` +\n `RETURN coalesce(${printExpr(cond === false ? lit(false) : cond)}, false) AS ok`,\n ctx,\n );\n if (rows.some((r) => r[\"ok\"] !== true)) {\n throw requestError(\n \"FORBIDDEN\",\n `not allowed to ${op.toLowerCase().replace(\"_\", \" \")} ${owner.name}.${rel.name}`,\n );\n }\n }\n\n /** Whether either end has validate rules for `op` at `when`. */\n endRules(\n owner: NodeType,\n target: NodeType,\n op: \"CREATE_RELATIONSHIP\" | \"DELETE_RELATIONSHIP\",\n when: \"BEFORE\" | \"AFTER\",\n ): boolean {\n return [owner, target].some((n) =>\n n.authorization?.validate.some(\n (r) => r.operations.has(op) && r.when.has(when),\n ),\n );\n }\n\n /**\n * Validate rules for connecting or disconnecting, on both ends of each\n * pair: FORBIDDEN when either end fails them.\n */\n async checkEnds(\n op: \"CREATE_RELATIONSHIP\" | \"DELETE_RELATIONSHIP\",\n owner: NodeType,\n target: NodeType,\n pairs: Array<{ from: unknown; to: unknown }>,\n when: \"BEFORE\" | \"AFTER\",\n ): Promise<void> {\n if (pairs.length === 0) return;\n const ctx = this.ctx();\n const a = authValidate(ctx, owner, \"a\", op, when);\n const b = authValidate(ctx, target, \"b\", op, when);\n if (!a && !b) return;\n const rows = await this.run(\n `UNWIND ${printExpr(bind(ctx, pairs))} AS row\\n` +\n `MATCH (a:${name(owner.labels[0]!)}) WHERE a.${name(owner.key.property)} = row.from\\n` +\n `MATCH (b:${name(target.labels[0]!)}) WHERE b.${name(target.key.property)} = row.to\\n` +\n `RETURN ${a ? printExpr(a) : \"true\"} AS a, ${b ? printExpr(b) : \"true\"} AS b`,\n ctx,\n );\n for (const row of rows) {\n if (row[\"a\"] !== true) throw forbidden(owner, op);\n if (row[\"b\"] !== true) throw forbidden(target, op);\n }\n }\n\n /** `update: [{ key, edge }]`: properties of connected pairs, in place. */\n async applyEdgeUpdates(plan: WritePlan): Promise<void> {\n for (const u of plan.edgeUpdates) {\n const owner = this.env.model.nodes.get(u.rel.owner)!;\n const target = this.env.model.nodes.get(u.rel.target)!;\n const ctx = this.ctx();\n const text =\n seekThenExpand(\n \"a\",\n owner,\n printExpr(bind(ctx, u.from)),\n u.rel,\n \"r\",\n \"b\",\n target,\n ) +\n (u.to !== undefined\n ? ` AND b.${name(target.key.property)} = ${printExpr(bind(ctx, u.to))}`\n : \"\") +\n andText(authFilter(ctx, target, \"b\", \"READ\")) +\n `\\nSET r += ${printExpr(bind(ctx, u.set))}` +\n edgeStamps(this.env.model, u.rel) +\n (u.remove.length > 0\n ? `\\nREMOVE ${u.remove.map((p) => `r.${name(p)}`).join(\", \")}`\n : \"\") +\n `\\nRETURN b.${name(target.key.property)} AS key`;\n const rows = await this.run(text, ctx);\n if (rows.length === 0) throw notConnected(owner, u.rel, target, u.to);\n await this.checkRelationshipRules(\n \"UPDATE_EDGE\",\n u.rel,\n rows.map((r) => ({ from: u.from, to: r[\"key\"] })),\n );\n for (const row of rows) {\n this.connected.push(relRef(u.rel, u.from, row[\"key\"]));\n }\n }\n }\n\n /**\n * `delete: { where, limit }`: the connected nodes `where` matches, under\n * their DELETE rules, deleted like a bulk delete (onDelete followed). More\n * than `limit` (default `maxBatch`) is an error, not a truncation.\n */\n async applyNestedDeletes(plan: WritePlan): Promise<void> {\n for (const d of plan.nestedDeletes) {\n const owner = this.env.model.nodes.get(d.rel.owner)!;\n const target = this.env.model.nodes.get(d.rel.target)!;\n const limit = d.limit ?? this.env.maxBatch;\n if (!Number.isInteger(limit) || limit < 1) {\n throw requestError(\n \"BAD_USER_INPUT\",\n \"`limit` must be a positive integer\",\n );\n }\n const ctx = this.ctx();\n const rows = await this.run(\n seekThenExpand(\n \"a\",\n owner,\n printExpr(bind(ctx, d.from)),\n d.rel,\n \"\",\n \"b\",\n target,\n ) +\n andText(compileNodeWhere(ctx, target, \"b\", d.where)) +\n andText(authFilter(ctx, target, \"b\", \"READ\")) +\n andText(authFilter(ctx, target, \"b\", \"DELETE\")) +\n `\\nRETURN DISTINCT b.${name(target.key.property)} AS key ORDER BY key LIMIT ${printExpr(bind(ctx, limit + 1))}`,\n ctx,\n );\n if (rows.length > limit) {\n throw requestError(\n \"LIMIT_EXCEEDED\",\n `more than ${limit} connected ${target.name} nodes match; narrow \\`where\\` or raise \\`limit\\``,\n );\n }\n if (rows.length > 0) {\n await 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 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 const set: Input = {};\n const remove: string[] = [];\n for (const f of node.fields.values()) {\n if (f.kind === \"relationship\") {\n const value = input[f.name];\n if (value && !settable(f, \"UPDATE\")) {\n throw requestError(\n \"BAD_USER_INPUT\",\n `${node.name}.${f.name} cannot be changed after create`,\n );\n }\n if (value) plan.relate(node, key, f, value as Input, true);\n continue;\n }\n if (f.kind !== \"scalar\" || f.key) continue;\n if (f.name in input) {\n if (!settable(f, \"UPDATE\")) {\n throw requestError(\n \"BAD_USER_INPUT\",\n `${node.name}.${f.name} cannot be changed after create`,\n );\n }\n if (adjust?.[f.name] != null) {\n throw requestError(\n \"BAD_USER_INPUT\",\n `${node.name}.${f.name} is both set and adjusted`,\n );\n }\n const value = input[f.name];\n if (value === null) {\n if (f.required) {\n throw requestError(\n \"BAD_USER_INPUT\",\n `${node.name}.${f.name} is required and cannot be null`,\n );\n }\n remove.push(f.property);\n } else {\n set[f.property] = toStored(f, value);\n }\n } else if (f.populatedBy?.operations.has(\"UPDATE\")) {\n set[f.property] = toStored(\n f,\n await plan.callback(f, \"UPDATE\", node, key, input),\n );\n }\n }\n prepared.push({ key, set, remove });\n }\n\n const actx = this.ctx();\n const adjustments = compileAdjust(actx, node, adjust);\n const stamped = timestamps(node, \"UPDATE\");\n 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 await this.run(\n `UNWIND ${rowsParam} AS row\\n` +\n `MATCH (n:${name(node.labels[0]!)}) WHERE n.${name(node.key.property)} = row.key\\n` +\n `SET ${sets.join(\", \")}` +\n (removes.length > 0\n ? `\\nREMOVE ${removes.map((p) => `n.${name(p)}`).join(\", \")}`\n : \"\"),\n sctx,\n );\n }\n const keys = todo.map((r) => r.key);\n this.info.nodesUpdated += keys.length;\n for (const key of keys) this.change.updated.push({ type: node.name, key });\n const entry = this.updated.get(node) ?? { keys: [], fields: new Set() };\n entry.keys.push(...keys);\n for (const f of written) entry.fields.add(f.name);\n this.updated.set(node, entry);\n return keys;\n }\n\n /**\n * AFTER rules on created nodes: the type's rules on every row, a field's\n * rules on the rows whose input sets the field. Rows are checked in\n * groups that set the same guarded fields.\n */\n async validateCreated(plan: WritePlan): Promise<void> {\n for (const [node, rows] of plan.creates) {\n const guarded = [...node.fields.values()]\n .filter((f) => f.kind === \"scalar\" && f.authorization)\n .map((f) => f.name);\n const groups = new Map<string, { fields: string[]; keys: unknown[] }>();\n for (const r of rows) {\n const fields = guarded.filter((f) => r.written.has(f));\n const id = fields.join(\"\\0\");\n const group = groups.get(id) ?? { fields, keys: [] };\n group.keys.push(r.key);\n groups.set(id, group);\n }\n for (const { fields, keys } of groups.values()) {\n await this.validateAfter(node, keys, \"CREATE\", new Set(fields));\n }\n }\n }\n\n async validateUpdated(): Promise<void> {\n for (const [node, { keys, fields }] of this.updated) {\n await this.validateAfter(node, keys, \"UPDATE\", fields);\n }\n }\n\n /** AFTER rules for `op` on the nodes with `keys` (and written fields). */\n async validateAfter(\n node: NodeType,\n keys: unknown[],\n op: \"CREATE\" | \"UPDATE\",\n fields: Set<string>,\n ): Promise<void> {\n if (keys.length === 0) return;\n const ctx = this.ctx();\n const rule = and(\n authValidate(ctx, node, \"n\", op, \"AFTER\"),\n ...[...fields].map((f) => {\n const field = node.fields.get(f);\n return field\n ? fieldValidate(ctx, node, field, \"n\", op, \"AFTER\")\n : undefined;\n }),\n );\n if (!rule) return;\n const text =\n `UNWIND ${printExpr(bind(ctx, dedupe(keys)))} AS k\\n` +\n `MATCH (n:${name(node.labels[0]!)}) WHERE n.${name(node.key.property)} = k\\n` +\n `RETURN n.${name(node.key.property)} AS key, ${printExpr(rule)} AS ok`;\n const rows = await this.run(text, ctx);\n if (rows.some((r) => r[\"ok\"] !== true)) throw forbidden(node, op);\n }\n\n /** Nodes by key, projected for the payload, inside the transaction. */\n async payload(\n node: NodeType,\n keys: unknown[],\n sets: SelectionSetNode[],\n ): Promise<unknown[]> {\n if (sets.length === 0) return keys.map(() => ({}));\n const ctx = this.ctx();\n const compiled = compileByKeys(ctx, node, keys, sets);\n const statement = compiled.statements[0]!;\n const result = await runStatement(this.env, this.tx, statement);\n return assertReadable(compiled.shape([result]) as unknown[]);\n }\n\n /**\n * Keys of the nodes `where` matches, under the filter rules for `op`.\n * More than `limit` is an error: bulk writes are bounded, not truncated.\n */\n async resolveKeys(\n node: NodeType,\n where: Input,\n op: \"UPDATE\" | \"DELETE\",\n limit: number,\n ): Promise<unknown[]> {\n const ctx = this.ctx();\n const pred = compileNodeWhere(ctx, node, \"this\", where);\n if (!pred) {\n throw requestError(\n \"BAD_USER_INPUT\",\n `\\`where\\` must filter something: bulk ${op.toLowerCase()}s never apply to every ${node.name} by accident`,\n );\n }\n const rows = await this.run(\n `MATCH (this:${name(node.labels[0]!)}) WHERE ${printExpr(pred)}` +\n andText(authFilter(ctx, node, \"this\", \"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","// 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 } from \"../driver.js\";\nimport { requestError } from \"../errors.js\";\nimport type { NodeType } from \"../model/types.js\";\nimport {\n mutationNames,\n settable,\n type MutationKind,\n} from \"../schema/mutations.js\";\nimport type { EntityRef, WriteChange } from \"./changes.js\";\nimport { 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 { Runner } from \"./mutate/runner.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\nasync function lookupViewerKey(\n env: MutationEnv,\n tx: DriverTransaction,\n ctx: CompileContext,\n): Promise<unknown> {\n const mapping = env.model.viewer;\n const viewerNode = mapping && env.model.nodes.get(mapping.type);\n if (\n !mapping ||\n !viewerNode ||\n mapping.field === viewerNode.key.name ||\n !env.jwt ||\n ![...env.model.nodes.values()].some((n) => n.key.keyScope)\n ) {\n return undefined;\n }\n const value = claim(ctx, mapping.claim);\n if (typeof value !== \"string\" && typeof value !== \"number\") return null;\n const field = viewerNode.fields.get(mapping.field);\n const property = field?.kind === \"scalar\" ? field.property : mapping.field;\n const rows = (\n await runStatement(env, tx, {\n text:\n `MATCH (v:${name(viewerNode.labels[0]!)}) WHERE v.${name(property)} = $claim\\n` +\n `RETURN v.${name(viewerNode.key.property)} AS key LIMIT 1`,\n params: { claim: value },\n })\n ).rows;\n return rows[0]?.[\"key\"] ?? null;\n}\n\nexport async function executeMutation(\n env: MutationEnv,\n op: MutationKind,\n node: NodeType,\n args: Record<string, unknown>,\n fieldNodes: readonly FieldNode[],\n fieldName: string,\n): Promise<MutationResult> {\n const owned = env.transaction;\n if (!owned && !env.driver.begin) {\n throw requestError(\n \"DATABASE_ERROR\",\n \"mutations need a driver with interactive transactions (@loradb/lora-node)\",\n );\n }\n const planCtx = newContext(env.selection, env.model, {\n jwt: env.jwt,\n degrees: env.degrees,\n 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\n const tx =\n owned ??\n (await env.driver.begin!({\n mode: \"write\",\n timeoutMs: env.timeoutMs,\n signal: env.signal,\n }));\n const change = emptyChange(op, fieldName);\n // @key(scope: VIEWER) under a @viewer that maps to a non-key field (an\n // opaque subject): the key space is the caller's node's key, looked up\n // once by the claim before anything is written.\n const viewerKey = await lookupViewerKey(env, tx, planCtx);\n if (viewerKey !== undefined) env = { ...env, viewerKey };\n const runner = new Runner(env, tx, change);\n const schema = env.selection.schema;\n const payloadFor = async (\n payloadTypeName: string,\n field: string,\n keys: unknown[],\n ) => {\n const payloadType = schema.getType(payloadTypeName) as GraphQLObjectType;\n return runner.payload(\n node,\n keys,\n payloadSelections(env, payloadType, fieldNodes, field),\n );\n };\n try {\n let payload: unknown;\n const plan = runner.plan();\n switch (op) {\n case \"CREATE\": {\n const keys = (args[\"input\"] as Input[]).map((input) =>\n plan.create(node, input),\n );\n await runner.apply(plan);\n payload = {\n [mutationNames.createdField(node)]: await payloadFor(\n mutationNames.createPayload(node),\n mutationNames.createdField(node),\n keys,\n ),\n info: runner.info,\n };\n break;\n }\n case \"UPDATE\": {\n const key = args[node.key.name];\n const field = mutationNames.updatedField(node);\n const done = await runner.update(\n plan,\n node,\n [{ key, input: (args[\"update\"] as Input | undefined) ?? {} }],\n args[\"adjust\"] as Input | undefined,\n );\n await runner.apply(plan);\n await runner.validateUpdated();\n const [value] =\n done.length > 0\n ? await payloadFor(mutationNames.updatePayload(node), field, [key])\n : [null];\n payload = { [field]: value ?? null, info: runner.info };\n break;\n }\n case \"UPDATE_MANY\": {\n const input = (args[\"update\"] as Input | undefined) ?? {};\n if (\n [...node.fields.values()].some(\n (f) => f.kind === \"relationship\" && input[f.name] != null,\n )\n ) {\n throw requestError(\n \"BAD_USER_INPUT\",\n `update${node.name} changes relationships; ${mutationNames.updateMany(node)} changes properties`,\n );\n }\n const keys = await runner.resolveKeys(\n node,\n args[\"where\"] as Input,\n \"UPDATE\",\n bulkLimit(args[\"limit\"], env.maxBatch),\n );\n const done = await runner.update(\n plan,\n node,\n keys.map((key) => ({ key, input })),\n args[\"adjust\"] as Input | undefined,\n );\n await runner.apply(plan);\n await runner.validateUpdated();\n payload = {\n [mutationNames.createdField(node)]: await payloadFor(\n mutationNames.updateManyPayload(node),\n mutationNames.createdField(node),\n done,\n ),\n info: runner.info,\n };\n break;\n }\n case \"UPSERT\":\n payload = await upsert(runner, plan, node, args, payloadFor);\n break;\n case \"DELETE\": {\n // A node the caller cannot see is not there: nothing to delete.\n const ctx = runner.ctx();\n const visible = await runner.run(\n `MATCH (n:${name(node.labels[0]!)}) WHERE n.${name(node.key.property)} = ${printExpr(bind(ctx, args[node.key.name]))}` +\n andText(authFilter(ctx, node, \"n\", \"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 checkUniqueTogether(runner);\n // Only now, so that any other error is the one a free key gets.\n if (runner.hiddenKey) throw forbidden(runner.hiddenKey, \"CREATE\");\n if (runner.takenUnique) {\n const { node: taken, field } = runner.takenUnique;\n throw requestError(\n \"CONSTRAINT_VIOLATION\",\n `${taken.name}.${field.name} must be unique; the value is taken`,\n undefined,\n { type: taken.name, field: field.name },\n );\n }\n if (!owned) await tx.commit();\n fillChange(change, runner);\n return { payload, change };\n } catch (err) {\n if (tx.isOpen) await tx.rollback();\n throw err;\n }\n}\n\n/** Create the inputs whose key is new, update the others. */\nasync function upsert(\n runner: Runner,\n plan: WritePlan,\n node: NodeType,\n args: Record<string, unknown>,\n payloadFor: (\n type: string,\n field: string,\n keys: unknown[],\n ) => Promise<unknown[]>,\n): Promise<unknown> {\n const inputs = args[\"input\"] as Input[];\n // 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 const ctx = runner.ctx();\n const existing = new Set(\n (\n await runner.run(\n `UNWIND ${printExpr(bind(ctx, keys))} AS k\\n` +\n `MATCH (n:${name(node.labels[0]!)}) WHERE n.${name(node.key.property)} = k` +\n andText(authFilter(ctx, node, \"n\", \"READ\")) +\n andText(authFilter(ctx, node, \"n\", \"UPDATE\")) +\n `\\nRETURN n.${name(node.key.property)} AS key`,\n ctx,\n )\n ).map((r) => keyOf(r[\"key\"])),\n );\n const updates: Array<{ key: unknown; input: Input }> = [];\n for (const [i, input] of inputs.entries()) {\n if (existing.has(keyOf(keys[i]))) {\n // Fields and relationships set only on create keep the value they\n // were created with.\n const kept = Object.fromEntries(\n Object.entries(input).filter(([k]) => {\n const f = node.fields.get(k);\n return (\n (f?.kind !== \"scalar\" && f?.kind !== \"relationship\") ||\n settable(f, \"UPDATE\")\n );\n }),\n );\n updates.push({ key: keys[i], input: kept });\n } else plan.create(node, input);\n }\n await runner.update(plan, node, updates);\n await runner.apply(plan);\n await runner.validateUpdated();\n const field = mutationNames.createdField(node);\n return {\n [field]: await payloadFor(mutationNames.upsertPayload(node), field, keys),\n info: runner.info,\n };\n}\n\n/** A bulk mutation's `limit`: at most `maxBatch`, which is the default. */\nfunction bulkLimit(value: unknown, max: number): number {\n if (value === null || value === undefined) return max;\n if (!Number.isInteger(value) || (value as number) < 0) {\n throw requestError(\n \"BAD_USER_INPUT\",\n \"`limit` must be a non-negative integer\",\n );\n }\n if ((value as number) > max) {\n throw requestError(\n \"LIMIT_EXCEEDED\",\n `\\`limit\\` is ${value as number}; a bulk mutation reaches at most ${max} nodes`,\n );\n }\n return value as number;\n}\n\nfunction emptyChange(op: MutationKind, field: string): WriteChange {\n const operation =\n op === \"UPDATE_MANY\" ? \"UPDATE\" : op === \"DELETE_MANY\" ? \"DELETE\" : op;\n return {\n operation,\n field,\n created: [],\n updated: [],\n deleted: [],\n connected: [],\n disconnected: [],\n entities: [],\n types: [],\n relationshipTypes: [],\n broad: false,\n };\n}\n\nfunction fillChange(change: WriteChange, runner: Runner): void {\n change.connected.push(...runner.connected);\n change.disconnected.push(...runner.disconnected);\n const entities = new Map<string, EntityRef>();\n const addEntity = (e: EntityRef) =>\n entities.set(`${e.type}\\0${keyOf(e.key)}`, e);\n for (const e of [...change.created, ...change.updated, ...change.deleted])\n addEntity(e);\n for (const r of [...change.connected, ...change.disconnected]) {\n addEntity(r.from);\n addEntity(r.to);\n }\n change.entities = [...entities.values()];\n change.types = [...new Set(change.entities.map((e) => e.type))].sort();\n change.relationshipTypes = [\n ...new Set(\n [...change.connected, ...change.disconnected].map((r) => r.type),\n ),\n ].sort();\n}\n","// 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 \"The most items a list argument of a @cypher field takes; more is BAD_USER_INPUT before the statement runs. Without it, maxListArgument applies.\"\n directive @size(max: Int!) on ARGUMENT_DEFINITION\n\n \"Bounds of an Int or Float argument of a @cypher field (each item, for a list); a value outside them is BAD_USER_INPUT before the statement runs.\"\n directive @range(min: Float, max: Float) on 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 \"Full-text search over String fields: a FULLTEXT index and a search root field per entry.\"\n directive @fulltext(indexes: [FulltextIndex!]!) on OBJECT\n\n \"A vector embedding ([Float!]): a VECTOR index and a similarity root field.\"\n directive @vector(\n dimensions: Int!\n similarity: VectorSimilarity = COSINE\n queryName: String\n ) on FIELD_DEFINITION\n\n input FulltextIndex {\n \"Index name. Default: <label>_search for the first, required after.\"\n name: String\n fields: [String!]!\n analyzer: FulltextAnalyzer = STANDARD\n \"Root field name. Default: search<Plural>, or search<Plural>By<Name>.\"\n queryName: String\n }\n\n enum FulltextAnalyzer {\n STANDARD\n SIMPLE\n }\n\n enum VectorSimilarity {\n COSINE\n EUCLIDEAN\n }\n\n \"Generated subscriptions to changes made through the library. None without this directive.\"\n directive @subscription(\n operations: [MutationOperation!]! = [CREATE, UPDATE, DELETE]\n \"Also send CONNECT and DISCONNECT events for the type's relationships.\"\n relationships: Boolean = false\n \"Send the stored values before an update or delete (one extra read per write).\"\n previousState: Boolean = false\n ) on OBJECT\n\n \"Generated mutations for a node type. None without this directive.\"\n directive @mutation(\n operations: [MutationOperation!]! = [CREATE, UPDATE, DELETE]\n ) on OBJECT\n\n \"Value stored on create when the input leaves the field out.\"\n directive @default(value: DefaultValue!) on FIELD_DEFINITION\n\n \"Set to the current time by the listed operations. 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(statement: String!, columnName: String) on FIELD_DEFINITION\n\n \"Require an authenticated request (a jwt in the context) for these operations.\"\n directive @authentication(\n operations: [AuthOperation!]! = [\n READ\n CREATE\n UPDATE\n DELETE\n CREATE_RELATIONSHIP\n DELETE_RELATIONSHIP\n SUBSCRIBE\n ]\n \"Claims the request must also satisfy, such as a role in roles.\"\n jwt: AuthorizationWhere\n ) on OBJECT | FIELD_DEFINITION\n\n \"Row-level rules over the node and the request's claims, compiled into the statements.\"\n directive @authorization(\n filter: [AuthorizationFilterRule!]\n validate: [AuthorizationValidateRule!]\n \"On a type: false keeps the schema's bypass (see @authorizationDefaults) from skipping this type's rules; 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 \"AuthorizationMask\",\n \"AuthorizationRuleDefinition\",\n \"QueryDirection\",\n \"OnDelete\",\n \"FulltextIndex\",\n \"FulltextAnalyzer\",\n \"VectorSimilarity\",\n \"MutationOperation\",\n \"TimestampOperation\",\n \"AuthOperation\",\n \"AuthorizationWhen\",\n \"AuthorizationFilterRule\",\n \"AuthorizationValidateRule\",\n \"DefaultValue\",\n \"AuthorizationWhere\",\n \"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([\"size\", \"range\"]);\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 ],\n \"relationship properties type\": [\"relationshipProperties\"],\n \"@jwt type\": [\"jwt\"],\n \"object type without @node\": [],\n \"Query or Mutation type\": [],\n interface: [\"query\", \"plural\", \"limit\"],\n union: [\"query\", \"plural\", \"limit\"],\n \"node field\": [\n \"key\",\n \"unique\",\n \"private\",\n \"relayId\",\n \"sortable\",\n \"groupBy\",\n \"filterable\",\n \"alias\",\n \"index\",\n \"default\",\n \"timestamp\",\n \"readonly\",\n \"authentication\",\n \"settable\",\n \"selectable\",\n \"populatedBy\",\n \"authorization\",\n \"vector\",\n // Refused with \"@relationship target must be a @node type\".\n \"relationship\",\n ],\n \"relationship field\": [\n \"relationship\",\n \"authorization\",\n \"authentication\",\n \"settable\",\n \"readonly\",\n \"filterable\",\n \"cardinality\",\n \"limit\",\n // Refused with \"@x is not allowed on a relationship field\".\n \"key\",\n \"unique\",\n \"sortable\",\n \"alias\",\n \"index\",\n \"default\",\n \"timestamp\",\n \"populatedBy\",\n \"selectable\",\n \"private\",\n \"groupBy\",\n \"vector\",\n \"relayId\",\n ],\n \"@cypher field\": [\n \"cypher\",\n \"authorization\",\n \"authentication\",\n \"filterable\",\n \"sortable\",\n // Refused with \"@x cannot be combined with @cypher\".\n \"relationship\",\n \"key\",\n \"unique\",\n \"alias\",\n \"index\",\n \"default\",\n \"timestamp\",\n \"groupBy\",\n ],\n \"Query or Mutation field\": [\n \"cypher\",\n \"authorization\",\n \"authentication\",\n // Refused with a specific message.\n \"filterable\",\n \"sortable\",\n \"relationship\",\n \"key\",\n \"unique\",\n \"alias\",\n \"index\",\n \"default\",\n \"timestamp\",\n \"groupBy\",\n ],\n \"@customResolver field\": [\n \"customResolver\",\n \"authentication\",\n // Refused with \"@x cannot be combined with @customResolver\".\n \"cypher\",\n \"relationship\",\n \"key\",\n \"filterable\",\n \"sortable\",\n \"groupBy\",\n ],\n \"relationship property\": [\n \"private\",\n \"sortable\",\n \"filterable\",\n \"alias\",\n \"default\",\n \"timestamp\",\n \"readonly\",\n \"authentication\",\n \"settable\",\n \"selectable\",\n \"authorization\",\n // Refused with a specific message.\n \"key\",\n \"unique\",\n \"relayId\",\n \"index\",\n \"vector\",\n \"groupBy\",\n ],\n \"interface field\": [\n \"filterable\",\n \"sortable\",\n // Refused with a specific message.\n \"key\",\n \"unique\",\n \"relayId\",\n \"index\",\n \"vector\",\n \"groupBy\",\n ],\n \"interface relationship field\": [\"declareRelationship\"],\n \"field of an object type without @node\": [],\n \"@jwt claim\": [\"jwtClaim\", \"viewer\"],\n};\n\nconst HINTS: Partial<Record<Position, string>> = {\n \"interface field\": \"; put it on the field of each implementation\",\n \"@customResolver field\": \"; the resolver decides what it returns\",\n \"field of an object type without @node\":\n \"; this type only shapes @cypher results\",\n \"object type without @node\": \"; this type only shapes @cypher results\",\n};\n\nlet known: ReadonlySet<string> | undefined;\n\n/** The directives this library defines (not graphql's built-ins). */\nexport function libraryDirectives(): ReadonlySet<string> {\n known ??= new Set(\n parse(directiveTypeDefs).definitions.flatMap((d) =>\n d.kind === \"DirectiveDefinition\" ? [d.name.value] : [],\n ),\n );\n return known;\n}\n\nexport interface PositionContext {\n schema: GraphQLSchema;\n nodeNames: ReadonlySet<string>;\n propsNames: ReadonlySet<string>;\n jwtType: string | undefined;\n /** @node types, interfaces and unions: what a relationship may target. */\n targetNames: ReadonlySet<string>;\n userTypes: readonly GraphQLNamedType[];\n}\n\n/** Report every library directive used where the model would ignore it. */\nexport function checkDirectivePositions(\n ctx: PositionContext,\n problems: ModelProblem[],\n): void {\n const ours = libraryDirectives();\n const check = (\n directives: readonly ConstDirectiveNode[],\n position: Position,\n type: string,\n field?: string,\n ) => {\n const allowed = DIRECTIVE_POSITIONS[position];\n for (const dir of directives) {\n const name = dir.name.value;\n if (!ours.has(name) || allowed.includes(name)) continue;\n problems.push({\n type,\n ...(field ? { field } : {}),\n message: `@${name} is not supported on ${/^[aeiou]/.test(position) ? \"an\" : \"a\"} ${position}${HINTS[position] ?? \"\"}`,\n });\n }\n };\n const typeDirectives = (t: GraphQLNamedType) => [\n ...(t.astNode?.directives ?? []),\n ...t.extensionASTNodes.flatMap((n) => n.directives ?? []),\n ];\n const has = (f: GraphQLField<unknown, unknown>, name: string) =>\n f.astNode?.directives?.some((x) => x.name.value === name) ?? false;\n\n for (const t of ctx.userTypes) {\n if (isUnionType(t)) {\n check(typeDirectives(t), \"union\", t.name);\n continue;\n }\n if (isInterfaceType(t)) {\n check(typeDirectives(t), \"interface\", t.name);\n for (const f of Object.values(t.getFields())) {\n check(\n f.astNode?.directives ?? [],\n has(f as GraphQLField<unknown, unknown>, \"declareRelationship\")\n ? \"interface relationship field\"\n : \"interface field\",\n t.name,\n f.name,\n );\n }\n continue;\n }\n if (!isObjectType(t)) continue;\n let typePosition: Position;\n let fieldPosition: (f: GraphQLField<unknown, unknown>) => Position;\n if (t.name === \"Query\" || t.name === \"Mutation\") {\n typePosition = \"Query or Mutation type\";\n fieldPosition = () => \"Query or Mutation field\";\n } else if (t.name === ctx.jwtType) {\n typePosition = \"@jwt type\";\n fieldPosition = () => \"@jwt claim\";\n } else if (ctx.nodeNames.has(t.name)) {\n typePosition = \"node type\";\n fieldPosition = (f) =>\n has(f, \"customResolver\")\n ? \"@customResolver field\"\n : has(f, \"cypher\")\n ? \"@cypher field\"\n : ctx.targetNames.has(getNamedType(f.type).name)\n ? \"relationship field\"\n : \"node field\";\n } else if (ctx.propsNames.has(t.name)) {\n typePosition = \"relationship properties type\";\n fieldPosition = () => \"relationship property\";\n } else if (t.name === \"Subscription\") {\n continue;\n } else {\n typePosition = \"object type without @node\";\n fieldPosition = () => \"field of an object type without @node\";\n }\n check(typeDirectives(t), typePosition, t.name);\n for (const f of Object.values(t.getFields())) {\n check(f.astNode?.directives ?? [], fieldPosition(f), t.name, f.name);\n }\n }\n // 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","// `@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 };\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 out.push({\n kind: \"fulltext\",\n name,\n fields,\n analyzer: raw.analyzer,\n queryName:\n raw.queryName ??\n (i === 0 ? `search${Plural}` : `search${Plural}By${upperFirst(name)}`),\n });\n });\n const vectors = scalars.filter((f) => f.vector);\n for (const f of vectors) {\n out.push({\n kind: \"vector\",\n name: `${snakeCase(label)}_${snakeCase(f.property)}_vector`,\n field: f,\n dimensions: f.vector!.dimensions,\n similarity: f.vector!.similarity,\n queryName:\n vectorQueryNames.get(f) ??\n (vectors.length === 1\n ? `similar${Plural}`\n : `similar${Plural}By${upperFirst(f.name)}`),\n });\n }\n const names = new Set<string>();\n for (const x of out) {\n if (names.has(x.name)) at(`search index name ${x.name} is used twice`);\n names.add(x.name);\n }\n return out;\n}\n\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 { 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 field: ScalarField = {\n kind: \"scalar\",\n name: f.name,\n property,\n type,\n enumName,\n customScalar,\n list: shape.list,\n required: shape.required,\n key,\n unique,\n private: isPrivate,\n relayId,\n filters,\n sortable: sortable && !isPrivate,\n groupBy,\n indexes,\n generate,\n ...(keyScope ? { keyScope } : {}),\n defaultValue,\n timestamp,\n readonly:\n readonlyFlag ||\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\n return {\n kind: \"relationship\",\n authorization,\n name: f.name,\n owner: t.name,\n type,\n direction: rel[\"direction\"] as \"IN\" | \"OUT\",\n target: getNamedType(f.type).name,\n list: shape.list,\n required: shape.required,\n properties,\n // Filled in once interfaces and unions are known.\n members: [],\n filterable: filterable !== undefined,\n queryDirection: rel[\"queryDirection\"] as \"DIRECTED\" | \"UNDIRECTED\",\n onDelete: rel[\"onDelete\"] as \"DETACH\" | \"CASCADE\" | \"RESTRICT\",\n nestedOperations: new Set(rel[\"nestedOperations\"] as NestedOperation[]),\n settableOn: {\n create:\n !readonlyFlag &&\n ((settableArgs?.[\"onCreate\"] as boolean | undefined) ?? true),\n update:\n !readonlyFlag &&\n ((settableArgs?.[\"onUpdate\"] as boolean | undefined) ?? true),\n },\n aggregate: rel[\"aggregate\"] as boolean,\n cardinality,\n limit: limitArgs\n ? resolveLimit(limitArgs, globalLimit, t.name, f.name, problems)\n : undefined,\n authentication: authOps(directive(d(\"authentication\"), f, at)),\n authenticationJwt: directive(d(\"authentication\"), f, at)?.[\"jwt\"] as\n | AuthorizationWhere\n | undefined,\n description: f.description ?? undefined,\n };\n}\n","// 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} 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 { unwrap, isScalarLike, shapeOf, unwrapInput } from \"./shapes.js\";\nimport { directive } from \"./directive-args.js\";\nimport { buildScalarField } from \"./scalar-field.js\";\nimport { authOps, readOnlyRules, rootFieldRules } from \"./authorization.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 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 const size = directive(d(\"size\"), a, at)?.[\"max\"] as number | undefined;\n if (size !== undefined && !argShape.list) {\n at(`argument ${a.name}: @size applies to list arguments`);\n } else if (size !== undefined && size < 1) {\n at(`argument ${a.name}: @size(max:) must be at least 1`);\n }\n const range = cypherArgumentRange(a, argNamed, d(\"range\"), at);\n const defaultValue = argumentDefault(a);\n if (range && outOfRange(defaultValue, range) !== undefined) {\n at(`argument ${a.name}: its default is outside @range`);\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 });\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 type: { named, ...shapeOf(shape) },\n node,\n abstract,\n object,\n args: cypherArgs,\n params,\n computed,\n authentication: authOps(directive(d(\"authentication\"), f, at)),\n authenticationJwt: directive(d(\"authentication\"), f, at)?.[\"jwt\"] as\n | AuthorizationWhere\n | undefined,\n description: f.description ?? undefined,\n };\n if (computed) computed.computedBy = field;\n return field;\n}\n\n/** The column of a statement ending in `RETURN x` or `RETURN … AS x`. */\n/**\n * The column a statement returns, when it returns exactly one: the alias\n * of the single item of its last top-level RETURN (or the item, when it\n * is a bare variable). Brackets, strings and comments are respected, so\n * `RETURN coalesce(a, b) AS n` and a RETURN inside `CALL { }` do not\n * confuse it.\n */\n/**\n * An SDL argument's default, as a value. graphql 16 keeps it on\n * `defaultValue`; graphql 17 builds `default: { literal }` from SDL and\n * leaves `defaultValue` undefined, so reading only `defaultValue` drops\n * `peers(limit: Int = 2)` to `peers(limit: Int)` there.\n */\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 } 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]);\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\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 }\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 }\n }\n }\n}\n\n/** A rule's `<field>Connection` test: quantifiers over { node, edge }. */\nfunction checkConnectionWhere(\n nodes: ReadonlyMap<string, NodeType>,\n props: ReadonlyMap<string, RelationshipPropertiesType>,\n rel: RelationshipField,\n value: unknown,\n path: string,\n at: (message: string) => void,\n) {\n if (!isRecord(value) || Object.keys(value).length === 0) {\n return at(`${path} must be a non-empty object`);\n }\n const target = nodes.get(rel.target);\n const edgeType = props.get(rel.properties!);\n for (const [q, inner] of Object.entries(value)) {\n const here = `${path}.${q}`;\n if (![\"some\", \"all\", \"none\", \"single\"].includes(q)) {\n at(`${path}: expected some, all, none or single`);\n continue;\n }\n if (!isRecord(inner) || Object.keys(inner).length === 0) {\n at(`${here} is empty: a rule must test something`);\n continue;\n }\n for (const [side, test] of Object.entries(inner)) {\n if (side === \"node\") {\n if (target)\n checkNodeWhere(nodes, props, target, test, `${here}.node`, at);\n } else if (side === \"edge\") {\n if (edgeType) checkEdgeWhere(edgeType, test, `${here}.edge`, at);\n } else {\n at(`${here}: expected node or edge`);\n }\n }\n }\n}\n\nfunction checkEdgeWhere(\n edgeType: RelationshipPropertiesType,\n where: unknown,\n path: string,\n at: (message: string) => void,\n) {\n if (!isRecord(where) || Object.keys(where).length === 0) {\n return at(`${path} is empty: a rule must test something`);\n }\n for (const [k, value] of Object.entries(where)) {\n const here = `${path}.${k}`;\n if (value === null) {\n at(`${here} is null: a rule must test something`);\n } else if (k === \"AND\" || k === \"OR\") {\n if (!Array.isArray(value)) at(`${here} must be a list`);\n else\n value.forEach((x, i) =>\n checkEdgeWhere(edgeType, x, `${here}[${i}]`, at),\n );\n } else if (k === \"NOT\") {\n checkEdgeWhere(edgeType, value, here, at);\n } else if (!edgeType.fields.has(k)) {\n at(`${here}: ${edgeType.name} has no field ${k}`);\n } else if (!isRecord(value) || Object.keys(value).length === 0) {\n at(`${here} must be a non-empty operator object`);\n } else {\n for (const [op, operand] of Object.entries(value)) {\n if (!SCALAR_WHERE_OPS.has(op)) at(`${here}: unknown operator ${op}`);\n else if (operand === null) at(`${here}.${op} is null`);\n }\n }\n }\n}\n","// 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 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} from \"./build/authorization.js\";\nimport {\n checkAuthorizationWhere,\n checkRuleWhere,\n abstractsOf,\n type RuleEnds,\n} from \"./build/rule-checks.js\";\nimport { readSearch } from \"./build/search.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 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 }\n const ruleEnds = (f: RelationshipField): RuleEnds | undefined => {\n const source = nodes.get(f.owner);\n const target = nodes.get(f.target);\n if (!source || !target) return undefined;\n return {\n source,\n target,\n edge: f.properties ? relationshipProperties.get(f.properties) : undefined,\n };\n };\n // Rule sugar (isViewer, viewer) expands into the plain rule AST before\n // the rules are checked, so the checks and the compiler see one form.\n if (viewer && jwtType) checkViewer(viewer, nodes, jwtType, problems);\n for (const node of nodes.values()) {\n if (node.key.keyScope && !viewer) {\n problems.push({\n type: node.name,\n field: node.key.name,\n message:\n \"@key(scope: VIEWER) needs a @viewer claim on the @jwt type: it names whose key space a create writes in\",\n });\n }\n }\n const viewerNode = viewer ? nodes.get(viewer.type) : undefined;\n const desugar = (\n owner: NodeType | undefined,\n type: string,\n field: string | undefined,\n rules: ReadonlyArray<{ where: AuthorizationWhere }>,\n ends?: { source: NodeType; target: NodeType },\n ) => {\n const ctx: DesugarContext = {\n nodes,\n props: relationshipProperties,\n viewer,\n abstracts,\n rules: namedRules,\n at: (message) =>\n problems.push({\n type,\n ...(field ? { field } : {}),\n message: `@authorization: ${message}`,\n }),\n };\n for (const rule of rules) {\n (rule as { where: AuthorizationWhere }).where = desugarRule(\n ctx,\n owner,\n rule.where,\n ends,\n );\n 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 }\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 } else if (f.kind === \"relationship\") {\n problems.push({\n type: node.name,\n field: f.name,\n message:\n \"@authorization: relationship rules need a @node target, not an interface or union\",\n });\n }\n continue;\n }\n checkRuleWhere(\n nodes,\n relationshipProperties,\n undefined,\n node.name,\n f.name,\n rule.where,\n problems,\n jwtShape,\n viewerNode,\n ends,\n );\n }\n }\n for (const rule of rules) {\n checkAuthorizationWhere(\n nodes,\n relationshipProperties,\n node,\n rule.where,\n problems,\n jwtShape,\n viewerNode,\n );\n }\n for (const where of [\n node.authenticationJwt,\n ...[...node.fields.values()].map((f) => f.authenticationJwt),\n ]) {\n if (where) {\n checkAuthorizationWhere(\n nodes,\n relationshipProperties,\n node,\n { jwt: where },\n problems,\n jwtShape,\n );\n }\n }\n }\n\n // 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 for (const g of nodes.get(f.target)?.fields.values() ?? []) {\n if (\n g.kind !== \"relationship\" ||\n g === f ||\n g.type !== f.type ||\n g.target !== 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 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 };\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 (span) => {\n span.setAttribute(\"graphql.field.name\", meta.field);\n if (meta.operationName) {\n span.setAttribute(\"graphql.operation.name\", meta.operationName);\n }\n try {\n return await fn();\n } catch (err) {\n fail(span, err);\n throw err;\n } finally {\n span.end();\n }\n });\n }\n\n /** Run statements, timing them and reporting the outcome. */\n statements<T extends QueryResult | QueryResult[]>(\n meta: StatementMeta,\n statements: Statement[],\n run: () => Promise<T>,\n ): Promise<T> {\n if (!this.active) return run();\n const tracer = this.#options.tracer;\n const body = async (span?: SpanLike): Promise<T> => {\n if (span) {\n span.setAttribute(\"db.system\", \"loradb\");\n span.setAttribute(\"db.operation.name\", meta.mode);\n span.setAttribute(\"graphql.field.name\", meta.field);\n if (this.#options.traceStatements) {\n span.setAttribute(\n \"db.statement\",\n statements.map((s) => s.text).join(\";\\n\"),\n );\n }\n }\n const start = performance.now();\n let result: T | undefined;\n let error: unknown;\n try {\n result = await run();\n return result;\n } catch (err) {\n error = err;\n if (span) fail(span, err);\n throw err;\n } finally {\n const durationMs = performance.now() - start;\n const rows = result === undefined ? 0 : countRows(result);\n if (span) {\n span.setAttribute(\"db.response.returned_rows\", rows);\n span.end();\n }\n this.#report(meta, statements, durationMs, rows, error);\n }\n };\n return tracer\n ? tracer.startActiveSpan(\"lora.cypher\", (span) => body(span))\n : body();\n }\n\n #report(\n meta: StatementMeta,\n statements: Statement[],\n durationMs: number,\n rows: number,\n error: unknown,\n ): void {\n const { onStatementEnd, metrics } = this.#options;\n try {\n onStatementEnd?.({\n field: meta.field,\n statements,\n mode: meta.mode,\n durationMs,\n rows,\n ...(error !== undefined ? { error } : {}),\n ...(meta.cost !== undefined ? { cost: meta.cost } : {}),\n ...(meta.operationName ? { operationName: meta.operationName } : {}),\n ...(meta.persistedId ? { persistedId: meta.persistedId } : {}),\n });\n if (metrics) {\n const attributes: Attributes = { field: meta.field, mode: meta.mode };\n if (meta.operationName) attributes[\"operation\"] = meta.operationName;\n metrics.counter(\n \"lora.graphql.statements\",\n statements.length,\n attributes,\n );\n metrics.histogram(\n \"lora.graphql.statement.duration\",\n durationMs,\n attributes,\n );\n if (error !== undefined) {\n metrics.counter(\"lora.graphql.errors\", 1, attributes);\n }\n if (meta.cost !== undefined) {\n metrics.histogram(\"lora.graphql.cost\", meta.cost, attributes);\n }\n }\n } catch {\n // Observers must not fail the request.\n }\n }\n}\n\nfunction countRows(result: QueryResult | QueryResult[]): number {\n return Array.isArray(result)\n ? result.reduce((n, r) => n + r.rows.length, 0)\n : result.rows.length;\n}\n\nfunction fail(span: SpanLike, err: unknown): void {\n span.recordException(err instanceof Error ? err : String(err));\n span.setStatus({\n code: STATUS_ERROR,\n message: err instanceof Error ? err.message : String(err),\n });\n}\n","// 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","// 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 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\nfunction temporal(\n name: string,\n kind: TemporalKind,\n description: string,\n): GraphQLScalarType {\n const parse = (value: unknown) => {\n if (typeof value !== \"string\" || value.length === 0) {\n throw new GraphQLError(`${name} must be an ISO-8601 string`);\n }\n return { kind, iso: value };\n };\n return new GraphQLScalarType({\n name,\n description,\n serialize(value) {\n if (typeof value === \"string\") return value;\n if (\n value !== null &&\n typeof value === \"object\" &&\n typeof (value as { iso?: unknown }).iso === \"string\"\n ) {\n return (value as { iso: string }).iso;\n }\n throw new GraphQLError(`${name} cannot represent ${String(value)}`);\n },\n parseValue: parse,\n parseLiteral(ast: ValueNode) {\n if (ast.kind !== Kind.STRING) {\n throw new GraphQLError(`${name} must be an ISO-8601 string`, {\n nodes: ast,\n });\n }\n return parse(ast.value);\n },\n });\n}\n\nexport const GraphQLDate = temporal(\n \"Date\",\n \"date\",\n \"A calendar date, e.g. `2026-06-21`.\",\n);\nexport const GraphQLTime = temporal(\n \"Time\",\n \"time\",\n \"A time of day with offset, e.g. `21:00:00+02:00`.\",\n);\nexport const GraphQLLocalTime = temporal(\n \"LocalTime\",\n \"localtime\",\n \"A time of day without offset, e.g. `21:00:00`.\",\n);\nexport const GraphQLDateTime = temporal(\n \"DateTime\",\n \"datetime\",\n \"An instant with offset, e.g. `2026-06-21T21:00:00Z`.\",\n);\nexport const GraphQLLocalDateTime = temporal(\n \"LocalDateTime\",\n \"localdatetime\",\n \"A date and time without offset, e.g. `2026-06-21T21:00:00`.\",\n);\nexport const GraphQLDuration = temporal(\n \"Duration\",\n \"duration\",\n \"An ISO-8601 duration, e.g. `P1DT2H`.\",\n);\n\nconst MIN_SAFE = BigInt(Number.MIN_SAFE_INTEGER);\nconst MAX_SAFE = BigInt(Number.MAX_SAFE_INTEGER);\n\nfunction parseBigInt(value: unknown): bigint {\n try {\n if (typeof value === \"bigint\") return value;\n if (typeof value === \"number\" && Number.isSafeInteger(value)) {\n return BigInt(value);\n }\n if (typeof value === \"string\" && /^-?\\d+$/.test(value)) {\n return BigInt(value);\n }\n } catch {\n // fall through\n }\n throw new GraphQLError(\"BigInt must be an integer or a decimal string\");\n}\n\n/** Pass safe integers as numbers; only true 64-bit values as bigint. */\nfunction toParam(n: bigint): number | bigint {\n return n >= MIN_SAFE && n <= MAX_SAFE ? Number(n) : n;\n}\n\nexport const GraphQLBigInt = new GraphQLScalarType({\n name: \"BigInt\",\n description: \"A 64-bit integer, serialised as a decimal string.\",\n serialize(value) {\n if (typeof value === \"bigint\") return value.toString();\n if (typeof value === \"number\" && Number.isInteger(value)) {\n return BigInt(value).toString();\n }\n throw new GraphQLError(`BigInt cannot represent ${String(value)}`);\n },\n parseValue: (value) => toParam(parseBigInt(value)),\n parseLiteral(ast) {\n if (ast.kind === Kind.INT || ast.kind === Kind.STRING) {\n return toParam(parseBigInt(ast.value));\n }\n throw new GraphQLError(\"BigInt must be an integer or a decimal string\", {\n nodes: ast,\n });\n },\n});\n\nexport const CUSTOM_SCALARS: Record<string, GraphQLScalarType> = {\n BigInt: GraphQLBigInt,\n Date: GraphQLDate,\n Time: GraphQLTime,\n LocalTime: GraphQLLocalTime,\n DateTime: GraphQLDateTime,\n LocalDateTime: GraphQLLocalDateTime,\n Duration: GraphQLDuration,\n};\n","// 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 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 t =\n documented === undefined || documented === given.description\n ? given\n : new GraphQLScalarType({\n ...given.toConfig(),\n description: documented,\n });\n } else {\n const base = baseType(stored, undefined) as GraphQLScalarType;\n t = new GraphQLScalarType({\n name,\n description: documented ?? `Stored as ${stored}.`,\n serialize: base.serialize,\n parseValue: base.parseValue,\n parseLiteral: base.parseLiteral,\n });\n }\n customScalars.set(name, t);\n }\n return t;\n };\n const scalarType = (\n f: ScalarField,\n ): GraphQLScalarType | GraphQLEnumType | GraphQLObjectType =>\n (f.customScalar && customScalar(f.customScalar)) ||\n baseType(f.type, f.enumName);\n const baseType = (\n type: ScalarType,\n enumName: string | undefined,\n ): GraphQLScalarType | GraphQLEnumType | GraphQLObjectType => {\n switch (type) {\n case \"String\":\n return GraphQLString;\n case \"ID\":\n return GraphQLID;\n case \"Int\":\n return GraphQLInt;\n case \"Float\":\n return GraphQLFloat;\n case \"Boolean\":\n return GraphQLBoolean;\n case \"Point\":\n return point;\n case \"CartesianPoint\":\n return cartesianPoint;\n case \"Enum\":\n return enums.get(enumName!)!;\n default:\n return CUSTOM_SCALARS[type]!;\n }\n };\n\n const scalarOutput = (f: ScalarField): GraphQLOutputType => {\n const base = scalarType(f);\n const t: GraphQLOutputType = f.list ? listOf(nonNull(base)) : base;\n return f.required ? nonNull(t) : t;\n };\n\n 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 }\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, paged with cursors.`,\n fields: {\n edges: {\n type: nonNull(listOf(nonNull(searchEdge))),\n resolve: connectionResolvers.edges,\n },\n pageInfo: {\n type: nonNull(pageInfo),\n resolve: connectionResolvers.pageInfo,\n },\n totalCount: {\n type: nonNull(GraphQLInt),\n description:\n \"Every match after `where` and the read rules (a vector search counts within its candidate window).\",\n resolve: connectionResolvers.totalCount,\n },\n },\n });\n for (const index of node.search) {\n const common = {\n where: { type: whereOf(node.name) },\n limit: { type: GraphQLInt },\n };\n const inputs =\n index.kind === \"fulltext\"\n ? { query: { type: nonNull(GraphQLString) } }\n : {\n vector: { type: listOf(nonNull(GraphQLFloat)) },\n to: { type: scalarType(node.key) as GraphQLInputType },\n };\n query[`${index.queryName}Connection`] = {\n type: nonNull(searchConnection),\n description:\n index.kind === \"fulltext\"\n ? `${index.queryName}, paged with cursors.`\n : `${index.queryName}, paged with cursors within the top ${Math.max(node.limit.max * 4, 1)} candidates.`,\n args: {\n ...inputs,\n where: { type: whereOf(node.name) },\n first: { type: GraphQLInt },\n after: { type: GraphQLString },\n },\n resolve: (_src, _args, context, info) =>\n hooks.resolveSearch(node, index, info, context, true),\n };\n query[index.queryName] = {\n type: nonNull(listOf(nonNull(match))),\n description:\n index.kind === \"fulltext\"\n ? `Full-text search over ${index.fields.map((f) => f.name).join(\", \")}. Terms are ANDed; a trailing * matches a prefix.`\n : `${node.name} nodes most similar to \\`vector\\`, or to the ${node.name} with ${node.key.name} \\`to\\` (${index.similarity.toLowerCase()}).`,\n args:\n index.kind === \"fulltext\"\n ? { query: { type: nonNull(GraphQLString) }, ...common }\n : {\n vector: { type: listOf(nonNull(GraphQLFloat)) },\n to: { type: scalarType(node.key) as GraphQLInputType },\n ...common,\n },\n resolve: (_src, _args, context, info) =>\n hooks.resolveSearch(node, index, info, context, false),\n };\n }\n }\n\n if (nodeInterface) {\n query[\"node\"] = {\n type: nodeInterface,\n description: \"Fetch any object by its global id.\",\n args: { id: { type: nonNull(GraphQLID) } },\n resolve: (_src, args, context, info) =>\n resolveNode((args as { id: string }).id, info, context),\n };\n 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 type { EntityRef, RelationshipRef, WriteChange } from \"./changes.js\";\n\n/** Node ids seen, for relationship ends and deletions. */\nconst ID_CACHE = 50_000;\n\nexport class EngineFeed {\n readonly #driver: LoraDriver;\n readonly #model: GraphModel;\n readonly #emit: (change: WriteChange) => void;\n readonly #onError: (err: unknown) => void;\n readonly #byLabel = new Map<string, NodeType>();\n readonly #ids = new Map<number, EntityRef>();\n #controller: AbortController | undefined;\n #lastLsn: number | undefined;\n\n constructor(\n driver: LoraDriver,\n model: GraphModel,\n emit: (change: WriteChange) => void,\n onError: (err: unknown) => void = () => {},\n ) {\n this.#driver = driver;\n this.#model = model;\n this.#emit = emit;\n this.#onError = onError;\n for (const node of model.nodes.values()) {\n this.#byLabel.set(node.labels[0]!, node);\n }\n }\n\n /** Subscribe; resolves once every later commit will be delivered. */\n async start(): Promise<void> {\n if (this.#controller) return;\n this.#controller = new AbortController();\n await this.#open();\n }\n\n stop(): void {\n this.#controller?.abort();\n this.#controller = undefined;\n }\n\n async #open(): Promise<void> {\n const signal = this.#controller!.signal;\n const feed = this.#driver.changes!({\n ...(this.#lastLsn !== undefined ? { fromLsn: this.#lastLsn } : {}),\n signal,\n });\n await feed.ready;\n void this.#pump(feed, signal);\n }\n\n /**\n * Deliver batches until the feed ends or fails. Runs detached, so it\n * never throws: a feed that fell behind resumes where it stopped at\n * once; any other failure is reported and the feed reopens from its\n * last position after a backoff (100 ms doubling to 10 s, reset by a\n * delivered batch), until stop().\n */\n async #pump(\n feed: AsyncIterable<DriverChangeBatch>,\n signal: AbortSignal,\n backoffMs = 100,\n ): Promise<void> {\n let delay = backoffMs;\n try {\n for await (const batch of feed) {\n this.#lastLsn = batch.lsn;\n const change = await this.#toChange(batch);\n if (change) this.#emit(change);\n delay = 100;\n }\n return;\n } catch (err) {\n if (signal.aborted) return;\n if ((err as { code?: string }).code !== \"LORA_CHANGES_LAGGED\") {\n this.#report(err);\n await sleep(delay, signal);\n delay = Math.min(delay * 2, 10_000);\n }\n }\n while (!signal.aborted) {\n try {\n const next = this.#driver.changes!({\n ...(this.#lastLsn !== undefined ? { fromLsn: this.#lastLsn } : {}),\n signal,\n });\n await next.ready;\n void this.#pump(next, signal, delay);\n return;\n } catch (err) {\n if (signal.aborted) return;\n this.#report(err);\n await sleep(delay, signal);\n delay = Math.min(delay * 2, 10_000);\n }\n }\n }\n\n #report(err: unknown): void {\n try {\n this.#onError(err);\n } catch {\n // A failing error hook must not stop the feed.\n }\n }\n\n async #toChange(batch: DriverChangeBatch): Promise<WriteChange | undefined> {\n const change: WriteChange = {\n operation: \"EXTERNAL\",\n field: \"\",\n created: [],\n updated: [],\n deleted: [],\n connected: [],\n disconnected: [],\n entities: [],\n types: [],\n relationshipTypes: [],\n broad: false,\n };\n const relationships: DriverChange[] = [];\n for (const c of batch.changes) {\n if (c.kind === \"reset\") {\n this.#ids.clear();\n change.broad = true;\n continue;\n }\n if (c.kind.startsWith(\"relationship\")) {\n relationships.push(c);\n continue;\n }\n const ref = this.#entity(c.labels ?? [], c.properties ?? {});\n if (!ref) continue;\n this.#remember(c.id!, ref);\n if (c.kind === \"nodeCreated\") change.created.push(ref);\n else if (c.kind === \"nodeDeleted\") change.deleted.push(ref);\n else change.updated.push(ref);\n }\n await this.#resolveEnds(relationships);\n for (const r of relationships) {\n const from = this.#ids.get(r.startId!);\n const to = this.#ids.get(r.endId!);\n if (!from || !to) continue;\n const ref = this.#relationship(r.type!, from, to);\n if (r.kind === \"relationshipDeleted\") change.disconnected.push(ref);\n else if (r.kind === \"relationshipCreated\") change.connected.push(ref);\n else {\n // Properties changed: both ends' connections changed.\n change.updated.push(from, to);\n }\n }\n fill(change);\n return change.entities.length > 0 || change.broad ? change : undefined;\n }\n\n /** The @node type and key of a node, from its labels and properties. */\n #entity(\n labels: string[],\n properties: Record<string, unknown>,\n ): EntityRef | undefined {\n for (const label of labels) {\n const node = this.#byLabel.get(label);\n if (!node) continue;\n const key = properties[node.key.property];\n return key === undefined ? undefined : { type: node.name, key };\n }\n return undefined;\n }\n\n #remember(id: number, ref: EntityRef): void {\n this.#ids.delete(id);\n this.#ids.set(id, ref);\n if (this.#ids.size > ID_CACHE) {\n this.#ids.delete(this.#ids.keys().next().value!);\n }\n }\n\n /** Look up relationship ends the feed has not shown yet. */\n async #resolveEnds(relationships: DriverChange[]): Promise<void> {\n const missing = [\n ...new Set(\n relationships\n .flatMap((r) => [r.startId!, r.endId!])\n .filter((id) => !this.#ids.has(id)),\n ),\n ];\n if (missing.length === 0) return;\n const [result] = await this.#driver.run(\n [\n {\n text: \"UNWIND $ids AS i MATCH (n) WHERE id(n) = i RETURN id(n) AS id, labels(n) AS labels, properties(n) AS props\",\n params: { ids: missing },\n },\n ],\n { mode: \"read\" },\n );\n for (const row of result!.rows) {\n const ref = this.#entity(\n row[\"labels\"] as string[],\n row[\"props\"] as Record<string, unknown>,\n );\n if (ref) this.#remember(row[\"id\"] as number, ref);\n }\n }\n\n /** The declaring field of a relationship between these types, if any. */\n #relationship(type: string, from: EntityRef, to: EntityRef): RelationshipRef {\n const owners: Array<[EntityRef, EntityRef, \"OUT\" | \"IN\"]> = [\n [from, to, \"OUT\"],\n [to, from, \"IN\"],\n ];\n for (const [owner, target, direction] of owners) {\n const node = this.#model.nodes.get(owner.type);\n const field = [...(node?.fields.values() ?? [])].find(\n (f): f is RelationshipField =>\n f.kind === \"relationship\" &&\n f.type === type &&\n f.direction === direction &&\n f.members.includes(target.type),\n );\n if (field) {\n return {\n type,\n field: `${node!.name}.${field.name}`,\n from: owner,\n to: target,\n };\n }\n }\n return { type, field: \"\", from, to };\n }\n}\n\nfunction fill(change: WriteChange): void {\n const entities = new Map<string, EntityRef>();\n const add = (e: EntityRef) => entities.set(`${e.type}\\0${keyOf(e.key)}`, e);\n for (const e of [...change.created, ...change.updated, ...change.deleted]) {\n add(e);\n }\n for (const r of [...change.connected, ...change.disconnected]) {\n add(r.from);\n add(r.to);\n }\n change.entities = [...entities.values()];\n change.types = [...new Set(change.entities.map((e) => e.type))].sort();\n change.relationshipTypes = [\n ...new Set(\n [...change.connected, ...change.disconnected].map((r) => r.type),\n ),\n ].sort();\n}\n\n/** Resolve after `ms`, or at once when `signal` aborts. */\nfunction sleep(ms: number, signal: AbortSignal): Promise<void> {\n return new Promise((resolve) => {\n if (signal.aborted) return resolve();\n const timer = setTimeout(done, ms);\n signal.addEventListener(\"abort\", done, { once: true });\n function done() {\n clearTimeout(timer);\n signal.removeEventListener(\"abort\", done);\n resolve();\n }\n });\n}\n","// 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 { checkPlans, type PlanReport } 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 } 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 type SelectionContext,\n} from \"./compile/selection.js\";\nimport type { LoraDriver, QueryResult, Statement } from \"./driver.js\";\nimport { affects, type WriteChange } from \"./execute/changes.js\";\nimport { executeCypherMutation } from \"./execute/cypher-mutation.js\";\nimport { LoraTransaction } from \"./execute/transaction.js\";\nimport {\n anySignal,\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} from \"./execute/mutate/env.js\";\nimport { collapseErrors, ModelError, requestError } from \"./errors.js\";\nimport {\n buildManifest,\n generateTypes,\n schemaHash,\n type OperationManifest,\n} from \"./codegen.js\";\nimport {\n envelopPlugin,\n nodeEnv,\n validationRules,\n type DocumentGuards,\n} from \"./guards.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} 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 { 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 #maxListFilter: number | undefined;\n readonly #maxStringFilter: number | undefined;\n readonly #callbacks: Record<string, PopulatedByCallback>;\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 /** Per-request timing collectors, by GraphQL context (see `timing`). */\n readonly #timings = new WeakMap<\n object,\n Map<string, { totalMs: number; databaseMs: number }>\n >();\n\n constructor(options: LoraGraphQLOptions) {\n this.model = buildModel(options.typeDefs, options);\n this.#driver = options.driver;\n this.#timeoutMs = options.timeoutMs ?? 10_000;\n 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 this.#maxListFilter = options.maxListFilter;\n this.#maxStringFilter = options.maxStringFilter;\n this.#callbacks = options.callbacks ?? {};\n const missing = [...this.model.nodes.values()].flatMap((n) =>\n [...n.fields.values()].flatMap((f) =>\n f.kind === \"scalar\" &&\n f.populatedBy &&\n !(f.populatedBy.callback in this.#callbacks)\n ? [`${n.name}.${f.name}: no callback named ${f.populatedBy.callback}`]\n : [],\n ),\n );\n this.#resolvers = options.resolvers ?? {};\n this.#scalars = options.scalars;\n for (const n of this.model.nodes.values()) {\n for (const f of n.fields.values()) {\n if (f.kind === \"custom\" && !this.#resolvers[n.name]?.[f.name]) {\n missing.push(\n `${n.name}.${f.name}: @customResolver needs resolvers.${n.name}.${f.name}`,\n );\n }\n }\n }\n if (missing.length > 0) {\n throw new ModelError(missing.map((message) => ({ message })));\n }\n this.#jwt =\n options.jwt ??\n ((context) => (context as LoraGraphQLContext | undefined)?.jwt);\n this.#onStatement = options.onStatement;\n this.#maskErrors = options.maskErrors ?? nodeEnv() === \"production\";\n this.#onError = options.onError;\n this.#guards = options.guards ?? {};\n 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 /** The configured document guards as validation rules. */\n validationRules(): ValidationRule[] {\n return this.#guards === false ? [] : validationRules(this.#guards);\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 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 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 };\n for (const [i, op] of (options.operations ?? []).entries()) {\n const operation = op.name ?? `operation ${i + 1}`;\n try {\n const fields = await this.explain(op.document, op.variables ?? {}, {\n rowBudget: options.rowBudget,\n context: op.context,\n });\n for (const f of fields) report.plans.push({ operation, ...f });\n } catch (err) {\n report.errors.push({\n operation,\n message: err instanceof Error ? err.message : String(err),\n });\n }\n }\n report.ok =\n report.security.length === 0 &&\n report.cypher.length === 0 &&\n report.missing.length === 0 &&\n report.errors.length === 0 &&\n report.plans.every((p) =>\n p.reports.every((r) => r.findings.length === 0),\n );\n return report;\n }\n\n /**\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 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 });\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 = (context as LoraGraphQLContext | undefined)?.signal;\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 ): CompiledRead {\n const base = infoContext(info);\n return this.#compiled.get(\n {\n fieldNodes: info.fieldNodes,\n fragments: info.fragments,\n variables: coercedVariables(info.variableValues),\n jwt: this.#jwt(context),\n context,\n statistics: this.#statisticsVersion,\n },\n (jwt) => {\n const ctx = this.#context(base, context, jwt);\n return { ctx, compiled: compile(ctx) };\n },\n );\n }\n\n #databaseError(field: string, err: unknown): unknown {\n 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(info, context, (ctx) =>\n compileRoot(\n ctx,\n kind,\n node,\n this.#args(ctx, info.parentType, info.fieldNodes),\n info.fieldNodes,\n ),\n );\n return this.#run(info.fieldName, compiled, context, info);\n }\n\n #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 try {\n value = 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 has no known write-set: report it broadly,\n // when the transaction it ran in commits.\n const change: WriteChange = {\n operation: \"CYPHER\",\n field: field.name,\n created: [],\n updated: [],\n deleted: [],\n connected: [],\n disconnected: [],\n entities: [],\n types: [],\n relationshipTypes: [],\n broad: true,\n };\n 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: (context as LoraGraphQLContext | undefined)?.signal,\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 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: (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 transaction: (context as LoraGraphQLContext | undefined)?.transaction\n ?.driverTransaction,\n onStatement: (statement) =>\n this.#onStatement?.({ field: info.fieldName, statement }),\n observe: this.#mutationObserve(info, context),\n 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(tx, (change) => this.#changes.emit(change));\n }\n\n /** Stop the engine change feed (with `changeFeed: true`). */\n close(): void {\n this.#changes.close();\n }\n}\n","// The narrow interface the library needs from a LoraDB database, plus one\n// adapter that fits both `@loradb/lora-node` and `@loradb/lora-wasm`\n// structurally, so neither binding is a dependency of this package.\n\nexport type LoraParams = Record<string, unknown>;\n\nexport interface Statement {\n text: string;\n params: LoraParams;\n}\n\nexport interface QueryResult {\n columns: string[];\n rows: Array<Record<string, unknown>>;\n}\n\nexport interface PlanNode {\n id: number;\n operator: string;\n details: Record<string, string>;\n estimatedRows: number | null;\n children: PlanNode[];\n}\n\nexport interface QueryPlan {\n query: string;\n shape: \"readOnly\" | \"mutating\";\n resultColumns: string[];\n tree: PlanNode;\n}\n\nexport interface RunOptions {\n /** `read` runs in a read-only transaction: the engine rejects writes. */\n mode: \"read\" | \"write\";\n timeoutMs?: number | undefined;\n signal?: AbortSignal | undefined;\n /**\n * A read the library vouches for: generated, or a @cypher statement\n * checked read-only at startup. The driver may run it outside a\n * read-only transaction.\n */\n verified?: boolean;\n /**\n * A verified read of at most one row, by an exact @key seek, projecting\n * only stored properties. Cheap enough to run synchronously.\n */\n bounded?: boolean;\n}\n\n/** An open interactive transaction: statements see earlier writes. */\nexport interface DriverTransaction {\n execute(statement: Statement): Promise<QueryResult>;\n commit(): Promise<void>;\n rollback(): Promise<void>;\n /** False once committed, rolled back, or failed (a failure rolls back). */\n readonly isOpen: boolean;\n}\n\nexport interface LoraDriver {\n /** Run statements atomically, in one transaction, in order. */\n run(statements: Statement[], options: RunOptions): Promise<QueryResult[]>;\n /**\n * Open an interactive transaction. Needed for mutations, which check\n * their writes (connect targets, cardinality, authorization) before\n * committing. Optional: the WASM binding has none, so it serves reads.\n * 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\n/** One change of a committed write, as lora-node reports it. */\nexport interface DriverChange {\n kind:\n | \"nodeCreated\"\n | \"nodeUpdated\"\n | \"nodeDeleted\"\n | \"relationshipCreated\"\n | \"relationshipUpdated\"\n | \"relationshipDeleted\"\n | \"reset\";\n id?: number;\n labels?: string[];\n type?: string;\n startId?: number;\n endId?: number;\n properties?: Record<string, unknown>;\n}\n\nexport interface DriverChangeBatch {\n lsn: number;\n changes: DriverChange[];\n}\n\n/** The subset of a LoraDB `Database` the adapter calls. */\nexport interface LoraDatabaseLike {\n transaction(\n statements: Array<{ query: string; params?: never }>,\n mode?: \"read_write\" | \"read_only\",\n options?: { timeoutMs?: number; signal?: AbortSignal },\n ): Promise<QueryResult[]>;\n execute?(\n query: string,\n params?: never,\n options?: { timeoutMs?: number; signal?: AbortSignal },\n ): Promise<QueryResult>;\n stream?(\n query: string,\n params?: never,\n options?: { timeoutMs?: number; signal?: AbortSignal },\n ): {\n columns(): string[] | Promise<string[]>;\n toArray(): Promise<Array<Record<string, unknown>>>;\n };\n explain?(query: string, params?: never): Promise<QueryPlan>;\n changes?(options?: {\n fromLsn?: number;\n signal?: AbortSignal;\n }): AsyncIterable<DriverChangeBatch> & { ready: Promise<void> };\n begin?(mode?: \"read_write\" | \"read_only\"): Promise<{\n execute(\n query: string,\n params?: never,\n options?: { timeoutMs?: number; signal?: AbortSignal },\n ): Promise<QueryResult>;\n commit(): Promise<void>;\n rollback(): Promise<void>;\n readonly isOpen: boolean;\n }>;\n}\n\n/**\n * Wrap a `Database` from `@loradb/lora-node` or `@loradb/lora-wasm`.\n *\n * ```ts\n * const db = await createDatabase();\n * const lora = new LoraGraphQL({ typeDefs, driver: loraDriver(db) });\n * ```\n */\nexport function loraDriver(db: LoraDatabaseLike): LoraDriver {\n const execute =\n typeof db.execute === \"function\" ? db.execute.bind(db) : undefined;\n const stream =\n typeof db.stream === \"function\" ? db.stream.bind(db) : undefined;\n const driver: LoraDriver = {\n async run(statements, options) {\n const single =\n options.mode === \"read\" && options.verified && statements.length === 1\n ? statements[0]!\n : undefined;\n // One keyed row of stored properties: a stream answers it on the JS\n // thread faster (~7 µs) than a hop to a libuv worker. Any other read\n // must not run there: db.stream() runs the whole query on the JS\n // thread, so one slow read would block every other request.\n if (single && options.bounded && stream) {\n const rows = stream(\n single.text,\n single.params as never,\n runLimits(options),\n );\n return [{ columns: await rows.columns(), rows: await rows.toArray() }];\n }\n // A single verified read needs no read-only transaction: execute()\n // runs it on a libuv worker at less than half a transaction's cost,\n // and stops at LIMIT as early.\n if (single && execute) {\n return [\n await execute(\n single.text,\n single.params as never,\n runLimits(options),\n ),\n ];\n }\n return db.transaction(\n statements.map((s) => ({ query: s.text, params: s.params as never })),\n options.mode === \"read\" ? \"read_only\" : \"read_write\",\n runLimits(options),\n );\n },\n };\n if (typeof db.begin === \"function\") {\n const begin = db.begin.bind(db);\n driver.begin = async (options) => {\n const limits = runLimits(options);\n // The engine's begin() waits for the writer lock without a timeout.\n const tx = await bounded(\n begin(options.mode === \"read\" ? \"read_only\" : \"read_write\"),\n limits,\n );\n return {\n execute: (s) => tx.execute(s.text, s.params as never, limits),\n commit: () => tx.commit(),\n rollback: () => tx.rollback(),\n get isOpen() {\n return tx.isOpen;\n },\n };\n };\n }\n if (typeof db.explain === \"function\") {\n const explain = db.explain.bind(db);\n driver.explain = (s) => explain(s.text, s.params as never);\n }\n if (typeof db.changes === \"function\") {\n driver.changes = db.changes.bind(db);\n }\n return driver;\n}\n\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"],"names":["RANGE_OPS","RANGE_UNINDEXABLE","TEXT_OPS","inferRequirements","model","out","node","label","f","at","schemaName","hasUnique","kinds","ops","range","op","spatial","text","k","index","reason","property","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","scanParams","skipQuoted","end","start","renameParams","rename","last","ref","codeOnly","maskLiterals","close","nl","checkCypherFields","driver","findings","fields","field","params","statement","owner","message","err","SEEK_OPERATORS","checkPlans","compiled","reports","plan","nodes","flatten","outer","flattenOuter","notes","sameColumns","x","scans","seeks","estimates","estimatedRows","SEEKS","BIND_NOTHING","scanExpands","expand","source","sourceScan","children","lintModel","unguardedMutations","rules","open","ModelError","problems","formatProblem","LORA_GRAPHQL_ERROR_CODES","ERROR_CODES","isLoraGraphQLError","ext","code","requestError","cause","extensions","GraphQLError","collapseErrors","errors","groups","error","path","pattern","group","item","first","count","RELATIONSHIP_OPERATIONS","PLACEHOLDER","RULE_REFERENCES","UNEXPANDED","isRecord","QUANTIFIERS","desugarRule","ctx","ends","keys","expandRule","extra","expanded","desugarNode","viewerType","schema","def","withinRule","stack","cycle","reported","id_","expandNodeRule","toNodeFilter","parts","test","isViewer","abstract","desugarAbstract","quantified","pair","member","visit","map","q","checkViewer","viewer","jwtType","ruleParts","testsRelationshipEnds","newContext","base","noteClaim","bound","seen","EXPR","exprValue","bind","freshVar","candidate","toLoraPoint","input","toStored","copies","isPolymorphic","memberFields","list","declared","abstractOf","listAggregate","lengths","values","init","step","durationSum","distinctCount","MAX_FILTER_DEPTH","MAX_LIST_FILTER","MAX_STRING_FILTER","SEEK_OPS","labelRows","fallback","filterDegree","chosen","stats","perRowCost","cost","relationshipCost","d","nodeWhere","targetCost","quantifier","memberWhere","rootFilterCost","all","keyed","keyedRows","rows","anchoredRows","hasPredicate","anchor","anchorOf","inverse","operand","SCALAR_OPS","COUNT_OPS","compileNodeWhere","variable","compileWhere","nodeKeys","checkFieldAuthentication","rule","fieldValidate","pred","scalarPredicate","maskedValue","guarded","descend","relationshipPredicate","relationshipExists","connectionPredicate","depth","max","compilePropsWhere","checkPropertyAccess","lookup","branches","compile","checkOperand","maxList","maxString","tooLong","stringTooLong","ciOp","ciValue","box","lowered","cypherOp","lower","relationshipPattern","from","targetLabel","to","relVariable","related","projection","authFilter","compileMemberWhere","mine","typename","rest","members","checkAuthentication","sum","distinct","lists","nonEmpty","probe","failing","compareCount","aggregatePredicate","exists","counts","total","pairWhere","negate","nonEmptyPair","refuseEdgeRowRules","AGGREGATE_KEYS","side","onEdge","fieldName","aggs","maskSettled","agg","bounds","aggregate","claimsSatisfy","compileRulePart","MissingClaim","bypassed","folded","compileRule","toExpr","foldOr","authValidate","when","validateRules","fieldReadGuard","forbidden","propertyAccess","propertyReadAccess","access","rulePartsHaveViewer","propertyReadGuard","vars","bypass","raw","masks","unless","substitute","claimsMaskedValue","checkKeyScope","viewerKey","scope","mapping","viewerNode","claim","prefix","rootFieldGuard","underNot","child","foldAnd","viewerTest","inRule","edge","matchClaims","wasInAuth","refs","relationshipRules","mode","flipped","relationshipRuleFields","refusedEdgeRead","hasRules","exprs","head","full","lookupPath","root","cur","part","sameValue","ka","kb","referenceString","ok","flush","read","ruleReference","resolved","steps","hops","built","_","expected","claimOp","authOps","readOnlyRules","relationship","readAuthorization","rootFieldRules","filter","validate","PROPERTY_OPS","passableWithoutClaims","readsClaims","claimsOnlyViolations","here","relationshipRuleOperations","isRelationshipRule","nodeAs","fieldAs","propertyAs","principalsOf","subject","token","tested","claims","viewerModel","t","found","always","namesViewer","rewrite","dropped","authorization","relationshipProperties","user","rootFieldVerdict","by","allowedBy","failed","fieldWriteGuarded","ruleLabels","fieldWriteVerdict","propertyVerdict","typeVerdict","verdict","typeRuleVerdict","rulesFor","isFalse","fieldVerdict","guard","relationshipAuthentication","relationshipVerdict","authentication","accessLints","authenticated","alone","anonymousLints","bypassReach","rewritableRuleFields","maskOracles","refusedNestedWrites","reached","properties","testedFields","referencedFields","nodeTests","pinned","pinsOne","REPOINT","repointable","updatable","updateRules","updateTests","after","createTested","masked","report","once","opsOf","context","refuses","createOpen","updateOpen","offered","targets","refused","kept","TYPE_WRITES","RELATIONSHIP_WRITES","advice","branch","claimFreeBranch","authenticationCovers","guardOf","has","usesClaims","unknownInputFields","named","isNonNullType","isListType","Kind","isInputObjectType","directive","directiveNodes","unknown","arg","known","getDirectiveValues","ast","dir","BUILTIN_SCALARS","unwrap","itemRequired","isScalarLike","isEnumType","storageOf","STORAGE_TYPES","isScalarType","lowerFirst","defaultPlural","typeName","shapeOf","shape","unwrapInput","upperFirst","snakeCase","names","hasOwnConnection","connectionTypeNames","settable","isUpdatable","offersNested","update","allows","hasSettable","outOfRange","bad","mutationNames","nonNull","GraphQLNonNull","listOf","GraphQLList","requiredOnCreate","adjustable","buildMutations","resolve","inputs","description","GraphQLInputObjectType","scalarInputs","propsCreate","propsUpdate","propsRequired","edgeField","connectInput","nestedCreateInput","createInput","nestedUpdateInput","updateInput","canCreate","polymorphicFields","byMember","connect","create","GraphQLBoolean","relationFields","GraphQLInt","nested","scalarsOf","upsertInput","numericAdjust","adjustType","GraphQLFloat","adjustInput","info","GraphQLObjectType","listPayload","obj","run","_src","_args","adjust","updateArgs","RESTRICTIVENESS","strictest","verdicts","best","rootTargets","query","mutation","subscription","write","relay","asList","ruled","nestedWrites","given","adds","operationAccess","operation","fragments","variables","principals","sel","rootSelections","operations","unresolved","creates","updates","valueFromASTUntyped","set","frag","accessMatrix","ruleOps","analyze","sample","statements","rels","arrow","degrees","summary","summarize","COMPILED_PER_FIELD","COMPILED_TOTAL","COMPILE_CACHE_BYTES","MAX_CACHED_VARIABLES","ENTRY_OVERHEAD","CompileCache","#byField","#live","#variableNames","#bindHints","#collected","#drop","#total","#maxBytes","#bytes","maxBytes","entry","request","#variablesKey","stableKey","claimAt","bindable","rebind","miss","#compileMiss","slots","entryBytes","oldest","jwt","hint","markers","MARKER","marked","withPath","result","findSlots","used","variableNames","picked","chars","paths","copy","copied","slot","st","fieldNodes","visited","exact","walk","fragment","proto","json","GRAPHQL_17","versionInfo","coercedVariables","variableValuesOf","collectFields","selectionSets","included","applies","subSelections","fieldArgs","getArgumentValues","GraphQLSkipDirective","GraphQLIncludeDirective","condition","cond","isAbstractType","isObjectType","finish","columns","expectation","readSet","refuseRowRules","what","deniedItem","assertNoneDenied","collectOne","coalesceFalse","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","_k","val","payload","toBase64Url","bytesToBase64Url","sign","decodeCursor","cursor","arity","encoded","dot","base64UrlToBytes","fromBase64Url","encoder","bytes","b64","keyExpr","resolveLimit","argument","resolveSort","tieBreak","one","direction","propName","resolvePage","backward","requested","signature","sortSignature","sortItems","cursorValues","leadBound","keysetPredicate","equal","lead","disjunction","compileCypherRoot","call","bindStatement","column","projectNode","projectAbstract","checkListArguments","texts","MAX_LIST_ARGUMENT","min","projectCypher","sets","body","gather","per","compileByKeys","byKey","keyOf","EXACT_OPS","POINT_OPS","rootMatch","computed","computedFields","carry","computedClauses","predicate","seekFromWhere","findRelatedAnchor","keyset","eq","inList","seek","dedupe","family","AGGREGATES","nativeAggregate","aggregateReturn","native","order","carried","alias","compileAggregate","aggType","aggregateWanted","aggregateRow","compileGrouped","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","objType","guardedValue","totalCount","page","sideName","sideType","existing","edgeNodes","requiresCache","requiresSelection","requires","cached","parse","defs","pre","selected","connectionOf","projectPolymorphic","projectRelationship","connected","degree","userSort","limitParam","resolveAbstractSort","memberList","sortExprs","tagged","mergedOrder","compileAbstractRoot","limitValue","calls","slice","chain","otherwise","compileRoot","compileList","compileSingle","compileConnection","statsColumns","statsCtx","statsRoot","results","setPath","SEARCH_SORT","compileSearch","matches","vector","readable","pool","candidates","exclude","searchConnectionSelections","searchCount","selections","searchNodeSelections","matchType","affects","reads","change","labelsOf","assertReadable","NAME","unquote","uniqueTogetherTouched","colon","u","runStatement","tx","NOW","timestamps","edgeStamps","now","labelTest","seekThenExpand","orFresh","andText","inverseFields","memberTest","relRef","notUniqueTogether","checkUniqueTogetherOf","uniqueTogetherStatement","nWhere","mWhere","theirs","back","executeCypherMutation","LoraTransaction","#tx","#emit","#pending","emit","MAX_CONCURRENT_STATEMENTS","OPERATION_TIMEOUT_FACTOR","OperationBudget","#controller","#deadline","#timeoutMs","#timer","#maxConcurrent","#waiting","#expired","#running","timeoutMs","maxConcurrent","expire","reject","#timeoutError","wake","anySignal","both","abort","notConnected","HIDDEN","requiredMissing","who","mapWriteError","checkCardinality","runner","touched","add","link","fresh","checkUniqueTogether","touch","other","ownerName","checkRequired","byField","deleteNodes","doomed","queue","next","batch","before","declaredField","isDoomed","keysByNode","restricting","blocking","orphans","orphan","relIds","neighbours","pctx","compileAdjust","current","WritePlan","written","storedDefault","satisfied","cb","ownerKey","pick","adding","replace","disconnect","nestedDelete","spec","keep","edgeProps","remove","defaults","onCreate","onUpdate","propertyError","TEMPORAL_KIND","tag","assertUniqueKeys","Runner","task","updating","relationships","visible","moves","placeholderKey","moved","stamped","bKey","matchText","returned","pairs","unique","links","lctx","onMatch","linked","byPair","ctx0","todo","prepared","actx","adjustments","suppliable","shapes","sctx","rowsParam","removes","hi","lo","payloadSelections","payloadType","settleClaims","lookupViewerKey","executeMutation","planCtx","authOp","emptyChange","payloadFor","payloadTypeName","done","bulkLimit","upsert","taken","fillChange","entities","addEntity","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","types","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","vectorQueryNames","readSearch","defaultName","plural","scalars","fulltext","Plural","guardedRead","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","WRITE_CLAUSES","buildCypherField","warnings","warn","namedType","object","columnName","inferColumn","cypherArgs","argNamed","argShape","size","cypherArgumentRange","argumentDefault","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","checkConnectionWhere","abstractsOf","checkAbstractWhere","readUniqueTogether","singles","ROOT_TYPES","buildModel","typeDefs","buildASTSchema","concatAST","atType","userTypes","schemaRules","enums","scalarDescriptions","nodeTypes","propsTypes","plainTypes","rootTypes","interfaceTypes","unionTypes","stored","viewerArgs","isNode","isProps","nodeNames","plainNames","objects","targetNames","checkPropertyCollisions","at0","primaryLabels","rootFieldOwners","nodeArgs","primary","custom","search","mutations","abstracts","declaredRel","queries","mutationFields","typeRules","namedRules","schemaDesugar","violations","WRITES","uncovered","ruleEnds","desugar","propertyEnds","users","misplaced","unsupported","dedupeProblems","STATUS_ERROR","Observer","#options","meta","tracer","span","fail","durationMs","countRows","#report","onStatementEnd","metrics","attributes","checkCustomRequires","requiredCustomFields","databaseError","mapped","DOCUMENT_CACHE_SIZE","documentBytes","Documents","#guards","#persistedOnly","#schema","#rules","#persistedIds","#documents","#persisted","#documentBytesMax","#documentBytes","#parse","#validate","document","OperationLimits","#operationTimeoutMs","#maxConcurrentStatements","#operations","#maxCost","#spent","#executions","#eventSpent","#budget","#onCost","execution","event","byOperation","budget","rootOf","searchOf","multiRoot","isDocument","operationType","operationName","getOperationAST","isVariableError","findOperation","infoContext","runInOrder","timingEntry","timing","rootKey","ms","temporal","GraphQLScalarType","GraphQLDate","GraphQLTime","GraphQLLocalTime","GraphQLDateTime","GraphQLLocalDateTime","GraphQLDuration","MIN_SAFE","MAX_SAFE","parseBigInt","toParam","GraphQLBigInt","CUSTOM_SCALARS","buildBaseTypes","hooks","sortDirection","GraphQLEnumType","pageInfo","GraphQLString","countFilter","point","cartesianPoint","nodeInterface","GraphQLInterfaceType","GraphQLID","customScalars","documented","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","comparison","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","more","makeConnection","edgeName","nodeType","propertiesType","connectionAggregates","aggregateSides","relationshipCount","connectionAggregate","made","propsObjects","propsObject","listArgs","edgeSorts","edgeSortOf","connectionArgs","_a","_c","cypherOutput","relationshipConnectionField","conn","plainObjects","plain","buildQuery","objectTypes","aggregateTypes","resolveRoot","resolveNode","grouped","match","searchEdge","searchConnection","common","maxIds","ids","buildSorts","buildSubscriptions","changeOperation","changeRelationship","keyType","previousFields","previousState","buildSchema","ID_CACHE","EngineFeed","#driver","#model","#onError","#byLabel","#ids","#lastLsn","onError","#open","signal","feed","#pump","backoffMs","delay","#toChange","sleep","#entity","#remember","#resolveEnds","#relationship","fill","owners","timer","ChangeHub","#maxQueued","#onWrite","#listeners","#feedListeners","#feed","#feedReady","listener","register","overflow","unregister","ready","iterator","CHANGE","SELF_OWNS","changeEvents","previous","make","events","self","sameContextReads","slotCompile","statistics","contextReads","fixed","filterCost","fan","worst","Subscriptions","#host","#changes","#maxSubscriptions","#subscriptionScope","#maxSubscriptionFilterDepth","#subscriptionTimeoutMs","#subscriptionCounts","#subscribers","#probes","#deleteSeen","#undispatch","#byKeyCompiles","#sharedReads","host","live","counted","release","#events","#visibleCheck","#relatedVisible","deliveries","sink","#addSubscriber","probed","deletions","dispatch","#dispatch","sinks","deliver","share","selfOwns","#relatedGroup","checks","selfGuard","shared","direct","shareKey","pending","LoraGraphQL","#limits","#maxBatch","#maxListArgument","#maxFilterDepth","#maxListFilter","#maxStringFilter","#callbacks","#resolvers","#scalars","#jwt","#onStatement","#maskErrors","#observer","#subscriptions","#degrees","#statisticsVersion","#compiled","#statistics","#mutationTransaction","#warnedNotAtomic","#timing","#readSets","#timings","cacheBytes","#context","#run","executeFn","setExecuteFn","#atomic","execArgs","#openAtomic","#closeAtomic","setResult","traced","#timingOf","#cachedCompile","#args","#resolveSearch","#resolveRoot","#resolveNode","#resolveCypher","#resolveMutation","invalid","validateSchema","#schemaEnv","coerced","getVariableValues","queryType","hash","#execute","collector","started","contextValue","graphqlExecute","closed","databaseMs","executionTiming","graphqlSubscribe","dbStart","opSignal","#meta","#databaseError","#checkGuard","#warnNotAtomic","#mutationEnv","#mutationObserve","opened","loraDriver","db","execute","stream","single","runLimits","begin","limits","bounded","explain","settled","abandon","onAbort"],"mappings":"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AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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"}