okmodel 0.1.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 (228) hide show
  1. package/README.md +727 -37
  2. package/dist/adapters/capabilities.d.ts +34 -0
  3. package/dist/adapters/pg/bunsql-extra.d.ts +17 -0
  4. package/dist/adapters/pg/bunsql.d.ts +60 -0
  5. package/dist/adapters/pg/call.d.ts +2 -12
  6. package/dist/adapters/pg/nodepostgres-extra.d.ts +18 -0
  7. package/dist/adapters/pg/nodepostgres.d.ts +57 -0
  8. package/dist/adapters/pg/postgres-extra.d.ts +50 -1
  9. package/dist/adapters/pg/postgresjs.d.ts +0 -4
  10. package/dist/adapters/pg/session.d.ts +94 -0
  11. package/dist/adapters/pg/watch.d.ts +18 -0
  12. package/dist/contracts/catalog/enum.d.ts +31 -4
  13. package/dist/contracts/catalog/extension.d.ts +61 -0
  14. package/dist/contracts/catalog/object.d.ts +1 -0
  15. package/dist/contracts/catalog/privilege.d.ts +64 -0
  16. package/dist/contracts/catalog/routine.d.ts +56 -0
  17. package/dist/contracts/catalog/types.d.ts +179 -18
  18. package/dist/contracts/catalog/view.d.ts +73 -0
  19. package/dist/contracts/connection.d.ts +13 -0
  20. package/dist/contracts/driver.d.ts +18 -5
  21. package/dist/contracts/error.d.ts +17 -1
  22. package/dist/contracts/generator.d.ts +63 -0
  23. package/dist/contracts/index.d.ts +2 -2
  24. package/dist/contracts/index.js +1 -1
  25. package/dist/contracts/internal.js +11 -9
  26. package/dist/contracts/location.d.ts +24 -0
  27. package/dist/contracts/rows.d.ts +15 -0
  28. package/dist/dialects/pg/archive-bind.d.ts +22 -0
  29. package/dist/dialects/pg/column.d.ts +129 -10
  30. package/dist/dialects/pg/compile.d.ts +1 -0
  31. package/dist/dialects/pg/custom.d.ts +6 -0
  32. package/dist/dialects/pg/ddl.d.ts +65 -1
  33. package/dist/dialects/pg/enum.d.ts +10 -8
  34. package/dist/dialects/pg/ext/citext.d.ts +14 -0
  35. package/dist/dialects/pg/ext/citext.js +11 -0
  36. package/dist/dialects/pg/ext/index.d.ts +52 -0
  37. package/dist/dialects/pg/ext/index.js +6 -0
  38. package/dist/dialects/pg/ext/pg-trgm.d.ts +53 -0
  39. package/dist/dialects/pg/ext/pg-trgm.js +42 -0
  40. package/dist/dialects/pg/filter-parse.d.ts +19 -0
  41. package/dist/dialects/pg/filters.d.ts +19 -0
  42. package/dist/dialects/pg/fn/index.d.ts +107 -0
  43. package/dist/dialects/pg/fn/index.js +175 -0
  44. package/dist/dialects/pg/fn/touch.d.ts +14 -0
  45. package/dist/dialects/pg/index.d.ts +11 -2
  46. package/dist/dialects/pg/index.js +243 -1062
  47. package/dist/dialects/pg/introspect.d.ts +10 -1
  48. package/dist/dialects/pg/keys.d.ts +19 -3
  49. package/dist/dialects/pg/model.d.ts +223 -2
  50. package/dist/dialects/pg/operator-fit.d.ts +86 -0
  51. package/dist/dialects/pg/operators.d.ts +46 -1
  52. package/dist/dialects/pg/ops/arr-append.d.ts +9 -0
  53. package/dist/dialects/pg/ops/arr-ns.d.ts +7 -0
  54. package/dist/dialects/pg/ops/arr-remove.d.ts +9 -0
  55. package/dist/dialects/pg/ops/containedBy.d.ts +9 -0
  56. package/dist/dialects/pg/ops/contains.d.ts +8 -4
  57. package/dist/dialects/pg/ops/hasAnyKey.d.ts +8 -0
  58. package/dist/dialects/pg/ops/hasKey.d.ts +8 -0
  59. package/dist/dialects/pg/ops/json-ns.d.ts +6 -0
  60. package/dist/dialects/pg/ops/json-set.d.ts +12 -0
  61. package/dist/dialects/pg/ops/matches.d.ts +16 -0
  62. package/dist/dialects/pg/ops/overlaps.d.ts +9 -0
  63. package/dist/dialects/pg/ops/path.d.ts +13 -0
  64. package/dist/dialects/pg/preset.d.ts +76 -0
  65. package/dist/dialects/pg/relations.d.ts +59 -2
  66. package/dist/dialects/pg/role/check.d.ts +45 -0
  67. package/dist/dialects/pg/role/index.d.ts +50 -0
  68. package/dist/dialects/pg/role/sql.d.ts +44 -0
  69. package/dist/dialects/pg/schema.d.ts +109 -5
  70. package/dist/dialects/pg/table.d.ts +137 -11
  71. package/dist/dialects/pg/temporal.d.ts +9 -7
  72. package/dist/dialects/pg/tenancy.d.ts +103 -0
  73. package/dist/dialects/pg/through.d.ts +21 -0
  74. package/dist/dialects/pg/trait.d.ts +141 -0
  75. package/dist/dialects/pg/view/client.d.ts +30 -0
  76. package/dist/dialects/pg/view/depend.d.ts +35 -0
  77. package/dist/dialects/pg/view/index.d.ts +114 -0
  78. package/dist/dialects/pg/view/index.js +289 -0
  79. package/dist/dialects/pg/view/scratch.d.ts +21 -0
  80. package/dist/dialects/pg/where.d.ts +37 -0
  81. package/dist/runtime/aggregate.d.ts +25 -0
  82. package/dist/runtime/archive-handle.d.ts +18 -0
  83. package/dist/runtime/archive-rules.d.ts +12 -0
  84. package/dist/runtime/archive.d.ts +73 -0
  85. package/dist/runtime/batch.d.ts +20 -0
  86. package/dist/runtime/client.d.ts +114 -5
  87. package/dist/runtime/conflict.d.ts +2 -1
  88. package/dist/runtime/exposure.d.ts +27 -0
  89. package/dist/runtime/hookm.d.ts +39 -0
  90. package/dist/runtime/ids/index.d.ts +11 -0
  91. package/dist/runtime/ids/index.js +193 -0
  92. package/dist/runtime/ids/okid-extended.d.ts +19 -0
  93. package/dist/runtime/ids/okid-generator.d.ts +21 -0
  94. package/dist/runtime/ids/okid-shared.d.ts +89 -0
  95. package/dist/runtime/ids/okid.d.ts +24 -0
  96. package/dist/runtime/ids/uuid.d.ts +21 -0
  97. package/dist/runtime/lock.d.ts +22 -0
  98. package/dist/runtime/operator-sql.d.ts +8 -0
  99. package/dist/runtime/page.d.ts +25 -0
  100. package/dist/runtime/pg/bun.d.ts +30 -0
  101. package/dist/runtime/pg/bun.js +52 -0
  102. package/dist/runtime/pg/pg.d.ts +29 -0
  103. package/dist/runtime/pg/pg.js +52 -0
  104. package/dist/runtime/pg/pglite.js +16 -17
  105. package/dist/runtime/pg/postgresjs.js +14 -24
  106. package/dist/runtime/plan.d.ts +146 -7
  107. package/dist/runtime/preset-stack.d.ts +17 -0
  108. package/dist/runtime/presets.d.ts +48 -0
  109. package/dist/runtime/read-stream.d.ts +26 -0
  110. package/dist/runtime/safety/index.d.ts +159 -0
  111. package/dist/runtime/safety/index.js +294 -0
  112. package/dist/runtime/safety-hook.d.ts +42 -0
  113. package/dist/runtime/server-check.d.ts +34 -0
  114. package/dist/runtime/tenancy/index.d.ts +37 -0
  115. package/dist/runtime/tenancy/index.js +368 -0
  116. package/dist/runtime/trait-read.d.ts +30 -0
  117. package/dist/runtime/traits/index.d.ts +133 -0
  118. package/dist/runtime/traits/index.js +646 -0
  119. package/dist/runtime/transaction.d.ts +19 -0
  120. package/dist/runtime/tx.d.ts +22 -7
  121. package/dist/runtime/types.d.ts +376 -27
  122. package/dist/runtime/validate/bind.d.ts +11 -0
  123. package/dist/runtime/validate/closed.d.ts +16 -0
  124. package/dist/runtime/validate/engine.d.ts +41 -0
  125. package/dist/runtime/validate/hook.d.ts +17 -0
  126. package/dist/runtime/validate/index.d.ts +21 -0
  127. package/dist/runtime/validate/index.js +175 -0
  128. package/dist/runtime/validate/load.d.ts +13 -0
  129. package/dist/runtime/validate/places.d.ts +41 -0
  130. package/dist/runtime/validate/rules.d.ts +108 -0
  131. package/dist/runtime/validate/surface.d.ts +102 -0
  132. package/dist/runtime/write.d.ts +30 -5
  133. package/dist/shared/01yr20s5.js +149 -0
  134. package/dist/shared/0jc3ffzf.js +154 -0
  135. package/dist/shared/0v1g424p.js +26 -0
  136. package/dist/shared/1g0drakv.js +225 -0
  137. package/dist/shared/{kprcwaha.js → 1tfdfvhh.js} +5 -3
  138. package/dist/shared/{05w44d8g.js → 2ssqrv66.js} +767 -715
  139. package/dist/shared/3ekj9x92.js +210 -0
  140. package/dist/shared/49ypnfwt.js +1122 -0
  141. package/dist/shared/4e4c6vq2.js +62 -0
  142. package/dist/shared/4m9fn52z.js +70 -0
  143. package/dist/shared/{ycwz42az.js → 52szzakm.js} +6 -26
  144. package/dist/shared/5nmdenb6.js +1229 -0
  145. package/dist/shared/672t5vym.js +12 -0
  146. package/dist/shared/6bazvqwm.js +86 -0
  147. package/dist/shared/6w5j844a.js +201 -0
  148. package/dist/shared/{fgqgsb5z.js → 75xkjv0t.js} +2 -2
  149. package/dist/shared/7fvtrkwr.js +84 -0
  150. package/dist/shared/7m88x3e9.js +45 -0
  151. package/dist/shared/{mtkwv8wx.js → 7p2wbz7f.js} +1 -1
  152. package/dist/shared/83eaefwr.js +10 -0
  153. package/dist/shared/94ez8kzh.js +19 -0
  154. package/dist/shared/96ps4g1z.js +32 -0
  155. package/dist/shared/{xqbhg6cn.js → 999ade2q.js} +95 -10
  156. package/dist/shared/9m80mkac.js +158 -0
  157. package/dist/shared/9x25fxhc.js +150 -0
  158. package/dist/shared/a5sxz52y.js +13 -0
  159. package/dist/shared/axhk06q1.js +156 -0
  160. package/dist/shared/{dynq16vb.js → b066g80h.js} +8 -6
  161. package/dist/shared/bqha5cg6.js +229 -0
  162. package/dist/shared/bryqk9k9.js +31 -0
  163. package/dist/shared/c8aghh05.js +442 -0
  164. package/dist/shared/c9z5g0fm.js +309 -0
  165. package/dist/shared/{m3ypagh5.js → dbjej1tw.js} +124 -15
  166. package/dist/shared/dyj86cmj.js +69 -0
  167. package/dist/shared/e6wg00wd.js +164 -0
  168. package/dist/shared/{hadrfb9h.js → edwqqryd.js} +17 -14
  169. package/dist/shared/{qk3hxfja.js → fptpmvxp.js} +5 -5
  170. package/dist/shared/fs0ex00p.js +76 -0
  171. package/dist/shared/{jjb7yht9.js → g4f5kcx9.js} +3 -3
  172. package/dist/shared/gjthds9j.js +48 -0
  173. package/dist/shared/hcmdtwgh.js +102 -0
  174. package/dist/shared/{g5fhqmwe.js → jkc6ws1p.js} +6 -56
  175. package/dist/shared/{yd1kzwn2.js → jns2wx4t.js} +55 -12
  176. package/dist/shared/k34e0xf2.js +450 -0
  177. package/dist/shared/k3ted12y.js +33 -0
  178. package/dist/shared/k7dwkhvq.js +31 -0
  179. package/dist/shared/{8b04d28c.js → kgnc8grt.js} +2 -2
  180. package/dist/shared/{hd293j9g.js → kyxb62mc.js} +14 -2
  181. package/dist/shared/m78s7898.js +376 -0
  182. package/dist/shared/m9tv7xn7.js +404 -0
  183. package/dist/shared/meck53jv.js +99 -0
  184. package/dist/shared/mt5wswjz.js +90 -0
  185. package/dist/shared/n0dgs0pb.js +75 -0
  186. package/dist/shared/n442h54c.js +14 -0
  187. package/dist/shared/n4jqhpqz.js +27 -0
  188. package/dist/shared/n7mcc1gk.js +132 -0
  189. package/dist/shared/ne02ng5c.js +68 -0
  190. package/dist/shared/{mkjmqjv4.js → nfzc5z0w.js} +2 -104
  191. package/dist/shared/nsva2a6b.js +42 -0
  192. package/dist/shared/p24x2334.js +195 -0
  193. package/dist/shared/qbxzvwwc.js +88 -0
  194. package/dist/shared/{w8samvk1.js → qybh48nd.js} +1 -1
  195. package/dist/shared/r6nwkxnt.js +86 -0
  196. package/dist/shared/{xy79j5hq.js → rrstp3kb.js} +25 -36
  197. package/dist/shared/rwmrejjz.js +26 -0
  198. package/dist/shared/{zhc5vmgf.js → s6gqfn5j.js} +2 -2
  199. package/dist/shared/{523ft3e8.js → scwxrpx2.js} +7 -5
  200. package/dist/shared/{j5cn2963.js → t4tbsy9h.js} +13 -64
  201. package/dist/shared/{y9m15dfv.js → t616ynfn.js} +544 -32
  202. package/dist/shared/{ngk8gj61.js → tbszx8mz.js} +15 -1
  203. package/dist/shared/th14ygv2.js +69 -0
  204. package/dist/shared/tmbdywx0.js +178 -0
  205. package/dist/shared/ty3v3hfk.js +64 -0
  206. package/dist/shared/wekze34d.js +246 -0
  207. package/dist/shared/x6wysh83.js +1132 -0
  208. package/dist/shared/{rgs0st28.js → xrfnq5k8.js} +237 -434
  209. package/dist/shared/{x5x59srr.js → xva8v7qk.js} +416 -83
  210. package/dist/shared/{dkn3y60a.js → xw1d69vd.js} +76 -112
  211. package/dist/shared/y005b761.js +112 -0
  212. package/dist/shared/ydaz1sv3.js +55 -0
  213. package/dist/shared/{p0cbr3g2.js → zwmqxb0g.js} +1 -1
  214. package/dist/tooling/cli.js +40 -12
  215. package/dist/tooling/migrate/apply.d.ts +16 -0
  216. package/dist/tooling/migrate/commands.d.ts +12 -1
  217. package/dist/tooling/migrate/config.d.ts +8 -0
  218. package/dist/tooling/migrate/doctor.d.ts +25 -0
  219. package/dist/tooling/migrate/drift.d.ts +19 -0
  220. package/dist/tooling/migrate/engine.d.ts +36 -0
  221. package/dist/tooling/migrate/ext.d.ts +17 -0
  222. package/dist/tooling/migrate/extensions.d.ts +51 -0
  223. package/dist/tooling/migrate/managed.d.ts +17 -0
  224. package/dist/tooling/migrate/plan.d.ts +14 -1
  225. package/dist/tooling/migrate/project.d.ts +25 -1
  226. package/dist/tooling/migrate/type-name.d.ts +19 -0
  227. package/package.json +61 -4
  228. package/dist/shared/gk7cs7sp.js +0 -566
