@supabase/pg-delta 1.0.0-alpha.10 → 1.0.0-alpha.11

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 (123) hide show
  1. package/dist/cli/commands/declarative-export.js +12 -17
  2. package/dist/cli/commands/plan.js +10 -13
  3. package/dist/cli/commands/sync.js +8 -12
  4. package/dist/cli/utils/integrations.d.ts +30 -6
  5. package/dist/cli/utils/integrations.js +98 -6
  6. package/dist/core/change-utils.d.ts +9 -0
  7. package/dist/core/change-utils.js +71 -0
  8. package/dist/core/change.types.d.ts +22 -0
  9. package/dist/core/change.types.js +37 -1
  10. package/dist/core/depend.js +25 -0
  11. package/dist/core/export/file-mapper.d.ts +2 -2
  12. package/dist/core/integrations/filter/dsl.d.ts +78 -74
  13. package/dist/core/integrations/filter/dsl.js +127 -79
  14. package/dist/core/integrations/filter/flatten.d.ts +51 -0
  15. package/dist/core/integrations/filter/flatten.js +116 -0
  16. package/dist/core/integrations/integration-dsl.d.ts +17 -1
  17. package/dist/core/integrations/merge.d.ts +20 -0
  18. package/dist/core/integrations/merge.js +60 -0
  19. package/dist/core/integrations/serialize/dsl.d.ts +7 -4
  20. package/dist/core/integrations/serialize/dsl.js +2 -2
  21. package/dist/core/integrations/supabase.js +23 -8
  22. package/dist/core/objects/aggregate/changes/aggregate.types.d.ts +1 -0
  23. package/dist/core/objects/base.change.d.ts +10 -0
  24. package/dist/core/objects/base.change.js +10 -0
  25. package/dist/core/objects/base.model.d.ts +4 -1
  26. package/dist/core/objects/base.model.js +5 -2
  27. package/dist/core/objects/collation/changes/collation.types.d.ts +1 -0
  28. package/dist/core/objects/domain/changes/domain.create.d.ts +1 -1
  29. package/dist/core/objects/domain/changes/domain.create.js +7 -1
  30. package/dist/core/objects/domain/changes/domain.types.d.ts +1 -0
  31. package/dist/core/objects/event-trigger/changes/event-trigger.types.d.ts +1 -0
  32. package/dist/core/objects/extension/changes/extension.types.d.ts +1 -0
  33. package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.types.d.ts +1 -0
  34. package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper.types.d.ts +1 -0
  35. package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.types.d.ts +1 -0
  36. package/dist/core/objects/foreign-data-wrapper/server/changes/server.types.d.ts +1 -0
  37. package/dist/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.types.d.ts +1 -0
  38. package/dist/core/objects/index/changes/index.types.d.ts +1 -0
  39. package/dist/core/objects/language/changes/language.types.d.ts +1 -0
  40. package/dist/core/objects/materialized-view/changes/materialized-view.types.d.ts +1 -0
  41. package/dist/core/objects/procedure/changes/procedure.types.d.ts +1 -0
  42. package/dist/core/objects/publication/changes/publication.types.d.ts +1 -0
  43. package/dist/core/objects/rls-policy/changes/rls-policy.types.d.ts +1 -0
  44. package/dist/core/objects/role/changes/role.types.d.ts +1 -0
  45. package/dist/core/objects/rule/changes/rule.types.d.ts +1 -0
  46. package/dist/core/objects/schema/changes/schema.types.d.ts +1 -0
  47. package/dist/core/objects/sequence/changes/sequence.types.d.ts +1 -0
  48. package/dist/core/objects/subscription/changes/subscription.types.d.ts +1 -0
  49. package/dist/core/objects/table/changes/table.types.d.ts +1 -0
  50. package/dist/core/objects/trigger/changes/trigger.types.d.ts +1 -0
  51. package/dist/core/objects/type/composite-type/changes/composite-type.types.d.ts +1 -0
  52. package/dist/core/objects/type/enum/changes/enum.types.d.ts +1 -0
  53. package/dist/core/objects/type/range/changes/range.types.d.ts +1 -0
  54. package/dist/core/objects/type/type.types.d.ts +1 -0
  55. package/dist/core/objects/view/changes/view.types.d.ts +1 -0
  56. package/dist/core/objects/view/view.diff.js +24 -13
  57. package/dist/core/postgres-config.d.ts +2 -2
  58. package/dist/core/sort/custom-constraints.js +1 -1
  59. package/dist/core/sort/logical-sort.js +3 -24
  60. package/package.json +5 -1
  61. package/src/cli/commands/declarative-export.ts +19 -27
  62. package/src/cli/commands/plan.ts +14 -20
  63. package/src/cli/commands/sync.ts +8 -15
  64. package/src/cli/utils/integrations.test.ts +210 -3
  65. package/src/cli/utils/integrations.ts +134 -6
  66. package/src/core/catalog.snapshot.test.ts +11 -2
  67. package/src/core/change-utils.test.ts +61 -0
  68. package/src/core/change-utils.ts +73 -0
  69. package/src/core/change.types.ts +50 -0
  70. package/src/core/depend.ts +25 -0
  71. package/src/core/export/file-mapper.ts +7 -2
  72. package/src/core/integrations/filter/dsl.test.ts +299 -60
  73. package/src/core/integrations/filter/dsl.ts +208 -169
  74. package/src/core/integrations/filter/flatten.test.ts +282 -0
  75. package/src/core/integrations/filter/flatten.ts +150 -0
  76. package/src/core/integrations/integration-dsl.ts +17 -1
  77. package/src/core/integrations/merge.test.ts +128 -0
  78. package/src/core/integrations/merge.ts +72 -0
  79. package/src/core/integrations/serialize/dsl.test.ts +6 -6
  80. package/src/core/integrations/serialize/dsl.ts +7 -4
  81. package/src/core/integrations/supabase.ts +23 -8
  82. package/src/core/objects/aggregate/changes/aggregate.types.ts +1 -0
  83. package/src/core/objects/base.change.ts +10 -0
  84. package/src/core/objects/base.model.test.ts +43 -0
  85. package/src/core/objects/base.model.ts +5 -2
  86. package/src/core/objects/collation/changes/collation.types.ts +1 -0
  87. package/src/core/objects/domain/changes/domain.create.ts +17 -1
  88. package/src/core/objects/domain/changes/domain.types.ts +1 -0
  89. package/src/core/objects/event-trigger/changes/event-trigger.types.ts +1 -0
  90. package/src/core/objects/extension/changes/extension.types.ts +1 -0
  91. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.types.ts +1 -0
  92. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper.types.ts +1 -0
  93. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.types.ts +1 -0
  94. package/src/core/objects/foreign-data-wrapper/server/changes/server.types.ts +1 -0
  95. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.types.ts +1 -0
  96. package/src/core/objects/index/changes/index.types.ts +1 -0
  97. package/src/core/objects/language/changes/language.types.ts +1 -0
  98. package/src/core/objects/materialized-view/changes/materialized-view.types.ts +1 -0
  99. package/src/core/objects/procedure/changes/procedure.types.ts +1 -0
  100. package/src/core/objects/publication/changes/publication.types.ts +1 -0
  101. package/src/core/objects/rls-policy/changes/rls-policy.types.ts +1 -0
  102. package/src/core/objects/role/changes/role.types.ts +1 -0
  103. package/src/core/objects/rule/changes/rule.types.ts +1 -0
  104. package/src/core/objects/schema/changes/schema.types.ts +1 -0
  105. package/src/core/objects/sequence/changes/sequence.types.ts +1 -0
  106. package/src/core/objects/subscription/changes/subscription.types.ts +1 -0
  107. package/src/core/objects/table/changes/table.types.ts +1 -0
  108. package/src/core/objects/trigger/changes/trigger.types.ts +1 -0
  109. package/src/core/objects/type/composite-type/changes/composite-type.types.ts +1 -0
  110. package/src/core/objects/type/enum/changes/enum.types.ts +1 -0
  111. package/src/core/objects/type/range/changes/range.types.ts +1 -0
  112. package/src/core/objects/type/type.types.ts +1 -0
  113. package/src/core/objects/view/changes/view.types.ts +1 -0
  114. package/src/core/objects/view/view.diff.test.ts +96 -0
  115. package/src/core/objects/view/view.diff.ts +30 -15
  116. package/src/core/postgres-config.ts +2 -2
  117. package/src/core/sort/custom-constraints.ts +1 -1
  118. package/src/core/sort/logical-sort.ts +3 -27
  119. package/src/typedoc.ts +248 -0
  120. package/dist/core/integrations/filter/extractors.d.ts +0 -12
  121. package/dist/core/integrations/filter/extractors.js +0 -178
  122. package/src/core/integrations/filter/extractors.test.ts +0 -244
  123. package/src/core/integrations/filter/extractors.ts +0 -187
