okmodel 0.2.1 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (108) hide show
  1. package/README.md +710 -36
  2. package/dist/contracts/catalog/enum.d.ts +31 -4
  3. package/dist/contracts/catalog/extension.d.ts +61 -0
  4. package/dist/contracts/catalog/privilege.d.ts +64 -0
  5. package/dist/contracts/catalog/routine.d.ts +56 -0
  6. package/dist/contracts/catalog/types.d.ts +164 -10
  7. package/dist/contracts/catalog/view.d.ts +73 -0
  8. package/dist/dialects/pg/column.d.ts +3 -1
  9. package/dist/dialects/pg/ddl.d.ts +65 -1
  10. package/dist/dialects/pg/enum.d.ts +10 -8
  11. package/dist/dialects/pg/ext/citext.d.ts +14 -0
  12. package/dist/dialects/pg/ext/citext.js +11 -0
  13. package/dist/dialects/pg/ext/index.d.ts +52 -0
  14. package/dist/dialects/pg/ext/index.js +6 -0
  15. package/dist/dialects/pg/ext/pg-trgm.d.ts +53 -0
  16. package/dist/dialects/pg/ext/pg-trgm.js +42 -0
  17. package/dist/dialects/pg/fn/index.d.ts +107 -0
  18. package/dist/dialects/pg/fn/index.js +175 -0
  19. package/dist/dialects/pg/fn/touch.d.ts +14 -0
  20. package/dist/dialects/pg/index.js +104 -19
  21. package/dist/dialects/pg/introspect.d.ts +10 -1
  22. package/dist/dialects/pg/operators.d.ts +8 -1
  23. package/dist/dialects/pg/role/check.d.ts +45 -0
  24. package/dist/dialects/pg/role/index.d.ts +50 -0
  25. package/dist/dialects/pg/role/sql.d.ts +44 -0
  26. package/dist/dialects/pg/table.d.ts +7 -0
  27. package/dist/dialects/pg/tenancy.d.ts +9 -0
  28. package/dist/dialects/pg/view/client.d.ts +30 -0
  29. package/dist/dialects/pg/view/depend.d.ts +35 -0
  30. package/dist/dialects/pg/view/index.d.ts +114 -0
  31. package/dist/dialects/pg/view/index.js +289 -0
  32. package/dist/dialects/pg/view/scratch.d.ts +21 -0
  33. package/dist/dialects/pg/where.d.ts +2 -2
  34. package/dist/runtime/pg/bun.js +3 -3
  35. package/dist/runtime/pg/pg.js +3 -3
  36. package/dist/runtime/pg/pglite.js +3 -3
  37. package/dist/runtime/pg/postgresjs.js +3 -3
  38. package/dist/runtime/tenancy/index.js +6 -3
  39. package/dist/runtime/traits/index.d.ts +7 -2
  40. package/dist/runtime/traits/index.js +149 -12
  41. package/dist/runtime/validate/index.js +4 -4
  42. package/dist/shared/{ytg3xf9p.js → 01yr20s5.js} +3 -3
  43. package/dist/shared/{cstgkzdx.js → 0jc3ffzf.js} +1 -1
  44. package/dist/shared/{xkz8g6by.js → 1g0drakv.js} +2 -2
  45. package/dist/shared/{eaxwrgby.js → 1tfdfvhh.js} +4 -3
  46. package/dist/shared/2ssqrv66.js +1576 -0
  47. package/dist/shared/{10tjenmd.js → 3ekj9x92.js} +1 -1
  48. package/dist/shared/49ypnfwt.js +1122 -0
  49. package/dist/shared/{sacqha1y.js → 4m9fn52z.js} +2 -2
  50. package/dist/shared/5nmdenb6.js +1229 -0
  51. package/dist/shared/{qa5dsc7z.js → 6bazvqwm.js} +3 -3
  52. package/dist/shared/{x9v1qgeb.js → 6w5j844a.js} +1 -1
  53. package/dist/shared/{0qkxbm1f.js → 75xkjv0t.js} +1 -1
  54. package/dist/shared/7fvtrkwr.js +84 -0
  55. package/dist/shared/94ez8kzh.js +19 -0
  56. package/dist/shared/{1dp5knt7.js → 999ade2q.js} +2 -2
  57. package/dist/shared/{3a5ne750.js → 9m80mkac.js} +2 -2
  58. package/dist/shared/9x25fxhc.js +150 -0
  59. package/dist/shared/{4b9da9d7.js → axhk06q1.js} +19 -1
  60. package/dist/shared/{38crxbgn.js → bqha5cg6.js} +3 -3
  61. package/dist/shared/{zd93g3rq.js → bryqk9k9.js} +1 -1
  62. package/dist/shared/{n47rd821.js → c8aghh05.js} +1 -1
  63. package/dist/shared/{dd4f8mnx.js → c9z5g0fm.js} +4 -2
  64. package/dist/shared/{eqmtn1bj.js → dbjej1tw.js} +71 -14
  65. package/dist/shared/{ps43134h.js → dyj86cmj.js} +4 -4
  66. package/dist/shared/{sfh4pk75.js → fptpmvxp.js} +3 -3
  67. package/dist/shared/{97g2jnrw.js → fs0ex00p.js} +3 -3
  68. package/dist/shared/{rtnaqre0.js → g4f5kcx9.js} +2 -2
  69. package/dist/shared/{yw5c610b.js → gjthds9j.js} +2 -2
  70. package/dist/shared/hcmdtwgh.js +102 -0
  71. package/dist/shared/{qxa0yb9j.js → jkc6ws1p.js} +2 -54
  72. package/dist/shared/{mxmcdsh5.js → k34e0xf2.js} +9 -9
  73. package/dist/shared/{py3nh7jy.js → kgnc8grt.js} +2 -2
  74. package/dist/shared/{g9f0zqce.js → m78s7898.js} +1 -1
  75. package/dist/shared/meck53jv.js +99 -0
  76. package/dist/shared/{v18jva5b.js → mt5wswjz.js} +1 -1
  77. package/dist/shared/{g1b5zzj9.js → n0dgs0pb.js} +1 -1
  78. package/dist/shared/{zt8y0wzb.js → n7mcc1gk.js} +1 -1
  79. package/dist/shared/ne02ng5c.js +68 -0
  80. package/dist/shared/{e7a268fy.js → p24x2334.js} +1 -1
  81. package/dist/shared/qbxzvwwc.js +88 -0
  82. package/dist/shared/{a1gdp7j9.js → qybh48nd.js} +1 -1
  83. package/dist/shared/{d04j53v8.js → scwxrpx2.js} +5 -4
  84. package/dist/shared/{d2whjz4k.js → t616ynfn.js} +530 -24
  85. package/dist/shared/th14ygv2.js +69 -0
  86. package/dist/shared/{xatfg0gn.js → tmbdywx0.js} +4 -19
  87. package/dist/shared/{ge03bfca.js → ty3v3hfk.js} +2 -2
  88. package/dist/shared/wekze34d.js +246 -0
  89. package/dist/shared/{7mht49yd.js → x6wysh83.js} +59 -18
  90. package/dist/shared/{4jzzghr6.js → xva8v7qk.js} +8 -8
  91. package/dist/shared/{ecdzej21.js → xw1d69vd.js} +7 -7
  92. package/dist/shared/y005b761.js +112 -0
  93. package/dist/shared/{mrq77sgw.js → ydaz1sv3.js} +1 -1
  94. package/dist/tooling/cli.js +32 -8
  95. package/dist/tooling/migrate/apply.d.ts +16 -0
  96. package/dist/tooling/migrate/commands.d.ts +2 -1
  97. package/dist/tooling/migrate/config.d.ts +8 -0
  98. package/dist/tooling/migrate/doctor.d.ts +25 -0
  99. package/dist/tooling/migrate/drift.d.ts +19 -0
  100. package/dist/tooling/migrate/ext.d.ts +17 -0
  101. package/dist/tooling/migrate/extensions.d.ts +51 -0
  102. package/dist/tooling/migrate/managed.d.ts +17 -0
  103. package/dist/tooling/migrate/plan.d.ts +14 -1
  104. package/dist/tooling/migrate/project.d.ts +25 -1
  105. package/dist/tooling/migrate/type-name.d.ts +19 -0
  106. package/package.json +22 -2
  107. package/dist/shared/5z4q2zda.js +0 -2073
  108. /package/dist/shared/{9k6vetvf.js → rrstp3kb.js} +0 -0
