@sequenceholdings/orm 0.1.3 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +108 -38
- package/dist/authoring.cjs +128 -16
- package/dist/authoring.cjs.map +1 -1
- package/dist/authoring.d.cts +21 -4
- package/dist/authoring.d.ts +21 -4
- package/dist/authoring.js +128 -16
- package/dist/authoring.js.map +1 -1
- package/dist/canonical.cjs +83 -9
- package/dist/canonical.cjs.map +1 -1
- package/dist/canonical.d.cts +47 -1
- package/dist/canonical.d.ts +47 -1
- package/dist/canonical.js +83 -10
- package/dist/canonical.js.map +1 -1
- package/dist/cli.cjs +816 -134
- package/dist/cli.cjs.map +1 -1
- package/dist/cli.js +818 -136
- package/dist/cli.js.map +1 -1
- package/dist/client.cjs.map +1 -1
- package/dist/client.js.map +1 -1
- package/dist/compiler.cjs +488 -96
- package/dist/compiler.cjs.map +1 -1
- package/dist/compiler.d.cts +34 -2
- package/dist/compiler.d.ts +34 -2
- package/dist/compiler.js +489 -97
- package/dist/compiler.js.map +1 -1
- package/dist/index.cjs +420 -71
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +266 -9
- package/dist/index.d.ts +266 -9
- package/dist/index.js +410 -73
- package/dist/index.js.map +1 -1
- package/dist/ir.cjs +146 -12
- package/dist/ir.cjs.map +1 -1
- package/dist/ir.d.cts +161 -5
- package/dist/ir.d.ts +161 -5
- package/dist/ir.js +144 -13
- package/dist/ir.js.map +1 -1
- package/dist/{naming-CTvWSRTf.d.ts → naming-DCn94LJ4.d.ts} +15 -1
- package/dist/{naming-DRyinU4u.d.cts → naming-DPglwzkB.d.cts} +15 -1
- package/dist/predicate-v2.cjs +136 -11
- package/dist/predicate-v2.cjs.map +1 -1
- package/dist/predicate-v2.d.cts +3 -0
- package/dist/predicate-v2.d.ts +3 -0
- package/dist/predicate-v2.js +136 -11
- package/dist/predicate-v2.js.map +1 -1
- package/dist/sdl.cjs +460 -13
- package/dist/sdl.cjs.map +1 -1
- package/dist/sdl.d.cts +1 -1
- package/dist/sdl.d.ts +1 -1
- package/dist/sdl.js +459 -14
- package/dist/sdl.js.map +1 -1
- package/package.json +6 -4
- package/src/codegen-gql/preset.cjs +64 -0
- package/src/codegen-gql/server-fns.cjs +11 -6
- package/templates/orm-namespace/codegen.preset.cjs +17 -0
- package/templates/orm-namespace/codegen.ts +1 -1
- package/templates/orm-namespace/package.json +3 -0
- package/templates/orm-namespace/schema/tables.ts +1 -1
- package/templates/orm-namespace/sequence.config.ts +1 -1
package/dist/canonical.cjs
CHANGED
|
@@ -2,10 +2,16 @@
|
|
|
2
2
|
|
|
3
3
|
var zod = require('zod');
|
|
4
4
|
|
|
5
|
+
// src/canonical/v2.ts
|
|
6
|
+
|
|
7
|
+
// src/constants.ts
|
|
8
|
+
var COLUMN_IDENTIFIER_PATTERN = /^_?[a-z][a-z0-9_]*$/;
|
|
9
|
+
|
|
5
10
|
// src/canonical/v2.ts
|
|
6
11
|
var CANONICAL_FORMAT = 2;
|
|
7
12
|
var IDENTIFIER_RE = /^[a-z][a-z0-9_]*$/;
|
|
8
13
|
var identifier = zod.z.string().min(1).max(63).regex(IDENTIFIER_RE);
|
|
14
|
+
var columnIdentifier = zod.z.string().min(1).max(63).regex(COLUMN_IDENTIFIER_PATTERN);
|
|
9
15
|
var COLUMN_TYPES = [
|
|
10
16
|
"uuid",
|
|
11
17
|
"text",
|
|
@@ -26,18 +32,33 @@ var canonicalEnumSchema = zod.z.object({
|
|
|
26
32
|
var canonicalColumnSchema = zod.z.object({
|
|
27
33
|
/** Property name in TS (camelCase); columnName is the Postgres name. */
|
|
28
34
|
name: zod.z.string().min(1).max(63),
|
|
29
|
-
columnName:
|
|
35
|
+
columnName: columnIdentifier,
|
|
30
36
|
type: zod.z.union([columnTypeSchema, zod.z.object({ enum: identifier })]),
|
|
31
37
|
nullable: zod.z.boolean().default(true),
|
|
32
38
|
unique: zod.z.boolean().default(false),
|
|
33
39
|
/** Literal default, or one of the allowlisted SQL functions. */
|
|
34
40
|
default: zod.z.union([zod.z.string(), zod.z.number(), zod.z.boolean(), zod.z.null()]).optional(),
|
|
35
41
|
defaultFn: zod.z.enum(["gen_random_uuid()", "now()"]).optional(),
|
|
42
|
+
/**
|
|
43
|
+
* Stamp this column from the database clock on UPDATE (`now()`). The
|
|
44
|
+
* column stays insertable (defaults fill gaps) but is omitted from
|
|
45
|
+
* SetInput / settable so callers cannot backdate it.
|
|
46
|
+
*/
|
|
47
|
+
onUpdateFn: zod.z.enum(["now()"]).optional(),
|
|
36
48
|
description: zod.z.string().max(500).optional(),
|
|
37
49
|
/** Migration hints — same semantics as v1. */
|
|
38
|
-
renamedFrom:
|
|
50
|
+
renamedFrom: columnIdentifier.optional(),
|
|
39
51
|
cast: zod.z.string().max(200).optional(),
|
|
40
52
|
deprecated: zod.z.boolean().default(false)
|
|
53
|
+
}).superRefine((column, ctx) => {
|
|
54
|
+
if (column.onUpdateFn === void 0) return;
|
|
55
|
+
if (typeof column.type !== "string" || column.type !== "timestamptz" && column.type !== "date") {
|
|
56
|
+
ctx.addIssue({
|
|
57
|
+
code: "custom",
|
|
58
|
+
path: ["onUpdateFn"],
|
|
59
|
+
message: `onUpdateFn '${column.onUpdateFn}' is only valid on timestamptz/date columns`
|
|
60
|
+
});
|
|
61
|
+
}
|
|
41
62
|
});
|
|
42
63
|
var canonicalLinkSchema = zod.z.object({
|
|
43
64
|
name: zod.z.string().min(1).max(63),
|
|
@@ -45,15 +66,15 @@ var canonicalLinkSchema = zod.z.object({
|
|
|
45
66
|
/** Target table name (namespace-local). Absent for toPlatformUser. */
|
|
46
67
|
target: identifier.optional(),
|
|
47
68
|
/** FK column on the owning side (toOne/toPlatformUser: on this table; toMany: on the target). */
|
|
48
|
-
on:
|
|
69
|
+
on: columnIdentifier,
|
|
49
70
|
/** Referenced column on the target (default: target's PK / platform user `sub`). */
|
|
50
|
-
references:
|
|
71
|
+
references: columnIdentifier.optional(),
|
|
51
72
|
/** enforce: true emits a real FK constraint (same-namespace toOne only). */
|
|
52
73
|
enforce: zod.z.boolean().default(false),
|
|
53
74
|
description: zod.z.string().max(500).optional()
|
|
54
75
|
});
|
|
55
76
|
var canonicalIndexSchema = zod.z.object({
|
|
56
|
-
columns: zod.z.array(
|
|
77
|
+
columns: zod.z.array(columnIdentifier).min(1),
|
|
57
78
|
unique: zod.z.boolean().default(false),
|
|
58
79
|
name: identifier.optional()
|
|
59
80
|
});
|
|
@@ -301,6 +322,13 @@ var canonicalCowMutationSchema = zod.z.object({
|
|
|
301
322
|
}
|
|
302
323
|
}
|
|
303
324
|
});
|
|
325
|
+
var canonicalForeignKeySchema = zod.z.object({
|
|
326
|
+
name: identifier,
|
|
327
|
+
columns: zod.z.array(columnIdentifier).min(1).max(8),
|
|
328
|
+
target: identifier,
|
|
329
|
+
references: zod.z.array(columnIdentifier).min(1).max(8),
|
|
330
|
+
deferrable: zod.z.enum(["initially-immediate", "initially-deferred"]).optional()
|
|
331
|
+
}).strict();
|
|
304
332
|
var canonicalTableSchema = zod.z.object({
|
|
305
333
|
table: identifier,
|
|
306
334
|
description: zod.z.string().max(2e3).optional(),
|
|
@@ -309,7 +337,7 @@ var canonicalTableSchema = zod.z.object({
|
|
|
309
337
|
/** Synced/reflected read-only tables (`source: gold.*`) — v1 semantics. */
|
|
310
338
|
source: zod.z.string().regex(/^gold\.[a-z][a-z0-9_]*$/).optional(),
|
|
311
339
|
columns: zod.z.array(canonicalColumnSchema).default([]),
|
|
312
|
-
primaryKey: zod.z.array(
|
|
340
|
+
primaryKey: zod.z.array(columnIdentifier).min(1).max(8).optional(),
|
|
313
341
|
links: zod.z.array(canonicalLinkSchema).default([]),
|
|
314
342
|
indexes: zod.z.array(canonicalIndexSchema).default([]),
|
|
315
343
|
policies: canonicalPoliciesSchema.default({}),
|
|
@@ -320,14 +348,16 @@ var canonicalTableSchema = zod.z.object({
|
|
|
320
348
|
*/
|
|
321
349
|
actions: zod.z.array(canonicalActionSchema).default([]),
|
|
322
350
|
/** Optional (not defaulted) so pre-CoW canonical documents keep byte-identical hashes. */
|
|
323
|
-
cowMutations: zod.z.array(canonicalCowMutationSchema).optional()
|
|
351
|
+
cowMutations: zod.z.array(canonicalCowMutationSchema).optional(),
|
|
352
|
+
/** Omitted by old definitions, preserving their existing content hashes. */
|
|
353
|
+
foreignKeys: zod.z.array(canonicalForeignKeySchema).max(100).optional()
|
|
324
354
|
});
|
|
325
355
|
var canonicalViewSchema = zod.z.object({
|
|
326
356
|
view: identifier,
|
|
327
357
|
description: zod.z.string().max(2e3).optional(),
|
|
328
358
|
columns: zod.z.array(canonicalColumnSchema).min(1),
|
|
329
359
|
/** Logical identity for GraphQL only; PostgreSQL views have no PK constraint. */
|
|
330
|
-
primaryKey: zod.z.array(
|
|
360
|
+
primaryKey: zod.z.array(columnIdentifier).min(1).max(8).optional(),
|
|
331
361
|
links: zod.z.array(canonicalLinkSchema).default([]),
|
|
332
362
|
policies: zod.z.object({ read: policyExpressionSchema }).strict(),
|
|
333
363
|
query: zod.z.string().min(1).max(1e5).refine(isSingleViewQuerySql, {
|
|
@@ -340,6 +370,9 @@ var canonicalViewSchema = zod.z.object({
|
|
|
340
370
|
if (column.default !== void 0 || column.defaultFn !== void 0) {
|
|
341
371
|
ctx.addIssue({ code: "custom", path: ["columns", index], message: `view column '${column.name}' cannot declare a default` });
|
|
342
372
|
}
|
|
373
|
+
if (column.onUpdateFn !== void 0) {
|
|
374
|
+
ctx.addIssue({ code: "custom", path: ["columns", index], message: `view column '${column.name}' cannot declare onUpdateFn` });
|
|
375
|
+
}
|
|
343
376
|
if (column.unique) {
|
|
344
377
|
ctx.addIssue({ code: "custom", path: ["columns", index], message: `view column '${column.name}' cannot declare unique` });
|
|
345
378
|
}
|
|
@@ -373,6 +406,45 @@ var canonicalDefinitionSchema = zod.z.object({
|
|
|
373
406
|
ctx.addIssue({ code: "custom", path: ["tables", index, "table"], message: `duplicate relation '${table.table}'` });
|
|
374
407
|
}
|
|
375
408
|
seen.add(table.table);
|
|
409
|
+
if (table.source !== void 0) {
|
|
410
|
+
for (const [columnIndex, column] of table.columns.entries()) {
|
|
411
|
+
if (column.onUpdateFn !== void 0) {
|
|
412
|
+
ctx.addIssue({
|
|
413
|
+
code: "custom",
|
|
414
|
+
path: ["tables", index, "columns", columnIndex],
|
|
415
|
+
message: `synced table '${table.table}' column '${column.name}' cannot declare onUpdateFn`
|
|
416
|
+
});
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
const fkTables = new Map(definition.tables.map((table) => [table.table, table]));
|
|
422
|
+
for (const [tableIndex, table] of definition.tables.entries()) {
|
|
423
|
+
const names = /* @__PURE__ */ new Set([
|
|
424
|
+
...table.primaryKey?.length ? [`${table.table}_pkey`] : [],
|
|
425
|
+
...table.columns.filter((column) => column.unique && !(table.primaryKey?.length === 1 && table.primaryKey[0] === column.columnName)).map((column) => `${table.table}_${column.columnName}_unique`),
|
|
426
|
+
...table.links.filter((link) => link.enforce).map((link) => `fk_${table.table}_${link.name}`)
|
|
427
|
+
]);
|
|
428
|
+
for (const [index, fk] of (table.foreignKeys ?? []).entries()) {
|
|
429
|
+
const fail = (message) => ctx.addIssue({ code: "custom", path: ["tables", tableIndex, "foreignKeys", index], message });
|
|
430
|
+
if (names.has(fk.name)) fail(`duplicate foreign key '${fk.name}'`);
|
|
431
|
+
names.add(fk.name);
|
|
432
|
+
const target = fkTables.get(fk.target);
|
|
433
|
+
if (table.source || !target || target.source) {
|
|
434
|
+
fail("foreign keys must connect owned tables in the same namespace");
|
|
435
|
+
continue;
|
|
436
|
+
}
|
|
437
|
+
if (fk.columns.length !== fk.references.length) fail("foreign key columns and references must have the same number of columns");
|
|
438
|
+
if (new Set(fk.columns).size !== fk.columns.length || new Set(fk.references).size !== fk.references.length) fail("foreign key columns must not repeat");
|
|
439
|
+
for (const [position, name] of fk.columns.entries()) {
|
|
440
|
+
const sourceColumn = table.columns.find((column) => column.columnName === name);
|
|
441
|
+
const targetColumn = target.columns.find((column) => column.columnName === fk.references[position]);
|
|
442
|
+
if (!sourceColumn || !targetColumn) fail("foreign key references an unknown column");
|
|
443
|
+
else if (JSON.stringify(sourceColumn.type) !== JSON.stringify(targetColumn.type)) fail("foreign key column types must match");
|
|
444
|
+
}
|
|
445
|
+
const uniqueKeys = [target.primaryKey ?? [], ...target.indexes.filter((index2) => index2.unique).map((index2) => index2.columns), ...target.columns.filter((column) => column.unique).map((column) => [column.columnName])];
|
|
446
|
+
if (!uniqueKeys.some((key) => key.length === fk.references.length && key.every((column) => fk.references.includes(column)))) fail("foreign key target columns must form a unique key");
|
|
447
|
+
}
|
|
376
448
|
}
|
|
377
449
|
const tableByName = new Map(definition.tables.map((table) => [table.table, table]));
|
|
378
450
|
for (const [tableIndex, table] of definition.tables.entries()) {
|
|
@@ -508,12 +580,13 @@ function normalizeCanonical(definition) {
|
|
|
508
580
|
...definition,
|
|
509
581
|
enums: sortByName(definition.enums),
|
|
510
582
|
tables: [...definition.tables].sort((a, b) => a.table.localeCompare(b.table)).map((t) => {
|
|
511
|
-
const { cowMutations, ...rest } = t;
|
|
583
|
+
const { cowMutations, foreignKeys, ...rest } = t;
|
|
512
584
|
return {
|
|
513
585
|
...rest,
|
|
514
586
|
links: sortByName(t.links),
|
|
515
587
|
indexes: [...t.indexes].sort((a, b) => (a.name ?? a.columns.join("_")).localeCompare(b.name ?? b.columns.join("_"))),
|
|
516
588
|
actions: sortByName(t.actions),
|
|
589
|
+
...foreignKeys?.length ? { foreignKeys: sortByName(foreignKeys) } : {},
|
|
517
590
|
// Omitted entirely when absent/empty so pre-CoW documents hash unchanged.
|
|
518
591
|
...cowMutations !== void 0 && cowMutations.length > 0 ? { cowMutations: sortByName(cowMutations) } : {}
|
|
519
592
|
};
|
|
@@ -538,6 +611,7 @@ exports.canonicalColumnSchema = canonicalColumnSchema;
|
|
|
538
611
|
exports.canonicalCowMutationSchema = canonicalCowMutationSchema;
|
|
539
612
|
exports.canonicalDefinitionSchema = canonicalDefinitionSchema;
|
|
540
613
|
exports.canonicalEnumSchema = canonicalEnumSchema;
|
|
614
|
+
exports.canonicalForeignKeySchema = canonicalForeignKeySchema;
|
|
541
615
|
exports.canonicalIndexSchema = canonicalIndexSchema;
|
|
542
616
|
exports.canonicalLinkSchema = canonicalLinkSchema;
|
|
543
617
|
exports.canonicalPoliciesSchema = canonicalPoliciesSchema;
|
package/dist/canonical.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/canonical/v2.ts"],"names":["z"],"mappings":"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","file":"canonical.cjs","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 insert: policyExpressionSchema.optional(),\n update: policyExpressionSchema.optional(),\n})\n\n/**\n * View SQL is generated by Drizzle in the authoring process, then crosses the\n * CLI → Atlas JSON boundary. Keep the canonical form to one SELECT statement:\n * PostgreSQL validates the complete grammar when the view is created, while\n * this scanner prevents statement stacking before the text reaches DDL.\n */\nexport function isSingleViewQuerySql(value: string): boolean {\n const query = value.trim()\n if (!/^\\(*(?:select|with)\\b/i.test(query) || query.includes('\\0')) return false\n\n let state: 'normal' | 'single' | 'double' = 'normal'\n for (let index = 0; index < query.length; index += 1) {\n const char = query[index]\n const next = query[index + 1]\n if (state === 'single') {\n if (char === \"'\" && next === \"'\") index += 1\n else if (char === \"'\") state = 'normal'\n continue\n }\n if (state === 'double') {\n if (char === '\"' && next === '\"') index += 1\n else if (char === '\"') state = 'normal'\n continue\n }\n if (char === \"'\") state = 'single'\n else if (char === '\"') state = 'double'\n else if (char === ';' || (char === '-' && next === '-') || (char === '/' && next === '*')) return false\n }\n return state === 'normal' && !/\\$[a-z_0-9]*\\$/i.test(query)\n}\n\n/**\n * Managed views execute as the shared ORM relation owner. Treat function use\n * as a capability boundary: a new function is unavailable until it is\n * deliberately reviewed here as side-effect-free. The migration engine checks\n * the functions PostgreSQL actually resolved against this list and pg_catalog,\n * so qualification and same-named functions in a consumer schema cannot evade\n * the boundary.\n */\nexport const VIEW_QUERY_FUNCTION_ALLOWLIST = [\n 'abs',\n 'age',\n 'array_agg',\n 'array_append',\n 'array_cat',\n 'array_dims',\n 'array_length',\n 'array_lower',\n 'array_ndims',\n 'array_position',\n 'array_positions',\n 'array_prepend',\n 'array_remove',\n 'array_replace',\n 'array_to_string',\n 'array_trim',\n 'array_upper',\n 'ascii',\n 'avg',\n 'bit_and',\n 'bit_or',\n 'bit_xor',\n 'bool_and',\n 'bool_or',\n 'btrim',\n 'cardinality',\n 'cbrt',\n 'ceil',\n 'ceiling',\n 'char_length',\n 'character_length',\n 'chr',\n 'concat',\n 'concat_ws',\n 'count',\n 'cume_dist',\n 'date_bin',\n 'date_part',\n 'date_trunc',\n 'decode',\n 'degrees',\n 'dense_rank',\n 'encode',\n 'enum_first',\n 'enum_last',\n 'enum_range',\n 'every',\n 'exp',\n 'first_value',\n 'floor',\n 'format',\n 'grouping',\n 'initcap',\n 'json_agg',\n 'json_array_length',\n 'json_build_array',\n 'json_build_object',\n 'json_extract_path',\n 'json_extract_path_text',\n 'json_object_agg',\n 'json_object_keys',\n 'json_strip_nulls',\n 'json_typeof',\n 'jsonb_agg',\n 'jsonb_array_length',\n 'jsonb_build_array',\n 'jsonb_build_object',\n 'jsonb_extract_path',\n 'jsonb_extract_path_text',\n 'jsonb_insert',\n 'jsonb_object_agg',\n 'jsonb_object_keys',\n 'jsonb_path_exists',\n 'jsonb_path_match',\n 'jsonb_path_query',\n 'jsonb_path_query_array',\n 'jsonb_path_query_first',\n 'jsonb_pretty',\n 'jsonb_set',\n 'jsonb_set_lax',\n 'jsonb_strip_nulls',\n 'jsonb_typeof',\n 'justify_days',\n 'justify_hours',\n 'justify_interval',\n 'lag',\n 'last_value',\n 'lead',\n 'left',\n 'length',\n 'ln',\n 'log',\n 'lower',\n 'lpad',\n 'ltrim',\n 'make_date',\n 'make_interval',\n 'make_time',\n 'make_timestamp',\n 'make_timestamptz',\n 'max',\n 'md5',\n 'min',\n 'mod',\n 'nth_value',\n 'ntile',\n 'octet_length',\n 'percent_rank',\n 'pi',\n 'power',\n 'quote_ident',\n 'quote_literal',\n 'quote_nullable',\n 'radians',\n 'rank',\n 'regexp_count',\n 'regexp_instr',\n 'regexp_like',\n 'regexp_match',\n 'regexp_matches',\n 'regexp_replace',\n 'regexp_split_to_array',\n 'regexp_split_to_table',\n 'repeat',\n 'replace',\n 'reverse',\n 'right',\n 'round',\n 'row_number',\n 'rpad',\n 'rtrim',\n 'sign',\n 'split_part',\n 'sqrt',\n 'starts_with',\n 'string_agg',\n 'string_to_array',\n 'strpos',\n 'substr',\n 'substring',\n 'sum',\n 'timezone',\n 'to_ascii',\n 'to_char',\n 'to_date',\n 'to_hex',\n 'to_json',\n 'to_jsonb',\n 'to_number',\n 'to_timestamp',\n 'translate',\n 'trunc',\n 'unnest',\n 'upper',\n 'width_bucket',\n] as const\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\n/**\n * Copy-on-write mutations for overlay tables backed by a synced twin\n * (v2-only). Structured metadata, never authored SQL: the compiler and data\n * plane generate the INSERT…SELECT / UPDATE / DELETE statements from it, so\n * there is no SQL surface to validate and write policies inject like any\n * other mutation. `override` copies the synced row into the overlay\n * (ON CONFLICT DO NOTHING) then updates the `set` columns; `revert` deletes\n * the overlay row so the coalesce view falls back to synced.\n */\nexport const canonicalCowMutationSchema = z.object({\n kind: z.enum(['override', 'revert']),\n name: identifier,\n /** Synced table (same namespace) the overlay copies from / falls back to. */\n synced: identifier,\n /** Single-column primary key PROPERTY (TS camelCase, like column `name`) shared by overlay and synced. */\n pk: z.string().min(1).max(63),\n /** Override: contract properties copied INSERT…SELECT from synced (pk included). Empty for revert. */\n copy: z.array(z.string().min(1).max(63)).default([]),\n /** Override: overlay properties written by the UPDATE (never the pk). Empty for revert. */\n set: z.array(z.string().min(1).max(63)).default([]),\n}).superRefine((mutation, ctx) => {\n if (mutation.kind === 'override') {\n if (mutation.set.length === 0) {\n ctx.addIssue({ code: 'custom', path: ['set'], message: 'override mutations must set at least one column' })\n }\n if (!mutation.copy.includes(mutation.pk)) {\n ctx.addIssue({ code: 'custom', path: ['copy'], message: 'override copy list must include the pk' })\n }\n } else if (mutation.set.length > 0 || mutation.copy.length > 0) {\n ctx.addIssue({ code: 'custom', path: ['set'], message: 'revert mutations take no copy/set columns' })\n }\n if (mutation.set.includes(mutation.pk)) {\n ctx.addIssue({ code: 'custom', path: ['set'], message: 'set must not include the pk — identity columns are pinned' })\n }\n // Duplicates would reach the executor as a doubled INSERT column or SET\n // assignment — reject at the schema like the authoring helper does.\n for (const [field, values] of [['copy', mutation.copy], ['set', mutation.set]] as const) {\n if (new Set(values).size !== values.length) {\n ctx.addIssue({ code: 'custom', path: [field], message: `${field} must not contain duplicate columns` })\n }\n }\n})\nexport type CanonicalCowMutation = z.infer<typeof canonicalCowMutationSchema>\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 /**\n * v1-conversion carry-over only. v2 has no action surface — the runtime\n * neither compiles nor executes these; writes are mutations. Kept parseable\n * so stored definitions and their content hashes stay stable.\n */\n actions: z.array(canonicalActionSchema).default([]),\n /** Optional (not defaulted) so pre-CoW canonical documents keep byte-identical hashes. */\n cowMutations: z.array(canonicalCowMutationSchema).optional(),\n})\nexport type CanonicalTable = z.infer<typeof canonicalTableSchema>\n\nexport const canonicalViewSchema = z.object({\n view: identifier,\n description: z.string().max(2000).optional(),\n columns: z.array(canonicalColumnSchema).min(1),\n /** Logical identity for GraphQL only; PostgreSQL views have no PK constraint. */\n primaryKey: z.array(identifier).min(1).max(8).optional(),\n links: z.array(canonicalLinkSchema).default([]),\n policies: z.object({ read: policyExpressionSchema }).strict(),\n query: z.string().min(1).max(100_000).refine(isSingleViewQuerySql, {\n message: 'view query must be one SELECT/WITH statement without comments or dollar-quoted bodies',\n }),\n /** Namespace-local logical relation names, sorted for deterministic hashing. */\n dependencies: z.array(identifier).max(500),\n}).superRefine((view, ctx) => {\n for (const [index, column] of view.columns.entries()) {\n if (column.default !== undefined || column.defaultFn !== undefined) {\n ctx.addIssue({ code: 'custom', path: ['columns', index], message: `view column '${column.name}' cannot declare a default` })\n }\n if (column.unique) {\n ctx.addIssue({ code: 'custom', path: ['columns', index], message: `view column '${column.name}' cannot declare unique` })\n }\n if (column.renamedFrom !== undefined || column.cast !== undefined) {\n ctx.addIssue({ code: 'custom', path: ['columns', index], message: `view column '${column.name}' cannot declare migration hints` })\n }\n }\n for (const [index, link] of view.links.entries()) {\n if (link.enforce) {\n ctx.addIssue({ code: 'custom', path: ['links', index, 'enforce'], message: `view link '${link.name}' cannot enforce a foreign key` })\n }\n }\n})\nexport type CanonicalView = z.infer<typeof canonicalViewSchema>\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 /** Optional to preserve byte-identical hashes for pre-view canonical v2 documents. */\n views: z.array(canonicalViewSchema).max(500).optional(),\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}).superRefine((definition, ctx) => {\n const seen = new Set<string>()\n for (const [index, table] of definition.tables.entries()) {\n if (seen.has(table.table)) {\n ctx.addIssue({ code: 'custom', path: ['tables', index, 'table'], message: `duplicate relation '${table.table}'` })\n }\n seen.add(table.table)\n }\n\n // CoW mutations: overlay must be an owned table; synced twin must be a\n // synced table in this namespace; copy/set columns must exist on both sides.\n const tableByName = new Map(definition.tables.map((table) => [table.table, table]))\n for (const [tableIndex, table] of definition.tables.entries()) {\n const cowMutations = table.cowMutations ?? []\n if (cowMutations.length === 0) continue\n const path = (index: number, ...rest: Array<string | number>): Array<string | number> =>\n ['tables', tableIndex, 'cowMutations', index, ...rest]\n if (table.source !== undefined) {\n ctx.addIssue({ code: 'custom', path: path(0), message: `synced table '${table.table}' cannot declare cow mutations — it is read-only` })\n continue\n }\n for (const [index, mutation] of cowMutations.entries()) {\n const synced = tableByName.get(mutation.synced)\n if (!synced || synced.source === undefined) {\n ctx.addIssue({\n code: 'custom',\n path: path(index, 'synced'),\n message: `cow mutation '${mutation.name}' references '${mutation.synced}', which is not a synced table in this namespace`,\n })\n continue\n }\n // The full helper invariants, mirrored so hand-written canonical cannot\n // bypass them (the generated conflict/copy SQL depends on every one):\n // single-column PK identity on both sides, matching scalar types AND\n // Postgres column names for every copied column, and no nullable-synced\n // → NOT-NULL-overlay traps.\n const overlayColumnsByName = new Map(table.columns.map((column) => [column.name, column]))\n const syncedColumnsByName = new Map(synced.columns.map((column) => [column.name, column]))\n let columnsExist = true\n for (const property of [mutation.pk, ...mutation.copy, ...mutation.set]) {\n if (!overlayColumnsByName.has(property)) {\n columnsExist = false\n ctx.addIssue({ code: 'custom', path: path(index), message: `cow mutation '${mutation.name}': column '${property}' does not exist on overlay '${table.table}'` })\n }\n }\n for (const property of [mutation.pk, ...mutation.copy]) {\n if (!syncedColumnsByName.has(property)) {\n columnsExist = false\n ctx.addIssue({ code: 'custom', path: path(index), message: `cow mutation '${mutation.name}': column '${property}' does not exist on synced '${mutation.synced}'` })\n }\n }\n if (!columnsExist) continue\n\n const overlayPk = table.primaryKey ?? []\n const syncedPk = synced.primaryKey ?? []\n if (overlayPk.length !== 1 || overlayPk[0] !== mutation.pk || syncedPk.length !== 1 || syncedPk[0] !== mutation.pk) {\n ctx.addIssue({\n code: 'custom',\n path: path(index, 'pk'),\n message: `cow mutation '${mutation.name}': pk '${mutation.pk}' must be the single-column primary key on both '${table.table}' and '${mutation.synced}'`,\n })\n }\n for (const property of [mutation.pk, ...mutation.copy]) {\n const overlayColumn = overlayColumnsByName.get(property)\n const syncedColumn = syncedColumnsByName.get(property)\n if (!overlayColumn || !syncedColumn) continue\n if (JSON.stringify(overlayColumn.type) !== JSON.stringify(syncedColumn.type)) {\n ctx.addIssue({\n code: 'custom',\n path: path(index),\n message: `cow mutation '${mutation.name}': column '${property}' must have the same type on overlay and synced`,\n })\n }\n if (overlayColumn.columnName !== syncedColumn.columnName) {\n ctx.addIssue({\n code: 'custom',\n path: path(index),\n message: `cow mutation '${mutation.name}': column '${property}' maps to different Postgres names on overlay ('${overlayColumn.columnName}') and synced ('${syncedColumn.columnName}')`,\n })\n }\n if (syncedColumn.nullable !== false && overlayColumn.nullable === false) {\n ctx.addIssue({\n code: 'custom',\n path: path(index),\n message: `cow mutation '${mutation.name}': column '${property}' is nullable on synced but NOT NULL on overlay — a NULL synced value would fail the copy`,\n })\n }\n }\n }\n }\n for (const [index, view] of (definition.views ?? []).entries()) {\n if (seen.has(view.view)) {\n ctx.addIssue({ code: 'custom', path: ['views', index, 'view'], message: `duplicate relation '${view.view}'` })\n }\n seen.add(view.view)\n }\n\n const views = definition.views ?? []\n const viewByName = new Map(views.map((view) => [view.view, view]))\n for (const [viewIndex, view] of views.entries()) {\n for (const [dependencyIndex, dependency] of view.dependencies.entries()) {\n if (!seen.has(dependency)) {\n ctx.addIssue({\n code: 'custom',\n path: ['views', viewIndex, 'dependencies', dependencyIndex],\n message: `view '${view.view}' depends on unknown relation '${dependency}'`,\n })\n }\n }\n }\n\n const visiting = new Set<string>()\n const visited = new Set<string>()\n let cycleReported = false\n const visit = (name: string, path: string[]): void => {\n if (visited.has(name) || cycleReported) return\n if (visiting.has(name)) {\n cycleReported = true\n ctx.addIssue({\n code: 'custom',\n path: ['views'],\n message: `view dependencies form a cycle: ${[...path, name].join(' -> ')}`,\n })\n return\n }\n visiting.add(name)\n const view = viewByName.get(name)\n for (const dependency of view?.dependencies ?? []) {\n if (viewByName.has(dependency)) visit(dependency, [...path, name])\n }\n visiting.delete(name)\n visited.add(name)\n }\n for (const view of views) visit(view.view, [])\n})\nexport type CanonicalDefinition = z.infer<typeof canonicalDefinitionSchema>\n\n/**\n * Project namespace-local tables and views onto the shared read/query surface.\n * A view deliberately becomes a CanonicalTable-shaped relation with no write\n * policy, indexes, actions, defaults, or constraints. Keeping this adapter at\n * the canonical boundary makes SDL and compiler behavior identical without\n * pretending views are writable tables in the wire contract.\n */\nexport function canonicalRelations(definition: CanonicalDefinition): CanonicalTable[] {\n const views = (definition.views ?? []).map<CanonicalTable>((view) => ({\n table: view.view,\n ...(view.description !== undefined ? { description: view.description } : {}),\n columns: view.columns,\n ...(view.primaryKey !== undefined ? { primaryKey: view.primaryKey } : {}),\n links: view.links,\n indexes: [],\n policies: { read: view.policies.read },\n actions: [],\n }))\n return [...definition.tables, ...views].sort((a, b) => a.table.localeCompare(b.table))\n}\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 const normalized: CanonicalDefinition = {\n ...definition,\n enums: sortByName(definition.enums),\n tables: [...definition.tables]\n .sort((a, b) => a.table.localeCompare(b.table))\n .map((t) => {\n const { cowMutations, ...rest } = t\n return {\n ...rest,\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 // Omitted entirely when absent/empty so pre-CoW documents hash unchanged.\n ...(cowMutations !== undefined && cowMutations.length > 0 ? { cowMutations: sortByName(cowMutations) } : {}),\n }\n }),\n }\n if (definition.views !== undefined) {\n normalized.views = [...definition.views]\n .sort((a, b) => a.view.localeCompare(b.view))\n .map((view) => ({\n ...view,\n links: sortByName(view.links),\n dependencies: [...view.dependencies].sort(),\n }))\n }\n return normalized\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/constants.ts","../src/canonical/v2.ts"],"names":["z","index"],"mappings":"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","file":"canonical.cjs","sourcesContent":["/** Namespace names become Postgres identifiers (`orm_<ns>` schema, `orm_<ns>_consumer` role) — the tight grammar is a security control, not cosmetics. */\nexport const NAMESPACE_PATTERN = /^[a-z][a-z0-9_]{0,40}$/\n\nexport const IDENTIFIER_PATTERN = /^[a-z][a-z0-9_]*$/\n/** Native source columns may have one leading underscore; relation names may not. */\nexport const COLUMN_IDENTIFIER_PATTERN = /^_?[a-z][a-z0-9_]*$/\nexport const MAX_IDENTIFIER_LENGTH = 63\n\n/**\n * The Data API carries a delegated, attenuated data token on this header (not\n * `Authorization`, which stays the app-user/session bearer). One definition\n * shared by the client transport, the server's caller resolver, and the\n * function-invoke minter, so all three agree.\n */\nexport const ORM_DATA_TOKEN_HEADER = 'x-sequence-data-token'\n\n/**\n * The SEPARATE header the invoke proxy uses to hand a managed function its\n * *service* data token — the escalation path. A function receives BOTH this and\n * `ORM_DATA_TOKEN_HEADER`; the default `createOrmClient` reads the user token,\n * the deliberately-named `createServiceOrmClient` reads THIS one. Two distinct\n * headers so reaching for the service identity is always an explicit act, never\n * an accidental default. Both are sent to the Data API on `ORM_DATA_TOKEN_HEADER`\n * — the server stays mode-agnostic and resolves whatever sub the token carries.\n */\nexport const ORM_SERVICE_DATA_TOKEN_HEADER = 'x-sequence-data-token-service'\n\n/**\n * Custom Roles & Capabilities claim keys as policies reference them: a\n * host-scoped registry key, or an org pin's `org/<key>`. Matches the registry\n * key grammar EXACTLY (`[a-z0-9-]`, 1–64 chars, no `_` — the FGA object-id\n * delimiter) so any capability that's declarable/attachable in namespace.yaml\n * can also be referenced here — a stricter pattern would let a valid key\n * register yet fail at apply (e.g. `org/2fa`, a one-char or digit-led key).\n */\nexport const CAPABILITY_KEY_PATTERN = /^(?:org\\/)?[a-z0-9-]{1,64}$/\n\nexport const CLAIM_KEY_PATTERN = /^[a-z][a-z0-9_]*$/\n\n/** Qualified reference to a table outside the defining file: `<schema>.<table>`. */\nexport const QUALIFIED_TABLE_PATTERN = /^[a-z][a-z0-9_]*\\.[a-z][a-z0-9_]*$/\n\n/** Synced reflected sources are restricted to the gold layer. */\nexport const SYNCED_SOURCE_PATTERN = /^gold\\.[a-z][a-z0-9_]*$/\n\nexport const ORM_SCHEMA_PREFIX = 'orm_'\nexport const CONSUMER_ROLE_SUFFIX = '_consumer'\n\nexport const ormSchemaName = (namespace: string): string => `${ORM_SCHEMA_PREFIX}${namespace}`\nexport const consumerRoleName = (namespace: string): string =>\n `${ORM_SCHEMA_PREFIX}${namespace}${CONSUMER_ROLE_SUFFIX}`\n\nexport const DEFINITION_FILE_EXTENSIONS = ['.yml', '.yaml'] as const\n\n/** Reserved basenames for the namespace-level config file (description, org capability pins). */\nexport const NAMESPACE_CONFIG_FILENAMES = new Set(['namespace.yaml', 'namespace.yml'])\n\nexport const HASH_DOMAIN = 'sequence-orm-definitions\\0'\n\n/**\n * A per-file byte cap where the loader reads untrusted YAML into memory — a real failure mode, not a product\n * limit. Counts of tables/indexes/params and policy/SQL lengths are\n * deliberately uncapped; Postgres enforces its own limits loudly at apply.\n */\nexport const MAX_DEFINITION_FILE_BYTES = 1024 * 1024\n\n/** Generated SDL aggregates every table/view; it is not an individual source file. */\nexport const MAX_GENERATED_SDL_BYTES = 16 * 1024 * 1024\n\n/** Registration and reviewed exports carry SDL, canonical metadata, snapshots and migrations. */\nexport const ORM_REGISTRATION_MAX_BYTES = 64 * 1024 * 1024\n\n/** `/api/data/<ns>/actions/…` and `/api/data/<ns>/query` share the table path segment. */\nexport const RESERVED_TABLE_NAMES = new Set(['actions', 'query'])\n\n/**\n * The Data API's query-string grammar owns these parameter names — a column\n * with one of them could never be filtered over the wire, so definitions\n * refuse it up front (\"validate rejects only what can never work\").\n */\nexport const RESERVED_COLUMN_NAMES = new Set(['select', 'order', 'limit', 'offset'])\n","/**\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'\nimport { COLUMN_IDENTIFIER_PATTERN } from '../constants.js'\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)\nconst columnIdentifier = z.string().min(1).max(63).regex(COLUMN_IDENTIFIER_PATTERN)\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: columnIdentifier,\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 /**\n * Stamp this column from the database clock on UPDATE (`now()`). The\n * column stays insertable (defaults fill gaps) but is omitted from\n * SetInput / settable so callers cannot backdate it.\n */\n onUpdateFn: z.enum(['now()']).optional(),\n description: z.string().max(500).optional(),\n /** Migration hints — same semantics as v1. */\n renamedFrom: columnIdentifier.optional(),\n cast: z.string().max(200).optional(),\n deprecated: z.boolean().default(false),\n}).superRefine((column, ctx) => {\n if (column.onUpdateFn === undefined) return\n if (typeof column.type !== 'string' || (column.type !== 'timestamptz' && column.type !== 'date')) {\n ctx.addIssue({\n code: 'custom',\n path: ['onUpdateFn'],\n message: `onUpdateFn '${column.onUpdateFn}' is only valid on timestamptz/date columns`,\n })\n }\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: columnIdentifier,\n /** Referenced column on the target (default: target's PK / platform user `sub`). */\n references: columnIdentifier.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(columnIdentifier).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 insert: policyExpressionSchema.optional(),\n update: policyExpressionSchema.optional(),\n})\n\n/**\n * View SQL is generated by Drizzle in the authoring process, then crosses the\n * CLI → Atlas JSON boundary. Keep the canonical form to one SELECT statement:\n * PostgreSQL validates the complete grammar when the view is created, while\n * this scanner prevents statement stacking before the text reaches DDL.\n */\nexport function isSingleViewQuerySql(value: string): boolean {\n const query = value.trim()\n if (!/^\\(*(?:select|with)\\b/i.test(query) || query.includes('\\0')) return false\n\n let state: 'normal' | 'single' | 'double' = 'normal'\n for (let index = 0; index < query.length; index += 1) {\n const char = query[index]\n const next = query[index + 1]\n if (state === 'single') {\n if (char === \"'\" && next === \"'\") index += 1\n else if (char === \"'\") state = 'normal'\n continue\n }\n if (state === 'double') {\n if (char === '\"' && next === '\"') index += 1\n else if (char === '\"') state = 'normal'\n continue\n }\n if (char === \"'\") state = 'single'\n else if (char === '\"') state = 'double'\n else if (char === ';' || (char === '-' && next === '-') || (char === '/' && next === '*')) return false\n }\n return state === 'normal' && !/\\$[a-z_0-9]*\\$/i.test(query)\n}\n\n/**\n * Managed views execute as the shared ORM relation owner. Treat function use\n * as a capability boundary: a new function is unavailable until it is\n * deliberately reviewed here as side-effect-free. The migration engine checks\n * the functions PostgreSQL actually resolved against this list and pg_catalog,\n * so qualification and same-named functions in a consumer schema cannot evade\n * the boundary.\n */\nexport const VIEW_QUERY_FUNCTION_ALLOWLIST = [\n 'abs',\n 'age',\n 'array_agg',\n 'array_append',\n 'array_cat',\n 'array_dims',\n 'array_length',\n 'array_lower',\n 'array_ndims',\n 'array_position',\n 'array_positions',\n 'array_prepend',\n 'array_remove',\n 'array_replace',\n 'array_to_string',\n 'array_trim',\n 'array_upper',\n 'ascii',\n 'avg',\n 'bit_and',\n 'bit_or',\n 'bit_xor',\n 'bool_and',\n 'bool_or',\n 'btrim',\n 'cardinality',\n 'cbrt',\n 'ceil',\n 'ceiling',\n 'char_length',\n 'character_length',\n 'chr',\n 'concat',\n 'concat_ws',\n 'count',\n 'cume_dist',\n 'date_bin',\n 'date_part',\n 'date_trunc',\n 'decode',\n 'degrees',\n 'dense_rank',\n 'encode',\n 'enum_first',\n 'enum_last',\n 'enum_range',\n 'every',\n 'exp',\n 'first_value',\n 'floor',\n 'format',\n 'grouping',\n 'initcap',\n 'json_agg',\n 'json_array_length',\n 'json_build_array',\n 'json_build_object',\n 'json_extract_path',\n 'json_extract_path_text',\n 'json_object_agg',\n 'json_object_keys',\n 'json_strip_nulls',\n 'json_typeof',\n 'jsonb_agg',\n 'jsonb_array_length',\n 'jsonb_build_array',\n 'jsonb_build_object',\n 'jsonb_extract_path',\n 'jsonb_extract_path_text',\n 'jsonb_insert',\n 'jsonb_object_agg',\n 'jsonb_object_keys',\n 'jsonb_path_exists',\n 'jsonb_path_match',\n 'jsonb_path_query',\n 'jsonb_path_query_array',\n 'jsonb_path_query_first',\n 'jsonb_pretty',\n 'jsonb_set',\n 'jsonb_set_lax',\n 'jsonb_strip_nulls',\n 'jsonb_typeof',\n 'justify_days',\n 'justify_hours',\n 'justify_interval',\n 'lag',\n 'last_value',\n 'lead',\n 'left',\n 'length',\n 'ln',\n 'log',\n 'lower',\n 'lpad',\n 'ltrim',\n 'make_date',\n 'make_interval',\n 'make_time',\n 'make_timestamp',\n 'make_timestamptz',\n 'max',\n 'md5',\n 'min',\n 'mod',\n 'nth_value',\n 'ntile',\n 'octet_length',\n 'percent_rank',\n 'pi',\n 'power',\n 'quote_ident',\n 'quote_literal',\n 'quote_nullable',\n 'radians',\n 'rank',\n 'regexp_count',\n 'regexp_instr',\n 'regexp_like',\n 'regexp_match',\n 'regexp_matches',\n 'regexp_replace',\n 'regexp_split_to_array',\n 'regexp_split_to_table',\n 'repeat',\n 'replace',\n 'reverse',\n 'right',\n 'round',\n 'row_number',\n 'rpad',\n 'rtrim',\n 'sign',\n 'split_part',\n 'sqrt',\n 'starts_with',\n 'string_agg',\n 'string_to_array',\n 'strpos',\n 'substr',\n 'substring',\n 'sum',\n 'timezone',\n 'to_ascii',\n 'to_char',\n 'to_date',\n 'to_hex',\n 'to_json',\n 'to_jsonb',\n 'to_number',\n 'to_timestamp',\n 'translate',\n 'trunc',\n 'unnest',\n 'upper',\n 'width_bucket',\n] as const\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\n/**\n * Copy-on-write mutations for overlay tables backed by a synced twin\n * (v2-only). Structured metadata, never authored SQL: the compiler and data\n * plane generate the INSERT…SELECT / UPDATE / DELETE statements from it, so\n * there is no SQL surface to validate and write policies inject like any\n * other mutation. `override` copies the synced row into the overlay\n * (ON CONFLICT DO NOTHING) then updates the `set` columns; `revert` deletes\n * the overlay row so the coalesce view falls back to synced.\n */\nexport const canonicalCowMutationSchema = z.object({\n kind: z.enum(['override', 'revert']),\n name: identifier,\n /** Synced table (same namespace) the overlay copies from / falls back to. */\n synced: identifier,\n /** Single-column primary key PROPERTY (TS camelCase, like column `name`) shared by overlay and synced. */\n pk: z.string().min(1).max(63),\n /** Override: contract properties copied INSERT…SELECT from synced (pk included). Empty for revert. */\n copy: z.array(z.string().min(1).max(63)).default([]),\n /** Override: overlay properties written by the UPDATE (never the pk). Empty for revert. */\n set: z.array(z.string().min(1).max(63)).default([]),\n}).superRefine((mutation, ctx) => {\n if (mutation.kind === 'override') {\n if (mutation.set.length === 0) {\n ctx.addIssue({ code: 'custom', path: ['set'], message: 'override mutations must set at least one column' })\n }\n if (!mutation.copy.includes(mutation.pk)) {\n ctx.addIssue({ code: 'custom', path: ['copy'], message: 'override copy list must include the pk' })\n }\n } else if (mutation.set.length > 0 || mutation.copy.length > 0) {\n ctx.addIssue({ code: 'custom', path: ['set'], message: 'revert mutations take no copy/set columns' })\n }\n if (mutation.set.includes(mutation.pk)) {\n ctx.addIssue({ code: 'custom', path: ['set'], message: 'set must not include the pk — identity columns are pinned' })\n }\n // Duplicates would reach the executor as a doubled INSERT column or SET\n // assignment — reject at the schema like the authoring helper does.\n for (const [field, values] of [['copy', mutation.copy], ['set', mutation.set]] as const) {\n if (new Set(values).size !== values.length) {\n ctx.addIssue({ code: 'custom', path: [field], message: `${field} must not contain duplicate columns` })\n }\n }\n})\nexport type CanonicalCowMutation = z.infer<typeof canonicalCowMutationSchema>\n\nexport const canonicalForeignKeySchema = z.object({\n name: identifier,\n columns: z.array(columnIdentifier).min(1).max(8),\n target: identifier,\n references: z.array(columnIdentifier).min(1).max(8),\n deferrable: z.enum(['initially-immediate', 'initially-deferred']).optional(),\n}).strict()\nexport type CanonicalForeignKey = z.infer<typeof canonicalForeignKeySchema>\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(columnIdentifier).min(1).max(8).optional(),\n links: z.array(canonicalLinkSchema).default([]),\n indexes: z.array(canonicalIndexSchema).default([]),\n policies: canonicalPoliciesSchema.default({}),\n /**\n * v1-conversion carry-over only. v2 has no action surface — the runtime\n * neither compiles nor executes these; writes are mutations. Kept parseable\n * so stored definitions and their content hashes stay stable.\n */\n actions: z.array(canonicalActionSchema).default([]),\n /** Optional (not defaulted) so pre-CoW canonical documents keep byte-identical hashes. */\n cowMutations: z.array(canonicalCowMutationSchema).optional(),\n /** Omitted by old definitions, preserving their existing content hashes. */\n foreignKeys: z.array(canonicalForeignKeySchema).max(100).optional(),\n})\nexport type CanonicalTable = z.infer<typeof canonicalTableSchema>\n\nexport const canonicalViewSchema = z.object({\n view: identifier,\n description: z.string().max(2000).optional(),\n columns: z.array(canonicalColumnSchema).min(1),\n /** Logical identity for GraphQL only; PostgreSQL views have no PK constraint. */\n primaryKey: z.array(columnIdentifier).min(1).max(8).optional(),\n links: z.array(canonicalLinkSchema).default([]),\n policies: z.object({ read: policyExpressionSchema }).strict(),\n query: z.string().min(1).max(100_000).refine(isSingleViewQuerySql, {\n message: 'view query must be one SELECT/WITH statement without comments or dollar-quoted bodies',\n }),\n /** Namespace-local logical relation names, sorted for deterministic hashing. */\n dependencies: z.array(identifier).max(500),\n}).superRefine((view, ctx) => {\n for (const [index, column] of view.columns.entries()) {\n if (column.default !== undefined || column.defaultFn !== undefined) {\n ctx.addIssue({ code: 'custom', path: ['columns', index], message: `view column '${column.name}' cannot declare a default` })\n }\n if (column.onUpdateFn !== undefined) {\n ctx.addIssue({ code: 'custom', path: ['columns', index], message: `view column '${column.name}' cannot declare onUpdateFn` })\n }\n if (column.unique) {\n ctx.addIssue({ code: 'custom', path: ['columns', index], message: `view column '${column.name}' cannot declare unique` })\n }\n if (column.renamedFrom !== undefined || column.cast !== undefined) {\n ctx.addIssue({ code: 'custom', path: ['columns', index], message: `view column '${column.name}' cannot declare migration hints` })\n }\n }\n for (const [index, link] of view.links.entries()) {\n if (link.enforce) {\n ctx.addIssue({ code: 'custom', path: ['links', index, 'enforce'], message: `view link '${link.name}' cannot enforce a foreign key` })\n }\n }\n})\nexport type CanonicalView = z.infer<typeof canonicalViewSchema>\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 /** Optional to preserve byte-identical hashes for pre-view canonical v2 documents. */\n views: z.array(canonicalViewSchema).max(500).optional(),\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}).superRefine((definition, ctx) => {\n const seen = new Set<string>()\n for (const [index, table] of definition.tables.entries()) {\n if (seen.has(table.table)) {\n ctx.addIssue({ code: 'custom', path: ['tables', index, 'table'], message: `duplicate relation '${table.table}'` })\n }\n seen.add(table.table)\n if (table.source !== undefined) {\n for (const [columnIndex, column] of table.columns.entries()) {\n if (column.onUpdateFn !== undefined) {\n ctx.addIssue({\n code: 'custom',\n path: ['tables', index, 'columns', columnIndex],\n message: `synced table '${table.table}' column '${column.name}' cannot declare onUpdateFn`,\n })\n }\n }\n }\n }\n\n const fkTables = new Map(definition.tables.map(table => [table.table, table]))\n for (const [tableIndex, table] of definition.tables.entries()) {\n const names = new Set([\n ...(table.primaryKey?.length ? [`${table.table}_pkey`] : []),\n ...table.columns.filter(column => column.unique && !(table.primaryKey?.length === 1 && table.primaryKey[0] === column.columnName)).map(column => `${table.table}_${column.columnName}_unique`),\n ...table.links.filter(link => link.enforce).map(link => `fk_${table.table}_${link.name}`),\n ])\n for (const [index, fk] of (table.foreignKeys ?? []).entries()) {\n const fail = (message: string) => ctx.addIssue({ code: 'custom', path: ['tables', tableIndex, 'foreignKeys', index], message })\n if (names.has(fk.name)) fail(`duplicate foreign key '${fk.name}'`)\n names.add(fk.name)\n const target = fkTables.get(fk.target)\n if (table.source || !target || target.source) {\n fail('foreign keys must connect owned tables in the same namespace')\n continue\n }\n if (fk.columns.length !== fk.references.length) fail('foreign key columns and references must have the same number of columns')\n if (new Set(fk.columns).size !== fk.columns.length || new Set(fk.references).size !== fk.references.length) fail('foreign key columns must not repeat')\n for (const [position, name] of fk.columns.entries()) {\n const sourceColumn = table.columns.find(column => column.columnName === name)\n const targetColumn = target.columns.find(column => column.columnName === fk.references[position])\n if (!sourceColumn || !targetColumn) fail('foreign key references an unknown column')\n else if (JSON.stringify(sourceColumn.type) !== JSON.stringify(targetColumn.type)) fail('foreign key column types must match')\n }\n const uniqueKeys = [target.primaryKey ?? [], ...target.indexes.filter(index => index.unique).map(index => index.columns), ...target.columns.filter(column => column.unique).map(column => [column.columnName])]\n if (!uniqueKeys.some(key => key.length === fk.references.length && key.every(column => fk.references.includes(column)))) fail('foreign key target columns must form a unique key')\n }\n }\n\n // CoW mutations: overlay must be an owned table; synced twin must be a\n // synced table in this namespace; copy/set columns must exist on both sides.\n const tableByName = new Map(definition.tables.map((table) => [table.table, table]))\n for (const [tableIndex, table] of definition.tables.entries()) {\n const cowMutations = table.cowMutations ?? []\n if (cowMutations.length === 0) continue\n const path = (index: number, ...rest: Array<string | number>): Array<string | number> =>\n ['tables', tableIndex, 'cowMutations', index, ...rest]\n if (table.source !== undefined) {\n ctx.addIssue({ code: 'custom', path: path(0), message: `synced table '${table.table}' cannot declare cow mutations — it is read-only` })\n continue\n }\n for (const [index, mutation] of cowMutations.entries()) {\n const synced = tableByName.get(mutation.synced)\n if (!synced || synced.source === undefined) {\n ctx.addIssue({\n code: 'custom',\n path: path(index, 'synced'),\n message: `cow mutation '${mutation.name}' references '${mutation.synced}', which is not a synced table in this namespace`,\n })\n continue\n }\n // The full helper invariants, mirrored so hand-written canonical cannot\n // bypass them (the generated conflict/copy SQL depends on every one):\n // single-column PK identity on both sides, matching scalar types AND\n // Postgres column names for every copied column, and no nullable-synced\n // → NOT-NULL-overlay traps.\n const overlayColumnsByName = new Map(table.columns.map((column) => [column.name, column]))\n const syncedColumnsByName = new Map(synced.columns.map((column) => [column.name, column]))\n let columnsExist = true\n for (const property of [mutation.pk, ...mutation.copy, ...mutation.set]) {\n if (!overlayColumnsByName.has(property)) {\n columnsExist = false\n ctx.addIssue({ code: 'custom', path: path(index), message: `cow mutation '${mutation.name}': column '${property}' does not exist on overlay '${table.table}'` })\n }\n }\n for (const property of [mutation.pk, ...mutation.copy]) {\n if (!syncedColumnsByName.has(property)) {\n columnsExist = false\n ctx.addIssue({ code: 'custom', path: path(index), message: `cow mutation '${mutation.name}': column '${property}' does not exist on synced '${mutation.synced}'` })\n }\n }\n if (!columnsExist) continue\n\n const overlayPk = table.primaryKey ?? []\n const syncedPk = synced.primaryKey ?? []\n if (overlayPk.length !== 1 || overlayPk[0] !== mutation.pk || syncedPk.length !== 1 || syncedPk[0] !== mutation.pk) {\n ctx.addIssue({\n code: 'custom',\n path: path(index, 'pk'),\n message: `cow mutation '${mutation.name}': pk '${mutation.pk}' must be the single-column primary key on both '${table.table}' and '${mutation.synced}'`,\n })\n }\n for (const property of [mutation.pk, ...mutation.copy]) {\n const overlayColumn = overlayColumnsByName.get(property)\n const syncedColumn = syncedColumnsByName.get(property)\n if (!overlayColumn || !syncedColumn) continue\n if (JSON.stringify(overlayColumn.type) !== JSON.stringify(syncedColumn.type)) {\n ctx.addIssue({\n code: 'custom',\n path: path(index),\n message: `cow mutation '${mutation.name}': column '${property}' must have the same type on overlay and synced`,\n })\n }\n if (overlayColumn.columnName !== syncedColumn.columnName) {\n ctx.addIssue({\n code: 'custom',\n path: path(index),\n message: `cow mutation '${mutation.name}': column '${property}' maps to different Postgres names on overlay ('${overlayColumn.columnName}') and synced ('${syncedColumn.columnName}')`,\n })\n }\n if (syncedColumn.nullable !== false && overlayColumn.nullable === false) {\n ctx.addIssue({\n code: 'custom',\n path: path(index),\n message: `cow mutation '${mutation.name}': column '${property}' is nullable on synced but NOT NULL on overlay — a NULL synced value would fail the copy`,\n })\n }\n }\n }\n }\n for (const [index, view] of (definition.views ?? []).entries()) {\n if (seen.has(view.view)) {\n ctx.addIssue({ code: 'custom', path: ['views', index, 'view'], message: `duplicate relation '${view.view}'` })\n }\n seen.add(view.view)\n }\n\n const views = definition.views ?? []\n const viewByName = new Map(views.map((view) => [view.view, view]))\n for (const [viewIndex, view] of views.entries()) {\n for (const [dependencyIndex, dependency] of view.dependencies.entries()) {\n if (!seen.has(dependency)) {\n ctx.addIssue({\n code: 'custom',\n path: ['views', viewIndex, 'dependencies', dependencyIndex],\n message: `view '${view.view}' depends on unknown relation '${dependency}'`,\n })\n }\n }\n }\n\n const visiting = new Set<string>()\n const visited = new Set<string>()\n let cycleReported = false\n const visit = (name: string, path: string[]): void => {\n if (visited.has(name) || cycleReported) return\n if (visiting.has(name)) {\n cycleReported = true\n ctx.addIssue({\n code: 'custom',\n path: ['views'],\n message: `view dependencies form a cycle: ${[...path, name].join(' -> ')}`,\n })\n return\n }\n visiting.add(name)\n const view = viewByName.get(name)\n for (const dependency of view?.dependencies ?? []) {\n if (viewByName.has(dependency)) visit(dependency, [...path, name])\n }\n visiting.delete(name)\n visited.add(name)\n }\n for (const view of views) visit(view.view, [])\n})\nexport type CanonicalDefinition = z.infer<typeof canonicalDefinitionSchema>\n\n/**\n * Project namespace-local tables and views onto the shared read/query surface.\n * A view deliberately becomes a CanonicalTable-shaped relation with no write\n * policy, indexes, actions, defaults, or constraints. Keeping this adapter at\n * the canonical boundary makes SDL and compiler behavior identical without\n * pretending views are writable tables in the wire contract.\n */\nexport function canonicalRelations(definition: CanonicalDefinition): CanonicalTable[] {\n const views = (definition.views ?? []).map<CanonicalTable>((view) => ({\n table: view.view,\n ...(view.description !== undefined ? { description: view.description } : {}),\n columns: view.columns,\n ...(view.primaryKey !== undefined ? { primaryKey: view.primaryKey } : {}),\n links: view.links,\n indexes: [],\n policies: { read: view.policies.read },\n actions: [],\n }))\n return [...definition.tables, ...views].sort((a, b) => a.table.localeCompare(b.table))\n}\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 const normalized: CanonicalDefinition = {\n ...definition,\n enums: sortByName(definition.enums),\n tables: [...definition.tables]\n .sort((a, b) => a.table.localeCompare(b.table))\n .map((t) => {\n const { cowMutations, foreignKeys, ...rest } = t\n return {\n ...rest,\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 ...(foreignKeys?.length ? { foreignKeys: sortByName(foreignKeys) } : {}),\n // Omitted entirely when absent/empty so pre-CoW documents hash unchanged.\n ...(cowMutations !== undefined && cowMutations.length > 0 ? { cowMutations: sortByName(cowMutations) } : {}),\n }\n }),\n }\n if (definition.views !== undefined) {\n normalized.views = [...definition.views]\n .sort((a, b) => a.view.localeCompare(b.view))\n .map((view) => ({\n ...view,\n links: sortByName(view.links),\n dependencies: [...view.dependencies].sort(),\n }))\n }\n return normalized\n}\n"]}
|
package/dist/canonical.d.cts
CHANGED
|
@@ -48,6 +48,9 @@ declare const canonicalColumnSchema: z.ZodObject<{
|
|
|
48
48
|
"gen_random_uuid()": "gen_random_uuid()";
|
|
49
49
|
"now()": "now()";
|
|
50
50
|
}>>;
|
|
51
|
+
onUpdateFn: z.ZodOptional<z.ZodEnum<{
|
|
52
|
+
"now()": "now()";
|
|
53
|
+
}>>;
|
|
51
54
|
description: z.ZodOptional<z.ZodString>;
|
|
52
55
|
renamedFrom: z.ZodOptional<z.ZodString>;
|
|
53
56
|
cast: z.ZodOptional<z.ZodString>;
|
|
@@ -193,6 +196,17 @@ declare const canonicalCowMutationSchema: z.ZodObject<{
|
|
|
193
196
|
set: z.ZodDefault<z.ZodArray<z.ZodString>>;
|
|
194
197
|
}, z.core.$strip>;
|
|
195
198
|
type CanonicalCowMutation = z.infer<typeof canonicalCowMutationSchema>;
|
|
199
|
+
declare const canonicalForeignKeySchema: z.ZodObject<{
|
|
200
|
+
name: z.ZodString;
|
|
201
|
+
columns: z.ZodArray<z.ZodString>;
|
|
202
|
+
target: z.ZodString;
|
|
203
|
+
references: z.ZodArray<z.ZodString>;
|
|
204
|
+
deferrable: z.ZodOptional<z.ZodEnum<{
|
|
205
|
+
"initially-immediate": "initially-immediate";
|
|
206
|
+
"initially-deferred": "initially-deferred";
|
|
207
|
+
}>>;
|
|
208
|
+
}, z.core.$strict>;
|
|
209
|
+
type CanonicalForeignKey = z.infer<typeof canonicalForeignKeySchema>;
|
|
196
210
|
declare const canonicalTableSchema: z.ZodObject<{
|
|
197
211
|
table: z.ZodString;
|
|
198
212
|
description: z.ZodOptional<z.ZodString>;
|
|
@@ -222,6 +236,9 @@ declare const canonicalTableSchema: z.ZodObject<{
|
|
|
222
236
|
"gen_random_uuid()": "gen_random_uuid()";
|
|
223
237
|
"now()": "now()";
|
|
224
238
|
}>>;
|
|
239
|
+
onUpdateFn: z.ZodOptional<z.ZodEnum<{
|
|
240
|
+
"now()": "now()";
|
|
241
|
+
}>>;
|
|
225
242
|
description: z.ZodOptional<z.ZodString>;
|
|
226
243
|
renamedFrom: z.ZodOptional<z.ZodString>;
|
|
227
244
|
cast: z.ZodOptional<z.ZodString>;
|
|
@@ -320,6 +337,16 @@ declare const canonicalTableSchema: z.ZodObject<{
|
|
|
320
337
|
copy: z.ZodDefault<z.ZodArray<z.ZodString>>;
|
|
321
338
|
set: z.ZodDefault<z.ZodArray<z.ZodString>>;
|
|
322
339
|
}, z.core.$strip>>>;
|
|
340
|
+
foreignKeys: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
341
|
+
name: z.ZodString;
|
|
342
|
+
columns: z.ZodArray<z.ZodString>;
|
|
343
|
+
target: z.ZodString;
|
|
344
|
+
references: z.ZodArray<z.ZodString>;
|
|
345
|
+
deferrable: z.ZodOptional<z.ZodEnum<{
|
|
346
|
+
"initially-immediate": "initially-immediate";
|
|
347
|
+
"initially-deferred": "initially-deferred";
|
|
348
|
+
}>>;
|
|
349
|
+
}, z.core.$strict>>>;
|
|
323
350
|
}, z.core.$strip>;
|
|
324
351
|
type CanonicalTable = z.infer<typeof canonicalTableSchema>;
|
|
325
352
|
declare const canonicalViewSchema: z.ZodObject<{
|
|
@@ -349,6 +376,9 @@ declare const canonicalViewSchema: z.ZodObject<{
|
|
|
349
376
|
"gen_random_uuid()": "gen_random_uuid()";
|
|
350
377
|
"now()": "now()";
|
|
351
378
|
}>>;
|
|
379
|
+
onUpdateFn: z.ZodOptional<z.ZodEnum<{
|
|
380
|
+
"now()": "now()";
|
|
381
|
+
}>>;
|
|
352
382
|
description: z.ZodOptional<z.ZodString>;
|
|
353
383
|
renamedFrom: z.ZodOptional<z.ZodString>;
|
|
354
384
|
cast: z.ZodOptional<z.ZodString>;
|
|
@@ -419,6 +449,9 @@ declare const canonicalDefinitionSchema: z.ZodObject<{
|
|
|
419
449
|
"gen_random_uuid()": "gen_random_uuid()";
|
|
420
450
|
"now()": "now()";
|
|
421
451
|
}>>;
|
|
452
|
+
onUpdateFn: z.ZodOptional<z.ZodEnum<{
|
|
453
|
+
"now()": "now()";
|
|
454
|
+
}>>;
|
|
422
455
|
description: z.ZodOptional<z.ZodString>;
|
|
423
456
|
renamedFrom: z.ZodOptional<z.ZodString>;
|
|
424
457
|
cast: z.ZodOptional<z.ZodString>;
|
|
@@ -517,6 +550,16 @@ declare const canonicalDefinitionSchema: z.ZodObject<{
|
|
|
517
550
|
copy: z.ZodDefault<z.ZodArray<z.ZodString>>;
|
|
518
551
|
set: z.ZodDefault<z.ZodArray<z.ZodString>>;
|
|
519
552
|
}, z.core.$strip>>>;
|
|
553
|
+
foreignKeys: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
554
|
+
name: z.ZodString;
|
|
555
|
+
columns: z.ZodArray<z.ZodString>;
|
|
556
|
+
target: z.ZodString;
|
|
557
|
+
references: z.ZodArray<z.ZodString>;
|
|
558
|
+
deferrable: z.ZodOptional<z.ZodEnum<{
|
|
559
|
+
"initially-immediate": "initially-immediate";
|
|
560
|
+
"initially-deferred": "initially-deferred";
|
|
561
|
+
}>>;
|
|
562
|
+
}, z.core.$strict>>>;
|
|
520
563
|
}, z.core.$strip>>;
|
|
521
564
|
views: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
522
565
|
view: z.ZodString;
|
|
@@ -545,6 +588,9 @@ declare const canonicalDefinitionSchema: z.ZodObject<{
|
|
|
545
588
|
"gen_random_uuid()": "gen_random_uuid()";
|
|
546
589
|
"now()": "now()";
|
|
547
590
|
}>>;
|
|
591
|
+
onUpdateFn: z.ZodOptional<z.ZodEnum<{
|
|
592
|
+
"now()": "now()";
|
|
593
|
+
}>>;
|
|
548
594
|
description: z.ZodOptional<z.ZodString>;
|
|
549
595
|
renamedFrom: z.ZodOptional<z.ZodString>;
|
|
550
596
|
cast: z.ZodOptional<z.ZodString>;
|
|
@@ -600,4 +646,4 @@ declare function canonicalRelations(definition: CanonicalDefinition): CanonicalT
|
|
|
600
646
|
*/
|
|
601
647
|
declare function normalizeCanonical(definition: CanonicalDefinition): CanonicalDefinition;
|
|
602
648
|
|
|
603
|
-
export { CANONICAL_FORMAT, COLUMN_TYPES, type CanonicalColumn, type CanonicalCowMutation, type CanonicalDefinition, type CanonicalEnum, type CanonicalLink, type CanonicalTable, type CanonicalView, type ColumnType, IDENTIFIER_RE, type PolicyExpression, VIEW_QUERY_FUNCTION_ALLOWLIST, canonicalActionSchema, canonicalColumnSchema, canonicalCowMutationSchema, canonicalDefinitionSchema, canonicalEnumSchema, canonicalIndexSchema, canonicalLinkSchema, canonicalPoliciesSchema, canonicalRelations, canonicalTableSchema, canonicalViewSchema, isSingleViewQuerySql, normalizeCanonical, policyExpressionSchema, policyVariantSchema };
|
|
649
|
+
export { CANONICAL_FORMAT, COLUMN_TYPES, type CanonicalColumn, type CanonicalCowMutation, type CanonicalDefinition, type CanonicalEnum, type CanonicalForeignKey, type CanonicalLink, type CanonicalTable, type CanonicalView, type ColumnType, IDENTIFIER_RE, type PolicyExpression, VIEW_QUERY_FUNCTION_ALLOWLIST, canonicalActionSchema, canonicalColumnSchema, canonicalCowMutationSchema, canonicalDefinitionSchema, canonicalEnumSchema, canonicalForeignKeySchema, canonicalIndexSchema, canonicalLinkSchema, canonicalPoliciesSchema, canonicalRelations, canonicalTableSchema, canonicalViewSchema, isSingleViewQuerySql, normalizeCanonical, policyExpressionSchema, policyVariantSchema };
|