@@ -1,244 +0,0 @@
1
- import { describe, expect, test } from "bun:test";
2
- import type { Change } from "../../change.types.ts";
3
- import { getSchema, PROPERTY_EXTRACTORS } from "./extractors.ts";
4
-
5
- describe("getSchema", () => {
6
- test("returns schema for table", () => {
7
- const change = {
8
- objectType: "table",
9
- table: { schema: "public" },
10
- } as unknown as Change;
11
- expect(getSchema(change)).toBe("public");
12
- });
13
-
14
- test("returns schema for view", () => {
15
- const change = {
16
- objectType: "view",
17
- view: { schema: "app" },
18
- } as unknown as Change;
19
- expect(getSchema(change)).toBe("app");
20
- });
21
-
22
- test("returns schema for enum", () => {
23
- const change = {
24
- objectType: "enum",
25
- enum: { schema: "types" },
26
- } as unknown as Change;
27
- expect(getSchema(change)).toBe("types");
28
- });
29
-
30
- test("returns schema.name for schema type", () => {
31
- const change = {
32
- objectType: "schema",
33
- schema: { name: "auth" },
34
- } as unknown as Change;
35
- expect(getSchema(change)).toBe("auth");
36
- });
37
-
38
- test("returns null for role", () => {
39
- const change = {
40
- objectType: "role",
41
- role: { name: "admin" },
42
- } as unknown as Change;
43
- expect(getSchema(change)).toBeNull();
44
- });
45
-
46
- test("returns null for publication", () => {
47
- const change = {
48
- objectType: "publication",
49
- publication: { name: "pub1" },
50
- } as unknown as Change;
51
- expect(getSchema(change)).toBeNull();
52
- });
53
-
54
- test("returns null for language", () => {
55
- const change = {
56
- objectType: "language",
57
- language: { name: "plpgsql" },
58
- } as unknown as Change;
59
- expect(getSchema(change)).toBeNull();
60
- });
61
- });
62
-
63
- describe("owner extractor", () => {
64
- const getOwner = PROPERTY_EXTRACTORS.owner;
65
-
66
- test("returns owner for table", () => {
67
- const change = {
68
- objectType: "table",
69
- table: { owner: "postgres" },
70
- } as unknown as Change;
71
- expect(getOwner(change)).toBe("postgres");
72
- });
73
-
74
- test("returns owner for schema", () => {
75
- const change = {
76
- objectType: "schema",
77
- schema: { owner: "admin" },
78
- } as unknown as Change;
79
- expect(getOwner(change)).toBe("admin");
80
- });
81
-
82
- test("returns role.name for role type", () => {
83
- const change = {
84
- objectType: "role",
85
- role: { name: "supabase_admin" },
86
- } as unknown as Change;
87
- expect(getOwner(change)).toBe("supabase_admin");
88
- });
89
-
90
- test("returns null for user_mapping", () => {
91
- const change = { objectType: "user_mapping" } as unknown as Change;
92
- expect(getOwner(change)).toBeNull();
93
- });
94
- });
95
-
96
- describe("PROPERTY_EXTRACTORS", () => {
97
- test("has all expected keys", () => {
98
- const expectedKeys = [
99
- "schema",
100
- "owner",
101
- "member",
102
- "grantee",
103
- "publication",
104
- "extension",
105
- "procedureLanguage",
106
- "eventTriggerName",
107
- "procedureBinaryPath",
108
- "triggerFunctionSchema",
109
- ];
110
- expect(Object.keys(PROPERTY_EXTRACTORS).sort()).toEqual(
111
- expectedKeys.sort(),
112
- );
113
- });
114
-
115
- describe("member", () => {
116
- test("returns member for membership scope", () => {
117
- const change = {
118
- scope: "membership",
119
- member: "app_user",
120
- } as unknown as Change;
121
- expect(PROPERTY_EXTRACTORS.member(change)).toBe("app_user");
122
- });
123
-
124
- test("returns null for non-membership scope", () => {
125
- const change = { scope: "object" } as unknown as Change;
126
- expect(PROPERTY_EXTRACTORS.member(change)).toBeNull();
127
- });
128
- });
129
-
130
- describe("grantee", () => {
131
- test("returns grantee for privilege scope", () => {
132
- const change = {
133
- scope: "privilege",
134
- grantee: "reader",
135
- } as unknown as Change;
136
- expect(PROPERTY_EXTRACTORS.grantee(change)).toBe("reader");
137
- });
138
-
139
- test("returns null for non-privilege scope", () => {
140
- const change = { scope: "object" } as unknown as Change;
141
- expect(PROPERTY_EXTRACTORS.grantee(change)).toBeNull();
142
- });
143
- });
144
-
145
- describe("publication", () => {
146
- test("returns name for publication type", () => {
147
- const change = {
148
- objectType: "publication",
149
- publication: { name: "my_pub" },
150
- } as unknown as Change;
151
- expect(PROPERTY_EXTRACTORS.publication(change)).toBe("my_pub");
152
- });
153
-
154
- test("returns null for non-publication type", () => {
155
- const change = { objectType: "table" } as unknown as Change;
156
- expect(PROPERTY_EXTRACTORS.publication(change)).toBeNull();
157
- });
158
- });
159
-
160
- describe("extension", () => {
161
- test("returns name for extension type", () => {
162
- const change = {
163
- objectType: "extension",
164
- extension: { name: "pgcrypto" },
165
- } as unknown as Change;
166
- expect(PROPERTY_EXTRACTORS.extension(change)).toBe("pgcrypto");
167
- });
168
-
169
- test("returns null for non-extension type", () => {
170
- const change = { objectType: "table" } as unknown as Change;
171
- expect(PROPERTY_EXTRACTORS.extension(change)).toBeNull();
172
- });
173
- });
174
-
175
- describe("procedureLanguage", () => {
176
- test("returns language for procedure type", () => {
177
- const change = {
178
- objectType: "procedure",
179
- procedure: { language: "plpgsql" },
180
- } as unknown as Change;
181
- expect(PROPERTY_EXTRACTORS.procedureLanguage(change)).toBe("plpgsql");
182
- });
183
-
184
- test("returns null for non-procedure type", () => {
185
- const change = { objectType: "table" } as unknown as Change;
186
- expect(PROPERTY_EXTRACTORS.procedureLanguage(change)).toBeNull();
187
- });
188
- });
189
-
190
- describe("eventTriggerName", () => {
191
- test("returns name for event_trigger type", () => {
192
- const change = {
193
- objectType: "event_trigger",
194
- eventTrigger: { name: "my_trigger" },
195
- } as unknown as Change;
196
- expect(PROPERTY_EXTRACTORS.eventTriggerName(change)).toBe("my_trigger");
197
- });
198
-
199
- test("returns null for non-event_trigger type", () => {
200
- const change = { objectType: "table" } as unknown as Change;
201
- expect(PROPERTY_EXTRACTORS.eventTriggerName(change)).toBeNull();
202
- });
203
- });
204
-
205
- describe("procedureBinaryPath", () => {
206
- test("returns binary_path for procedure type", () => {
207
- const change = {
208
- objectType: "procedure",
209
- procedure: { binary_path: "/usr/bin/pg" },
210
- } as unknown as Change;
211
- expect(PROPERTY_EXTRACTORS.procedureBinaryPath(change)).toBe(
212
- "/usr/bin/pg",
213
- );
214
- });
215
-
216
- test("returns null when binary_path is undefined", () => {
217
- const change = {
218
- objectType: "procedure",
219
- procedure: {},
220
- } as unknown as Change;
221
- expect(PROPERTY_EXTRACTORS.procedureBinaryPath(change)).toBeNull();
222
- });
223
-
224
- test("returns null for non-procedure type", () => {
225
- const change = { objectType: "table" } as unknown as Change;
226
- expect(PROPERTY_EXTRACTORS.procedureBinaryPath(change)).toBeNull();
227
- });
228
- });
229
-
230
- describe("triggerFunctionSchema", () => {
231
- test("returns function_schema for trigger type", () => {
232
- const change = {
233
- objectType: "trigger",
234
- trigger: { function_schema: "public" },
235
- } as unknown as Change;
236
- expect(PROPERTY_EXTRACTORS.triggerFunctionSchema(change)).toBe("public");
237
- });
238
-
239
- test("returns null for non-trigger type", () => {
240
- const change = { objectType: "table" } as unknown as Change;
241
- expect(PROPERTY_EXTRACTORS.triggerFunctionSchema(change)).toBeNull();
242
- });
243
- });
244
- });
@@ -1,187 +0,0 @@
1
- import type { Change } from "../../change.types.ts";
2
-
3
- /**
4
- * Property extractor function that extracts a value from a change.
5
- */
6
- type PropertyExtractor = (change: Change) => string | null;
7
-
8
- /**
9
- * Registry of property extractors.
10
- * Maps property names to extractor functions.
11
- */
12
- export const PROPERTY_EXTRACTORS: Record<string, PropertyExtractor> = {
13
- schema: getSchema,
14
- owner: getOwner,
15
- member: (change: Change) => {
16
- if (change.scope === "membership") {
17
- return change.member;
18
- }
19
- return null;
20
- },
21
- grantee: (change: Change) => {
22
- if (change.scope === "privilege" && "grantee" in change) {
23
- return change.grantee;
24
- }
25
- return null;
26
- },
27
- publication: (change: Change) => {
28
- if (change.objectType === "publication") {
29
- return change.publication.name;
30
- }
31
- return null;
32
- },
33
- extension: (change: Change) => {
34
- if (change.objectType === "extension") {
35
- return change.extension.name;
36
- }
37
- return null;
38
- },
39
- procedureLanguage: (change: Change) => {
40
- if (change.objectType === "procedure") {
41
- return change.procedure.language;
42
- }
43
- return null;
44
- },
45
- eventTriggerName: (change: Change) => {
46
- if (change.objectType === "event_trigger") {
47
- return change.eventTrigger.name;
48
- }
49
- return null;
50
- },
51
- procedureBinaryPath: (change: Change) => {
52
- if (change.objectType === "procedure") {
53
- return change.procedure.binary_path ?? null;
54
- }
55
- return null;
56
- },
57
- triggerFunctionSchema: (change: Change) => {
58
- if (change.objectType === "trigger") {
59
- return change.trigger.function_schema;
60
- }
61
- return null;
62
- },
63
- };
64
-
65
- export function getSchema(change: Change) {
66
- switch (change.objectType) {
67
- case "aggregate":
68
- return change.aggregate.schema;
69
- case "collation":
70
- return change.collation.schema;
71
- case "composite_type":
72
- return change.compositeType.schema;
73
- case "domain":
74
- return change.domain.schema;
75
- case "enum":
76
- return change.enum.schema;
77
- case "event_trigger":
78
- return null;
79
- case "extension":
80
- return change.extension.schema;
81
- case "index":
82
- return change.index.schema;
83
- case "language":
84
- return null;
85
- case "materialized_view":
86
- return change.materializedView.schema;
87
- case "procedure":
88
- return change.procedure.schema;
89
- case "publication":
90
- return null;
91
- case "range":
92
- return change.range.schema;
93
- case "rls_policy":
94
- return change.policy.schema;
95
- case "role":
96
- return null;
97
- case "rule":
98
- return change.rule.schema;
99
- case "schema":
100
- return change.schema.name;
101
- case "sequence":
102
- return change.sequence.schema;
103
- case "subscription":
104
- return null;
105
- case "table":
106
- return change.table.schema;
107
- case "trigger":
108
- return change.trigger.schema;
109
- case "view":
110
- return change.view.schema;
111
- case "foreign_data_wrapper":
112
- return null;
113
- case "server":
114
- return null;
115
- case "user_mapping":
116
- return null;
117
- case "foreign_table":
118
- return change.foreignTable.schema;
119
- default: {
120
- // exhaustiveness check
121
- const _exhaustive: never = change;
122
- return _exhaustive;
123
- }
124
- }
125
- }
126
-
127
- function getOwner(change: Change) {
128
- switch (change.objectType) {
129
- case "aggregate":
130
- return change.aggregate.owner;
131
- case "collation":
132
- return change.collation.owner;
133
- case "composite_type":
134
- return change.compositeType.owner;
135
- case "domain":
136
- return change.domain.owner;
137
- case "enum":
138
- return change.enum.owner;
139
- case "event_trigger":
140
- return change.eventTrigger.owner;
141
- case "extension":
142
- return change.extension.owner;
143
- case "index":
144
- return change.index.owner;
145
- case "language":
146
- return change.language.owner;
147
- case "materialized_view":
148
- return change.materializedView.owner;
149
- case "procedure":
150
- return change.procedure.owner;
151
- case "publication":
152
- return change.publication.owner;
153
- case "range":
154
- return change.range.owner;
155
- case "rls_policy":
156
- return change.policy.owner;
157
- case "role":
158
- return change.role.name;
159
- case "rule":
160
- return change.rule.owner;
161
- case "schema":
162
- return change.schema.owner;
163
- case "sequence":
164
- return change.sequence.owner;
165
- case "subscription":
166
- return change.subscription.owner;
167
- case "table":
168
- return change.table.owner;
169
- case "trigger":
170
- return change.trigger.owner;
171
- case "view":
172
- return change.view.owner;
173
- case "foreign_data_wrapper":
174
- return change.foreignDataWrapper.owner;
175
- case "server":
176
- return change.server.owner;
177
- case "user_mapping":
178
- return null;
179
- case "foreign_table":
180
- return change.foreignTable.owner;
181
- default: {
182
- // exhaustiveness check
183
- const _exhaustive: never = change;
184
- return _exhaustive;
185
- }
186
- }
187
- }