@@ -0,0 +1,69 @@
1
+ import {
2
+ normaliseEdges,
3
+ assertProvenance
4
+ } from "./t4tbsy9h.js";
5
+ import {
6
+ assertIdentifier2
7
+ } from "./nfzc5z0w.js";
8
+ import {
9
+ catalogError2
10
+ } from "./52szzakm.js";
11
+
12
+ // src/contracts/catalog/extension.ts
13
+ function extensionObject(input) {
14
+ assertIdentifier2(input.name, "extension");
15
+ assertIdentifier2(input.schema, "extension schema");
16
+ assertProvenance(input.provenance);
17
+ assertVersion(input.version);
18
+ const definition = {
19
+ schema: input.schema,
20
+ relocatable: input.relocatable ?? true,
21
+ ...input.version !== undefined ? { version: input.version } : {}
22
+ };
23
+ return {
24
+ kind: "extension",
25
+ identity: { kind: "extension", name: input.name },
26
+ owner: input.owner ?? "managed",
27
+ definition,
28
+ dependencies: normaliseEdges(input.dependencies ?? []),
29
+ provenance: input.provenance
30
+ };
31
+ }
32
+ function isExactVersion(version) {
33
+ return version !== undefined && /^\d+(?:\.\d+)*$/.test(version);
34
+ }
35
+ function compareExtensionVersions(left, right) {
36
+ const a = parts(left);
37
+ const b = parts(right);
38
+ const length = Math.max(a.length, b.length);
39
+ for (let index = 0;index < length; index += 1) {
40
+ const diff = (a[index] ?? 0) - (b[index] ?? 0);
41
+ if (diff !== 0)
42
+ return diff < 0 ? -1 : 1;
43
+ }
44
+ return 0;
45
+ }
46
+ function sameExtensionDefinition(before, after) {
47
+ if (before.definition.schema !== after.definition.schema)
48
+ return false;
49
+ if (before.definition.relocatable !== after.definition.relocatable)
50
+ return false;
51
+ return sameVersion(before.definition.version, after.definition.version);
52
+ }
53
+ function sameVersion(before, after) {
54
+ if (!isExactVersion(after) || !isExactVersion(before))
55
+ return true;
56
+ return before === after;
57
+ }
58
+ function assertVersion(version) {
59
+ if (version === undefined)
60
+ return;
61
+ if (isExactVersion(version) || /^>=\d+(?:\.\d+)*$/.test(version))
62
+ return;
63
+ catalogError2("OKM1020", `Extension version ${String(version)} must be a dotted version or a >= floor.`);
64
+ }
65
+ function parts(version) {
66
+ return version.split(".").map((part) => Number(part));
67
+ }
68
+
69
+ export { extensionObject, isExactVersion, compareExtensionVersions, sameExtensionDefinition };
@@ -1,3 +1,6 @@
1
+ import {
2
+ arrayElement
3
+ } from "./94ez8kzh.js";
1
4
  import {
2
5
  OkmError2
3
6
  } from "./52szzakm.js";
