okmodel 0.3.0 → 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 (104) hide show
  1. package/README.md +182 -22
  2. package/dist/contracts/catalog/document.d.ts +6 -2
  3. package/dist/dialects/pg/ext/citext.js +1 -1
  4. package/dist/dialects/pg/ext/index.js +1 -1
  5. package/dist/dialects/pg/ext/pg-trgm.js +1 -1
  6. package/dist/dialects/pg/index.js +3 -3
  7. package/dist/dialects/pg/role/sql.d.ts +11 -4
  8. package/dist/dialects/pg/table.d.ts +17 -1
  9. package/dist/dialects/pg/view/index.js +1 -1
  10. package/dist/dialects/pg/view/scratch.d.ts +3 -2
  11. package/dist/runtime/catalog-cache.d.ts +17 -0
  12. package/dist/runtime/compat-words.d.ts +23 -0
  13. package/dist/runtime/drift-detail.d.ts +20 -4
  14. package/dist/runtime/drift.d.ts +4 -2
  15. package/dist/runtime/pg/bun.js +2 -2
  16. package/dist/runtime/pg/pg.js +2 -2
  17. package/dist/runtime/pg/pglite.js +2 -2
  18. package/dist/runtime/pg/postgresjs.js +2 -2
  19. package/dist/runtime/traits/index.js +5 -4
  20. package/dist/runtime/types.d.ts +2 -0
  21. package/dist/runtime/validate/index.js +2 -2
  22. package/dist/shared/2321avmn.js +418 -0
  23. package/dist/shared/{x6wysh83.js → 3p4b1fg0.js} +3 -5
  24. package/dist/shared/{wekze34d.js → 41kv2xdm.js} +74 -2
  25. package/dist/shared/{fs0ex00p.js → 4ef7mmqf.js} +2 -2
  26. package/dist/shared/5mtf6cj3.js +94 -0
  27. package/dist/shared/{999ade2q.js → 5vdm4sgp.js} +1 -1
  28. package/dist/shared/{qybh48nd.js → 6693j9rs.js} +1 -1
  29. package/dist/shared/{bqha5cg6.js → 6p5k20sm.js} +2 -2
  30. package/dist/shared/7nk68fj8.js +751 -0
  31. package/dist/shared/{ne02ng5c.js → 84ptn35q.js} +7 -4
  32. package/dist/shared/{t616ynfn.js → 8jb4ymh2.js} +59 -12
  33. package/dist/shared/{th14ygv2.js → 8ktwd3rh.js} +29 -1
  34. package/dist/shared/9yn6a2vd.js +11 -0
  35. package/dist/shared/ady1ms74.js +72 -0
  36. package/dist/shared/{scwxrpx2.js → c5g81ngb.js} +82 -15
  37. package/dist/shared/{6bazvqwm.js → fb00y8fp.js} +2 -2
  38. package/dist/shared/{jkc6ws1p.js → g7ez901n.js} +83 -2
  39. package/dist/shared/{kgnc8grt.js → gdh9mrtp.js} +1 -1
  40. package/dist/shared/hqjsxnz7.js +13 -0
  41. package/dist/shared/htnaj77v.js +17 -0
  42. package/dist/shared/{mt5wswjz.js → jgxzjzcz.js} +1 -1
  43. package/dist/shared/{6w5j844a.js → jsd07prz.js} +2 -2
  44. package/dist/shared/{m78s7898.js → kafaa5zv.js} +1 -1
  45. package/dist/shared/kj680nxv.js +19 -0
  46. package/dist/shared/{k34e0xf2.js → kkzwp3d2.js} +8 -8
  47. package/dist/shared/{2ssqrv66.js → n5y9zyj1.js} +1029 -174
  48. package/dist/shared/{ty3v3hfk.js → nxb42q7h.js} +2 -2
  49. package/dist/shared/{5nmdenb6.js → q6zsyh31.js} +1003 -40
  50. package/dist/shared/{fptpmvxp.js → q795afwa.js} +26 -21
  51. package/dist/shared/{3ekj9x92.js → qn0srwwq.js} +1 -1
  52. package/dist/shared/s4mb6a4b.js +545 -0
  53. package/dist/shared/{01yr20s5.js → sf8m6tfy.js} +2 -2
  54. package/dist/shared/{bryqk9k9.js → sr5ms7b3.js} +1 -1
  55. package/dist/shared/{meck53jv.js → tny2t3sm.js} +6 -5
  56. package/dist/shared/{p24x2334.js → v7tpnhnz.js} +1 -1
  57. package/dist/shared/{xw1d69vd.js → wqem4jed.js} +6 -6
  58. package/dist/shared/{49ypnfwt.js → xghkt7a9.js} +50 -28
  59. package/dist/shared/{7fvtrkwr.js → ycatkxmq.js} +1 -1
  60. package/dist/shared/ygem90rn.js +900 -0
  61. package/dist/shared/{1tfdfvhh.js → yjw02enp.js} +6 -4
  62. package/dist/shared/{ydaz1sv3.js → zg24x0hm.js} +1 -1
  63. package/dist/tooling/cli.js +46 -17
  64. package/dist/tooling/migrate/apply.d.ts +59 -5
  65. package/dist/tooling/migrate/backfill.d.ts +136 -0
  66. package/dist/tooling/migrate/check.d.ts +65 -0
  67. package/dist/tooling/migrate/classify.d.ts +108 -0
  68. package/dist/tooling/migrate/commands.d.ts +2 -2
  69. package/dist/tooling/migrate/config.d.ts +22 -0
  70. package/dist/tooling/migrate/doctor.d.ts +3 -0
  71. package/dist/tooling/migrate/drift.d.ts +18 -2
  72. package/dist/tooling/migrate/estimate.d.ts +50 -0
  73. package/dist/tooling/migrate/extensions.d.ts +2 -0
  74. package/dist/tooling/migrate/files.d.ts +12 -0
  75. package/dist/tooling/migrate/index.d.ts +3 -2
  76. package/dist/tooling/migrate/index.js +67 -1
  77. package/dist/tooling/migrate/lint-rules.d.ts +51 -0
  78. package/dist/tooling/migrate/lint.d.ts +71 -0
  79. package/dist/tooling/migrate/managed.d.ts +1 -1
  80. package/dist/tooling/migrate/plan.d.ts +64 -9
  81. package/dist/tooling/migrate/project.d.ts +42 -7
  82. package/dist/tooling/migrate/provision.d.ts +18 -0
  83. package/dist/tooling/migrate/reference.d.ts +40 -0
  84. package/dist/tooling/migrate/runner.d.ts +108 -0
  85. package/dist/tooling/migrate/safe.d.ts +77 -0
  86. package/dist/tooling/migrate/seed.d.ts +20 -0
  87. package/dist/tooling/migrate/snapshot.d.ts +78 -0
  88. package/dist/tooling/migrate/status.d.ts +25 -6
  89. package/dist/tooling/testing/factories.d.ts +117 -0
  90. package/dist/tooling/testing/facts.d.ts +72 -0
  91. package/dist/tooling/testing/index.d.ts +89 -0
  92. package/dist/tooling/testing/index.js +8 -0
  93. package/dist/tooling/testing/isolation.d.ts +30 -0
  94. package/dist/tooling/testing/random.d.ts +40 -0
  95. package/dist/tooling/testing/record.d.ts +38 -0
  96. package/package.json +6 -2
  97. package/dist/shared/dbjej1tw.js +0 -456
  98. package/dist/shared/g4f5kcx9.js +0 -37
  99. package/dist/shared/qbxzvwwc.js +0 -88
  100. package/dist/shared/zwmqxb0g.js +0 -79
  101. package/dist/shared/{xva8v7qk.js → awrsqrn7.js} +3 -3
  102. package/dist/shared/{75xkjv0t.js → fa9vt245.js} +0 -0
  103. package/dist/shared/{m9tv7xn7.js → radd3z4g.js} +3 -3
  104. /package/dist/shared/{0jc3ffzf.js → zvbjc949.js} +0 -0