@@ -1,13 +1,25 @@
1
+ import {
2
+ functionObject,
3
+ triggerObject
4
+ } from "./9x25fxhc.js";
5
+ import {
6
+ viewObject,
7
+ materializedViewObject,
8
+ materializedViewIndex
9
+ } from "./y005b761.js";
10
+ import {
11
+ extensionObject
12
+ } from "./th14ygv2.js";
1
13
  import {
2
14
  dependencyOrder,
3
- catalog,
4
- enumType
5
- } from "./g5fhqmwe.js";
15
+ catalog
16
+ } from "./jkc6ws1p.js";
17
+ import {
18
+ enumType,
19
+ domainType,
20
+ isDomain
21
+ } from "./qbxzvwwc.js";
6
22
  import {
7
- OWNERS2,
8
- BUILT_KINDS2,
9
- referentialAction,
10
- CATALOG_VERSION2,
11
23
  canonicalJson,
12
24
  staticNamespace2,
13
25
  templateNamespace2,
@@ -22,14 +34,23 @@ import {
22
34
  index3,
23
35
  constraint2,
24
36
  sequence2,
25
- compareText
26
- } from "./j5cn2963.js";
37
+ normaliseEdges,
38
+ compareText,
39
+ assertProvenance
40
+ } from "./t4tbsy9h.js";
27
41
  import {
28
- sha2562
29
- } from "./mkjmqjv4.js";
42
+ OWNERS2,
43
+ BUILT_KINDS2,
44
+ referentialAction,
45
+ CATALOG_VERSION2
46
+ } from "./4e4c6vq2.js";
47
+ import {
48
+ sha2562,
49
+ assertIdentifier2
50
+ } from "./nfzc5z0w.js";
30
51
  import {
31
52
  catalogError2
32
- } from "./ycwz42az.js";
53
+ } from "./52szzakm.js";
33
54
 
