okmodel 0.2.1 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (108) hide show
  1. package/README.md +710 -36
  2. package/dist/contracts/catalog/enum.d.ts +31 -4
  3. package/dist/contracts/catalog/extension.d.ts +61 -0
  4. package/dist/contracts/catalog/privilege.d.ts +64 -0
  5. package/dist/contracts/catalog/routine.d.ts +56 -0
  6. package/dist/contracts/catalog/types.d.ts +164 -10
  7. package/dist/contracts/catalog/view.d.ts +73 -0
  8. package/dist/dialects/pg/column.d.ts +3 -1
  9. package/dist/dialects/pg/ddl.d.ts +65 -1
  10. package/dist/dialects/pg/enum.d.ts +10 -8
  11. package/dist/dialects/pg/ext/citext.d.ts +14 -0
  12. package/dist/dialects/pg/ext/citext.js +11 -0
  13. package/dist/dialects/pg/ext/index.d.ts +52 -0
  14. package/dist/dialects/pg/ext/index.js +6 -0
  15. package/dist/dialects/pg/ext/pg-trgm.d.ts +53 -0
  16. package/dist/dialects/pg/ext/pg-trgm.js +42 -0
  17. package/dist/dialects/pg/fn/index.d.ts +107 -0
  18. package/dist/dialects/pg/fn/index.js +175 -0
  19. package/dist/dialects/pg/fn/touch.d.ts +14 -0
  20. package/dist/dialects/pg/index.js +104 -19
  21. package/dist/dialects/pg/introspect.d.ts +10 -1
  22. package/dist/dialects/pg/operators.d.ts +8 -1
  23. package/dist/dialects/pg/role/check.d.ts +45 -0
  24. package/dist/dialects/pg/role/index.d.ts +50 -0
  25. package/dist/dialects/pg/role/sql.d.ts +44 -0
  26. package/dist/dialects/pg/table.d.ts +7 -0
  27. package/dist/dialects/pg/tenancy.d.ts +9 -0
  28. package/dist/dialects/pg/view/client.d.ts +30 -0
  29. package/dist/dialects/pg/view/depend.d.ts +35 -0
  30. package/dist/dialects/pg/view/index.d.ts +114 -0
  31. package/dist/dialects/pg/view/index.js +289 -0
  32. package/dist/dialects/pg/view/scratch.d.ts +21 -0
  33. package/dist/dialects/pg/where.d.ts +2 -2
  34. package/dist/runtime/pg/bun.js +3 -3
  35. package/dist/runtime/pg/pg.js +3 -3
  36. package/dist/runtime/pg/pglite.js +3 -3
  37. package/dist/runtime/pg/postgresjs.js +3 -3
  38. package/dist/runtime/tenancy/index.js +6 -3
  39. package/dist/runtime/traits/index.d.ts +7 -2
  40. package/dist/runtime/traits/index.js +149 -12
  41. package/dist/runtime/validate/index.js +4 -4
  42. package/dist/shared/{ytg3xf9p.js → 01yr20s5.js} +3 -3
  43. package/dist/shared/{cstgkzdx.js → 0jc3ffzf.js} +1 -1
  44. package/dist/shared/{xkz8g6by.js → 1g0drakv.js} +2 -2
  45. package/dist/shared/{eaxwrgby.js → 1tfdfvhh.js} +4 -3
  46. package/dist/shared/2ssqrv66.js +1576 -0
  47. package/dist/shared/{10tjenmd.js → 3ekj9x92.js} +1 -1
  48. package/dist/shared/49ypnfwt.js +1122 -0
  49. package/dist/shared/{sacqha1y.js → 4m9fn52z.js} +2 -2
  50. package/dist/shared/5nmdenb6.js +1229 -0
  51. package/dist/shared/{qa5dsc7z.js → 6bazvqwm.js} +3 -3
  52. package/dist/shared/{x9v1qgeb.js → 6w5j844a.js} +1 -1
  53. package/dist/shared/{0qkxbm1f.js → 75xkjv0t.js} +1 -1
  54. package/dist/shared/7fvtrkwr.js +84 -0
  55. package/dist/shared/94ez8kzh.js +19 -0
  56. package/dist/shared/{1dp5knt7.js → 999ade2q.js} +2 -2
  57. package/dist/shared/{3a5ne750.js → 9m80mkac.js} +2 -2
  58. package/dist/shared/9x25fxhc.js +150 -0
  59. package/dist/shared/{4b9da9d7.js → axhk06q1.js} +19 -1
  60. package/dist/shared/{38crxbgn.js → bqha5cg6.js} +3 -3
  61. package/dist/shared/{zd93g3rq.js → bryqk9k9.js} +1 -1
  62. package/dist/shared/{n47rd821.js → c8aghh05.js} +1 -1
  63. package/dist/shared/{dd4f8mnx.js → c9z5g0fm.js} +4 -2
  64. package/dist/shared/{eqmtn1bj.js → dbjej1tw.js} +71 -14
  65. package/dist/shared/{ps43134h.js → dyj86cmj.js} +4 -4
  66. package/dist/shared/{sfh4pk75.js → fptpmvxp.js} +3 -3
  67. package/dist/shared/{97g2jnrw.js → fs0ex00p.js} +3 -3
  68. package/dist/shared/{rtnaqre0.js → g4f5kcx9.js} +2 -2
  69. package/dist/shared/{yw5c610b.js → gjthds9j.js} +2 -2
  70. package/dist/shared/hcmdtwgh.js +102 -0
  71. package/dist/shared/{qxa0yb9j.js → jkc6ws1p.js} +2 -54
  72. package/dist/shared/{mxmcdsh5.js → k34e0xf2.js} +9 -9
  73. package/dist/shared/{py3nh7jy.js → kgnc8grt.js} +2 -2
  74. package/dist/shared/{g9f0zqce.js → m78s7898.js} +1 -1
  75. package/dist/shared/meck53jv.js +99 -0
  76. package/dist/shared/{v18jva5b.js → mt5wswjz.js} +1 -1
  77. package/dist/shared/{g1b5zzj9.js → n0dgs0pb.js} +1 -1
  78. package/dist/shared/{zt8y0wzb.js → n7mcc1gk.js} +1 -1
  79. package/dist/shared/ne02ng5c.js +68 -0
  80. package/dist/shared/{e7a268fy.js → p24x2334.js} +1 -1
  81. package/dist/shared/qbxzvwwc.js +88 -0
  82. package/dist/shared/{a1gdp7j9.js → qybh48nd.js} +1 -1
  83. package/dist/shared/{d04j53v8.js → scwxrpx2.js} +5 -4
  84. package/dist/shared/{d2whjz4k.js → t616ynfn.js} +530 -24
  85. package/dist/shared/th14ygv2.js +69 -0
  86. package/dist/shared/{xatfg0gn.js → tmbdywx0.js} +4 -19
  87. package/dist/shared/{ge03bfca.js → ty3v3hfk.js} +2 -2
  88. package/dist/shared/wekze34d.js +246 -0
  89. package/dist/shared/{7mht49yd.js → x6wysh83.js} +59 -18
  90. package/dist/shared/{4jzzghr6.js → xva8v7qk.js} +8 -8
  91. package/dist/shared/{ecdzej21.js → xw1d69vd.js} +7 -7
  92. package/dist/shared/y005b761.js +112 -0
  93. package/dist/shared/{mrq77sgw.js → ydaz1sv3.js} +1 -1
  94. package/dist/tooling/cli.js +32 -8
  95. package/dist/tooling/migrate/apply.d.ts +16 -0
  96. package/dist/tooling/migrate/commands.d.ts +2 -1
  97. package/dist/tooling/migrate/config.d.ts +8 -0
  98. package/dist/tooling/migrate/doctor.d.ts +25 -0
  99. package/dist/tooling/migrate/drift.d.ts +19 -0
  100. package/dist/tooling/migrate/ext.d.ts +17 -0
  101. package/dist/tooling/migrate/extensions.d.ts +51 -0
  102. package/dist/tooling/migrate/managed.d.ts +17 -0
  103. package/dist/tooling/migrate/plan.d.ts +14 -1
  104. package/dist/tooling/migrate/project.d.ts +25 -1
  105. package/dist/tooling/migrate/type-name.d.ts +19 -0
  106. package/package.json +22 -2
  107. package/dist/shared/5z4q2zda.js +0 -2073
  108. /package/dist/shared/{9k6vetvf.js → rrstp3kb.js} +0 -0
