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.
- package/README.md +710 -36
- package/dist/contracts/catalog/enum.d.ts +31 -4
- package/dist/contracts/catalog/extension.d.ts +61 -0
- package/dist/contracts/catalog/privilege.d.ts +64 -0
- package/dist/contracts/catalog/routine.d.ts +56 -0
- package/dist/contracts/catalog/types.d.ts +164 -10
- package/dist/contracts/catalog/view.d.ts +73 -0
- package/dist/dialects/pg/column.d.ts +3 -1
- package/dist/dialects/pg/ddl.d.ts +65 -1
- package/dist/dialects/pg/enum.d.ts +10 -8
- package/dist/dialects/pg/ext/citext.d.ts +14 -0
- package/dist/dialects/pg/ext/citext.js +11 -0
- package/dist/dialects/pg/ext/index.d.ts +52 -0
- package/dist/dialects/pg/ext/index.js +6 -0
- package/dist/dialects/pg/ext/pg-trgm.d.ts +53 -0
- package/dist/dialects/pg/ext/pg-trgm.js +42 -0
- package/dist/dialects/pg/fn/index.d.ts +107 -0
- package/dist/dialects/pg/fn/index.js +175 -0
- package/dist/dialects/pg/fn/touch.d.ts +14 -0
- package/dist/dialects/pg/index.js +104 -19
- package/dist/dialects/pg/introspect.d.ts +10 -1
- package/dist/dialects/pg/operators.d.ts +8 -1
- package/dist/dialects/pg/role/check.d.ts +45 -0
- package/dist/dialects/pg/role/index.d.ts +50 -0
- package/dist/dialects/pg/role/sql.d.ts +44 -0
- package/dist/dialects/pg/table.d.ts +7 -0
- package/dist/dialects/pg/tenancy.d.ts +9 -0
- package/dist/dialects/pg/view/client.d.ts +30 -0
- package/dist/dialects/pg/view/depend.d.ts +35 -0
- package/dist/dialects/pg/view/index.d.ts +114 -0
- package/dist/dialects/pg/view/index.js +289 -0
- package/dist/dialects/pg/view/scratch.d.ts +21 -0
- package/dist/dialects/pg/where.d.ts +2 -2
- package/dist/runtime/pg/bun.js +3 -3
- package/dist/runtime/pg/pg.js +3 -3
- package/dist/runtime/pg/pglite.js +3 -3
- package/dist/runtime/pg/postgresjs.js +3 -3
- package/dist/runtime/tenancy/index.js +6 -3
- package/dist/runtime/traits/index.d.ts +7 -2
- package/dist/runtime/traits/index.js +149 -12
- package/dist/runtime/validate/index.js +4 -4
- package/dist/shared/{ytg3xf9p.js → 01yr20s5.js} +3 -3
- package/dist/shared/{cstgkzdx.js → 0jc3ffzf.js} +1 -1
- package/dist/shared/{xkz8g6by.js → 1g0drakv.js} +2 -2
- package/dist/shared/{eaxwrgby.js → 1tfdfvhh.js} +4 -3
- package/dist/shared/2ssqrv66.js +1576 -0
- package/dist/shared/{10tjenmd.js → 3ekj9x92.js} +1 -1
- package/dist/shared/49ypnfwt.js +1122 -0
- package/dist/shared/{sacqha1y.js → 4m9fn52z.js} +2 -2
- package/dist/shared/5nmdenb6.js +1229 -0
- package/dist/shared/{qa5dsc7z.js → 6bazvqwm.js} +3 -3
- package/dist/shared/{x9v1qgeb.js → 6w5j844a.js} +1 -1
- package/dist/shared/{0qkxbm1f.js → 75xkjv0t.js} +1 -1
- package/dist/shared/7fvtrkwr.js +84 -0
- package/dist/shared/94ez8kzh.js +19 -0
- package/dist/shared/{1dp5knt7.js → 999ade2q.js} +2 -2
- package/dist/shared/{3a5ne750.js → 9m80mkac.js} +2 -2
- package/dist/shared/9x25fxhc.js +150 -0
- package/dist/shared/{4b9da9d7.js → axhk06q1.js} +19 -1
- package/dist/shared/{38crxbgn.js → bqha5cg6.js} +3 -3
- package/dist/shared/{zd93g3rq.js → bryqk9k9.js} +1 -1
- package/dist/shared/{n47rd821.js → c8aghh05.js} +1 -1
- package/dist/shared/{dd4f8mnx.js → c9z5g0fm.js} +4 -2
- package/dist/shared/{eqmtn1bj.js → dbjej1tw.js} +71 -14
- package/dist/shared/{ps43134h.js → dyj86cmj.js} +4 -4
- package/dist/shared/{sfh4pk75.js → fptpmvxp.js} +3 -3
- package/dist/shared/{97g2jnrw.js → fs0ex00p.js} +3 -3
- package/dist/shared/{rtnaqre0.js → g4f5kcx9.js} +2 -2
- package/dist/shared/{yw5c610b.js → gjthds9j.js} +2 -2
- package/dist/shared/hcmdtwgh.js +102 -0
- package/dist/shared/{qxa0yb9j.js → jkc6ws1p.js} +2 -54
- package/dist/shared/{mxmcdsh5.js → k34e0xf2.js} +9 -9
- package/dist/shared/{py3nh7jy.js → kgnc8grt.js} +2 -2
- package/dist/shared/{g9f0zqce.js → m78s7898.js} +1 -1
- package/dist/shared/meck53jv.js +99 -0
- package/dist/shared/{v18jva5b.js → mt5wswjz.js} +1 -1
- package/dist/shared/{g1b5zzj9.js → n0dgs0pb.js} +1 -1
- package/dist/shared/{zt8y0wzb.js → n7mcc1gk.js} +1 -1
- package/dist/shared/ne02ng5c.js +68 -0
- package/dist/shared/{e7a268fy.js → p24x2334.js} +1 -1
- package/dist/shared/qbxzvwwc.js +88 -0
- package/dist/shared/{a1gdp7j9.js → qybh48nd.js} +1 -1
- package/dist/shared/{d04j53v8.js → scwxrpx2.js} +5 -4
- package/dist/shared/{d2whjz4k.js → t616ynfn.js} +530 -24
- package/dist/shared/th14ygv2.js +69 -0
- package/dist/shared/{xatfg0gn.js → tmbdywx0.js} +4 -19
- package/dist/shared/{ge03bfca.js → ty3v3hfk.js} +2 -2
- package/dist/shared/wekze34d.js +246 -0
- package/dist/shared/{7mht49yd.js → x6wysh83.js} +59 -18
- package/dist/shared/{4jzzghr6.js → xva8v7qk.js} +8 -8
- package/dist/shared/{ecdzej21.js → xw1d69vd.js} +7 -7
- package/dist/shared/y005b761.js +112 -0
- package/dist/shared/{mrq77sgw.js → ydaz1sv3.js} +1 -1
- package/dist/tooling/cli.js +32 -8
- package/dist/tooling/migrate/apply.d.ts +16 -0
- package/dist/tooling/migrate/commands.d.ts +2 -1
- package/dist/tooling/migrate/config.d.ts +8 -0
- package/dist/tooling/migrate/doctor.d.ts +25 -0
- package/dist/tooling/migrate/drift.d.ts +19 -0
- package/dist/tooling/migrate/ext.d.ts +17 -0
- package/dist/tooling/migrate/extensions.d.ts +51 -0
- package/dist/tooling/migrate/managed.d.ts +17 -0
- package/dist/tooling/migrate/plan.d.ts +14 -1
- package/dist/tooling/migrate/project.d.ts +25 -1
- package/dist/tooling/migrate/type-name.d.ts +19 -0
- package/package.json +22 -2
- package/dist/shared/5z4q2zda.js +0 -2073
- /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,
|
|
178
|
+
export { definition, unavailable, rejected, writeArray, readArray };
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
withHttp,
|
|
3
3
|
attachHttp
|
|
4
|
-
} from "./
|
|
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("./
|
|
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
|
-
|
|
3
|
-
|
|
4
|
-
} from "./sacqha1y.js";
|
|
2
|
+
catalog
|
|
3
|
+
} from "./jkc6ws1p.js";
|
|
5
4
|
import {
|
|
6
|
-
catalog,
|
|
7
5
|
enumType,
|
|
8
6
|
sameEnumLabels
|
|
9
|
-
} from "./
|
|
7
|
+
} from "./qbxzvwwc.js";
|
|
10
8
|
import {
|
|
11
9
|
snakeCase,
|
|
12
10
|
emittedTypeName,
|
|
13
11
|
rejectLater
|
|
14
|
-
} from "./
|
|
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 "./
|
|
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 "./
|
|
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 "./
|
|
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 "./
|
|
19
|
+
} from "./9m80mkac.js";
|
|
20
20
|
import {
|
|
21
21
|
encodeJson
|
|
22
|
-
} from "./
|
|
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 "./
|
|
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("./
|
|
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("./
|
|
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("./
|
|
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("./
|
|
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("./
|
|
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("./
|
|
274
|
+
const { stream } = await import("./999ade2q.js");
|
|
275
275
|
yield* stream(sql, text, params);
|
|
276
276
|
}
|
|
277
277
|
function send(sql, text, params, named) {
|