34
55
  // src/contracts/catalog/rewrite.ts
35
56
  function replaceIdentifier(text, from, to) {
@@ -87,6 +108,60 @@ function isIdentPart(char) {
87
108
  return isIdentStart(char) || char >= "0" && char <= "9";
88
109
  }
89
110
 
111
+ // src/contracts/catalog/privilege.ts
112
+ function roleObject(input) {
113
+ assertIdentifier2(input.name, "role");
114
+ assertProvenance(input.provenance);
115
+ return {
116
+ kind: "role",
117
+ identity: { kind: "role", name: input.name },
118
+ owner: input.owner ?? "managed",
119
+ definition: {
120
+ login: input.login === true,
121
+ inherit: input.inherit !== false
122
+ },
123
+ dependencies: normaliseEdges(input.dependencies ?? []),
124
+ provenance: input.provenance
125
+ };
126
+ }
127
+ function grantObject(input) {
128
+ assertIdentifier2(input.role, "role");
129
+ assertProvenance(input.provenance);
130
+ return {
131
+ kind: "grant",
132
+ identity: {
133
+ kind: "grant",
134
+ role: input.role,
135
+ object: input.object,
136
+ privilege: input.privilege
137
+ },
138
+ owner: input.owner ?? "managed",
139
+ definition: {},
140
+ dependencies: normaliseEdges(input.dependencies ?? []),
141
+ provenance: input.provenance
142
+ };
143
+ }
144
+ function defaultPrivilegeObject(input) {
145
+ assertIdentifier2(input.forRole, "role");
146
+ assertIdentifier2(input.grantee, "role");
147
+ assertProvenance(input.provenance);
148
+ return {
149
+ kind: "defaultPrivilege",
150
+ identity: {
151
+ kind: "defaultPrivilege",
152
+ forRole: input.forRole,
153
+ namespace: input.namespace,
154
+ objectKind: input.objectKind,
155
+ grantee: input.grantee,
156
+ privilege: input.privilege
157
+ },
158
+ owner: input.owner ?? "managed",
159
+ definition: {},
160
+ dependencies: normaliseEdges(input.dependencies ?? []),
161
+ provenance: input.provenance
162
+ };
163
+ }
164
+
90
165
  // src/contracts/catalog/document.ts
91
166
  function creationOrder2(source) {
92
167
  return dependencyOrder(source.objects);
@@ -217,10 +292,60 @@ function rewriteRenamed(object, change, fromKey, toIdentity) {
217
292
  return rewriteSequence(object, dependencies);
218
293
  case "type":
219
294
  return rewriteType(object, dependencies);
295
+ case "extension":
296
+ return retargeted(object, dependencies);
297
+ case "function": {
298
+ const local = object.dependencies.some((edge) => edge.target.kind === "column" && sameRef2(edge.target.parent, change.parent));
299
+ return functionObject({
300
+ namespace: object.identity.namespace,
301
+ name: object.identity.name,
302
+ arguments: object.definition.arguments,
303
+ returns: object.definition.returns,
304
+ language: object.definition.language,
305
+ volatility: object.definition.volatility,
306
+ security: object.definition.security,
307
+ body: rewriteExpr(object.definition.body, change, local),
308
+ owner: object.owner,
309
+ provenance: object.provenance,
310
+ dependencies,
311
+ ...object.definition.searchPath !== undefined ? { searchPath: object.definition.searchPath } : {},
312
+ ...object.definition.atomic === true ? { atomic: true } : {}
313
+ });
314
+ }
315
+ case "view":
316
+ case "materializedView": {
317
+ const local = object.dependencies.some((edge) => edge.target.kind === "column" && sameRef2(edge.target.parent, change.parent));
318
+ return rewriteView(object, dependencies, rewriteExpr(object.definition.query, change, local));
319
+ }
320
+ case "role":
321
+ case "grant":
322
+ case "defaultPrivilege":
323
+ return retargeted(object, dependencies);
324
+ case "trigger": {
325
+ const local = sameRef2(object.identity.parent, change.parent);
326
+ return triggerObject({
327
+ parent: object.identity.parent,
328
+ name: object.identity.name,
329
+ timing: object.definition.timing,
330
+ events: object.definition.events,
331
+ level: object.definition.level,
332
+ calls: object.definition.calls,
333
+ owner: object.owner,
334
+ provenance: object.provenance,
335
+ dependencies,
336
+ ...object.definition.updateOf !== undefined ? {
337
+ updateOf: local ? renameList(object.definition.updateOf, change.from, change.to) : object.definition.updateOf
338
+ } : {},
339
+ ...object.definition.when !== undefined ? { when: rewriteExpr(object.definition.when, change, local) } : {}
340
+ });
341
+ }
220
342
  default:
221
343
  return assertNever(object);
222
344
  }
223
345
  }
346
+ function retargeted(object, dependencies) {
347
+ return { ...object, dependencies: dependencies.map((target) => ({ target })) };
348
+ }
224
349
  function rewriteTable(object, change, dependencies) {
225
350
  const partition = object.definition.partition;
226
351
  const renamed = partition !== undefined && object.identity.name === change.parent.name && sameNamespace2(object.identity.namespace, change.parent.namespace);
@@ -251,6 +376,7 @@ function rewriteColumn(object, change, dependencies) {
251
376
  provenance: object.provenance,
252
377
  dependencies,
253
378
  ...definition.defaultExpression !== undefined ? { defaultExpression: rewriteExpr(definition.defaultExpression, change, local) } : {},
379
+ ...definition.collation !== undefined ? { collation: definition.collation } : {},
254
380
  ...definition.identity !== undefined ? { identity: definition.identity } : {},
255
381
  ...definition.generated !== undefined ? {
256
382
  generated: {
@@ -263,17 +389,39 @@ function rewriteColumn(object, change, dependencies) {
263
389
  function rewriteIndex(object, change, dependencies) {
264
390
  const local = sameRef2(object.identity.parent, change.parent);
265
391
  const definition = object.definition;
392
+ return indexAgain(object, object.identity.parent, dependencies, {
393
+ columns: local ? renameList(definition.columns, change.from, change.to) : [...definition.columns],
394
+ ...definition.predicate !== undefined ? { predicate: rewriteExpr(definition.predicate, change, local) } : {},
395
+ ...definition.expression !== undefined ? { expression: rewriteExpr(definition.expression, change, local) } : {}
396
+ });
397
+ }
398
+ function indexAgain(object, parent, dependencies, patch) {
399
+ const onView = dependencies.some((edge) => edge.kind === "view" || edge.kind === "materializedView");
400
+ if (onView) {
401
+ return materializedViewIndex({
402
+ parent,
403
+ name: object.identity.name,
404
+ nameKey: object.definition.nameKey,
405
+ columns: patch.columns,
406
+ unique: object.definition.unique,
407
+ owner: object.owner,
408
+ provenance: object.provenance,
409
+ dependencies,
410
+ ...patch.predicate !== undefined ? { predicate: patch.predicate } : {},
411
+ ...patch.expression !== undefined ? { expression: patch.expression } : {}
412
+ });
413
+ }
266
414
  return index3({
267
- parent: object.identity.parent,
415
+ parent,
268
416
  name: object.identity.name,
269
- nameKey: definition.nameKey,
270
- columns: local ? renameList(definition.columns, change.from, change.to) : [...definition.columns],
271
- unique: definition.unique,
417
+ nameKey: object.definition.nameKey,
418
+ columns: patch.columns,
419
+ unique: object.definition.unique,
272
420
  owner: object.owner,
273
421
  provenance: object.provenance,
274
422
  dependencies,
275
- ...definition.predicate !== undefined ? { predicate: rewriteExpr(definition.predicate, change, local) } : {},
276
- ...definition.expression !== undefined ? { expression: rewriteExpr(definition.expression, change, local) } : {}
423
+ ...patch.predicate !== undefined ? { predicate: patch.predicate } : {},
424
+ ...patch.expression !== undefined ? { expression: patch.expression } : {}
277
425
  });
278
426
  }
279
427
  function rewriteConstraint(object, change, dependencies) {
@@ -302,6 +450,24 @@ function rewriteConstraint(object, change, dependencies) {
302
450
  ...referenced !== undefined ? { references: referenced } : {}
303
451
  });
304
452
  }
453
+ function rewriteView(object, dependencies, query) {
454
+ const input = {
455
+ namespace: object.identity.namespace,
456
+ name: object.identity.name,
457
+ columns: object.definition.columns,
458
+ query,
459
+ owner: object.owner,
460
+ provenance: object.provenance,
461
+ dependencies
462
+ };
463
+ if (object.kind === "materializedView") {
464
+ return materializedViewObject({
465
+ ...input,
466
+ ...object.definition.refresh !== undefined ? { refresh: object.definition.refresh } : {}
467
+ });
468
+ }
469
+ return viewObject(input);
470
+ }
305
471
  function rewriteExpr(text, change, active) {
306
472
  if (!active)
307
473
  return text;
@@ -335,20 +501,14 @@ function rewriteTableName(object, change, fromKey, toIdentity) {
335
501
  ...object.definition.defaultExpression !== undefined ? {
336
502
  defaultExpression: rewriteExpr(object.definition.defaultExpression, { from: change.from, to: change.to }, local)
337
503
  } : {},
504
+ ...object.definition.collation !== undefined ? { collation: object.definition.collation } : {},
338
505
  ...object.definition.identity !== undefined ? { identity: object.definition.identity } : {},
339
506
  ...object.definition.generated !== undefined ? { generated: object.definition.generated } : {}
340
507
  });
341
508
  }
342
509
  if (object.kind === "index") {
343
- return index3({
344
- parent,
345
- name: object.identity.name,
346
- nameKey: object.definition.nameKey,
510
+ return indexAgain(object, parent, dependencies, {
347
511
  columns: [...object.definition.columns],
348
- unique: object.definition.unique,
349
- owner: object.owner,
350
- provenance: object.provenance,
351
- dependencies,
352
512
  ...object.definition.predicate !== undefined ? {
353
513
  predicate: rewriteExpr(object.definition.predicate, { from: change.from, to: change.to }, local)
354
514
  } : {},
@@ -386,6 +546,59 @@ function rewriteTableName(object, change, fromKey, toIdentity) {
386
546
  return rewriteSequence(object, dependencies);
387
547
  if (object.kind === "type")
388
548
  return rewriteType(object, dependencies);
549
+ if (object.kind === "extension") {
550
+ return { ...object, dependencies: dependencies.map((target) => ({ target })) };
551
+ }
552
+ if (object.kind === "function") {
553
+ const local = object.dependencies.some((edge) => edge.target.kind === "table" && edge.target.name === change.from && sameNamespace2(edge.target.namespace, change.namespace));
554
+ return functionObject({
555
+ namespace: object.identity.namespace,
556
+ name: object.identity.name,
557
+ arguments: object.definition.arguments,
558
+ returns: object.definition.returns,
559
+ language: object.definition.language,
560
+ volatility: object.definition.volatility,
561
+ security: object.definition.security,
562
+ body: rewriteExpr(object.definition.body, { from: change.from, to: change.to }, local),
563
+ owner: object.owner,
564
+ provenance: object.provenance,
565
+ dependencies,
566
+ ...object.definition.searchPath !== undefined ? { searchPath: object.definition.searchPath } : {},
567
+ ...object.definition.atomic === true ? { atomic: true } : {}
568
+ });
569
+ }
570
+ if (object.kind === "view" || object.kind === "materializedView") {
571
+ const local = object.dependencies.some((edge) => {
572
+ if (edge.target.kind === "table") {
573
+ return edge.target.name === change.from && sameNamespace2(edge.target.namespace, change.namespace);
574
+ }
575
+ if (edge.target.kind === "column") {
576
+ return edge.target.parent.name === change.from && sameNamespace2(edge.target.parent.namespace, change.namespace);
577
+ }
578
+ return false;
579
+ });
580
+ return rewriteView(object, dependencies, rewriteExpr(object.definition.query, { from: change.from, to: change.to }, local));
581
+ }
582
+ if (object.kind === "role" || object.kind === "grant" || object.kind === "defaultPrivilege") {
583
+ return retargeted(object, dependencies);
584
+ }
585
+ if (object.kind === "trigger") {
586
+ const parent = movedParent(object.identity.parent, change);
587
+ const local = parent.name !== object.identity.parent.name;
588
+ return triggerObject({
589
+ parent,
590
+ name: object.identity.name,
591
+ timing: object.definition.timing,
592
+ events: object.definition.events,
593
+ level: object.definition.level,
594
+ calls: object.definition.calls,
595
+ owner: object.owner,
596
+ provenance: object.provenance,
597
+ dependencies,
598
+ ...object.definition.updateOf !== undefined ? { updateOf: object.definition.updateOf } : {},
599
+ ...object.definition.when !== undefined ? { when: rewriteExpr(object.definition.when, { from: change.from, to: change.to }, local) } : {}
600
+ });
601
+ }
389
602
  return assertNever(object);
390
603
  }
391
604
  function movedParent(parent, change) {
@@ -395,6 +608,17 @@ function movedParent(parent, change) {
395
608
  return parent;
396
609
  }
397
610
  function rewriteType(object, dependencies) {
611
+ if (isDomain(object.definition)) {
612
+ return domainType({
613
+ namespace: object.identity.namespace,
614
+ name: object.identity.name,
615
+ base: object.definition.base,
616
+ check: object.definition.check,
617
+ owner: object.owner,
618
+ provenance: object.provenance,
619
+ dependencies
620
+ });
621
+ }
398
622
  return enumType({
399
623
  namespace: object.identity.namespace,
400
624
  name: object.identity.name,
@@ -457,6 +681,7 @@ function definitionToJson(object) {
457
681
  dataType: definition.dataType,
458
682
  nullable: definition.nullable,
459
683
  ...definition.defaultExpression !== undefined ? { defaultExpression: definition.defaultExpression } : {},
684
+ ...definition.collation !== undefined ? { collation: definition.collation } : {},
460
685
  ...definition.identity !== undefined ? { identity: { always: definition.identity.always } } : {},
461
686
  ...definition.generated !== undefined ? {
462
687
  generated: {
@@ -508,7 +733,68 @@ function definitionToJson(object) {
508
733
  start: object.definition.start
509
734
  };
510
735
  case "type":
511
- return { labels: object.definition.labels };
736
+ return isDomain(object.definition) ? { base: object.definition.base, check: object.definition.check } : { labels: object.definition.labels };
737
+ case "extension": {
738
+ const definition = object.definition;
739
+ return {
740
+ relocatable: definition.relocatable,
741
+ schema: definition.schema,
742
+ ...definition.version !== undefined ? { version: definition.version } : {}
743
+ };
744
+ }
745
+ case "function": {
746
+ const definition = object.definition;
747
+ return {
748
+ arguments: definition.arguments.map((argument) => ({
749
+ name: argument.name,
750
+ type: argument.type
751
+ })),
752
+ body: definition.body,
753
+ language: definition.language,
754
+ returns: definition.returns,
755
+ security: definition.security,
756
+ volatility: definition.volatility,
757
+ ...definition.atomic === true ? { atomic: true } : {},
758
+ ...definition.searchPath !== undefined ? { searchPath: definition.searchPath } : {}
759
+ };
760
+ }
761
+ case "trigger": {
762
+ const definition = object.definition;
763
+ return {
764
+ calls: {
765
+ argTypes: [...definition.calls.argTypes],
766
+ name: definition.calls.name,
767
+ namespace: namespaceToJson(definition.calls.namespace)
768
+ },
769
+ events: [...definition.events],
770
+ level: definition.level,
771
+ timing: definition.timing,
772
+ ...definition.updateOf !== undefined ? { updateOf: [...definition.updateOf] } : {},
773
+ ...definition.when !== undefined ? { when: definition.when } : {}
774
+ };
775
+ }
776
+ case "view":
777
+ return {
778
+ columns: object.definition.columns.map((column) => ({
779
+ dataType: column.dataType,
780
+ name: column.name
781
+ })),
782
+ query: object.definition.query
783
+ };
784
+ case "materializedView":
785
+ return {
786
+ columns: object.definition.columns.map((column) => ({
787
+ dataType: column.dataType,
788
+ name: column.name
789
+ })),
790
+ query: object.definition.query,
791
+ ...object.definition.refresh !== undefined ? { refresh: object.definition.refresh } : {}
792
+ };
793
+ case "role":
794
+ return { inherit: object.definition.inherit, login: object.definition.login };
795
+ case "grant":
796
+ case "defaultPrivilege":
797
+ return {};
512
798
  default:
513
799
  return assertNever(object);
514
800
  }
@@ -541,6 +827,21 @@ function parseObject(value) {
541
827
  return parseSequence(identity, definition, owner, provenance, dependencies);
542
828
  case "type":
543
829
  return parseType(identity, definition, owner, provenance, dependencies);
830
+ case "extension":
831
+ return parseExtension(identity, definition, owner, provenance, dependencies);
832
+ case "function":
833
+ return parseFunction(identity, definition, owner, provenance, dependencies);
834
+ case "trigger":
835
+ return parseTrigger(identity, definition, owner, provenance, dependencies);
836
+ case "view":
837
+ case "materializedView":
838
+ return parseView(kind, identity, definition, owner, provenance, dependencies);
839
+ case "role":
840
+ return parseRole(identity, definition, owner, provenance, dependencies);
841
+ case "grant":
842
+ return parseGrant(identity, definition, owner, provenance, dependencies);
843
+ case "defaultPrivilege":
844
+ return parseDefaultPrivilege(identity, definition, owner, provenance, dependencies);
544
845
  default:
545
846
  return assertNeverKind(kind);
546
847
  }
@@ -564,7 +865,7 @@ function parseColumn(identity, definition, owner, provenance, dependencies) {
564
865
  if (identity.kind !== "column") {
565
866
  catalogError2("OKM1020", `Column object identity is ${identity.kind}, not a column.`);
566
867
  }
567
- rejectUnknown(definition, ["dataType", "defaultExpression", "generated", "identity", "nullable"], "column definition");
868
+ rejectUnknown(definition, ["collation", "dataType", "defaultExpression", "generated", "identity", "nullable"], "column definition");
568
869
  const generated = definition.generated;
569
870
  const columnIdentity = definition.identity;
570
871
  return column2({
@@ -576,6 +877,7 @@ function parseColumn(identity, definition, owner, provenance, dependencies) {
576
877
  provenance,
577
878
  dependencies,
578
879
  ...definition.defaultExpression === undefined ? {} : { defaultExpression: requireString(definition.defaultExpression, "default") },
880
+ ...definition.collation === undefined ? {} : { collation: requireString(definition.collation, "collation") },
579
881
  ...columnIdentity === undefined ? {} : { identity: parseAlways(columnIdentity) },
580
882
  ...generated === undefined ? {} : { generated: parseGenerated(generated) }
581
883
  });
@@ -662,6 +964,18 @@ function parseType(identity, definition, owner, provenance, dependencies) {
662
964
  if (identity.kind !== "type") {
663
965
  catalogError2("OKM1020", `Type object identity is ${identity.kind}, not a type.`);
664
966
  }
967
+ if ("base" in definition || "check" in definition) {
968
+ rejectUnknown(definition, ["base", "check"], "type definition");
969
+ return domainType({
970
+ namespace: identity.namespace,
971
+ name: identity.name,
972
+ base: requireString(definition.base, "domain base"),
973
+ check: requireString(definition.check, "domain check"),
974
+ owner,
975
+ provenance,
976
+ dependencies
977
+ });
978
+ }
665
979
  rejectUnknown(definition, ["labels"], "type definition");
666
980
  return enumType({
667
981
  namespace: identity.namespace,
@@ -672,6 +986,160 @@ function parseType(identity, definition, owner, provenance, dependencies) {
672
986
  dependencies
673
987
  });
674
988
  }
989
+ function parseFunction(identity, definition, owner, provenance, dependencies) {
990
+ if (identity.kind !== "function") {
991
+ catalogError2("OKM1020", `Function object identity is ${identity.kind}, not a function.`);
992
+ }
993
+ rejectUnknown(definition, ["arguments", "atomic", "body", "language", "returns", "searchPath", "security", "volatility"], "function definition");
994
+ const language = requireString(definition.language, "function language");
995
+ if (language !== "sql" && language !== "plpgsql") {
996
+ catalogError2("OKM1020", `Function ${identity.name} language must be sql or plpgsql.`);
997
+ }
998
+ const volatility = parseVolatility(definition.volatility);
999
+ const security = parseSecurity(definition.security);
1000
+ return functionObject({
1001
+ namespace: identity.namespace,
1002
+ name: identity.name,
1003
+ arguments: parseArguments(definition.arguments),
1004
+ returns: requireString(definition.returns, "function returns"),
1005
+ language,
1006
+ body: requireString(definition.body, "function body"),
1007
+ owner,
1008
+ provenance,
1009
+ dependencies,
1010
+ ...volatility !== undefined ? { volatility } : {},
1011
+ ...security !== undefined ? { security } : {},
1012
+ ...definition.atomic === true ? { atomic: true } : {},
1013
+ ...definition.searchPath !== undefined ? { searchPath: requireString(definition.searchPath, "search path") } : {}
1014
+ });
1015
+ }
1016
+ function parseArguments(value) {
1017
+ if (value === undefined)
1018
+ return [];
1019
+ if (!Array.isArray(value))
1020
+ catalogError2("OKM1020", "Function arguments must be an array.");
1021
+ return value.map((item) => {
1022
+ const record = requireRecord(item, "function argument");
1023
+ rejectUnknown(record, ["name", "type"], "function argument");
1024
+ return {
1025
+ name: requireString(record.name, "argument name"),
1026
+ type: requireString(record.type, "argument type")
1027
+ };
1028
+ });
1029
+ }
1030
+ function parseVolatility(value) {
1031
+ if (value === undefined)
1032
+ return;
1033
+ const text = requireString(value, "volatility");
1034
+ if (text !== "volatile" && text !== "stable" && text !== "immutable") {
1035
+ catalogError2("OKM1020", `Volatility ${text} is not supported.`);
1036
+ }
1037
+ return text;
1038
+ }
1039
+ function parseSecurity(value) {
1040
+ if (value === undefined)
1041
+ return;
1042
+ const text = requireString(value, "security");
1043
+ if (text !== "invoker" && text !== "definer") {
1044
+ catalogError2("OKM1020", `Security ${text} is not supported.`);
1045
+ }
1046
+ return text;
1047
+ }
1048
+ function parseTrigger(identity, definition, owner, provenance, dependencies) {
1049
+ if (identity.kind !== "trigger") {
1050
+ catalogError2("OKM1020", `Trigger object identity is ${identity.kind}, not a trigger.`);
1051
+ }
1052
+ rejectUnknown(definition, ["calls", "events", "level", "timing", "updateOf", "when"], "trigger definition");
1053
+ const timing = requireString(definition.timing, "trigger timing");
1054
+ if (timing !== "before" && timing !== "after" && timing !== "instead") {
1055
+ catalogError2("OKM1020", `Trigger timing ${timing} is not supported.`);
1056
+ }
1057
+ const level = requireString(definition.level, "trigger level");
1058
+ if (level !== "row" && level !== "statement") {
1059
+ catalogError2("OKM1020", `Trigger level ${level} is not supported.`);
1060
+ }
1061
+ const calls = requireRecord(definition.calls, "trigger call");
1062
+ rejectUnknown(calls, ["argTypes", "name", "namespace"], "trigger call");
1063
+ return triggerObject({
1064
+ parent: identity.parent,
1065
+ name: identity.name,
1066
+ timing,
1067
+ events: requireStrings(definition.events, "trigger events").map(parseEvent),
1068
+ level,
1069
+ calls: {
1070
+ namespace: parseNamespace(calls.namespace),
1071
+ name: requireString(calls.name, "trigger function"),
1072
+ argTypes: requireStrings(calls.argTypes, "trigger argument types")
1073
+ },
1074
+ owner,
1075
+ provenance,
1076
+ dependencies,
1077
+ ...definition.updateOf !== undefined ? { updateOf: requireStrings(definition.updateOf, "update of") } : {},
1078
+ ...definition.when !== undefined ? { when: requireString(definition.when, "when") } : {}
1079
+ });
1080
+ }
1081
+ function parseView(kind, identity, definition, owner, provenance, dependencies) {
1082
+ if (identity.kind !== kind) {
1083
+ catalogError2("OKM1020", `View object identity is ${identity.kind}, not a ${kind}.`);
1084
+ }
1085
+ const fields = kind === "view" ? ["columns", "query"] : ["columns", "query", "refresh"];
1086
+ rejectUnknown(definition, fields, "view definition");
1087
+ const columns = parseViewColumns(definition.columns);
1088
+ const query = requireString(definition.query, "view query");
1089
+ const refresh = definition.refresh;
1090
+ if (refresh !== undefined && refresh !== "concurrently") {
1091
+ catalogError2("OKM1020", `Materialized view ${identity.name} refresh is not supported.`);
1092
+ }
1093
+ const input = {
1094
+ namespace: identity.namespace,
1095
+ name: identity.name,
1096
+ columns,
1097
+ query,
1098
+ owner,
1099
+ provenance,
1100
+ dependencies
1101
+ };
1102
+ if (kind === "materializedView") {
1103
+ return materializedViewObject({
1104
+ ...input,
1105
+ ...refresh === "concurrently" ? { refresh: "concurrently" } : {}
1106
+ });
1107
+ }
1108
+ return viewObject(input);
1109
+ }
1110
+ function parseViewColumns(value) {
1111
+ if (!Array.isArray(value))
1112
+ catalogError2("OKM1020", "View columns must be a list.");
1113
+ return value.map((item) => {
1114
+ const record = requireRecord(item, "view column");
1115
+ rejectUnknown(record, ["dataType", "name"], "view column");
1116
+ return {
1117
+ name: requireString(record.name, "view column"),
1118
+ dataType: requireString(record.dataType, "view column type")
1119
+ };
1120
+ });
1121
+ }
1122
+ function parseEvent(value) {
1123
+ if (value !== "insert" && value !== "update" && value !== "delete" && value !== "truncate") {
1124
+ catalogError2("OKM1020", `Trigger event ${value} is not supported.`);
1125
+ }
1126
+ return value;
1127
+ }
1128
+ function parseExtension(identity, definition, owner, provenance, dependencies) {
1129
+ if (identity.kind !== "extension") {
1130
+ catalogError2("OKM1020", `Extension object identity is ${identity.kind}, not an extension.`);
1131
+ }
1132
+ rejectUnknown(definition, ["relocatable", "schema", "version"], "extension definition");
1133
+ return extensionObject({
1134
+ name: identity.name,
1135
+ schema: requireString(definition.schema, "extension schema"),
1136
+ relocatable: requireBoolean(definition.relocatable, "relocatable"),
1137
+ ...definition.version !== undefined ? { version: requireString(definition.version, "extension version") } : {},
1138
+ owner,
1139
+ provenance,
1140
+ dependencies
1141
+ });
1142
+ }
675
1143
  function parseIdentity(value) {
676
1144
  const record = requireRecord(value, "identity");
677
1145
  const kind = requireString(record.kind, "identity kind");
@@ -757,8 +1225,8 @@ function parseGrantObject(value) {
757
1225
  const record = requireRecord(value, "grant object");
758
1226
  rejectUnknown(record, ["kind", "name", "namespace"], "grant object");
759
1227
  const kind = requireString(record.kind, "grant object kind");
760
- if (kind !== "table" && kind !== "sequence" && kind !== "namespace") {
761
- catalogError2("OKM1020", `Grant object kind ${kind} must be table, sequence, or namespace.`);
1228
+ if (kind !== "table" && kind !== "view" && kind !== "materializedView" && kind !== "sequence" && kind !== "function" && kind !== "namespace") {
1229
+ catalogError2("OKM1020", `Grant object kind ${kind} must be table, view, materializedView, sequence, function, or namespace.`);
762
1230
  }
763
1231
  return {
764
1232
  kind,
@@ -766,6 +1234,50 @@ function parseGrantObject(value) {
766
1234
  namespace: parseNamespace(record.namespace)
767
1235
  };
768
1236
  }
1237
+ function parseRole(identity, definition, owner, provenance, dependencies) {
1238
+ if (identity.kind !== "role") {
1239
+ catalogError2("OKM1020", `Role object identity is ${identity.kind}, not a role.`);
1240
+ }
1241
+ rejectUnknown(definition, ["inherit", "login"], "role definition");
1242
+ return roleObject({
1243
+ name: identity.name,
1244
+ login: requireBoolean(definition.login, "login"),
1245
+ inherit: requireBoolean(definition.inherit, "inherit"),
1246
+ owner,
1247
+ provenance,
1248
+ dependencies
1249
+ });
1250
+ }
1251
+ function parseGrant(identity, definition, owner, provenance, dependencies) {
1252
+ if (identity.kind !== "grant") {
1253
+ catalogError2("OKM1020", `Grant object identity is ${identity.kind}, not a grant.`);
1254
+ }
1255
+ rejectUnknown(definition, [], "grant definition");
1256
+ return grantObject({
1257
+ role: identity.role,
1258
+ object: identity.object,
1259
+ privilege: identity.privilege,
1260
+ owner,
1261
+ provenance,
1262
+ dependencies
1263
+ });
1264
+ }
1265
+ function parseDefaultPrivilege(identity, definition, owner, provenance, dependencies) {
1266
+ if (identity.kind !== "defaultPrivilege") {
1267
+ catalogError2("OKM1020", `Default privilege object identity is ${identity.kind}, not a default privilege.`);
1268
+ }
1269
+ rejectUnknown(definition, [], "default privilege definition");
1270
+ return defaultPrivilegeObject({
1271
+ forRole: identity.forRole,
1272
+ namespace: identity.namespace,
1273
+ objectKind: identity.objectKind,
1274
+ grantee: identity.grantee,
1275
+ privilege: identity.privilege,
1276
+ owner,
1277
+ provenance,
1278
+ dependencies
1279
+ });
1280
+ }
769
1281
  function parsePartition(value) {
770
1282
  const record = requireRecord(value, "partition");
771
1283
  rejectUnknown(record, ["columns", "method"], "partition");
@@ -839,7 +1351,7 @@ function parseDependencies(value) {
839
1351
  });
840
1352
  }
841
1353
  function isBuiltKind(kind) {
842
- return BUILT_KINDS2.includes(kind);
1354
+ return kind === "extension" || kind === "function" || kind === "trigger" || kind === "view" || kind === "materializedView" || kind === "role" || kind === "grant" || kind === "defaultPrivilege" || BUILT_KINDS2.includes(kind);
843
1355
  }
844
1356
  function isOwner(value) {
845
1357
  return OWNERS2.includes(value);
@@ -885,4 +1397,4 @@ function assertNeverKind(value) {
885
1397
  return catalogError2("OKM1020", `Unexpected kind ${JSON.stringify(value)}.`);
886
1398
  }
887
1399
 
888
- export { creationOrder2, renameColumn2, renameTable2, serializeCatalog2, catalogHash2, loadTrustedCatalog2, parseCatalog2 };
1400
+ export { roleObject, grantObject, defaultPrivilegeObject, creationOrder2, renameColumn2, renameTable2, serializeCatalog2, catalogHash2, loadTrustedCatalog2, parseCatalog2 };