okmodel 0.2.1 → 0.4.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 (148) hide show
  1. package/README.md +882 -48
  2. package/dist/contracts/catalog/document.d.ts +6 -2
  3. package/dist/contracts/catalog/enum.d.ts +31 -4
  4. package/dist/contracts/catalog/extension.d.ts +61 -0
  5. package/dist/contracts/catalog/privilege.d.ts +64 -0
  6. package/dist/contracts/catalog/routine.d.ts +56 -0
  7. package/dist/contracts/catalog/types.d.ts +164 -10
  8. package/dist/contracts/catalog/view.d.ts +73 -0
  9. package/dist/dialects/pg/column.d.ts +3 -1
  10. package/dist/dialects/pg/ddl.d.ts +65 -1
  11. package/dist/dialects/pg/enum.d.ts +10 -8
  12. package/dist/dialects/pg/ext/citext.d.ts +14 -0
  13. package/dist/dialects/pg/ext/citext.js +11 -0
  14. package/dist/dialects/pg/ext/index.d.ts +52 -0
  15. package/dist/dialects/pg/ext/index.js +6 -0
  16. package/dist/dialects/pg/ext/pg-trgm.d.ts +53 -0
  17. package/dist/dialects/pg/ext/pg-trgm.js +42 -0
  18. package/dist/dialects/pg/fn/index.d.ts +107 -0
  19. package/dist/dialects/pg/fn/index.js +175 -0
  20. package/dist/dialects/pg/fn/touch.d.ts +14 -0
  21. package/dist/dialects/pg/index.js +104 -19
  22. package/dist/dialects/pg/introspect.d.ts +10 -1
  23. package/dist/dialects/pg/operators.d.ts +8 -1
  24. package/dist/dialects/pg/role/check.d.ts +45 -0
  25. package/dist/dialects/pg/role/index.d.ts +50 -0
  26. package/dist/dialects/pg/role/sql.d.ts +51 -0
  27. package/dist/dialects/pg/table.d.ts +24 -1
  28. package/dist/dialects/pg/tenancy.d.ts +9 -0
  29. package/dist/dialects/pg/view/client.d.ts +30 -0
  30. package/dist/dialects/pg/view/depend.d.ts +35 -0
  31. package/dist/dialects/pg/view/index.d.ts +114 -0
  32. package/dist/dialects/pg/view/index.js +289 -0
  33. package/dist/dialects/pg/view/scratch.d.ts +22 -0
  34. package/dist/dialects/pg/where.d.ts +2 -2
  35. package/dist/runtime/catalog-cache.d.ts +17 -0
  36. package/dist/runtime/compat-words.d.ts +23 -0
  37. package/dist/runtime/drift-detail.d.ts +20 -4
  38. package/dist/runtime/drift.d.ts +4 -2
  39. package/dist/runtime/pg/bun.js +3 -3
  40. package/dist/runtime/pg/pg.js +3 -3
  41. package/dist/runtime/pg/pglite.js +3 -3
  42. package/dist/runtime/pg/postgresjs.js +3 -3
  43. package/dist/runtime/tenancy/index.js +6 -3
  44. package/dist/runtime/traits/index.d.ts +7 -2
  45. package/dist/runtime/traits/index.js +151 -13
  46. package/dist/runtime/types.d.ts +2 -0
  47. package/dist/runtime/validate/index.js +4 -4
  48. package/dist/shared/{xkz8g6by.js → 1g0drakv.js} +2 -2
  49. package/dist/shared/2321avmn.js +418 -0
  50. package/dist/shared/{7mht49yd.js → 3p4b1fg0.js} +57 -18
  51. package/dist/shared/41kv2xdm.js +318 -0
  52. package/dist/shared/{97g2jnrw.js → 4ef7mmqf.js} +3 -3
  53. package/dist/shared/{sacqha1y.js → 4m9fn52z.js} +2 -2
  54. package/dist/shared/5mtf6cj3.js +94 -0
  55. package/dist/shared/{1dp5knt7.js → 5vdm4sgp.js} +2 -2
  56. package/dist/shared/{a1gdp7j9.js → 6693j9rs.js} +1 -1
  57. package/dist/shared/{38crxbgn.js → 6p5k20sm.js} +3 -3
  58. package/dist/shared/7nk68fj8.js +751 -0
  59. package/dist/shared/84ptn35q.js +71 -0
  60. package/dist/shared/{d2whjz4k.js → 8jb4ymh2.js} +581 -28
  61. package/dist/shared/8ktwd3rh.js +97 -0
  62. package/dist/shared/94ez8kzh.js +19 -0
  63. package/dist/shared/{3a5ne750.js → 9m80mkac.js} +2 -2
  64. package/dist/shared/9x25fxhc.js +150 -0
  65. package/dist/shared/9yn6a2vd.js +11 -0
  66. package/dist/shared/ady1ms74.js +72 -0
  67. package/dist/shared/{4jzzghr6.js → awrsqrn7.js} +6 -6
  68. package/dist/shared/{4b9da9d7.js → axhk06q1.js} +19 -1
  69. package/dist/shared/{d04j53v8.js → c5g81ngb.js} +82 -14
  70. package/dist/shared/{n47rd821.js → c8aghh05.js} +1 -1
  71. package/dist/shared/{dd4f8mnx.js → c9z5g0fm.js} +4 -2
  72. package/dist/shared/{ps43134h.js → dyj86cmj.js} +4 -4
  73. package/dist/shared/{0qkxbm1f.js → fa9vt245.js} +1 -1
  74. package/dist/shared/{qa5dsc7z.js → fb00y8fp.js} +3 -3
  75. package/dist/shared/{qxa0yb9j.js → g7ez901n.js} +30 -1
  76. package/dist/shared/{py3nh7jy.js → gdh9mrtp.js} +2 -2
  77. package/dist/shared/{yw5c610b.js → gjthds9j.js} +2 -2
  78. package/dist/shared/hcmdtwgh.js +102 -0
  79. package/dist/shared/hqjsxnz7.js +13 -0
  80. package/dist/shared/htnaj77v.js +17 -0
  81. package/dist/shared/{v18jva5b.js → jgxzjzcz.js} +1 -1
  82. package/dist/shared/{x9v1qgeb.js → jsd07prz.js} +3 -3
  83. package/dist/shared/{g9f0zqce.js → kafaa5zv.js} +1 -1
  84. package/dist/shared/kj680nxv.js +19 -0
  85. package/dist/shared/{mxmcdsh5.js → kkzwp3d2.js} +9 -9
  86. package/dist/shared/{g1b5zzj9.js → n0dgs0pb.js} +1 -1
  87. package/dist/shared/n5y9zyj1.js +2431 -0
  88. package/dist/shared/{zt8y0wzb.js → n7mcc1gk.js} +1 -1
  89. package/dist/shared/{ge03bfca.js → nxb42q7h.js} +2 -2
  90. package/dist/shared/q6zsyh31.js +2192 -0
  91. package/dist/shared/{sfh4pk75.js → q795afwa.js} +26 -21
  92. package/dist/shared/{10tjenmd.js → qn0srwwq.js} +1 -1
  93. package/dist/shared/s4mb6a4b.js +545 -0
  94. package/dist/shared/{ytg3xf9p.js → sf8m6tfy.js} +3 -3
  95. package/dist/shared/{zd93g3rq.js → sr5ms7b3.js} +1 -1
  96. package/dist/shared/{xatfg0gn.js → tmbdywx0.js} +4 -19
  97. package/dist/shared/tny2t3sm.js +100 -0
  98. package/dist/shared/{e7a268fy.js → v7tpnhnz.js} +1 -1
  99. package/dist/shared/{ecdzej21.js → wqem4jed.js} +7 -7
  100. package/dist/shared/xghkt7a9.js +1144 -0
  101. package/dist/shared/y005b761.js +112 -0
  102. package/dist/shared/ycatkxmq.js +84 -0
  103. package/dist/shared/ygem90rn.js +900 -0
  104. package/dist/shared/{eaxwrgby.js → yjw02enp.js} +6 -3
  105. package/dist/shared/{mrq77sgw.js → zg24x0hm.js} +1 -1
  106. package/dist/shared/{cstgkzdx.js → zvbjc949.js} +1 -1
  107. package/dist/tooling/cli.js +66 -13
  108. package/dist/tooling/migrate/apply.d.ts +75 -5
  109. package/dist/tooling/migrate/backfill.d.ts +136 -0
  110. package/dist/tooling/migrate/check.d.ts +65 -0
  111. package/dist/tooling/migrate/classify.d.ts +108 -0
  112. package/dist/tooling/migrate/commands.d.ts +2 -1
  113. package/dist/tooling/migrate/config.d.ts +30 -0
  114. package/dist/tooling/migrate/doctor.d.ts +28 -0
  115. package/dist/tooling/migrate/drift.d.ts +35 -0
  116. package/dist/tooling/migrate/estimate.d.ts +50 -0
  117. package/dist/tooling/migrate/ext.d.ts +17 -0
  118. package/dist/tooling/migrate/extensions.d.ts +53 -0
  119. package/dist/tooling/migrate/files.d.ts +12 -0
  120. package/dist/tooling/migrate/index.d.ts +3 -2
  121. package/dist/tooling/migrate/index.js +67 -1
  122. package/dist/tooling/migrate/lint-rules.d.ts +51 -0
  123. package/dist/tooling/migrate/lint.d.ts +71 -0
  124. package/dist/tooling/migrate/managed.d.ts +17 -0
  125. package/dist/tooling/migrate/plan.d.ts +78 -10
  126. package/dist/tooling/migrate/project.d.ts +64 -5
  127. package/dist/tooling/migrate/provision.d.ts +18 -0
  128. package/dist/tooling/migrate/reference.d.ts +40 -0
  129. package/dist/tooling/migrate/runner.d.ts +108 -0
  130. package/dist/tooling/migrate/safe.d.ts +77 -0
  131. package/dist/tooling/migrate/seed.d.ts +20 -0
  132. package/dist/tooling/migrate/snapshot.d.ts +78 -0
  133. package/dist/tooling/migrate/status.d.ts +25 -6
  134. package/dist/tooling/migrate/type-name.d.ts +19 -0
  135. package/dist/tooling/testing/factories.d.ts +117 -0
  136. package/dist/tooling/testing/facts.d.ts +72 -0
  137. package/dist/tooling/testing/index.d.ts +89 -0
  138. package/dist/tooling/testing/index.js +8 -0
  139. package/dist/tooling/testing/isolation.d.ts +30 -0
  140. package/dist/tooling/testing/random.d.ts +40 -0
  141. package/dist/tooling/testing/record.d.ts +38 -0
  142. package/package.json +26 -2
  143. package/dist/shared/5z4q2zda.js +0 -2073
  144. package/dist/shared/eqmtn1bj.js +0 -399
  145. package/dist/shared/rtnaqre0.js +0 -37
  146. package/dist/shared/zwmqxb0g.js +0 -79
  147. package/dist/shared/{m9tv7xn7.js → radd3z4g.js} +3 -3
  148. /package/dist/shared/{9k6vetvf.js → rrstp3kb.js} +0 -0