@@ -16,24 +19,6 @@ function rejected(message) {
16
19
  throw new OkmError2(CODEC_VALUE_CODE, message);
17
20
  }
18
21
 
19
- // src/dialects/pg/quote.ts
20
- function quoteLiteral(value) {
21
- return `'${value.replaceAll("'", "''")}'`;
22
- }
23
- function arrayElement(encoded, raw) {
24
- if (raw && (encoded === "true" || encoded === "false" || isBareNumber(encoded))) {
25
- return encoded;
26
- }
27
- return `"${encoded.replaceAll("\\", "\\\\").replaceAll('"', "\\\"")}"`;
28
- }
29
- function isBareNumber(encoded) {
30
- let pattern = bareNumber;
31
- pattern ??= /^-?(?:0|[1-9]\d*)(?:\.\d+)?(?:[eE][+-]?\d+)?$/;
32
- bareNumber = pattern;
33
- return pattern.test(encoded);
34
- }
35
- var bareNumber;
36
-
37
22
  // src/dialects/pg/array-literal.ts
38
23
  function writeArray(value, dims, encode, raw) {
39
24
  return writeLevel(value, dims, encode, raw);
@@ -190,4 +175,4 @@ function isSpace(char) {
190
175
  ` || char === "\t";
191
176
  }
192
177
 
193
- export { definition, unavailable, rejected, quoteLiteral, writeArray, readArray };
178
+ export { definition, unavailable, rejected, writeArray, readArray };
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  withHttp,
3
3
  attachHttp
4
- } from "./mxmcdsh5.js";
4
+ } from "./k34e0xf2.js";
5
5
  import {
6
6
  OkmError2
7
7
  } from "./52szzakm.js";
@@ -31,7 +31,7 @@ async function acceptServer(pool, schema, rows, http, requireMeta, options, sour
31
31
  }));
32
32
  }
33
33
  } else {
34
- const { assertCompatible } = await import("./sfh4pk75.js");
34
+ const { assertCompatible } = await import("./fptpmvxp.js");
35
35
  try {
36
36
  await assertCompatible(pool, schema, recorded, source, options);
37
37
  } catch (error) {
@@ -0,0 +1,246 @@
1
+ import {
2
+ isDomain
3
+ } from "./qbxzvwwc.js";
4
+ import {
5
+ quoteLiteral
6
+ } from "./94ez8kzh.js";
7
+ import {
8
+ identityKey2
9
+ } from "./t4tbsy9h.js";
10
+ import {
11
+ fitIdentifier2
12
+ } from "./nfzc5z0w.js";
13
+
14
+ // src/dialects/pg/ddl.ts
15
+ function quoteIdent(name) {
16
+ return `"${name.replaceAll('"', '""')}"`;
17
+ }
18
+ function ownedByView(object) {
19
+ if (object.kind !== "index")
20
+ return false;
21
+ return object.dependencies.some((edge) => edge.target.kind === "view" || edge.target.kind === "materializedView");
22
+ }
23
+ function dropObjectSql(object, schema) {
24
+ if (object.owner === "ignored")
25
+ return;
26
+ switch (object.kind) {
27
+ case "table":
28
+ return `drop table ${qualify(schema, object.identity.name)}`;
29
+ case "column":
30
+ return `alter table ${qualify(schema, object.identity.parent.name)} drop column ${quoteIdent(object.identity.name)}`;
31
+ case "index":
32
+ return `drop index ${qualify(schema, object.identity.name)}`;
33
+ case "constraint":
34
+ return `alter table ${qualify(schema, object.identity.parent.name)} drop constraint ${quoteIdent(object.identity.name)}`;
35
+ case "sequence":
36
+ return `drop sequence ${qualify(schema, object.identity.name)}`;
37
+ case "type":
38
+ return `drop type ${qualify(schema, object.identity.name)}`;
39
+ case "extension":
40
+ return `drop extension ${quoteIdent(object.identity.name)}`;
41
+ case "function":
42
+ return `drop function ${qualify(schema, object.identity.name)}(${object.identity.argTypes.join(", ")})`;
43
+ case "trigger":
44
+ return `drop trigger ${quoteIdent(object.identity.name)} on ${qualify(schema, object.identity.parent.name)}`;
45
+ case "view":
46
+ return `drop view ${qualify(schema, object.identity.name)}`;
47
+ case "materializedView":
48
+ return `drop materialized view ${qualify(schema, object.identity.name)}`;
49
+ default:
50
+ return;
51
+ }
52
+ }
53
+ function createObjectSql(object, schema) {
54
+ switch (object.kind) {
55
+ case "column":
56
+ return `alter table ${qualify(schema, object.identity.parent.name)} add column ${columnSql(object)}`;
57
+ case "index":
58
+ return createIndexSql(object, schema);
59
+ case "constraint":
60
+ return `alter table ${qualify(schema, object.identity.parent.name)} add constraint ${quoteIdent(object.identity.name)} ${constraintBody(object, schema)}`;
61
+ case "sequence":
62
+ return createSequenceSql(object, schema);
63
+ case "type":
64
+ return createTypeSql(object, schema);
65
+ case "extension":
66
+ return createExtensionSql(object);
67
+ case "function":
68
+ return functionSql(object, schema, false);
69
+ case "trigger":
70
+ return triggerSql(object, schema);
71
+ case "view":
72
+ return viewSql(object, schema, false);
73
+ case "materializedView":
74
+ return materializedViewSql(object, schema);
75
+ case "table":
76
+ return;
77
+ default:
78
+ return;
79
+ }
80
+ }
81
+ function functionSql(object, schema, replace) {
82
+ const definition = object.definition;
83
+ const args = definition.arguments.map((argument) => `${quoteIdent(argument.name)} ${argument.type}`).join(", ");
84
+ const head = `${replace ? "create or replace" : "create"} function ${qualify(schema, object.identity.name)}(${args})`;
85
+ const security = ` security ${definition.security}`;
86
+ const path = definition.searchPath === undefined ? "" : ` set search_path to ${definition.searchPath}`;
87
+ const tail = `returns ${definition.returns} language ${definition.language} ${definition.volatility}${security}${path}`;
88
+ if (definition.atomic)
89
+ return `${head} ${tail} ${definition.body}`;
90
+ return `${head} ${tail} as ${dollarQuote(definition.body)}`;
91
+ }
92
+ function viewSql(object, schema, replace) {
93
+ const verb = replace ? "create or replace view" : "create view";
94
+ return `${verb} ${qualify(schema, object.identity.name)} as ${object.definition.query}`;
95
+ }
96
+ function materializedViewSql(object, schema) {
97
+ return `create materialized view ${qualify(schema, object.identity.name)} as ${object.definition.query} with no data`;
98
+ }
99
+ function refreshMaterializedViewSql(object, schema, populated = false) {
100
+ const concurrently = populated && object.definition.refresh === "concurrently" ? " concurrently" : "";
101
+ return `refresh materialized view${concurrently} ${qualify(schema, object.identity.name)}`;
102
+ }
103
+ function triggerSql(object, schema) {
104
+ const definition = object.definition;
105
+ const timing = definition.timing === "instead" ? "instead of" : definition.timing;
106
+ const events = definition.events.map((event) => {
107
+ if (event !== "update" || definition.updateOf === undefined)
108
+ return event;
109
+ return `update of ${definition.updateOf.map((column) => quoteIdent(column)).join(", ")}`;
110
+ }).join(" or ");
111
+ const when = definition.when === undefined ? "" : ` when (${definition.when})`;
112
+ const args = definition.calls.argTypes.join(", ");
113
+ const fn = `${qualify(schema, definition.calls.name)}(${args})`;
114
+ return `create trigger ${quoteIdent(object.identity.name)} ${timing} ${events} on ${qualify(schema, object.identity.parent.name)} for each ${definition.level}${when} execute function ${fn}`;
115
+ }
116
+ function dollarQuote(body) {
117
+ let tag = "okm";
118
+ while (body.includes(`$${tag}$`))
119
+ tag = `${tag}_`;
120
+ return `$${tag}$${body}$${tag}$`;
121
+ }
122
+ function alterColumnSql(before, after, schema) {
123
+ const statements = [];
124
+ const table = qualify(schema, after.identity.parent.name);
125
+ const name = quoteIdent(after.identity.name);
126
+ const typeChanged = before.definition.dataType !== after.definition.dataType;
127
+ const collationChanged = before.definition.collation !== after.definition.collation;
128
+ if (typeChanged || collationChanged) {
129
+ const using = typeChanged ? ` using ${name}::${after.definition.dataType}` : "";
130
+ statements.push(`alter table ${table} alter column ${name} set data type ${after.definition.dataType}${collateSql(after.definition.collation)}${using}`);
131
+ }
132
+ if (before.definition.nullable !== after.definition.nullable) {
133
+ statements.push(`alter table ${table} alter column ${name} ${after.definition.nullable ? "drop not null" : "set not null"}`);
134
+ }
135
+ if (before.definition.defaultExpression !== after.definition.defaultExpression) {
136
+ statements.push(after.definition.defaultExpression === undefined ? `alter table ${table} alter column ${name} drop default` : `alter table ${table} alter column ${name} set default ${after.definition.defaultExpression}`);
137
+ }
138
+ return statements;
139
+ }
140
+ function identitySequence(sequence, source) {
141
+ const key = identityKey2(sequence.identity);
142
+ return source.objects.some((object) => {
143
+ if (object.kind !== "column" || object.definition.identity === undefined)
144
+ return false;
145
+ return object.dependencies.some((edge) => identityKey2(edge.target) === key);
146
+ });
147
+ }
148
+ function createTableSql(tableObject, source, schema) {
149
+ const parent = tableObject.identity.name;
150
+ const columns = source.objects.filter((object) => object.kind === "column" && object.identity.parent.name === parent);
151
+ const primary = source.objects.find((object) => object.kind === "constraint" && object.definition.constraintKind === "primaryKey" && object.identity.parent.name === parent);
152
+ const lines = columns.map((column) => columnSql(column));
153
+ if (primary !== undefined) {
154
+ const cols = primary.definition.columns.map((name) => quoteIdent(name)).join(", ");
155
+ lines.push(`constraint ${quoteIdent(primary.identity.name)} primary key (${cols})`);
156
+ }
157
+ const partition = tableObject.definition.partition;
158
+ const tail = partition === undefined ? "" : ` partition by ${partition.method} (${partition.columns.map((name) => quoteIdent(name)).join(", ")})`;
159
+ return `create table ${qualify(schema, parent)} (
160
+ ${lines.join(`,
161
+ `)}
162
+ )${tail}`;
163
+ }
164
+ function collateSql(collation) {
165
+ if (collation === undefined)
166
+ return "";
167
+ return ` collate ${quoteIdent(collation)}`;
168
+ }
169
+ function createTypeSql(object, schema) {
170
+ if (isDomain(object.definition)) {
171
+ const name = object.identity.name;
172
+ const constraint = quoteIdent(fitIdentifier2(`${name}_check`));
173
+ return `create domain ${qualify(schema, name)} as ${object.definition.base} constraint ${constraint} check (${object.definition.check})`;
174
+ }
175
+ const labels = object.definition.labels.map((label) => quoteLiteral(label)).join(", ");
176
+ return `create type ${qualify(schema, object.identity.name)} as enum (${labels})`;
177
+ }
178
+ function columnSql(column) {
179
+ const definition = column.definition;
180
+ let sql = `${quoteIdent(column.identity.name)} ${definition.dataType}${collateSql(definition.collation)}`;
181
+ if (definition.identity !== undefined) {
182
+ sql += definition.identity.always ? " generated always as identity" : " generated by default as identity";
183
+ } else if (definition.generated !== undefined) {
184
+ sql += ` generated always as (${definition.generated.expression}) stored`;
185
+ }
186
+ if (!definition.nullable)
187
+ sql += " not null";
188
+ if (definition.defaultExpression !== undefined)
189
+ sql += ` default ${definition.defaultExpression}`;
190
+ return sql;
191
+ }
192
+ function createIndexSql(object, schema) {
193
+ const unique = object.definition.unique ? "unique " : "";
194
+ const where = object.definition.predicate === undefined ? "" : ` where ${object.definition.predicate}`;
195
+ const expression = object.definition.expression;
196
+ const name = quoteIdent(object.identity.name);
197
+ const on = qualify(schema, object.identity.parent.name);
198
+ if (expression !== undefined && expression.startsWith("using ")) {
199
+ return `create ${unique}index ${name} on ${on} ${expression}${where}`;
200
+ }
201
+ const target = expression !== undefined ? `(${expression})` : object.definition.columns.map((column) => quoteIdent(column)).join(", ");
202
+ return `create ${unique}index ${name} on ${on} (${target})${where}`;
203
+ }
204
+ function createExtensionSql(object) {
205
+ const version = object.definition.version;
206
+ const pinned = version !== undefined && /^\d+(?:\.\d+)*$/.test(version) ? ` version ${quoteLiteral(version)}` : "";
207
+ return `create extension ${quoteIdent(object.identity.name)} schema ${quoteIdent(object.definition.schema)}${pinned}`;
208
+ }
209
+ function createSequenceSql(object, schema) {
210
+ const definition = object.definition;
211
+ const cycle = definition.cycle ? " cycle" : "";
212
+ return `create sequence ${qualify(schema, object.identity.name)} as ${definition.dataType} start ${definition.start} increment ${definition.increment}${cycle}`;
213
+ }
214
+ function constraintBody(object, schema) {
215
+ const definition = object.definition;
216
+ const columns = definition.columns.map((name) => quoteIdent(name)).join(", ");
217
+ switch (definition.constraintKind) {
218
+ case "primaryKey":
219
+ return `primary key (${columns})`;
220
+ case "unique": {
221
+ const nulls = definition.nullsNotDistinct ? " nulls not distinct" : "";
222
+ return `unique${nulls} (${columns})${deferClause(definition)}`;
223
+ }
224
+ case "check":
225
+ return `check (${definition.expression ?? "true"})${deferClause(definition)}`;
226
+ case "foreignKey": {
227
+ const references = definition.references;
228
+ const target = references === undefined ? "" : ` references ${qualify(schema, references.parent.name)} (${references.columns.map((name) => quoteIdent(name)).join(", ")})`;
229
+ const onDelete = references?.onDelete === undefined ? "" : ` on delete ${references.onDelete}`;
230
+ const onUpdate = references?.onUpdate === undefined ? "" : ` on update ${references.onUpdate}`;
231
+ return `foreign key (${columns})${target}${onDelete}${onUpdate}${deferClause(definition)}`;
232
+ }
233
+ default:
234
+ return definition.constraintKind;
235
+ }
236
+ }
237
+ function deferClause(definition) {
238
+ if (!definition.deferrable)
239
+ return "";
240
+ return ` deferrable initially ${definition.initially}`;
241
+ }
242
+ function qualify(schema, name) {
243
+ return `${quoteIdent(schema)}.${quoteIdent(name)}`;
244
+ }
245
+
246
+ export { quoteIdent, ownedByView, dropObjectSql, createObjectSql, functionSql, viewSql, refreshMaterializedViewSql, alterColumnSql, identitySequence, createTableSql, qualify };
@@ -1,29 +1,33 @@
1
1
  import {
2
- encodeText,
3
- decodeText
4
- } from "./sacqha1y.js";
2
+ catalog
3
+ } from "./jkc6ws1p.js";
5
4
  import {
6
- catalog,
7
5
  enumType,
8
6
  sameEnumLabels
9
- } from "./qxa0yb9j.js";
7
+ } from "./qbxzvwwc.js";
10
8
  import {
11
9
  snakeCase,
12
10
  emittedTypeName,
13
11
  rejectLater
14
- } from "./x9v1qgeb.js";
12
+ } from "./6w5j844a.js";
15
13
  import {
16
14
  withLocation
17
15
  } from "./k7dwkhvq.js";
