@sequenceholdings/orm 0.1.1 → 0.1.2

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 (63) hide show
  1. package/README.md +1 -1
  2. package/dist/authoring.cjs +794 -0
  3. package/dist/authoring.cjs.map +1 -0
  4. package/dist/authoring.d.cts +274 -0
  5. package/dist/authoring.d.ts +274 -0
  6. package/dist/authoring.js +763 -0
  7. package/dist/authoring.js.map +1 -0
  8. package/dist/canonical.cjs +146 -0
  9. package/dist/canonical.cjs.map +1 -0
  10. package/dist/canonical.d.cts +369 -0
  11. package/dist/canonical.d.ts +369 -0
  12. package/dist/canonical.js +131 -0
  13. package/dist/canonical.js.map +1 -0
  14. package/dist/cli.cjs +6172 -1683
  15. package/dist/cli.cjs.map +1 -1
  16. package/dist/cli.d.cts +8 -1
  17. package/dist/cli.d.ts +8 -1
  18. package/dist/cli.js +6172 -1685
  19. package/dist/cli.js.map +1 -1
  20. package/dist/client.cjs +120 -0
  21. package/dist/client.cjs.map +1 -1
  22. package/dist/client.d.cts +74 -2
  23. package/dist/client.d.ts +74 -2
  24. package/dist/client.js +116 -1
  25. package/dist/client.js.map +1 -1
  26. package/dist/compiler.cjs +3001 -0
  27. package/dist/compiler.cjs.map +1 -0
  28. package/dist/compiler.d.cts +581 -0
  29. package/dist/compiler.d.ts +581 -0
  30. package/dist/compiler.js +2947 -0
  31. package/dist/compiler.js.map +1 -0
  32. package/dist/index.cjs +1705 -326
  33. package/dist/index.cjs.map +1 -1
  34. package/dist/index.d.cts +117 -56
  35. package/dist/index.d.ts +117 -56
  36. package/dist/index.js +1619 -323
  37. package/dist/index.js.map +1 -1
  38. package/dist/ir.cjs +407 -0
  39. package/dist/ir.cjs.map +1 -0
  40. package/dist/ir.d.cts +1179 -0
  41. package/dist/ir.d.ts +1179 -0
  42. package/dist/ir.js +388 -0
  43. package/dist/ir.js.map +1 -0
  44. package/dist/naming-CTvWSRTf.d.ts +79 -0
  45. package/dist/naming-DRyinU4u.d.cts +79 -0
  46. package/dist/sdl.cjs +833 -0
  47. package/dist/sdl.cjs.map +1 -0
  48. package/dist/sdl.d.cts +96 -0
  49. package/dist/sdl.d.ts +96 -0
  50. package/dist/sdl.js +809 -0
  51. package/dist/sdl.js.map +1 -0
  52. package/package.json +36 -3
  53. package/src/codegen-gql/apollo-hooks.cjs +98 -0
  54. package/src/codegen-gql/server-fns.cjs +101 -0
  55. package/templates/README.md +13 -0
  56. package/templates/orm-namespace/CLAUDE.md +81 -0
  57. package/templates/orm-namespace/codegen.ts +22 -0
  58. package/templates/orm-namespace/gitignore +5 -0
  59. package/templates/orm-namespace/graphql/example/queries.ts +56 -0
  60. package/templates/orm-namespace/package.json +24 -0
  61. package/templates/orm-namespace/schema/tables.ts +71 -0
  62. package/templates/orm-namespace/sequence.config.ts +32 -0
  63. package/templates/orm-namespace/tsconfig.json +15 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/canonical/v2.ts","../src/sdl/naming.ts","../src/sdl/generate.ts","../src/hash.ts","../src/codegen-gql/errors.ts","../src/codegen-gql/manifest.ts","../src/codegen-gql/type-policies.ts"],"names":["identifier","GRAPHQL_NAME_RE","z","createHash"],"mappings":"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","file":"sdl.js","sourcesContent":["/**\n * Canonical namespace definition v2 — the data-only JSON a consumer's\n * TypeScript schema serializes to. This is v2's equivalent of the v1 YAML\n * `NamespaceDefinition`: the CLI's jiti loader produces it, the content hash\n * is computed over it, the server re-validates it (consumer TS never runs\n * server-side), and the SDL generator / GraphQL compiler / migration engine\n * all consume it.\n *\n * FROZEN CONTRACT (week 1): downstream tracks build against these shapes.\n * Additive evolution only; `definition_format` discriminates on the wire.\n */\nimport { z } from 'zod'\n\nexport const CANONICAL_FORMAT = 2 as const\n\n/** Identifier grammar shared with v1 (`^[a-z][a-z0-9_]*$`, ≤63 bytes). */\nexport const IDENTIFIER_RE = /^[a-z][a-z0-9_]*$/\nconst identifier = z.string().min(1).max(63).regex(IDENTIFIER_RE)\n\n/** The 10 v1 column types, unchanged in v2. */\nexport const COLUMN_TYPES = [\n 'uuid', 'text', 'integer', 'bigint', 'numeric', 'double',\n 'boolean', 'timestamptz', 'date', 'jsonb',\n] as const\nexport type ColumnType = (typeof COLUMN_TYPES)[number]\n\nconst columnTypeSchema = z.enum(COLUMN_TYPES)\n\n/** Enum columns reference a namespace-level `defineEnum` by name. */\nexport const canonicalEnumSchema = z.object({\n name: identifier,\n values: z.array(z.string().min(1).max(63)).min(1).max(100),\n})\nexport type CanonicalEnum = z.infer<typeof canonicalEnumSchema>\n\nexport const canonicalColumnSchema = z.object({\n /** Property name in TS (camelCase); columnName is the Postgres name. */\n name: z.string().min(1).max(63),\n columnName: identifier,\n type: z.union([columnTypeSchema, z.object({ enum: identifier })]),\n nullable: z.boolean().default(true),\n unique: z.boolean().default(false),\n /** Literal default, or one of the allowlisted SQL functions. */\n default: z.union([z.string(), z.number(), z.boolean(), z.null()]).optional(),\n defaultFn: z.enum(['gen_random_uuid()', 'now()']).optional(),\n description: z.string().max(500).optional(),\n /** Migration hints — same semantics as v1. */\n renamedFrom: identifier.optional(),\n cast: z.string().max(200).optional(),\n deprecated: z.boolean().default(false),\n})\nexport type CanonicalColumn = z.infer<typeof canonicalColumnSchema>\n\nexport const canonicalLinkSchema = z.object({\n name: z.string().min(1).max(63),\n kind: z.enum(['toOne', 'toMany', 'toPlatformUser']),\n /** Target table name (namespace-local). Absent for toPlatformUser. */\n target: identifier.optional(),\n /** FK column on the owning side (toOne/toPlatformUser: on this table; toMany: on the target). */\n on: identifier,\n /** Referenced column on the target (default: target's PK / platform user `sub`). */\n references: identifier.optional(),\n /** enforce: true emits a real FK constraint (same-namespace toOne only). */\n enforce: z.boolean().default(false),\n description: z.string().max(500).optional(),\n})\nexport type CanonicalLink = z.infer<typeof canonicalLinkSchema>\n\nexport const canonicalIndexSchema = z.object({\n columns: z.array(identifier).min(1),\n unique: z.boolean().default(false),\n name: identifier.optional(),\n})\n\n/**\n * Policy expressions stay DSL SOURCE STRINGS in the canonical form — parsing\n * and claim-key validation happen in both CLI and server via the shared\n * predicate parser. Variants follow §4c permissive-union semantics.\n */\nexport const policyVariantSchema = z.object({\n /** Claims-only guard (capability()/role()/claim() comparisons — no columns). */\n when: z.string().min(1).max(1000),\n /** Exactly one of: allow-all bypass, or a row predicate. */\n allow: z.literal(true).optional(),\n policy: z.string().min(1).max(2000).optional(),\n}).refine((v) => (v.allow === true) !== (typeof v.policy === 'string'), {\n message: 'A variant declares exactly one of allow: true or policy',\n})\n\nexport const policyExpressionSchema = z.union([\n z.string().min(1).max(2000),\n z.object({\n default: z.string().min(1).max(2000),\n variants: z.array(policyVariantSchema).max(10).default([]),\n }),\n])\nexport type PolicyExpression = z.infer<typeof policyExpressionSchema>\n\nexport const canonicalPoliciesSchema = z.object({\n read: policyExpressionSchema.optional(),\n write: policyExpressionSchema.optional(),\n})\n\n/** Actions carry over from v1 as compiled named-SQL ops (plan: resolved OQ-1). */\nexport const canonicalActionSchema = z.object({\n name: identifier,\n requires: z.string().max(1000).optional(),\n params: z.record(z.string(), z.object({\n type: columnTypeSchema,\n nullable: z.boolean().default(false),\n })).default({}),\n executes: z.string().min(1).max(10_000),\n returns: z.enum(['rows', 'rowsAffected', 'scalar']).default('rowsAffected'),\n audit: z.object({ action: z.string(), resource: z.string() }).optional(),\n})\n\nexport const canonicalTableSchema = z.object({\n table: identifier,\n description: z.string().max(2000).optional(),\n /** Table-level rename hint (new in v2). */\n renamedFrom: identifier.optional(),\n /** Synced/reflected read-only tables (`source: gold.*`) — v1 semantics. */\n source: z.string().regex(/^gold\\.[a-z][a-z0-9_]*$/).optional(),\n columns: z.array(canonicalColumnSchema).default([]),\n primaryKey: z.array(identifier).min(1).max(8).optional(),\n links: z.array(canonicalLinkSchema).default([]),\n indexes: z.array(canonicalIndexSchema).default([]),\n policies: canonicalPoliciesSchema.default({}),\n actions: z.array(canonicalActionSchema).default([]),\n})\nexport type CanonicalTable = z.infer<typeof canonicalTableSchema>\n\nexport const canonicalDefinitionSchema = z.object({\n definition_format: z.literal(CANONICAL_FORMAT),\n namespace: identifier.max(41),\n description: z.string().max(2000).optional(),\n enums: z.array(canonicalEnumSchema).default([]),\n tables: z.array(canonicalTableSchema).min(0).max(500),\n /** Verbatim custom-roles grammar (@sequenceholdings/custom-roles-manifest). */\n capabilities: z.object({\n roles: z.unknown().optional(),\n uses: z.array(z.string()).default([]),\n }).default({ uses: [] }),\n})\nexport type CanonicalDefinition = z.infer<typeof canonicalDefinitionSchema>\n\n/**\n * Deterministic serialization discipline: tables sorted by name, columns in\n * declaration order (order is meaningful for DDL), links/indexes/actions\n * sorted by name, object keys emitted in schema order. `serializeNamespace`\n * (authoring layer) and the server-side re-validation both normalize through\n * this function before hashing so CLI and server hash identical bytes.\n */\nexport function normalizeCanonical(definition: CanonicalDefinition): CanonicalDefinition {\n const sortByName = <T extends { name: string }>(items: T[]): T[] =>\n [...items].sort((a, b) => a.name.localeCompare(b.name))\n return {\n ...definition,\n enums: sortByName(definition.enums),\n tables: [...definition.tables]\n .sort((a, b) => a.table.localeCompare(b.table))\n .map((t) => ({\n ...t,\n links: sortByName(t.links),\n indexes: [...t.indexes].sort((a, b) =>\n (a.name ?? a.columns.join('_')).localeCompare(b.name ?? b.columns.join('_'))),\n actions: sortByName(t.actions),\n })),\n }\n}\n","/**\n * graphql-default (Hasura-style) camelCase naming for the v2 SDL generator.\n *\n * Verified against the bios marketplace corpus\n * (~/test/apps/marketplace/src/graphql, 871 ops):\n * - input types are singular PascalCase + suffix (`VideoClipBoolExp`,\n * `UserOrderBy`, `ProfileInsertInput`, `ThirdPartyIntegrationOnConflict`)\n * - roots keep the table's plurality camelCased (`videoClips`, `profileByPk`,\n * `profileAggregate`, `insertProfileOne`, `updateUserByPk`)\n * - order enum values: ASC / ASC_NULLS_FIRST / ... / DESC_NULLS_LAST\n * - SelectColumn / UpdateColumn enum values are camelCase field names\n * (`distinctOn: [role]`, `updateColumns: [sceneFile, buyerTagId]`)\n * - constraint enum values are raw Postgres constraint names\n * (`static_ad_pkey`, `audience_profile_id_name_key`)\n * - mutation args keep `_set` / `_append` / `_inc` underscores; everything\n * else camelCases (`pkColumns`, `updateColumns`, `distinctOn`,\n * `affectedRows`, `returning`)\n */\nimport { COLUMN_TYPES, type ColumnType } from '../canonical/v2.js'\n\n/** `deal_comments` → `dealComments`. Preserves already-camelCase input. */\nexport function camelCase(name: string): string {\n const segments = name.split('_').filter((segment) => segment.length > 0)\n const first = segments[0]\n if (first === undefined) return name\n const head = first.charAt(0).toLowerCase() + first.slice(1)\n return head + segments.slice(1).map(capitalizeFirst).join('')\n}\n\n/** `deal_comments` → `DealComments`. */\nexport function pascalCase(name: string): string {\n return capitalizeFirst(camelCase(name))\n}\n\nfunction capitalizeFirst(segment: string): string {\n return segment.charAt(0).toUpperCase() + segment.slice(1)\n}\n\n/**\n * Deterministic English-ish singularization of one word. Intentional,\n * documented misses exist (`statuses` → `statuse`): a full inflection engine\n * would make generated names depend on a dictionary. Ambiguous table names\n * are resolved by renaming the table (or a future explicit `graphqlName`\n * annotation), never by changing these rules — they are part of the wire\n * contract once a namespace ships.\n */\nfunction singularizeWord(word: string): string {\n if (word.endsWith('ies') && word.length > 3) return `${word.slice(0, -3)}y`\n for (const suffix of ['sses', 'xes', 'ches', 'shes']) {\n if (word.endsWith(suffix)) return word.slice(0, -2)\n }\n if (word.endsWith('ss')) return word\n if (word.endsWith('s') && word.length > 1) return word.slice(0, -1)\n return word\n}\n\n/** GraphQL object type name: `deal_comments` → `DealComment` (last word singularized). */\nexport function typeName(table: string): string {\n const segments = table.split('_').filter((segment) => segment.length > 0)\n const last = segments[segments.length - 1]\n if (last === undefined) return pascalCase(table)\n return [...segments.slice(0, -1), singularizeWord(last)].map(capitalizeFirst).join('')\n}\n\n/** Column → GraphQL field name: `author_sub` → `authorSub`. */\nexport function fieldName(column: string): string {\n return camelCase(column)\n}\n\n/** Postgres enum name → GraphQL enum type name: `deal_status` → `DealStatus`. */\nexport function enumTypeName(name: string): string {\n return pascalCase(name)\n}\n\n/** GraphQL type → comparison input name: `String` → `StringComparisonExp`, `uuid` → `UuidComparisonExp`. */\nexport function comparisonExpName(gqlTypeName: string): string {\n return `${capitalizeFirst(gqlTypeName)}ComparisonExp`\n}\n\n/** Maps the 10 canonical column types onto GraphQL scalar names. */\nconst SCALAR_FOR_COLUMN_TYPE: Record<ColumnType, string> = {\n uuid: 'uuid',\n text: 'String',\n integer: 'Int',\n bigint: 'bigint',\n numeric: 'numeric',\n double: 'Float',\n boolean: 'Boolean',\n timestamptz: 'timestamptz',\n date: 'date',\n jsonb: 'jsonb',\n}\n\nexport function graphqlScalarFor(type: ColumnType): string {\n return SCALAR_FOR_COLUMN_TYPE[type]\n}\n\n/**\n * GraphQL scalar name → canonical column type: the exact inverse of\n * SCALAR_FOR_COLUMN_TYPE plus the `ID` builtin (accepted as text). This is\n * the map the compiler's restrict pass classifies variable types with, so a\n * variable declared with a lowercase custom scalar exactly as the SDL\n * declares it (`$id: uuid!`, `$before: timestamptz`) resolves to the right\n * ColumnType — capitalized spellings (`Uuid`) are NOT names this schema\n * declares and never classify.\n */\nconst COLUMN_TYPE_BY_SCALAR: ReadonlyMap<string, ColumnType> = new Map<string, ColumnType>([\n ['ID', 'text'],\n ...COLUMN_TYPES.map((type): [string, ColumnType] => [graphqlScalarFor(type), type]),\n])\n\nexport function columnTypeForScalar(scalarName: string): ColumnType | undefined {\n return COLUMN_TYPE_BY_SCALAR.get(scalarName)\n}\n\n/** Every GraphQL scalar name usable as a variable type — for diagnostics. */\nexport const VARIABLE_SCALAR_NAMES: readonly string[] = [...COLUMN_TYPE_BY_SCALAR.keys()]\n\n/** The custom scalars every generated schema declares (plan §3). */\nexport const CUSTOM_SCALARS = ['bigint', 'date', 'jsonb', 'numeric', 'timestamptz', 'uuid'] as const\n\n/** Column types eligible for sum/avg aggregates and `_inc` updates. */\nexport const NUMERICISH_COLUMN_TYPES: readonly ColumnType[] = ['integer', 'bigint', 'numeric', 'double']\n\nexport const ORDER_BY_ENUM = 'OrderBy'\nexport const ORDER_BY_ENUM_VALUES = [\n 'ASC',\n 'ASC_NULLS_FIRST',\n 'ASC_NULLS_LAST',\n 'DESC',\n 'DESC_NULLS_FIRST',\n 'DESC_NULLS_LAST',\n] as const\n\n/** The built-in read-only platform users entity (plan §4b). */\nexport const PLATFORM_USER_TYPENAME = 'PlatformUser'\n\n/** Every generated GraphQL name derived from one table name. */\nexport interface TableNames {\n typename: string\n selectRoot: string\n byPkRoot: string\n aggregateRoot: string\n insertRoot: string\n insertOneRoot: string\n updateRoot: string\n updateByPkRoot: string\n deleteRoot: string\n deleteByPkRoot: string\n boolExp: string\n orderBy: string\n selectColumn: string\n insertInput: string\n setInput: string\n appendInput: string\n incInput: string\n onConflict: string\n pkColumnsInput: string\n constraintEnum: string\n updateColumnEnum: string\n mutationResponse: string\n aggregate: string\n aggregateFields: string\n sumFields: string\n avgFields: string\n aggregateBoolExp: string\n aggregateBoolExpCount: string\n}\n\nexport function tableNames(table: string): TableNames {\n const root = camelCase(table)\n const rootPascal = pascalCase(table)\n const type = typeName(table)\n return {\n typename: type,\n selectRoot: root,\n byPkRoot: `${root}ByPk`,\n aggregateRoot: `${root}Aggregate`,\n insertRoot: `insert${rootPascal}`,\n insertOneRoot: `insert${rootPascal}One`,\n updateRoot: `update${rootPascal}`,\n updateByPkRoot: `update${rootPascal}ByPk`,\n deleteRoot: `delete${rootPascal}`,\n deleteByPkRoot: `delete${rootPascal}ByPk`,\n boolExp: `${type}BoolExp`,\n orderBy: `${type}OrderBy`,\n selectColumn: `${type}SelectColumn`,\n insertInput: `${type}InsertInput`,\n setInput: `${type}SetInput`,\n appendInput: `${type}AppendInput`,\n incInput: `${type}IncInput`,\n onConflict: `${type}OnConflict`,\n pkColumnsInput: `${type}PkColumnsInput`,\n constraintEnum: `${type}Constraint`,\n updateColumnEnum: `${type}UpdateColumn`,\n mutationResponse: `${type}MutationResponse`,\n aggregate: `${type}Aggregate`,\n aggregateFields: `${type}AggregateFields`,\n sumFields: `${type}SumFields`,\n avgFields: `${type}AvgFields`,\n aggregateBoolExp: `${type}AggregateBoolExp`,\n aggregateBoolExpCount: `${type}AggregateBoolExpCount`,\n }\n}\n","/**\n * SDL generation (plan §3): pure `(canonical) → string`, offline and\n * byte-deterministic. The output is the schema consumers commit as\n * `schema.graphql` and point graphql-codegen at; the GraphQL→IR compiler\n * validates documents against the same SDL.\n *\n * Determinism discipline: the canonical definition is normalized\n * (`normalizeCanonical` — tables/links/indexes/enums sorted, columns kept in\n * declaration order), every derived collection is emitted in a fixed order,\n * and nothing time- or environment-dependent enters the output.\n */\nimport {\n canonicalDefinitionSchema,\n normalizeCanonical,\n type CanonicalColumn,\n type CanonicalDefinition,\n type CanonicalTable,\n type ColumnType,\n} from '../canonical/v2.js'\nimport {\n CUSTOM_SCALARS,\n NUMERICISH_COLUMN_TYPES,\n ORDER_BY_ENUM,\n ORDER_BY_ENUM_VALUES,\n PLATFORM_USER_TYPENAME,\n comparisonExpName,\n enumTypeName,\n fieldName,\n graphqlScalarFor,\n tableNames,\n type TableNames,\n} from './naming.js'\n\nexport class SdlGenerationError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'SdlGenerationError'\n }\n}\n\nexport interface GenerateSdlOptions {\n /**\n * Server-pinned columns per table (computed by the compiler from write\n * policies — a column referenced via claim comparison, e.g.\n * `author_sub = claim('sub')`, is stamped server-side on insert and must\n * not be client-suppliable). Pinned columns are excluded from\n * `<Type>InsertInput` only; they remain readable, filterable, orderable,\n * and settable. Entries match either the column's TS `name` or its\n * Postgres `columnName`.\n */\n pinnedColumns?: Record<string, string[]>\n}\n\nconst GRAPHQL_NAME_RE = /^[_A-Za-z][_0-9A-Za-z]*$/\nconst RESERVED_ENUM_VALUES = new Set(['true', 'false', 'null'])\n\nconst NUMERICISH = new Set<ColumnType>(NUMERICISH_COLUMN_TYPES)\n\n/** PlatformUser curated fields (plan §4b) in contract order. */\nconst PLATFORM_USER_FIELDS: ReadonlyArray<{ name: string; gqlType: string; nullable: boolean }> = [\n { name: 'sub', gqlType: 'String', nullable: false },\n { name: 'email', gqlType: 'String', nullable: true },\n { name: 'name', gqlType: 'String', nullable: true },\n { name: 'organization', gqlType: 'String', nullable: true },\n { name: 'role', gqlType: 'String', nullable: true },\n { name: 'managerId', gqlType: 'String', nullable: true },\n { name: 'accountEnabled', gqlType: 'Boolean', nullable: false },\n]\n\nexport function generateSdl(canonical: CanonicalDefinition, options: GenerateSdlOptions = {}): string {\n const def = normalizeCanonical(canonicalDefinitionSchema.parse(canonical))\n // Synced (`source: gold.*`) tables stay on the v1 REST path — excluded from SDL in v2.0.\n const tables = def.tables.filter((table) => table.source === undefined)\n if (tables.length === 0) {\n throw new SdlGenerationError(\n `Namespace \"${def.namespace}\" exposes no tables (synced tables are excluded from SDL in v2.0) — nothing to generate.`,\n )\n }\n for (const table of tables) {\n if (table.columns.length === 0) {\n throw new SdlGenerationError(`Table \"${table.table}\" has no columns — cannot generate an object type.`)\n }\n }\n\n const namesByTable = new Map<string, TableNames>(tables.map((table) => [table.table, tableNames(table.table)]))\n const enumByName = new Map(def.enums.map((entry) => [entry.name, entry]))\n\n const hasPlatformUser = tables.some((table) => table.links.some((link) => link.kind === 'toPlatformUser'))\n\n /** Enums actually referenced by an exposed column — declared-but-unused enums are omitted. */\n const usedEnums = new Set<string>()\n for (const table of tables) {\n for (const column of table.columns) {\n if (typeof column.type === 'object') {\n if (!enumByName.has(column.type.enum)) {\n throw new SdlGenerationError(\n `Column \"${table.table}.${column.columnName}\" references undeclared enum \"${column.type.enum}\".`,\n )\n }\n usedEnums.add(column.type.enum)\n }\n }\n }\n\n /** Tables reachable through a toMany link get an aggregate predicate input (count only, §4d). */\n const aggregateBoolExpTargets = new Set<string>()\n for (const table of tables) {\n for (const link of table.links) {\n if (link.kind === 'toMany' && link.target !== undefined && namesByTable.has(link.target)) {\n aggregateBoolExpTargets.add(link.target)\n }\n }\n }\n\n const usedComparisonScalars = new Set<string>()\n for (const table of tables) {\n for (const column of table.columns) {\n if (typeof column.type !== 'object') usedComparisonScalars.add(graphqlScalarFor(column.type))\n }\n }\n if (hasPlatformUser) {\n usedComparisonScalars.add('String')\n usedComparisonScalars.add('Boolean')\n }\n // Aggregate predicates compare counts: `predicate: IntComparisonExp!`.\n if (aggregateBoolExpTargets.size > 0) usedComparisonScalars.add('Int')\n\n const blocks: string[] = []\n\n blocks.push(\n `# Generated by @sequenceholdings/orm — GraphQL SDL for namespace \"${def.namespace}\".\\n` +\n '# Do not edit: regenerate with `seq-studio orm generate`.',\n )\n\n blocks.push('directive @include(if: Boolean!) on FIELD | FRAGMENT_SPREAD | INLINE_FRAGMENT')\n blocks.push(\n '\"\"\"Gates an operation behind a platform capability or custom role — checked by the data plane before execution.\"\"\"\\n' +\n 'directive @requires(capability: String, role: String) on QUERY | MUTATION',\n )\n blocks.push('directive @skip(if: Boolean!) on FIELD | FRAGMENT_SPREAD | INLINE_FRAGMENT')\n\n for (const scalar of CUSTOM_SCALARS) blocks.push(`scalar ${scalar}`)\n\n blocks.push(renderEnum(ORDER_BY_ENUM, [...ORDER_BY_ENUM_VALUES]))\n\n for (const enumName of [...usedEnums].sort()) {\n const entry = enumByName.get(enumName)\n if (!entry) continue\n for (const value of entry.values) assertEnumValue(value, `enum \"${enumName}\"`)\n blocks.push(renderEnum(enumTypeName(enumName), entry.values))\n }\n\n for (const scalar of [...usedComparisonScalars].sort()) {\n blocks.push(renderComparisonExp(scalar))\n }\n for (const enumName of [...usedEnums].sort()) {\n blocks.push(renderComparisonExp(enumTypeName(enumName)))\n }\n\n if (hasPlatformUser) blocks.push(...renderPlatformUserBlocks())\n\n for (const table of tables) {\n const names = namesByTable.get(table.table)\n if (!names) continue\n blocks.push(\n ...renderTableBlocks({\n table,\n names,\n namesByTable,\n emitAggregateBoolExp: aggregateBoolExpTargets.has(table.table),\n pinned: options.pinnedColumns?.[table.table] ?? [],\n }),\n )\n }\n\n blocks.push(renderQueryRoot(tables, namesByTable))\n\n const mutationRoot = renderMutationRoot(tables, namesByTable)\n if (mutationRoot !== null) blocks.push(mutationRoot)\n\n return `${blocks.join('\\n\\n')}\\n`\n}\n\n// ---------------------------------------------------------------------------\n// Rendering helpers\n// ---------------------------------------------------------------------------\n\nfunction assertEnumValue(value: string, context: string): void {\n if (!GRAPHQL_NAME_RE.test(value) || RESERVED_ENUM_VALUES.has(value)) {\n throw new SdlGenerationError(\n `Value \"${value}\" in ${context} is not a valid GraphQL enum value (must match ${GRAPHQL_NAME_RE} and not be true/false/null).`,\n )\n }\n}\n\nfunction renderEnum(name: string, values: readonly string[]): string {\n return `enum ${name} {\\n${values.map((value) => ` ${value}`).join('\\n')}\\n}`\n}\n\n/** `\"\"\"…\"\"\"` description block lines, with embedded triple-quotes escaped. */\nfunction descriptionLines(text: string, indent: string): string[] {\n const escaped = text.replace(/\"\"\"/g, '\\\\\"\"\"')\n return [`${indent}\"\"\"`, ...escaped.split('\\n').map((line) => `${indent}${line}`), `${indent}\"\"\"`]\n}\n\n/**\n * Comparison input for one GraphQL type. Uniform base operator set, plus\n * `_like`/`_ilike` on String and `_contains`/`_hasKey` on jsonb (§4d).\n * Fields sort alphabetically for byte determinism.\n */\nfunction renderComparisonExp(gqlTypeName: string): string {\n const fields: Array<[string, string]> = [\n ['_eq', gqlTypeName],\n ['_neq', gqlTypeName],\n ['_gt', gqlTypeName],\n ['_gte', gqlTypeName],\n ['_lt', gqlTypeName],\n ['_lte', gqlTypeName],\n ['_in', `[${gqlTypeName}!]`],\n ['_nin', `[${gqlTypeName}!]`],\n ['_isNull', 'Boolean'],\n ]\n if (gqlTypeName === 'String') {\n fields.push(['_like', 'String'], ['_ilike', 'String'])\n }\n if (gqlTypeName === 'jsonb') {\n fields.push(['_contains', 'jsonb'], ['_hasKey', 'String'])\n }\n fields.sort(([a], [b]) => a.localeCompare(b))\n const body = fields.map(([field, type]) => ` ${field}: ${type}`).join('\\n')\n return `input ${comparisonExpName(gqlTypeName)} {\\n${body}\\n}`\n}\n\nfunction renderPlatformUserBlocks(): string[] {\n const typeFields = PLATFORM_USER_FIELDS.map(\n (field) => ` ${field.name}: ${field.gqlType}${field.nullable ? '' : '!'}`,\n ).join('\\n')\n const boolExpName = `${PLATFORM_USER_TYPENAME}BoolExp`\n const boolFields = [\n ` _and: [${boolExpName}!]`,\n ` _not: ${boolExpName}`,\n ` _or: [${boolExpName}!]`,\n ...PLATFORM_USER_FIELDS.map((field) => ` ${field.name}: ${comparisonExpName(field.gqlType)}`),\n ].join('\\n')\n const orderFields = PLATFORM_USER_FIELDS.map((field) => ` ${field.name}: ${ORDER_BY_ENUM}`).join('\\n')\n return [\n '\"\"\"Curated read-only view over platform users (plan §4b) — reachable only through `toPlatformUser` links.\"\"\"\\n' +\n `type ${PLATFORM_USER_TYPENAME} {\\n${typeFields}\\n}`,\n `input ${boolExpName} {\\n${boolFields}\\n}`,\n `input ${PLATFORM_USER_TYPENAME}OrderBy {\\n${orderFields}\\n}`,\n ]\n}\n\ninterface TableRenderContext {\n table: CanonicalTable\n names: TableNames\n namesByTable: Map<string, TableNames>\n emitAggregateBoolExp: boolean\n pinned: string[]\n}\n\n/** `where/orderBy/limit/offset` args for a to-many relation field. */\nfunction relationArgs(target: TableNames): string {\n return `where: ${target.boolExp}, orderBy: [${target.orderBy}!], limit: Int, offset: Int`\n}\n\n/** Root select/aggregate args — relations plus `distinctOn`. */\nfunction rootArgs(names: TableNames): string {\n return `where: ${names.boolExp}, orderBy: [${names.orderBy}!], distinctOn: [${names.selectColumn}!], limit: Int, offset: Int`\n}\n\n/** Resolve the PK identifiers to canonical columns (throws on a dangling reference). */\nfunction primaryKeyColumns(table: CanonicalTable): CanonicalColumn[] {\n if (!table.primaryKey || table.primaryKey.length === 0) return []\n return table.primaryKey.map((identifier) => {\n const column = table.columns.find((c) => c.columnName === identifier || c.name === identifier)\n if (!column) {\n throw new SdlGenerationError(`Primary key column \"${identifier}\" not found on table \"${table.table}\".`)\n }\n return column\n })\n}\n\nfunction pkArgs(table: CanonicalTable, ctx: TableRenderContext): string {\n return primaryKeyColumns(table)\n .map((column) => `${fieldName(column.name)}: ${columnGqlTypeOf(table, column)}!`)\n .join(', ')\n}\n\nfunction renderTableBlocks(ctx: TableRenderContext): string[] {\n const { table, names } = ctx\n const blocks: string[] = [\n renderObjectType(ctx),\n renderSelectColumnEnum(ctx),\n renderOrderByInput(ctx),\n renderBoolExp(ctx),\n ...renderAggregateTypes(ctx),\n ]\n if (ctx.emitAggregateBoolExp) blocks.push(...renderAggregateBoolExp(ctx))\n\n const pk = primaryKeyColumns(table)\n if (pk.length > 0) {\n const fields = pk\n .map((column) => ` ${fieldName(column.name)}: ${columnGqlTypeOf(table, column)}!`)\n .join('\\n')\n blocks.push(`input ${names.pkColumnsInput} {\\n${fields}\\n}`)\n }\n\n if (isWritable(table)) blocks.push(...renderWriteBlocks(ctx))\n return blocks\n}\n\nfunction isWritable(table: CanonicalTable): boolean {\n return table.policies.write !== undefined\n}\n\nfunction renderObjectType(ctx: TableRenderContext): string {\n const { table, names } = ctx\n const lines: string[] = []\n if (table.description !== undefined) lines.push(...descriptionLines(table.description, ''))\n lines.push(`type ${names.typename} {`)\n for (const column of table.columns) {\n if (column.description !== undefined) lines.push(...descriptionLines(column.description, ' '))\n const bang = column.nullable ? '' : '!'\n const deprecated = column.deprecated ? ' @deprecated' : ''\n lines.push(` ${fieldName(column.name)}: ${columnGqlTypeOf(table, column)}${bang}${deprecated}`)\n }\n for (const link of table.links) {\n if (link.description !== undefined) lines.push(...descriptionLines(link.description, ' '))\n if (link.kind === 'toPlatformUser') {\n lines.push(` ${fieldName(link.name)}: ${PLATFORM_USER_TYPENAME}`)\n continue\n }\n // A link may target a synced/excluded table (valid in policies) — SDL skips it.\n const target = link.target !== undefined ? ctx.namesByTable.get(link.target) : undefined\n if (!target) continue\n if (link.kind === 'toOne') {\n lines.push(` ${fieldName(link.name)}: ${target.typename}`)\n } else {\n lines.push(` ${fieldName(link.name)}(${relationArgs(target)}): [${target.typename}!]!`)\n lines.push(` ${fieldName(link.name)}Aggregate(${relationArgs(target)}): ${target.aggregate}!`)\n }\n }\n lines.push('}')\n return lines.join('\\n')\n}\n\nfunction renderSelectColumnEnum(ctx: TableRenderContext): string {\n const values = ctx.table.columns.map((column) => fieldName(column.name))\n for (const value of values) assertEnumValue(value, `select-column enum for table \"${ctx.table.table}\"`)\n return renderEnum(ctx.names.selectColumn, values)\n}\n\nfunction renderOrderByInput(ctx: TableRenderContext): string {\n const { table, names } = ctx\n const lines = table.columns.map((column) => ` ${fieldName(column.name)}: ${ORDER_BY_ENUM}`)\n for (const link of table.links) {\n if (link.kind === 'toPlatformUser') {\n lines.push(` ${fieldName(link.name)}: ${PLATFORM_USER_TYPENAME}OrderBy`)\n } else if (link.kind === 'toOne' && link.target !== undefined) {\n const target = ctx.namesByTable.get(link.target)\n if (target) lines.push(` ${fieldName(link.name)}: ${target.orderBy}`)\n }\n // to-many ordering is not part of the v1 grammar (plan §4e: to-one only).\n }\n return `input ${names.orderBy} {\\n${lines.join('\\n')}\\n}`\n}\n\nfunction renderBoolExp(ctx: TableRenderContext): string {\n const { table, names } = ctx\n const lines: string[] = [\n ` _and: [${names.boolExp}!]`,\n ` _not: ${names.boolExp}`,\n ` _or: [${names.boolExp}!]`,\n ]\n for (const column of table.columns) {\n lines.push(` ${fieldName(column.name)}: ${comparisonExpName(columnGqlTypeOf(table, column))}`)\n }\n for (const link of table.links) {\n if (link.kind === 'toPlatformUser') {\n lines.push(` ${fieldName(link.name)}: ${PLATFORM_USER_TYPENAME}BoolExp`)\n continue\n }\n const target = link.target !== undefined ? ctx.namesByTable.get(link.target) : undefined\n if (!target) continue\n lines.push(` ${fieldName(link.name)}: ${target.boolExp}`)\n if (link.kind === 'toMany') {\n lines.push(` ${fieldName(link.name)}Aggregate: ${target.aggregateBoolExp}`)\n }\n }\n return `input ${names.boolExp} {\\n${lines.join('\\n')}\\n}`\n}\n\nfunction numericishColumns(table: CanonicalTable): CanonicalColumn[] {\n return table.columns.filter((column) => typeof column.type !== 'object' && NUMERICISH.has(column.type))\n}\n\nfunction jsonbColumns(table: CanonicalTable): CanonicalColumn[] {\n return table.columns.filter((column) => column.type === 'jsonb')\n}\n\nfunction renderAggregateTypes(ctx: TableRenderContext): string[] {\n const { table, names } = ctx\n const numericish = numericishColumns(table)\n const blocks: string[] = []\n blocks.push(\n `type ${names.aggregate} {\\n aggregate: ${names.aggregateFields}\\n nodes: [${names.typename}!]!\\n}`,\n )\n const fieldLines = [` count(columns: [${names.selectColumn}!], distinct: Boolean): Int!`]\n if (numericish.length > 0) {\n fieldLines.push(` avg: ${names.avgFields}`)\n fieldLines.push(` sum: ${names.sumFields}`)\n }\n blocks.push(`type ${names.aggregateFields} {\\n${fieldLines.join('\\n')}\\n}`)\n if (numericish.length > 0) {\n const avgLines = numericish.map((column) => ` ${fieldName(column.name)}: Float`)\n blocks.push(`type ${names.avgFields} {\\n${avgLines.join('\\n')}\\n}`)\n const sumLines = numericish.map((column) => ` ${fieldName(column.name)}: ${columnGqlTypeOf(table, column)}`)\n blocks.push(`type ${names.sumFields} {\\n${sumLines.join('\\n')}\\n}`)\n }\n return blocks\n}\n\n/** Hasura-parity aggregate predicate input — count only in v1 (§4d). */\nfunction renderAggregateBoolExp(ctx: TableRenderContext): string[] {\n const { names } = ctx\n return [\n `input ${names.aggregateBoolExp} {\\n count: ${names.aggregateBoolExpCount}\\n}`,\n `input ${names.aggregateBoolExpCount} {\\n` +\n ` arguments: [${names.selectColumn}!]\\n` +\n ' distinct: Boolean\\n' +\n ` filter: ${names.boolExp}\\n` +\n ' predicate: IntComparisonExp!\\n}',\n ]\n}\n\n/** Postgres constraint names selectable in `onConflict` — PK + unique indexes/columns. */\nfunction constraintValues(table: CanonicalTable): string[] {\n const values = new Set<string>()\n if (table.primaryKey && table.primaryKey.length > 0) values.add(`${table.table}_pkey`)\n for (const column of table.columns) {\n if (column.unique) values.add(`${table.table}_${column.columnName}_key`)\n }\n for (const index of table.indexes) {\n if (index.unique) values.add(index.name ?? `${table.table}_${index.columns.join('_')}_key`)\n }\n return [...values].sort()\n}\n\nfunction renderWriteBlocks(ctx: TableRenderContext): string[] {\n const { table, names, pinned } = ctx\n const blocks: string[] = []\n\n const pinnedSet = new Set(pinned)\n const insertable = table.columns.filter(\n (column) => !pinnedSet.has(column.name) && !pinnedSet.has(column.columnName),\n )\n if (insertable.length === 0) {\n throw new SdlGenerationError(\n `Table \"${table.table}\" has no insertable columns after excluding pinned columns [${pinned.join(', ')}].`,\n )\n }\n // Insert-input fields are all nullable (Hasura parity) — column defaults and\n // server-pinned values fill the gaps; NOT NULL is enforced by Postgres.\n const insertLines = insertable.map(\n (column) => ` ${fieldName(column.name)}: ${columnGqlTypeOf(table, column)}`,\n )\n blocks.push(`input ${names.insertInput} {\\n${insertLines.join('\\n')}\\n}`)\n\n const setLines = table.columns.map(\n (column) => ` ${fieldName(column.name)}: ${columnGqlTypeOf(table, column)}`,\n )\n blocks.push(`input ${names.setInput} {\\n${setLines.join('\\n')}\\n}`)\n\n const jsonb = jsonbColumns(table)\n if (jsonb.length > 0) {\n const appendLines = jsonb.map((column) => ` ${fieldName(column.name)}: jsonb`)\n blocks.push(`input ${names.appendInput} {\\n${appendLines.join('\\n')}\\n}`)\n }\n\n const numericish = numericishColumns(table)\n if (numericish.length > 0) {\n const incLines = numericish.map(\n (column) => ` ${fieldName(column.name)}: ${columnGqlTypeOf(table, column)}`,\n )\n blocks.push(`input ${names.incInput} {\\n${incLines.join('\\n')}\\n}`)\n }\n\n const constraints = constraintValues(table)\n if (constraints.length > 0) {\n for (const value of constraints) assertEnumValue(value, `constraint enum for table \"${table.table}\"`)\n blocks.push(renderEnum(names.constraintEnum, constraints))\n const updateColumns = table.columns.map((column) => fieldName(column.name))\n blocks.push(renderEnum(names.updateColumnEnum, updateColumns))\n blocks.push(\n `input ${names.onConflict} {\\n` +\n ` constraint: ${names.constraintEnum}!\\n` +\n ` updateColumns: [${names.updateColumnEnum}!]! = []\\n` +\n ` where: ${names.boolExp}\\n}`,\n )\n }\n\n blocks.push(\n `type ${names.mutationResponse} {\\n affectedRows: Int!\\n returning: [${names.typename}!]!\\n}`,\n )\n return blocks\n}\n\nfunction renderQueryRoot(tables: CanonicalTable[], namesByTable: Map<string, TableNames>): string {\n const lines: string[] = ['type Query {']\n for (const table of tables) {\n const names = namesByTable.get(table.table)\n if (!names) continue\n lines.push(` ${names.selectRoot}(${rootArgs(names)}): [${names.typename}!]!`)\n const pk = primaryKeyColumns(table)\n if (pk.length > 0) {\n const args = pk\n .map((column) => `${fieldName(column.name)}: ${columnGqlTypeOf(table, column)}!`)\n .join(', ')\n lines.push(` ${names.byPkRoot}(${args}): ${names.typename}`)\n }\n lines.push(` ${names.aggregateRoot}(${rootArgs(names)}): ${names.aggregate}!`)\n }\n lines.push('}')\n return lines.join('\\n')\n}\n\nfunction columnGqlTypeOf(table: CanonicalTable, column: CanonicalColumn): string {\n return typeof column.type === 'object' ? enumTypeName(column.type.enum) : graphqlScalarFor(column.type)\n}\n\nfunction renderMutationRoot(tables: CanonicalTable[], namesByTable: Map<string, TableNames>): string | null {\n const lines: string[] = []\n for (const table of tables) {\n if (!isWritable(table)) continue\n const names = namesByTable.get(table.table)\n if (!names) continue\n const constraints = constraintValues(table)\n const onConflictArg = constraints.length > 0 ? `, onConflict: ${names.onConflict}` : ''\n const updateArgs = [`_set: ${names.setInput}`]\n if (jsonbColumns(table).length > 0) updateArgs.push(`_append: ${names.appendInput}`)\n if (numericishColumns(table).length > 0) updateArgs.push(`_inc: ${names.incInput}`)\n const updateArgList = updateArgs.join(', ')\n\n lines.push(` ${names.insertRoot}(objects: [${names.insertInput}!]!${onConflictArg}): ${names.mutationResponse}`)\n lines.push(` ${names.insertOneRoot}(object: ${names.insertInput}!${onConflictArg}): ${names.typename}`)\n lines.push(` ${names.updateRoot}(where: ${names.boolExp}!, ${updateArgList}): ${names.mutationResponse}`)\n const pk = primaryKeyColumns(table)\n if (pk.length > 0) {\n lines.push(\n ` ${names.updateByPkRoot}(pkColumns: ${names.pkColumnsInput}!, ${updateArgList}): ${names.typename}`,\n )\n }\n lines.push(` ${names.deleteRoot}(where: ${names.boolExp}!): ${names.mutationResponse}`)\n if (pk.length > 0) {\n const args = pk\n .map((column) => `${fieldName(column.name)}: ${columnGqlTypeOf(table, column)}!`)\n .join(', ')\n lines.push(` ${names.deleteByPkRoot}(${args}): ${names.typename}`)\n }\n }\n if (lines.length === 0) return null\n return `type Mutation {\\n${lines.join('\\n')}\\n}`\n}\n","import { createHash } from 'node:crypto'\nimport { HASH_DOMAIN } from './constants.js'\nimport type { NamespaceCapabilities, NamespaceDefinition } from './schema/namespace.js'\nimport type { TableFile } from './schema/table.js'\n\ntype JsonValue = string | number | boolean | null | JsonValue[] | { [key: string]: JsonValue }\n\n/** `Object.entries` widens Zod record values to `unknown` under tsup's DTS check. */\ntype RoleDefinition = NonNullable<NamespaceCapabilities['roles']['definitions'][string]>\ntype CapabilityDeclaration = NonNullable<NamespaceCapabilities['roles']['capabilities'][string]>\n\n/** Key-sorted, undefined-skipped JSON — identical definitions hash identically regardless of YAML key order. */\nexport function stableJson(value: unknown): string {\n if (value === null || typeof value !== 'object') return JSON.stringify(value)\n if (Array.isArray(value)) return `[${value.map(stableJson).join(',')}]`\n const entries = Object.entries(value as Record<string, unknown>)\n .filter(([, entryValue]) => entryValue !== undefined)\n .sort(([a], [b]) => (a < b ? -1 : 1))\n .map(([key, entryValue]) => `${JSON.stringify(key)}:${stableJson(entryValue)}`)\n return `{${entries.join(',')}}`\n}\n\n/** Empty collections hash as omitted — `indexes: []` and no indexes are the same definition. */\nfunction emptyToNull(value: unknown): JsonValue {\n if (value == null) return null\n if (Array.isArray(value)) return value.length === 0 ? null : (value as JsonValue)\n if (typeof value === 'object' && Object.keys(value).length === 0) return null\n return value as JsonValue\n}\n\n/** Predicates hash by their source text; parsed ASTs are derived and excluded. */\nfunction canonicalTable(table: TableFile): JsonValue {\n return {\n table: table.table,\n description: table.description ?? null,\n columns: (table.columns ?? null) as JsonValue,\n source: table.source ?? null,\n links: emptyToNull(table.links),\n indexes: emptyToNull(table.indexes),\n policies: {\n read: table.policies?.read?.source ?? null,\n write: table.policies?.write?.source ?? null,\n },\n actions: emptyToNull(\n Object.fromEntries(\n Object.entries(table.actions ?? {}).map(([name, action]) => [\n name,\n {\n description: action.description ?? null,\n requires: action.requires?.source ?? null,\n params: emptyToNull(action.params),\n validates: emptyToNull(action.validates?.map((entry) => entry.source)),\n executes: action.executes,\n returns: emptyToNull(action.returns),\n audit: (action.audit ?? null) as JsonValue,\n },\n ]),\n ),\n ),\n }\n}\n\n/**\n * The capabilities block, canonicalized: record keys sort via stableJson, and\n * we sort every array (uses, each role's inherits/grants) so authoring order\n * never changes the hash. Absent optional descriptions are omitted, not null,\n * so the canonical block round-trips back through the manifest schema. An empty\n * block hashes as omitted — \"no capabilities\" and an empty block are the same.\n */\nfunction canonicalCapabilities(capabilities: NamespaceCapabilities): JsonValue {\n const { definitions, capabilities: declared } = capabilities.roles\n const isEmpty =\n Object.keys(definitions).length === 0 && Object.keys(declared).length === 0 && capabilities.uses.length === 0\n if (isEmpty) return null\n // JSON-safe by construction (omitted optionals are dropped by stableJson); the\n // conditional spreads defeat structural inference, so assert the JsonValue shape.\n return {\n roles: {\n definitions: Object.fromEntries(\n (Object.entries(definitions) as [string, RoleDefinition][]).map(([key, def]) => [\n key,\n {\n ...(def.description !== undefined ? { description: def.description } : {}),\n default: def.default,\n inherits: [...def.inherits].sort(),\n grants: [...def.grants].sort(),\n },\n ]),\n ),\n capabilities: Object.fromEntries(\n (Object.entries(declared) as [string, CapabilityDeclaration][]).map(([key, cap]) => [\n key,\n cap.description !== undefined ? { description: cap.description } : {},\n ]),\n ),\n },\n uses: [...capabilities.uses].sort(),\n } as JsonValue\n}\n\nexport function canonicalizeDefinition(definition: NamespaceDefinition): JsonValue {\n return {\n namespace: definition.namespace,\n description: definition.description,\n capabilities: canonicalCapabilities(definition.capabilities),\n tables: definition.tables.map(canonicalTable),\n }\n}\n\nexport function computeDefinitionHash(definition: NamespaceDefinition): string {\n return createHash('sha256')\n .update(HASH_DOMAIN)\n .update(stableJson(canonicalizeDefinition(definition)))\n .digest('hex')\n}\n","/** Errors raised by the v2 client-codegen surface (manifest + generated sources). */\nexport class CodegenGqlError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'CodegenGqlError'\n }\n}\n","/**\n * `operations.manifest.json` (plan §7): the client-side registry of compiled\n * operations written by `orm generate` alongside `schema.graphql`. The Apollo\n * link / `executeOperation` resolve an operation NAME to its `opHash` here —\n * the wire carries only `{op: <hash>, variables}`, never document text.\n *\n * `opsHash` identifies the operation set (plan §6: document edits mint a new\n * ops hash, never a migration) and is computed over the sorted operation\n * entries, independent of input order.\n */\nimport { createHash } from 'node:crypto'\nimport { z } from 'zod'\nimport { stableJson } from '../hash.js'\nimport { CodegenGqlError } from './errors.js'\n\nexport const MANIFEST_VERSION = 1 as const\n\n/** Same grammar the IR contract enforces for `opHash` (frozen, plan §4). */\nconst OP_HASH_RE = /^sha256:[0-9a-f]{64}$/\nconst GRAPHQL_NAME_RE = /^[_A-Za-z][_0-9A-Za-z]*$/\n\nexport const manifestRequiresSchema = z\n .object({\n capability: z.string().min(1).optional(),\n role: z.string().min(1).optional(),\n })\n .nullable()\n\nexport const manifestOperationSchema = z.object({\n hash: z.string().regex(OP_HASH_RE),\n kind: z.enum(['query', 'mutation', 'action']),\n requires: manifestRequiresSchema,\n})\n\nexport const operationsManifestSchema = z.object({\n manifestVersion: z.literal(MANIFEST_VERSION),\n schemaHash: z.string().min(1),\n opsHash: z.string().regex(OP_HASH_RE),\n operations: z.record(z.string().regex(GRAPHQL_NAME_RE), manifestOperationSchema),\n})\nexport type OperationsManifest = z.infer<typeof operationsManifestSchema>\nexport type ManifestOperation = z.infer<typeof manifestOperationSchema>\n\nexport interface ManifestOperationInput {\n /** Operation name as authored in the document (the registry identity). */\n name: string\n /** Compiled op hash (`sha256:<64 hex>` — the wire selector). */\n hash: string\n kind: 'query' | 'mutation' | 'action'\n /** `@requires` gate; absent/empty normalizes to null. */\n requires?: { capability?: string; role?: string } | null\n}\n\nexport function buildOperationsManifest({\n schemaHash,\n operations,\n}: {\n schemaHash: string\n operations: ManifestOperationInput[]\n}): OperationsManifest {\n if (schemaHash.length === 0) throw new CodegenGqlError('schemaHash must be a non-empty string.')\n\n const sorted = [...operations].sort((a, b) => a.name.localeCompare(b.name))\n const seen = new Set<string>()\n const entries = sorted.map((op) => {\n if (!GRAPHQL_NAME_RE.test(op.name)) {\n throw new CodegenGqlError(`Operation name \"${op.name}\" is not a valid GraphQL name.`)\n }\n if (seen.has(op.name)) {\n throw new CodegenGqlError(`Duplicate operation name \"${op.name}\" — operation names must be unique per namespace.`)\n }\n seen.add(op.name)\n if (!OP_HASH_RE.test(op.hash)) {\n throw new CodegenGqlError(`Operation \"${op.name}\" has malformed hash \"${op.hash}\" (expected sha256:<64 hex>).`)\n }\n return { name: op.name, hash: op.hash, kind: op.kind, requires: normalizeRequires(op.requires) }\n })\n\n const opsHash = `sha256:${createHash('sha256').update(stableJson(entries)).digest('hex')}`\n\n const operationsRecord: Record<string, ManifestOperation> = {}\n for (const entry of entries) {\n operationsRecord[entry.name] = { hash: entry.hash, kind: entry.kind, requires: entry.requires }\n }\n\n return {\n manifestVersion: MANIFEST_VERSION,\n schemaHash,\n opsHash,\n operations: operationsRecord,\n }\n}\n\nfunction normalizeRequires(\n requires: ManifestOperationInput['requires'],\n): { capability?: string; role?: string } | null {\n if (requires === undefined || requires === null) return null\n const normalized: { capability?: string; role?: string } = {}\n if (requires.capability !== undefined) normalized.capability = requires.capability\n if (requires.role !== undefined) normalized.role = requires.role\n return normalized.capability === undefined && normalized.role === undefined ? null : normalized\n}\n","/**\n * `typePolicies.gen.ts` generation (plan §7): Apollo InMemoryCache key fields\n * derived from primary keys (composite included), so persisted-operation\n * responses normalize identically to the bios Apollo setup.\n */\nimport { canonicalDefinitionSchema, normalizeCanonical, type CanonicalDefinition } from '../canonical/v2.js'\nimport { PLATFORM_USER_TYPENAME, fieldName, tableNames } from '../sdl/naming.js'\nimport { CodegenGqlError } from './errors.js'\n\n/** Returns the TypeScript SOURCE of the consumer's `typePolicies.gen.ts`. */\nexport function generateTypePolicies(canonical: CanonicalDefinition): string {\n const def = normalizeCanonical(canonicalDefinitionSchema.parse(canonical))\n const entries: Array<{ typename: string; keyFields: string[] }> = []\n let hasPlatformUser = false\n\n for (const table of def.tables) {\n // Synced tables are excluded from the GraphQL surface (mirrors generateSdl).\n if (table.source !== undefined) continue\n if (table.links.some((link) => link.kind === 'toPlatformUser')) hasPlatformUser = true\n if (!table.primaryKey || table.primaryKey.length === 0) continue\n const keyFields = table.primaryKey.map((identifier) => {\n const column = table.columns.find((c) => c.columnName === identifier || c.name === identifier)\n if (!column) {\n throw new CodegenGqlError(`Primary key column \"${identifier}\" not found on table \"${table.table}\".`)\n }\n return fieldName(column.name)\n })\n entries.push({ typename: tableNames(table.table).typename, keyFields })\n }\n\n if (hasPlatformUser) entries.push({ typename: PLATFORM_USER_TYPENAME, keyFields: ['sub'] })\n entries.sort((a, b) => a.typename.localeCompare(b.typename))\n\n const body = entries\n .map((entry) => ` ${entry.typename}: { keyFields: [${entry.keyFields.map((key) => `'${key}'`).join(', ')}] },`)\n .join('\\n')\n\n return (\n '/* Generated by @sequenceholdings/orm — Apollo cache type policies. Do not edit. */\\n' +\n \"import type { TypePolicies } from '@apollo/client'\\n\\n\" +\n `export const typePolicies: TypePolicies = {\\n${body}\\n}\\n`\n )\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sequenceholdings/orm",
3
- "version": "0.1.1",
3
+ "version": "0.1.2",
4
4
  "description": "Sequence ORM — YAML-defined OpCo tables compiled to Postgres + RLS, with a typed Data API client",
5
5
  "license": "UNLICENSED",
6
6
  "repository": {
@@ -31,17 +31,50 @@
31
31
  "types": "./dist/client.d.ts",
32
32
  "import": "./dist/client.js",
33
33
  "require": "./dist/client.cjs"
34
- }
34
+ },
35
+ "./ir": {
36
+ "types": "./dist/ir.d.ts",
37
+ "import": "./dist/ir.js",
38
+ "require": "./dist/ir.cjs"
39
+ },
40
+ "./canonical": {
41
+ "types": "./dist/canonical.d.ts",
42
+ "import": "./dist/canonical.js",
43
+ "require": "./dist/canonical.cjs"
44
+ },
45
+ "./compiler": {
46
+ "types": "./dist/compiler.d.ts",
47
+ "import": "./dist/compiler.js",
48
+ "require": "./dist/compiler.cjs"
49
+ },
50
+ "./sdl": {
51
+ "types": "./dist/sdl.d.ts",
52
+ "import": "./dist/sdl.js",
53
+ "require": "./dist/sdl.cjs"
54
+ },
55
+ "./authoring": {
56
+ "types": "./dist/authoring.d.ts",
57
+ "import": "./dist/authoring.js",
58
+ "require": "./dist/authoring.cjs"
59
+ },
60
+ "./codegen/apollo-hooks": "./src/codegen-gql/apollo-hooks.cjs",
61
+ "./codegen/server-fns": "./src/codegen-gql/server-fns.cjs"
35
62
  },