@@ -0,0 +1,112 @@
1
+ import {
2
+ staticNamespace2,
3
+ assertNamespace2,
4
+ normaliseEdges,
5
+ assertProvenance
6
+ } from "./t4tbsy9h.js";
7
+ import {
8
+ assertIdentifier2,
9
+ fitIdentifier2,
10
+ deterministicName2
11
+ } from "./nfzc5z0w.js";
12
+ import {
13
+ catalogError2
14
+ } from "./52szzakm.js";
15
+
16
+ // src/contracts/catalog/view.ts
17
+ function normaliseViewQuery(query) {
18
+ return query.trim().replace(/;\s*$/, "");
19
+ }
20
+ function viewObject(input) {
21
+ const namespace = input.namespace ?? staticNamespace2("public");
22
+ const columns = readColumns(input.name, input.columns);
23
+ const query = readQuery(input.name, input.query);
24
+ assertNamespace2(namespace);
25
+ assertProvenance(input.provenance);
26
+ const definition = { columns, query };
27
+ return {
28
+ kind: "view",
29
+ identity: { kind: "view", namespace, name: input.name },
30
+ owner: input.owner ?? "managed",
31
+ definition,
32
+ dependencies: normaliseEdges(input.dependencies ?? []),
33
+ provenance: input.provenance
34
+ };
35
+ }
36
+ function materializedViewObject(input) {
37
+ const namespace = input.namespace ?? staticNamespace2("public");
38
+ const columns = readColumns(input.name, input.columns);
39
+ const query = readQuery(input.name, input.query);
40
+ assertNamespace2(namespace);
41
+ assertProvenance(input.provenance);
42
+ const definition = {
43
+ columns,
44
+ query,
45
+ ...input.refresh === "concurrently" ? { refresh: "concurrently" } : {}
46
+ };
47
+ return {
48
+ kind: "materializedView",
49
+ identity: { kind: "materializedView", namespace, name: input.name },
50
+ owner: input.owner ?? "managed",
51
+ definition,
52
+ dependencies: normaliseEdges(input.dependencies ?? []),
53
+ provenance: input.provenance
54
+ };
55
+ }
56
+ function materializedViewIndex(input) {
57
+ assertNamespace2(input.parent.namespace);
58
+ assertIdentifier2(input.parent.name, "index parent");
59
+ assertProvenance(input.provenance);
60
+ const columns = [...input.columns];
61
+ for (const name of columns)
62
+ assertIdentifier2(name, "index column");
63
+ if (columns.length === 0 && input.expression === undefined) {
64
+ catalogError2("OKM1020", `Index on ${input.parent.name} needs a column or an expression.`);
65
+ }
66
+ const nameKey = input.nameKey ?? (columns.length > 0 ? columns.join("_") : "expr");
67
+ const name = input.name === undefined ? deterministicName2({ parent: input.parent.name, purpose: "index", nameKey }) : fitIdentifier2(input.name);
68
+ const parentView = {
69
+ kind: "materializedView",
70
+ namespace: input.parent.namespace,
71
+ name: input.parent.name
72
+ };
73
+ return {
74
+ kind: "index",
75
+ identity: { kind: "index", parent: input.parent, name },
76
+ owner: input.owner ?? "managed",
77
+ definition: {
78
+ columns,
79
+ unique: input.unique === true,
80
+ nameKey,
81
+ ...input.expression !== undefined ? { expression: input.expression } : {},
82
+ ...input.predicate !== undefined ? { predicate: input.predicate } : {}
83
+ },
84
+ dependencies: normaliseEdges(input.dependencies ?? [parentView]),
85
+ provenance: input.provenance
86
+ };
87
+ }
88
+ function readColumns(view, columns) {
89
+ assertIdentifier2(view, "view");
90
+ if (columns.length === 0)
91
+ catalogError2("OKM1020", `View ${view} needs a column.`);
92
+ const seen = new Set;
93
+ return columns.map((column) => {
94
+ assertIdentifier2(column.name, `view ${view} column`);
95
+ if (seen.has(column.name)) {
96
+ catalogError2("OKM1020", `View ${view} lists column ${column.name} twice.`);
97
+ }
98
+ seen.add(column.name);
99
+ if (column.dataType.length === 0 || /[;'"\\]/.test(column.dataType)) {
100
+ catalogError2("OKM1020", `View ${view} column ${column.name} type is not a type name.`);
101
+ }
102
+ return { name: column.name, dataType: column.dataType };
103
+ });
104
+ }
105
+ function readQuery(view, query) {
106
+ const text = normaliseViewQuery(query);
107
+ if (text.length === 0)
108
+ catalogError2("OKM1020", `View ${view} needs a query.`);
109
+ return text;
110
+ }
111
+
112
+ export { normaliseViewQuery, viewObject, materializedViewObject, materializedViewIndex };
@@ -0,0 +1,84 @@
1
+ import {
2
+ extensionObject
3
+ } from "./8ktwd3rh.js";
4
+ import {
5
+ OkmError2
6
+ } from "./52szzakm.js";
7
+
8
+ // src/dialects/pg/ext/index.ts
9
+ function extension2(name, options = {}) {
10
+ const schema = options.schema ?? "public";
11
+ const relocatable = options.relocatable ?? true;
12
+ const version = options.version;
13
+ const record = extensionObject({
14
+ name,
15
+ schema,
16
+ relocatable,
17
+ ...version !== undefined ? { version } : {},
18
+ provenance: { origin: "extension", name }
19
+ });
20
+ return {
21
+ name,
22
+ schema,
23
+ relocatable,
24
+ ...version !== undefined ? { version } : {},
25
+ contribute(peers, built) {
26
+ const names = peerNames(peers);
27
+ assertDeclared(names, built);
28
+ return [record];
29
+ }
30
+ };
31
+ }
32
+ function peerNames(peers) {
33
+ if (!Array.isArray(peers)) {
34
+ extensionError("OKM1810", "schema({ extensions }) must be a list of extensions.");
35
+ }
36
+ const counts = new Map;
37
+ for (const peer of peers) {
38
+ if (!isPeer(peer)) {
39
+ extensionError("OKM1810", "schema({ extensions }) must be a list of extensions.");
40
+ }
41
+ counts.set(peer.name, (counts.get(peer.name) ?? 0) + 1);
42
+ }
43
+ for (const [name, count] of counts) {
44
+ if (count > 1)
45
+ extensionError("OKM1813", `Extension ${name} is defined twice.`);
46
+ }
47
+ return counts;
48
+ }
49
+ function assertDeclared(names, built) {
50
+ if (!Array.isArray(built))
51
+ return;
52
+ for (const object of built) {
53
+ if (typeof object !== "object" || object === null || !("dependencies" in object))
54
+ continue;
55
+ const dependencies = object.dependencies;
56
+ if (!Array.isArray(dependencies))
57
+ continue;
58
+ for (const edge of dependencies) {
59
+ if (typeof edge !== "object" || edge === null || !("target" in edge))
60
+ continue;
61
+ const target = edge.target;
62
+ if (typeof target !== "object" || target === null)
63
+ continue;
64
+ if (!("kind" in target) || !("name" in target))
65
+ continue;
66
+ if (target.kind === "extension" && typeof target.name === "string" && !names.has(target.name)) {
67
+ extensionError("OKM1810", `Extension ${target.name} is used but not declared.`);
68
+ }
69
+ }
70
+ }
71
+ }
72
+ function isPeer(value) {
73
+ if (typeof value !== "object" || value === null)
74
+ return false;
75
+ if (!("name" in value) || !("contribute" in value))
76
+ return false;
77
+ return typeof value.name === "string" && value.name.length > 0 && typeof value.contribute === "function";
78
+ }
79
+ function extensionError(code, message) {
80
+ const summary = code === "OKM1813" ? "Keep one definition. A second copy fails at build." : "Declare the extension next to the schema that uses it.";
81
+ throw new OkmError2(code, message, { fix: { summary } });
82
+ }
83
+
84
+ export { extension2 };