16
+ import {
17
+ encodeText,
18
+ decodeText
19
+ } from "./4m9fn52z.js";
18
20
  import {
19
21
  ColumnBuilder2,
20
22
  formatType
21
- } from "./dd4f8mnx.js";
23
+ } from "./c9z5g0fm.js";
22
24
  import {
23
25
  definition,
24
- unavailable,
26
+ unavailable
27
+ } from "./tmbdywx0.js";
28
+ import {
25
29
  quoteLiteral
26
- } from "./xatfg0gn.js";
30
+ } from "./94ez8kzh.js";
27
31
  import {
28
32
  staticNamespace2,
29
33
  table3,
@@ -221,19 +225,18 @@ var SCHEMA_KNOWN = new Set([
221
225
  "casing",
222
226
  "codecs",
223
227
  "defaults",
228
+ "extensions",
229
+ "functions",
224
230
  "requires",
225
231
  "tables",
226
232
  "tenancy",
227
233
  "traits",
234
+ "triggers",
228
235
  "types",
229
- "validation"
236
+ "validation",
237
+ "views"
230
238
  ]);
231
- var SCHEMA_LATER = {
232
- extensions: "0.3",
233
- functions: "0.3",
234
- triggers: "0.3",
235
- views: "0.3"
236
- };
239
+ var SCHEMA_LATER = {};
237
240
  var BIGINT_CODECS = new Set(["string", "number", "bigint"]);
238
241
  var NUMERIC_CODECS = new Set(["string", "number"]);
239
242
  function stage(jobs, build) {
@@ -250,7 +253,7 @@ function schema2(config) {
250
253
  }
251
254
  const casing = readCasing(config.casing);
252
255
  const tables = rewritePass(config.tables, tenancy, schemaTraits, casing);
253
- const hooks = collectHooks(tenancy, schemaTraits, config.tables);
256
+ const hooks = collectHooks(tenancy, schemaTraits, config.tables, config.views);
254
257
  const types = readTypes(config.types);
255
258
  const codecs = readCodecs(config.codecs);
256
259
  const requires = readRequires(config.requires);
@@ -281,6 +284,7 @@ function schema2(config) {
281
284
  for (const item of prepared) {
282
285
  model[item.tsName] = tableModel(item, edges, byName, accepted);
283
286
  }
287
+ bindViews(config.views, model, tenancy, tables, casing);
284
288
  let document;
285
289
  return {
286
290
  get catalog() {
@@ -296,6 +300,14 @@ function schema2(config) {
296
300
  provenance: note.provenance
297
301
  }));
298
302
  }
303
+ contributeListed(config.extensions, objects);
304
+ contributeListed(config.functions, objects);
305
+ contributeListed(schemaTraits, objects);
306
+ for (const item of config.tables) {
307
+ contributeListed(item.options?.traits, objects);
308
+ }
309
+ contributeListed(config.triggers, objects);
310
+ contributeListed(config.views, objects);
299
311
  document = catalog(objects);
300
312
  }
301
313
  return document;
@@ -379,7 +391,7 @@ var registeredHooks = [];
379
391
  function addSchemaHook(hook) {
380
392
  registeredHooks.push(hook);
381
393
  }
382
- function collectHooks(tenancy, schemaTraits, tables) {
394
+ function collectHooks(tenancy, schemaTraits, tables, views) {
383
395
  const found = [];
384
396
  const seen = new Set;
385
397
  const add = (value) => {
@@ -391,6 +403,12 @@ function collectHooks(tenancy, schemaTraits, tables) {
391
403
  seen.add(value);
392
404
  found.push(hook.bind(value));
393
405
  };
406
+ if (Array.isArray(views)) {
407
+ for (const item of views) {
408
+ if (typeof item === "object" && item !== null)
409
+ add(item);
410
+ }
411
+ }
394
412
  if (tenancy !== undefined)
395
413
  add(tenancy);
396
414
  if (schemaTraits !== undefined) {
@@ -410,6 +428,17 @@ function collectHooks(tenancy, schemaTraits, tables) {
410
428
  found.push(hook);
411
429
  return found.length === 0 ? undefined : found;
412
430
  }
431
+ function bindViews(views, model, tenancy, tables, casing) {
432
+ if (!Array.isArray(views))
433
+ return;
434
+ const scoped = new Set;
435
+ for (const item of views) {
436
+ if (typeof item !== "object" || item === null)
437
+ continue;
438
+ const install = item.install;
439
+ install?.call(item, model, tenancy, tables, casing, scoped);
440
+ }
441
+ }
413
442
  function archiveModel(item) {
414
443
  const archive = item.archiveModel;
415
444
  return archive === undefined ? undefined : { archive };
@@ -423,6 +452,16 @@ function bareTables(tables) {
423
452
  }
424
453
  return tables;
425
454
  }
455
+ function contributeListed(value, objects) {
456
+ if (!Array.isArray(value))
457
+ return;
458
+ for (const item of value) {
459
+ const produced = item.contribute(value, objects);
460
+ if (Array.isArray(produced))
461
+ for (const object of produced)
462
+ objects.push(object);
463
+ }
464
+ }
426
465
  function openSchemaTraits(value) {
427
466
  if (value === undefined)
428
467
  return;
@@ -650,6 +689,7 @@ function pushCompiled(objects, column, input) {
650
689
  objects.push(compiled.check);
651
690
  if (compiled.unique !== undefined)
652
691
  objects.push(compiled.unique);
692
+ column.state.domain?.emit?.(input.parent.namespace, input.provenance, objects);
653
693
  }
654
694
  function compileUniques(tableName, options, parent, provenance, byField, jobs) {
655
695
  const unique = options?.unique;
@@ -695,6 +735,7 @@ function compileIndexes(tableName, options, handles, parent, provenance, jobs) {
695
735
  unique: built.isUnique === true,
696
736
  nameKey: built.columns.join("_"),
697
737
  ...built.predicate !== undefined ? { predicate: built.predicate } : {},
738
+ ...built.expression !== undefined ? { expression: built.expression } : {},
698
739
  provenance
699
740
  }));
700
741
  }
@@ -2,24 +2,24 @@ import {
2
2
  assertOperatorFits,
3
3
  textArray,
4
4
  arrayElementType
5
- } from "./zt8y0wzb.js";
5
+ } from "./n7mcc1gk.js";
6
+ import {
7
+ touchFields,
8
+ fieldSealed,
9
+ sealingTrait
10
+ } from "./7m88x3e9.js";
6
11
  import {
7
12
  runWrite
8
13
  } from "./n4jqhpqz.js";
9
14
  import {
10
15
  stack
11
16
  } from "./672t5vym.js";
12
- import {
13
- touchFields,
14
- fieldSealed,
15
- sealingTrait
16
- } from "./7m88x3e9.js";
17
17
  import {
18
18
  writeWouldValidate
19
- } from "./3a5ne750.js";
19
+ } from "./9m80mkac.js";
20
20
  import {
21
21
  encodeJson
22
- } from "./yw5c610b.js";
22
+ } from "./gjthds9j.js";
23
23
  import {
24
24
  withRowFilters,
25
25
  archiveRules,
@@ -6,7 +6,7 @@ import {
6
6
  runCall,
7
7
  EMPTY_NOTICES,
8
8
  resultFrom
9
- } from "./9k6vetvf.js";
9
+ } from "./rrstp3kb.js";
10
10
 
11
11
  // src/adapters/pg/postgresjs.ts
12
12
  import net from "node:net";
@@ -117,7 +117,7 @@ function open2(config) {
117
117
  },
118
118
  async batch(statements, options) {
119
119
  return sockets.occupy(async () => {
120
- const { checkout } = await import("./1dp5knt7.js");
120
+ const { checkout } = await import("./999ade2q.js");
121
121
  const connection = await checkout(held);
122
122
  try {
123
123
  return await connection.batch(statements, options);
@@ -129,12 +129,12 @@ function open2(config) {
129
129
  reserve() {
130
130
  const gate = sockets.busyGate();
131
131
  gate.enter();
132
- return import("./1dp5knt7.js").then((mod) => mod.holdCheckout(gate, () => mod.checkout(held)), (error) => {
132
+ return import("./999ade2q.js").then((mod) => mod.holdCheckout(gate, () => mod.checkout(held)), (error) => {
133
133
  gate.leave();
134
134
  throw error;
135
135
  });
136
136
  },
137
- describe: (text, params) => sockets.occupy(() => import("./1dp5knt7.js").then((mod) => mod.describe(sql, text, params))),
137
+ describe: (text, params) => sockets.occupy(() => import("./999ade2q.js").then((mod) => mod.describe(sql, text, params))),
138
138
  stream(text, params) {
139
139
  const gate = sockets.busyGate();
140
140
  return async function* () {
@@ -149,7 +149,7 @@ function open2(config) {
149
149
  listen(channel, onNotify) {
150
150
  const gate = sockets.listenerGate();
151
151
  gate.enter();
152
- return import("./1dp5knt7.js").then((mod) => mod.holdListener(gate, async () => {
152
+ return import("./999ade2q.js").then((mod) => mod.holdListener(gate, async () => {
153
153
  const listening = await sql.listen(channel, onNotify);
154
154
  return async () => {
155
155
  await listening.unlisten();
@@ -219,7 +219,7 @@ class PgSession {
219
219
  onAbort();
220
220
  else
221
221
  watch.signal.addEventListener("abort", onAbort, { once: true });
222
- return import("./1dp5knt7.js").then((mod) => mod.watchQuery(pending, watch, onAbort, {
222
+ return import("./999ade2q.js").then((mod) => mod.watchQuery(pending, watch, onAbort, {
223
223
  start,
224
224
  text,
225
225
  notices: this.notices,
@@ -271,7 +271,7 @@ class PgSession {
271
271
  }
272
272
  }
273
273
  async function* loadStream(sql, text, params) {
274
- const { stream } = await import("./1dp5knt7.js");
274
+ const { stream } = await import("./999ade2q.js");
275
275
  yield* stream(sql, text, params);
276
276
  }
277
277
  function send(sql, text, params, named) {