@@ -1,8 +1,24 @@
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 "./qxa0yb9j.js";
15
+ catalog
16
+ } from "./jkc6ws1p.js";
17
+ import {
18
+ enumType,
19
+ domainType,
20
+ isDomain
21
+ } from "./qbxzvwwc.js";
6
22
  import {
7
23
  canonicalJson,
8
24
  staticNamespace2,
@@ -18,7 +34,9 @@ import {
18
34
  index3,
19
35
  constraint2,
20
36
  sequence2,
21
- compareText
37
+ normaliseEdges,
38
+ compareText,
39
+ assertProvenance
22
40
  } from "./t4tbsy9h.js";
23
41
  import {
24
42
  OWNERS2,
@@ -27,7 +45,8 @@ import {
27
45
  CATALOG_VERSION2
28
46
  } from "./4e4c6vq2.js";
29
47
  import {
30
- sha2562
48
+ sha2562,
49
+ assertIdentifier2
31
50
  } from "./nfzc5z0w.js";
32
51
  import {
33
52
  catalogError2
@@ -89,6 +108,60 @@ function isIdentPart(char) {
89
108
  return isIdentStart(char) || char >= "0" && char <= "9";
90
109
  }
91
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
+
92
165
  // src/contracts/catalog/document.ts
93
166
  function creationOrder2(source) {
94
167
  return dependencyOrder(source.objects);
@@ -219,10 +292,60 @@ function rewriteRenamed(object, change, fromKey, toIdentity) {
219
292
  return rewriteSequence(object, dependencies);
220
293
  case "type":
221
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
+ }
222
342
  default:
223
343
  return assertNever(object);
224
344
  }
225
345
  }
346
+ function retargeted(object, dependencies) {
347
+ return { ...object, dependencies: dependencies.map((target) => ({ target })) };
348
+ }
226
349
  function rewriteTable(object, change, dependencies) {
227
350
  const partition = object.definition.partition;
228
351
  const renamed = partition !== undefined && object.identity.name === change.parent.name && sameNamespace2(object.identity.namespace, change.parent.namespace);
@@ -266,17 +389,39 @@ function rewriteColumn(object, change, dependencies) {
266
389
  function rewriteIndex(object, change, dependencies) {
267
390
  const local = sameRef2(object.identity.parent, change.parent);
268
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
+ }
269
414
  return index3({
270
- parent: object.identity.parent,
415
+ parent,
271
416
  name: object.identity.name,
272
- nameKey: definition.nameKey,
273
- columns: local ? renameList(definition.columns, change.from, change.to) : [...definition.columns],
274
- unique: definition.unique,
417
+ nameKey: object.definition.nameKey,
418
+ columns: patch.columns,
419
+ unique: object.definition.unique,
275
420
  owner: object.owner,
276
421
  provenance: object.provenance,
277
422
  dependencies,
278
- ...definition.predicate !== undefined ? { predicate: rewriteExpr(definition.predicate, change, local) } : {},
279
- ...definition.expression !== undefined ? { expression: rewriteExpr(definition.expression, change, local) } : {}
423
+ ...patch.predicate !== undefined ? { predicate: patch.predicate } : {},
424
+ ...patch.expression !== undefined ? { expression: patch.expression } : {}
280
425
  });
281
426
  }
282
427
  function rewriteConstraint(object, change, dependencies) {
@@ -305,6 +450,24 @@ function rewriteConstraint(object, change, dependencies) {
305
450
  ...referenced !== undefined ? { references: referenced } : {}
306
451
  });
307
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
+ }
308
471
  function rewriteExpr(text, change, active) {
309
472
  if (!active)
310
473
  return text;
@@ -344,15 +507,8 @@ function rewriteTableName(object, change, fromKey, toIdentity) {
344
507
  });
345
508
  }
346
509
  if (object.kind === "index") {
347
- return index3({
348
- parent,
349
- name: object.identity.name,
350
- nameKey: object.definition.nameKey,
510
+ return indexAgain(object, parent, dependencies, {
351
511
  columns: [...object.definition.columns],
352
- unique: object.definition.unique,
353
- owner: object.owner,
354
- provenance: object.provenance,
355
- dependencies,
356
512
  ...object.definition.predicate !== undefined ? {
357
513
  predicate: rewriteExpr(object.definition.predicate, { from: change.from, to: change.to }, local)
358
514
  } : {},
@@ -390,6 +546,59 @@ function rewriteTableName(object, change, fromKey, toIdentity) {
390
546
  return rewriteSequence(object, dependencies);
391
547
  if (object.kind === "type")
392
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
+ }
393
602
  return assertNever(object);
394
603
  }
395
604
  function movedParent(parent, change) {
@@ -399,6 +608,17 @@ function movedParent(parent, change) {
399
608
  return parent;
400
609
  }
401
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
+ }
402
622
  return enumType({
403
623
  namespace: object.identity.namespace,
404
624
  name: object.identity.name,
@@ -513,7 +733,68 @@ function definitionToJson(object) {
513
733
  start: object.definition.start
514
734
  };
515
735
  case "type":
516
- 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 {};
517
798
  default:
518
799
  return assertNever(object);
519
800
  }
@@ -546,6 +827,21 @@ function parseObject(value) {
546
827
  return parseSequence(identity, definition, owner, provenance, dependencies);
547
828
  case "type":
548
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);
549
845
  default:
550
846
  return assertNeverKind(kind);
551
847
  }
@@ -668,6 +964,18 @@ function parseType(identity, definition, owner, provenance, dependencies) {
668
964
  if (identity.kind !== "type") {
669
965
  catalogError2("OKM1020", `Type object identity is ${identity.kind}, not a type.`);
670
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
+ }
671
979
  rejectUnknown(definition, ["labels"], "type definition");
672
980
  return enumType({
673
981
  namespace: identity.namespace,
@@ -678,6 +986,160 @@ function parseType(identity, definition, owner, provenance, dependencies) {
678
986
  dependencies
679
987
  });
680
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
+ }
681
1143
  function parseIdentity(value) {
682
1144
  const record = requireRecord(value, "identity");
683
1145
  const kind = requireString(record.kind, "identity kind");
@@ -763,8 +1225,8 @@ function parseGrantObject(value) {
763
1225
  const record = requireRecord(value, "grant object");
764
1226
  rejectUnknown(record, ["kind", "name", "namespace"], "grant object");
765
1227
  const kind = requireString(record.kind, "grant object kind");
766
- if (kind !== "table" && kind !== "sequence" && kind !== "namespace") {
767
- 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.`);
768
1230
  }
769
1231
  return {
770
1232
  kind,
@@ -772,6 +1234,50 @@ function parseGrantObject(value) {
772
1234
  namespace: parseNamespace(record.namespace)
773
1235
  };
774
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
+ }
775
1281
  function parsePartition(value) {
776
1282
  const record = requireRecord(value, "partition");
777
1283
  rejectUnknown(record, ["columns", "method"], "partition");
@@ -845,7 +1351,7 @@ function parseDependencies(value) {
845
1351
  });
846
1352
  }
847
1353
  function isBuiltKind(kind) {
848
- 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);
849
1355
  }
850
1356
  function isOwner(value) {
851
1357
  return OWNERS2.includes(value);
@@ -891,4 +1397,4 @@ function assertNeverKind(value) {
891
1397
  return catalogError2("OKM1020", `Unexpected kind ${JSON.stringify(value)}.`);
892
1398
  }
893
1399
 
894
- export { creationOrder2, renameColumn2, renameTable2, serializeCatalog2, catalogHash2, loadTrustedCatalog2, parseCatalog2 };
1400
+ export { roleObject, grantObject, defaultPrivilegeObject, creationOrder2, renameColumn2, renameTable2, serializeCatalog2, catalogHash2, loadTrustedCatalog2, parseCatalog2 };