@@ -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("./999ade2q.js");
120
+ const { checkout } = await import("./5vdm4sgp.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("./999ade2q.js").then((mod) => mod.holdCheckout(gate, () => mod.checkout(held)), (error) => {
132
+ return import("./5vdm4sgp.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("./999ade2q.js").then((mod) => mod.describe(sql, text, params))),
137
+ describe: (text, params) => sockets.occupy(() => import("./5vdm4sgp.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("./999ade2q.js").then((mod) => mod.holdListener(gate, async () => {
152
+ return import("./5vdm4sgp.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("./999ade2q.js").then((mod) => mod.watchQuery(pending, watch, onAbort, {
222
+ return import("./5vdm4sgp.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("./999ade2q.js");
274
+ const { stream } = await import("./5vdm4sgp.js");
275
275
  yield* stream(sql, text, params);
276
276
  }
277
277
  function send(sql, text, params, named) {
@@ -2,13 +2,14 @@ import {
2
2
  roleObject,
3
3
  grantObject,
4
4
  defaultPrivilegeObject
5
- } from "./t616ynfn.js";
5
+ } from "./8jb4ymh2.js";
6
6
  import {
7
7
  planMigration
8
- } from "./2ssqrv66.js";
8
+ } from "./n5y9zyj1.js";
9
9
  import {
10
- quoteIdent
11
- } from "./wekze34d.js";
10
+ quoteIdent,
11
+ createObjectSql
12
+ } from "./41kv2xdm.js";
12
13
  import {
13
14
  functionObject,
14
15
  triggerObject
@@ -21,14 +22,12 @@ import {
21
22
  } from "./y005b761.js";
22
23
  import {
23
24
  extensionObject
24
- } from "./th14ygv2.js";
25
- import {
26
- catalog
27
- } from "./jkc6ws1p.js";
25
+ } from "./8ktwd3rh.js";
28
26
  import {
27
+ catalog,
29
28
  enumType,
30
29
  domainType
31
- } from "./qbxzvwwc.js";
30
+ } from "./g7ez901n.js";
32
31
  import {
33
32
  staticNamespace2,
34
33
  identityKey2,
@@ -252,6 +251,7 @@ async function introspectSchema(runner, concrete, logical = "public", options) {
252
251
  const parent = parents.get(parentName) ?? { namespace, name: parentName };
253
252
  const kind = constraintKind(text(row, "contype"));
254
253
  const columns = list(text(row, "columns"));
254
+ const name = text(row, "name");
255
255
  const expression = kind === "check" ? checkExpression(text(row, "definition")) : "";
256
256
  const refTable = text(row, "ref_table");
257
257
  const refColumns = list(text(row, "ref_columns"));
@@ -261,8 +261,8 @@ async function introspectSchema(runner, concrete, logical = "public", options) {
261
261
  objects.push(constraint2({
262
262
  parent,
263
263
  constraintKind: kind,
264
- name: text(row, "name"),
265
- nameKey: kind === "primaryKey" ? "pkey" : columns.length > 0 ? columns.join("_") : "check",
264
+ name,
265
+ nameKey: constraintNameKey(kind, parentName, name, columns),
266
266
  columns,
267
267
  provenance,
268
268
  deferrable: flag(row, "deferrable"),
@@ -861,6 +861,19 @@ function partitionMethod(value) {
861
861
  return "hash";
862
862
  return;
863
863
  }
864
+ function constraintNameKey(kind, parent, name, columns) {
865
+ if (kind === "primaryKey")
866
+ return "pkey";
867
+ const tag = kind === "unique" ? "key" : kind === "foreignKey" ? "fkey" : "check";
868
+ const prefix = `${parent}_`;
869
+ const suffix = `_${tag}`;
870
+ if (name.startsWith(prefix) && name.endsWith(suffix) && name.length > prefix.length + suffix.length) {
871
+ return name.slice(prefix.length, -suffix.length);
872
+ }
873
+ if (columns.length > 0)
874
+ return columns.join("_");
875
+ return tag;
876
+ }
864
877
  function constraintKind(value) {
865
878
  if (value === "p")
866
879
  return "primaryKey";
@@ -934,6 +947,13 @@ async function sealViews(runner, source) {
934
947
  await runner.query(`create schema ${quoteIdent(SCRATCH)}`);
935
948
  try {
936
949
  await runner.query(`set search_path to ${quoteIdent(SCRATCH)}`);
950
+ for (const object of source.objects) {
951
+ if (object.kind !== "type")
952
+ continue;
953
+ const statement = createObjectSql(object, SCRATCH);
954
+ if (statement !== undefined)
955
+ await runner.query(statement);
956
+ }
937
957
  for (const object of source.objects) {
938
958
  if (object.kind !== "table")
939
959
  continue;
@@ -1061,11 +1081,11 @@ async function dropScratch(runner) {
1061
1081
  continue;
1062
1082
  await runner.query(`drop table if exists ${quoteIdent(SCRATCH)}.${quoteIdent(cellText(row.name))}`);
1063
1083
  }
1064
- await runner.query(`drop schema if exists ${quoteIdent(SCRATCH)}`);
1084
+ await runner.query(`drop schema if exists ${quoteIdent(SCRATCH)} cascade`);
1065
1085
  }
1066
1086
 
1067
1087
  // src/tooling/migrate/drift.ts
1068
- async function assertAuthorDrift(url, author, roles) {
1088
+ async function assertAuthorDrift2(url, author, roles) {
1069
1089
  const sql = postgres(url, {
1070
1090
  max: 1,
1071
1091
  connect_timeout: 5,
@@ -1078,10 +1098,9 @@ async function assertAuthorDrift(url, author, roles) {
1078
1098
  `;
1079
1099
  if (present[0]?.reg == null)
1080
1100
  return;
1081
- const runner = queryOf(sql);
1082
- const managed = managedRoleNames(roles);
1101
+ const runner = catalogQuery2(sql);
1083
1102
  const authorOnServer = await sealViews(runner, author);
1084
- const live = await introspectSchema(runner, "public", "public", managed === undefined ? undefined : { managedRoles: managed });
1103
+ const live = await introspectSchema(runner, "public", "public", managedRoleOptions2(roles));
1085
1104
  const plan = planMigration({ before: live, after: authorOnServer, name: "check" });
1086
1105
  if (plan.steps.length === 0)
1087
1106
  return;
@@ -1096,15 +1115,7 @@ ${plan.steps.map((step) => step.sql).join(`
1096
1115
  await sql.end({ timeout: 5 });
1097
1116
  }
1098
1117
  }
1099
- function managedRoleNames(roles) {
1100
- if (roles === undefined)
1101
- return;
1102
- const names = new Set([roles.migration, roles.app]);
1103
- for (const role of roles.managed ?? [])
1104
- names.add(role.name);
1105
- return [...names];
1106
- }
1107
- function queryOf(sql) {
1118
+ function catalogQuery2(sql) {
1108
1119
  return {
1109
1120
  async query(text, params) {
1110
1121
  const rows = await sql.unsafe(text, params === undefined ? undefined : [...params]);
@@ -1117,6 +1128,17 @@ function queryOf(sql) {
1117
1128
  }
1118
1129
  };
1119
1130
  }
1120
- export {
1121
- assertAuthorDrift
1122
- };
1131
+ function managedRoleOptions2(roles) {
1132
+ const names = managedRoleNames(roles);
1133
+ return names === undefined ? undefined : { managedRoles: names };
1134
+ }
1135
+ function managedRoleNames(roles) {
1136
+ if (roles === undefined)
1137
+ return;
1138
+ const names = new Set([roles.migration, roles.app]);
1139
+ for (const role of roles.managed ?? [])
1140
+ names.add(role.name);
1141
+ return [...names];
1142
+ }
1143
+
1144
+ export { introspectSchema, sealViews, assertAuthorDrift2, catalogQuery2, managedRoleOptions2 };
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  extensionObject
3
- } from "./th14ygv2.js";
3
+ } from "./8ktwd3rh.js";
4
4
  import {
5
5
  OkmError2
6
6
  } from "./52szzakm.js";