36
63
  "files": [
37
64
  "dist",
65
+ "src/codegen-gql/apollo-hooks.cjs",
66
+ "src/codegen-gql/server-fns.cjs",
67
+ "templates",
38
68
  "README.md"
39
69
  ],
40
70
  "dependencies": {
71
+ "graphql": "^16.11.0",
72
+ "jiti": "^2.4.2",
41
73
  "drizzle-kit": "^0.31.9",
42
74
  "drizzle-orm": "^0.45.2",
43
75
  "js-yaml": "^4.1.1",
44
- "zod": "^4.1.13"
76
+ "zod": "^4.1.13",
77
+ "@sequenceholdings/custom-roles-manifest": "0.1.0"
45
78
  },
46
79
  "devDependencies": {
47
80
  "@types/js-yaml": "^4.0.9",
@@ -0,0 +1,98 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * graphql-codegen plugin — Apollo hook factories for v2 ORM operations.
5
+ *
6
+ * Output byte-matches the bios reference plugin (`codegen-apollo-hooks.js`):
7
+ * `use<Name>Query` / `use<Name>LazyQuery` / `use<Name>SuspenseQuery` /
8
+ * `use<Name>BackgroundQuery` per query, `use<Name>Mutation` per mutation, and
9
+ * `use<Name>Fragment` per fragment definition. Runs after the standard
10
+ * `typescript` / `typescript-operations` / `typed-document-node` plugins in
11
+ * the same output file, so `<Name>Query` / `<Name>QueryVariables` /
12
+ * `<Name>Document` are in scope.
13
+ *
14
+ * Deviation from the reference: no subscription hooks — the v2 compiler
15
+ * rejects subscription documents (plan: not in v1), and unnamed operations
16
+ * are skipped instead of crashing.
17
+ */
18
+
19
+ const apolloImport = "import * as Apollo from '@apollo/client';";
20
+
21
+ function generateOperationHook(type, name) {
22
+ const operationName = capitalize(name);
23
+ if (type === 'query') {
24
+ return `export const use${operationName}Query = (options?: Apollo.QueryHookOptions<${operationName}Query, ${operationName}QueryVariables>) => {
25
+ return Apollo.useQuery<${operationName}Query, ${operationName}QueryVariables>(${operationName}Document, options);
26
+ };
27
+ export const use${operationName}LazyQuery = (options?: Apollo.LazyQueryHookOptions<${operationName}Query, ${operationName}QueryVariables>) => {
28
+ return Apollo.useLazyQuery(${operationName}Document, options);
29
+ };
30
+
31
+ export const use${operationName}SuspenseQuery = (options?: Apollo.SuspenseQueryHookOptions<${operationName}Query, ${operationName}QueryVariables>) => {
32
+ return Apollo.useSuspenseQuery(${operationName}Document, options);
33
+ };
34
+
35
+ export const use${operationName}BackgroundQuery = (options?: Apollo.BackgroundQueryHookOptions<${operationName}Query, ${operationName}QueryVariables>) => {
36
+ return Apollo.useBackgroundQuery(${operationName}Document, options);
37
+ };
38
+ `;
39
+ } else if (type === 'mutation') {
40
+ return `export const use${operationName}Mutation = (options?: Apollo.MutationHookOptions<${operationName}Mutation, ${operationName}MutationVariables>) => {
41
+ return Apollo.useMutation(${operationName}Document, options);
42
+ };`;
43
+ }
44
+
45
+ return '';
46
+ }
47
+
48
+ function generateFragmentHook(name, fragmentName) {
49
+ return `export const use${fragmentName}Fragment = (options: { from: Apollo.StoreObject | Apollo.Reference } & Omit<Partial<Apollo.UseFragmentOptions<${fragmentName}Fragment, Apollo.OperationVariables>>, 'from'>) => {
50
+ return Apollo.useFragment<${fragmentName}Fragment>({
51
+ fragment: ${fragmentName}FragmentDoc,
52
+ fragmentName: "${fragmentName}",
53
+ ...options,
54
+ from: {
55
+ __typename: "${name}",
56
+ ...options.from
57
+ },
58
+ });
59
+ }`;
60
+ }
61
+
62
+ function capitalize(str) {
63
+ return str.charAt(0).toUpperCase() + str.slice(1);
64
+ }
65
+
66
+ module.exports = {
67
+ plugin: (_schema, documents) => {
68
+ const hooks = documents
69
+ .flatMap(({ document }) => {
70
+ if (!document) return [];
71
+ const operations = document.definitions
72
+ .filter((def) => def.kind === 'OperationDefinition' && def.name)
73
+ .map((operation) => ({
74
+ type: operation.operation,
75
+ operationName: operation.name.value,
76
+ }));
77
+ const fragments = document.definitions
78
+ .filter((def) => def.kind === 'FragmentDefinition')
79
+ .map((fragment) => ({
80
+ name: fragment.typeCondition.name.value,
81
+ fragmentName: fragment.name.value,
82
+ }));
83
+ const solvedOperations = operations.map(({ type, operationName }) =>
84
+ generateOperationHook(type, operationName),
85
+ );
86
+ const solvedFragments = fragments.map(({ name, fragmentName }) =>
87
+ generateFragmentHook(name, capitalize(fragmentName)),
88
+ );
89
+ return [...solvedOperations, ...solvedFragments];
90
+ })
91
+ .filter(Boolean);
92
+
93
+ if (hooks.length) {
94
+ return [apolloImport, ...hooks].join('\n\n');
95
+ }
96
+ return '';
97
+ },
98
+ };
@@ -0,0 +1,101 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * graphql-codegen plugin — `db<Name>` server functions over the v2 ORM
5
+ * persisted-operation client.
6
+ *
7
+ * Output matches the bios reference plugin (`codegen-apollo-server.js`) —
8
+ * `db<Name>(variables)` returning the first root field, plus `db<Name>Full`
9
+ * for queries — with one transport change: `fetchHasuraGraphQL_INTERNAL`
10
+ * is replaced by `executeOperation` from '@sequenceholdings/orm/client'.
11
+ * `executeOperation({ op, variables })` receives the operation name AS
12
+ * AUTHORED in the document (e.g. `getDeals`) — that is the manifest/registry
13
+ * key the client resolves to the wire `opHash`; only the generated function
14
+ * and type identifiers are capitalized.
15
+ *
16
+ * config:
17
+ * typesImportPath — module the `<Name><Kind>Variables` types are imported
18
+ * from (default './types.gen'). Point it at the file the `typescript` +
19
+ * `typescript-operations` plugins write.
20
+ */
21
+
22
+ function getResultFieldName(operation) {
23
+ const firstSelection = operation.selectionSet?.selections?.[0];
24
+ if (firstSelection?.kind === 'Field') {
25
+ // Use the alias if it exists, otherwise use the field name.
26
+ return firstSelection.alias?.value ?? firstSelection.name.value;
27
+ }
28
+ return null;
29
+ }
30
+
31
+ function generateOperationFunction(type, name, resultField) {
32
+ const operationName = capitalize(name);
33
+
34
+ if (type === 'query') {
35
+ return `export async function db${operationName}(variables: ${operationName}QueryVariables) {
36
+ const result = await executeOperation({ op: '${name}', variables });
37
+
38
+ return result.${resultField};
39
+ }
40
+
41
+ export async function db${operationName}Full(variables: ${operationName}QueryVariables) {
42
+ const result = await executeOperation({ op: '${name}', variables });
43
+
44
+ return result;
45
+ }`;
46
+ } else if (type === 'mutation') {
47
+ return `export async function db${operationName}(variables: ${operationName}MutationVariables) {
48
+ const result = await executeOperation({ op: '${name}', variables });
49
+
50
+ return result.${resultField};
51
+ }`;
52
+ }
53
+
54
+ return '';
55
+ }
56
+
57
+ function capitalize(str) {
58
+ return str.charAt(0).toUpperCase() + str.slice(1);
59
+ }
60
+
61
+ module.exports = {
62
+ plugin: (_schema, documents, config) => {
63
+ const typesImportPath = (config && config.typesImportPath) || './types.gen';
64
+ const imports = new Set();
65
+ const functions = documents
66
+ .flatMap(({ document }) => {
67
+ if (!document) return [];
68
+ return document.definitions
69
+ .filter((def) => def.kind === 'OperationDefinition' && def.name)
70
+ .map((operation) => {
71
+ const operationName = operation.name.value;
72
+ const capitalizedName = capitalize(operationName);
73
+ const resultField = getResultFieldName(operation);
74
+
75
+ if (!resultField) {
76
+ return '';
77
+ }
78
+
79
+ imports.add(
80
+ `${capitalizedName}${capitalize(operation.operation)}Variables`,
81
+ );
82
+
83
+ return generateOperationFunction(
84
+ operation.operation,
85
+ operationName,
86
+ resultField,
87
+ );
88
+ });
89
+ })
90
+ .filter(Boolean);
91
+
92
+ if (functions.length) {
93
+ const importStatements = [
94
+ `import { executeOperation } from '@sequenceholdings/orm/client';`,
95
+ `import { ${Array.from(imports).join(', ')} } from '${typesImportPath}';`,
96
+ ];
97
+ return [...importStatements, ...functions].join('\n\n');
98
+ }
99
+ return '';
100
+ },
101
+ };
@@ -0,0 +1,13 @@
1
+ # Templates
2
+
3
+ Scaffold sources for `seq-studio orm init` (shipped in the npm tarball via the
4
+ `files` array in `package.json`).
5
+
6
+ ## Init-verb rename contract
7
+
8
+ `orm-namespace/gitignore` is deliberately **not** named `.gitignore`: `npm pack`
9
+ strips dotfiles from published tarballs, so the template stores it undotted.
10
+ Any init/scaffold verb that copies `templates/orm-namespace/` into a consumer
11
+ directory MUST rename `gitignore` → `.gitignore` as part of the copy (the same
12
+ convention `create-react-app`-style scaffolds use). Add the same rename for any
13
+ future dotfile template (`npmrc`, `env.example` variants, etc.).
@@ -0,0 +1,81 @@
1
+ # Sequence ORM namespace
2
+
3
+ This directory defines ONE Sequence ORM namespace: TypeScript table
4
+ definitions with row-level policies, plus handwritten GraphQL operations.
5
+ `seq-studio orm apply` pushes it to Atlas, which validates, compiles, and
6
+ applies it. Your app never talks to Postgres — it calls the data plane with
7
+ `{ op: <hash>, variables }` through the generated hooks/functions.
8
+
9
+ ## The loop
10
+
11
+ 1. Edit `schema/*.ts` (tables, columns, links, policies) and/or
12
+ `graphql/**/*.ts` (operations).
13
+ 2. `seq-studio orm generate` — refreshes `schema.graphql` + generated types.
14
+ 3. `seq-studio orm diff` — preview the migration for a schema change.
15
+ 4. `seq-studio orm apply -e <env>` — pushes. Schema changes write a reviewed
16
+ migration file into `migrations/`; operation-only edits take the fast path
17
+ (seconds, no migration).
18
+ 5. Commit `schema/`, `graphql/`, `schema.graphql`, `generated/`, and
19
+ `migrations/` together.
20
+
21
+ ## Hard rules
22
+
23
+ - **Never hand-edit `migrations/`.** Migration files are generated by
24
+ `seq-studio orm apply`/`diff` and replayed verbatim by the server. Editing
25
+ or deleting a committed migration breaks the ledger.
26
+ - **Never hand-edit `schema.graphql` or `generated/`.** Both are outputs of
27
+ `seq-studio orm generate`. To change the API surface, change `schema/*.ts`.
28
+ - **No raw SQL.** There is no query escape hatch: every read/write is a
29
+ GraphQL document in `graphql/`, compiled at push time. For genuinely exotic
30
+ multi-statement writes, declare a table `action` — parameterized, gated,
31
+ audited.
32
+ - **Every table needs `read` and `write` policies.** Policies are the row
33
+ security boundary and are compiled into every operation touching the table.
34
+ There is no "no policy" fallback — an unrestricted table must say so
35
+ explicitly (`allow: true` variant or a `true` policy) so the decision is
36
+ reviewable.
37
+ - **Exactly one `defineNamespace`** (in `sequence.config.ts`), and every
38
+ table module must call `defineTable` at import time — the CLI collects
39
+ registrations by importing your files.
40
+ - **Renames need hints.** Renaming a column or table without
41
+ `.renamedFrom('old_name')` (column) / `renamedFrom` (table config) is a
42
+ DROP + CREATE — data loss. The diff will refuse ambiguous renames; add the
43
+ hint instead of forcing.
44
+ - **Capabilities/roles are declared here, granted in the Permissions UI.**
45
+ Never hardcode user identities in policies; use `claim('sub')` /
46
+ `claim('org')` and grants.
47
+
48
+ ## Policy DSL quick reference
49
+
50
+ ```
51
+ author_sub = claim('sub') -- row value vs caller claim
52
+ org = claim('org') and status = 'open' -- boolean algebra
53
+ exists(deal, org = claim('org')) -- traverse a declared link
54
+ capability('deals-read') -- boolean grant check
55
+ role('deal-manager') -- boolean role check
56
+ ```
57
+
58
+ Variants widen access per grant (permissive union):
59
+
60
+ ```ts
61
+ policies: {
62
+ read: {
63
+ default: "author_sub = claim('sub')",
64
+ variants: [
65
+ { when: "capability('deals-read')", policy: "org = claim('org')" },
66
+ { when: "role('deal-manager')", allow: true },
67
+ ],
68
+ },
69
+ }
70
+ ```
71
+
72
+ ## GraphQL operations
73
+
74
+ - Named operations only; one export per document; gate with
75
+ `@requires(capability: "…")` / `@requires(role: "…")`.
76
+ - Dynamic filters are policy-bounded: `$where: <Table>BoolExp` /
77
+ `$orderBy` / whole-input write objects are validated against a
78
+ schema-derived whitelist and AND-ed with the table policy at runtime —
79
+ they can never widen access.
80
+ - Joins follow declared links (`toOne` / `toMany` / `toPlatformUser`) — there
81
+ are no ad-hoc joins at query time. Declare the link, then select through it.
@@ -0,0 +1,22 @@
1
+ import type { CodegenConfig } from '@graphql-codegen/cli'
2
+
3
+ /**
4
+ * graphql-codegen config. `seq-studio orm generate` writes ./schema.graphql
5
+ * from your table definitions, then runs this config when present — emitting
6
+ * typed Apollo hooks (`use<Name>Query`) and server functions (`db<Name>`)
7
+ * over the persisted-operation client.
8
+ *
9
+ * schema.graphql and the generated output are committed: reviews see the API
10
+ * surface change alongside the schema change that caused it.
11
+ */
12
+ const config: CodegenConfig = {
13
+ schema: './schema.graphql',
14
+ documents: ['graphql/**/*.ts'],
15
+ generates: {
16
+ './generated/': {
17
+ preset: '@sequenceholdings/orm/codegen',
18
+ },
19
+ },
20
+ }
21
+
22
+ export default config
@@ -0,0 +1,5 @@
1
+ # Commit schema.graphql, migrations/, and generated/ — reviews should see
2
+ # API-surface and DDL changes alongside the schema change that caused them.
3
+ node_modules/
4
+ *.log
5
+ .DS_Store