pg-dump-parser 1.7.0 → 1.8.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.
- package/LICENSE +1 -1
- package/README.md +34 -2
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -1
- package/dist/index.js.map +1 -1
- package/dist/parsePgDump.d.ts +58 -36
- package/dist/parsePgDump.d.ts.map +1 -1
- package/dist/parsePgDump.js.map +1 -1
- package/dist/parsePgDump.test.js.map +1 -1
- package/dist/scopeSchemaObject.d.ts.map +1 -1
- package/dist/scopeSchemaObject.js +22 -29
- package/dist/scopeSchemaObject.js.map +1 -1
- package/dist/sortSchemaObjects.d.ts +14 -0
- package/dist/sortSchemaObjects.d.ts.map +1 -0
- package/dist/sortSchemaObjects.js +261 -0
- package/dist/sortSchemaObjects.js.map +1 -0
- package/dist/sortSchemaObjects.test.d.ts +2 -0
- package/dist/sortSchemaObjects.test.d.ts.map +1 -0
- package/dist/sortSchemaObjects.test.js +343 -0
- package/dist/sortSchemaObjects.test.js.map +1 -0
- package/package.json +13 -13
- package/src/index.ts +5 -0
- package/src/parsePgDump.test.ts +1 -1
- package/src/parsePgDump.ts +1 -1
- package/src/sortSchemaObjects.test.ts +372 -0
- package/src/sortSchemaObjects.ts +323 -0
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.sortSchemaObjectsByScope = exports.sortSchemaObjects = exports.groupAndSortSchemaObjects = void 0;
|
|
4
|
+
const scopeSchemaObject_1 = require("./scopeSchemaObject");
|
|
5
|
+
/**
|
|
6
|
+
* Sort order for different schema object types
|
|
7
|
+
*/
|
|
8
|
+
const TYPE_SORT_ORDER = {
|
|
9
|
+
// ACLs and other
|
|
10
|
+
ACL: 18,
|
|
11
|
+
AGGREGATE: 6,
|
|
12
|
+
CAST: 22,
|
|
13
|
+
// Comments
|
|
14
|
+
COMMENT: 17,
|
|
15
|
+
// Constraints (sorted by type)
|
|
16
|
+
CONSTRAINT: 11,
|
|
17
|
+
// Table modifications and defaults
|
|
18
|
+
DEFAULT: 10,
|
|
19
|
+
'DEFAULT ACL': 19,
|
|
20
|
+
// Extensions first
|
|
21
|
+
EXTENSION: 1,
|
|
22
|
+
'FK CONSTRAINT': 12,
|
|
23
|
+
// Functions and procedures
|
|
24
|
+
FUNCTION: 4,
|
|
25
|
+
// Indexes
|
|
26
|
+
INDEX: 13,
|
|
27
|
+
'MATERIALIZED VIEW': 15,
|
|
28
|
+
PROCEDURE: 5,
|
|
29
|
+
// Publications and casts
|
|
30
|
+
PUBLICATION: 21,
|
|
31
|
+
// Types and schemas
|
|
32
|
+
SCHEMA: 2,
|
|
33
|
+
SEQUENCE: 8,
|
|
34
|
+
'SEQUENCE OWNED BY': 9,
|
|
35
|
+
// Tables and sequences
|
|
36
|
+
TABLE: 7,
|
|
37
|
+
// Table attachments
|
|
38
|
+
'TABLE ATTACH': 20,
|
|
39
|
+
'TEXT SEARCH CONFIGURATION': 24,
|
|
40
|
+
// Text search
|
|
41
|
+
'TEXT SEARCH DICTIONARY': 23,
|
|
42
|
+
// Triggers
|
|
43
|
+
TRIGGER: 16,
|
|
44
|
+
TYPE: 3,
|
|
45
|
+
// Views
|
|
46
|
+
VIEW: 14,
|
|
47
|
+
};
|
|
48
|
+
/**
|
|
49
|
+
* Get the sort key for a constraint based on its type
|
|
50
|
+
*/
|
|
51
|
+
const getConstraintSortKey = (sql) => {
|
|
52
|
+
const upperSql = sql.toUpperCase();
|
|
53
|
+
if (upperSql.includes('PRIMARY KEY')) {
|
|
54
|
+
return '1_PRIMARY';
|
|
55
|
+
}
|
|
56
|
+
else if (upperSql.includes('UNIQUE')) {
|
|
57
|
+
return '2_UNIQUE';
|
|
58
|
+
}
|
|
59
|
+
else if (upperSql.includes('FOREIGN KEY')) {
|
|
60
|
+
return '3_FOREIGN';
|
|
61
|
+
}
|
|
62
|
+
else if (upperSql.includes('CHECK')) {
|
|
63
|
+
return '4_CHECK';
|
|
64
|
+
}
|
|
65
|
+
else if (upperSql.includes('EXCLUDE')) {
|
|
66
|
+
return '5_EXCLUDE';
|
|
67
|
+
}
|
|
68
|
+
return '9_OTHER';
|
|
69
|
+
};
|
|
70
|
+
/**
|
|
71
|
+
* Compare two schema objects for sorting
|
|
72
|
+
*/
|
|
73
|
+
const compareSchemaObjects = (a, b, schemaObjects) => {
|
|
74
|
+
// Handle non-attributed headers (like database dump headers)
|
|
75
|
+
if (!('Type' in a.header) && !('Type' in b.header)) {
|
|
76
|
+
return 0;
|
|
77
|
+
}
|
|
78
|
+
if (!('Type' in a.header)) {
|
|
79
|
+
return -1;
|
|
80
|
+
}
|
|
81
|
+
if (!('Type' in b.header)) {
|
|
82
|
+
return 1;
|
|
83
|
+
}
|
|
84
|
+
const aHeader = a.header;
|
|
85
|
+
const bHeader = b.header;
|
|
86
|
+
// First, sort by type order
|
|
87
|
+
const aTypeOrder = TYPE_SORT_ORDER[aHeader.Type] ?? 999;
|
|
88
|
+
const bTypeOrder = TYPE_SORT_ORDER[bHeader.Type] ?? 999;
|
|
89
|
+
if (aTypeOrder !== bTypeOrder) {
|
|
90
|
+
return aTypeOrder - bTypeOrder;
|
|
91
|
+
}
|
|
92
|
+
// For the same type, apply specific sorting rules
|
|
93
|
+
// Sort by schema first (null schemas come first)
|
|
94
|
+
const aSchema = aHeader.Schema ?? '';
|
|
95
|
+
const bSchema = bHeader.Schema ?? '';
|
|
96
|
+
if (aSchema !== bSchema) {
|
|
97
|
+
if (aSchema === '') {
|
|
98
|
+
return -1;
|
|
99
|
+
}
|
|
100
|
+
if (bSchema === '') {
|
|
101
|
+
return 1;
|
|
102
|
+
}
|
|
103
|
+
return aSchema.localeCompare(bSchema);
|
|
104
|
+
}
|
|
105
|
+
// Special handling for constraints
|
|
106
|
+
if (aHeader.Type === 'CONSTRAINT' || aHeader.Type === 'FK CONSTRAINT') {
|
|
107
|
+
// Extract table name from constraint name (format: "table constraint_name")
|
|
108
|
+
const aTableName = aHeader.Name.split(' ')[0];
|
|
109
|
+
const bTableName = bHeader.Name.split(' ')[0];
|
|
110
|
+
if (aTableName !== bTableName) {
|
|
111
|
+
return aTableName.localeCompare(bTableName);
|
|
112
|
+
}
|
|
113
|
+
// Within the same table, sort by constraint type
|
|
114
|
+
const aConstraintKey = getConstraintSortKey(a.sql);
|
|
115
|
+
const bConstraintKey = getConstraintSortKey(b.sql);
|
|
116
|
+
if (aConstraintKey !== bConstraintKey) {
|
|
117
|
+
return aConstraintKey.localeCompare(bConstraintKey);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
// Special handling for indexes
|
|
121
|
+
if (aHeader.Type === 'INDEX') {
|
|
122
|
+
// Group indexes by their target table
|
|
123
|
+
const aScopeObject = (0, scopeSchemaObject_1.scopeSchemaObject)(schemaObjects, a);
|
|
124
|
+
const bScopeObject = (0, scopeSchemaObject_1.scopeSchemaObject)(schemaObjects, b);
|
|
125
|
+
if (aScopeObject && bScopeObject) {
|
|
126
|
+
const aTableName = aScopeObject.name;
|
|
127
|
+
const bTableName = bScopeObject.name;
|
|
128
|
+
if (aTableName !== bTableName) {
|
|
129
|
+
return aTableName.localeCompare(bTableName);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
// Special handling for comments - sort by what they comment on
|
|
134
|
+
if (aHeader.Type === 'COMMENT') {
|
|
135
|
+
const aTarget = aHeader.Name;
|
|
136
|
+
const bTarget = bHeader.Name;
|
|
137
|
+
// Extract the type of comment (TABLE, COLUMN, etc.)
|
|
138
|
+
const aCommentType = aTarget.split(' ')[0];
|
|
139
|
+
const bCommentType = bTarget.split(' ')[0];
|
|
140
|
+
if (aCommentType !== bCommentType) {
|
|
141
|
+
// Define order for comment types
|
|
142
|
+
const commentTypeOrder = {
|
|
143
|
+
AGGREGATE: 6,
|
|
144
|
+
COLUMN: 8,
|
|
145
|
+
EXTENSION: 1,
|
|
146
|
+
FUNCTION: 4,
|
|
147
|
+
INDEX: 10,
|
|
148
|
+
MATERIALIZED: 12,
|
|
149
|
+
PROCEDURE: 5,
|
|
150
|
+
SCHEMA: 2,
|
|
151
|
+
SEQUENCE: 9,
|
|
152
|
+
TABLE: 7,
|
|
153
|
+
TYPE: 3,
|
|
154
|
+
VIEW: 11,
|
|
155
|
+
};
|
|
156
|
+
const aOrder = commentTypeOrder[aCommentType] ?? 999;
|
|
157
|
+
const bOrder = commentTypeOrder[bCommentType] ?? 999;
|
|
158
|
+
if (aOrder !== bOrder) {
|
|
159
|
+
return aOrder - bOrder;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
// For COLUMN comments, sort by table name then column position
|
|
163
|
+
if (aCommentType === 'COLUMN') {
|
|
164
|
+
const aMatch = aTarget.match(/COLUMN\s+(\S+\.\S+)\.(.+)/u);
|
|
165
|
+
const bMatch = bTarget.match(/COLUMN\s+(\S+\.\S+)\.(.+)/u);
|
|
166
|
+
if (aMatch && bMatch) {
|
|
167
|
+
const aTable = aMatch[1];
|
|
168
|
+
const bTable = bMatch[1];
|
|
169
|
+
if (aTable !== bTable) {
|
|
170
|
+
return aTable.localeCompare(bTable);
|
|
171
|
+
}
|
|
172
|
+
// Same table, sort by column name
|
|
173
|
+
const aColumn = aMatch[2];
|
|
174
|
+
const bColumn = bMatch[2];
|
|
175
|
+
return aColumn.localeCompare(bColumn);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
// Finally, sort by name
|
|
180
|
+
return aHeader.Name.localeCompare(bHeader.Name);
|
|
181
|
+
};
|
|
182
|
+
/**
|
|
183
|
+
* Groups schema objects by their scope (table, view, etc.) and sorts them
|
|
184
|
+
*/
|
|
185
|
+
const groupAndSortSchemaObjects = (schemaObjects) => {
|
|
186
|
+
const grouped = new Map();
|
|
187
|
+
// First, group objects by their scope
|
|
188
|
+
for (const schemaObject of schemaObjects) {
|
|
189
|
+
const scope = (0, scopeSchemaObject_1.scopeSchemaObject)(schemaObjects, schemaObject);
|
|
190
|
+
let key;
|
|
191
|
+
if (scope) {
|
|
192
|
+
// Create a unique key for each scope
|
|
193
|
+
key = `${scope.type}:${scope.schema ?? 'null'}:${scope.name}`;
|
|
194
|
+
}
|
|
195
|
+
else if ('Type' in schemaObject.header) {
|
|
196
|
+
// For objects without a scope, group by type
|
|
197
|
+
const header = schemaObject.header;
|
|
198
|
+
key = `_UNSCOPED:${header.Type}:${header.Schema ?? 'null'}:${header.Name}`;
|
|
199
|
+
}
|
|
200
|
+
else {
|
|
201
|
+
// Title headers
|
|
202
|
+
key = '_TITLE';
|
|
203
|
+
}
|
|
204
|
+
if (!grouped.has(key)) {
|
|
205
|
+
grouped.set(key, []);
|
|
206
|
+
}
|
|
207
|
+
const groupArray = grouped.get(key);
|
|
208
|
+
if (groupArray) {
|
|
209
|
+
groupArray.push(schemaObject);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
// Sort objects within each group
|
|
213
|
+
for (const objects of grouped.values()) {
|
|
214
|
+
objects.sort((a, b) => compareSchemaObjects(a, b, schemaObjects));
|
|
215
|
+
}
|
|
216
|
+
// Sort the groups themselves
|
|
217
|
+
const sortedGrouped = new Map(
|
|
218
|
+
// eslint-disable-next-line unicorn/no-array-sort
|
|
219
|
+
[...grouped.entries()].sort(([keyA], [keyB]) => {
|
|
220
|
+
// Title headers first
|
|
221
|
+
if (keyA === '_TITLE') {
|
|
222
|
+
return -1;
|
|
223
|
+
}
|
|
224
|
+
if (keyB === '_TITLE') {
|
|
225
|
+
return 1;
|
|
226
|
+
}
|
|
227
|
+
// Then unscoped objects
|
|
228
|
+
if (keyA.startsWith('_UNSCOPED:') && !keyB.startsWith('_UNSCOPED:')) {
|
|
229
|
+
return -1;
|
|
230
|
+
}
|
|
231
|
+
if (!keyA.startsWith('_UNSCOPED:') && keyB.startsWith('_UNSCOPED:')) {
|
|
232
|
+
return 1;
|
|
233
|
+
}
|
|
234
|
+
// Sort by type, schema, then name
|
|
235
|
+
return keyA.localeCompare(keyB);
|
|
236
|
+
}));
|
|
237
|
+
return sortedGrouped;
|
|
238
|
+
};
|
|
239
|
+
exports.groupAndSortSchemaObjects = groupAndSortSchemaObjects;
|
|
240
|
+
/**
|
|
241
|
+
* Sorts an array of schema objects
|
|
242
|
+
*/
|
|
243
|
+
const sortSchemaObjects = (schemaObjects) => {
|
|
244
|
+
const sorted = [...schemaObjects];
|
|
245
|
+
sorted.sort((a, b) => compareSchemaObjects(a, b, schemaObjects));
|
|
246
|
+
return sorted;
|
|
247
|
+
};
|
|
248
|
+
exports.sortSchemaObjects = sortSchemaObjects;
|
|
249
|
+
/**
|
|
250
|
+
* Sorts schema objects while preserving their grouping by scope
|
|
251
|
+
*/
|
|
252
|
+
const sortSchemaObjectsByScope = (schemaObjects) => {
|
|
253
|
+
const grouped = (0, exports.groupAndSortSchemaObjects)(schemaObjects);
|
|
254
|
+
const result = [];
|
|
255
|
+
for (const objects of grouped.values()) {
|
|
256
|
+
result.push(...objects);
|
|
257
|
+
}
|
|
258
|
+
return result;
|
|
259
|
+
};
|
|
260
|
+
exports.sortSchemaObjectsByScope = sortSchemaObjectsByScope;
|
|
261
|
+
//# sourceMappingURL=sortSchemaObjects.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sortSchemaObjects.js","sourceRoot":"","sources":["../src/sortSchemaObjects.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sortSchemaObjects.test.d.ts","sourceRoot":"","sources":["../src/sortSchemaObjects.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,343 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const parsePgDump_1 = require("./parsePgDump");
|
|
7
|
+
const sortSchemaObjects_1 = require("./sortSchemaObjects");
|
|
8
|
+
const multiline_ts_1 = __importDefault(require("multiline-ts"));
|
|
9
|
+
const vitest_1 = require("vitest");
|
|
10
|
+
(0, vitest_1.describe)('sortSchemaObjects', () => {
|
|
11
|
+
(0, vitest_1.test)('sorts schema objects by type order', () => {
|
|
12
|
+
const dump = (0, multiline_ts_1.default) `
|
|
13
|
+
--
|
|
14
|
+
-- Name: foo; Type: TABLE; Schema: public; Owner: postgres
|
|
15
|
+
--
|
|
16
|
+
|
|
17
|
+
CREATE TABLE public.foo (
|
|
18
|
+
id integer NOT NULL,
|
|
19
|
+
name text NOT NULL
|
|
20
|
+
);
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
--
|
|
24
|
+
-- Name: bar; Type: INDEX; Schema: public; Owner: postgres
|
|
25
|
+
--
|
|
26
|
+
|
|
27
|
+
CREATE INDEX bar ON public.foo USING btree (name);
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
--
|
|
31
|
+
-- Name: baz; Type: EXTENSION; Schema: -; Owner: -
|
|
32
|
+
--
|
|
33
|
+
|
|
34
|
+
CREATE EXTENSION IF NOT EXISTS baz;
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
--
|
|
38
|
+
-- Name: qux; Type: CONSTRAINT; Schema: public; Owner: postgres
|
|
39
|
+
--
|
|
40
|
+
|
|
41
|
+
ALTER TABLE ONLY public.foo
|
|
42
|
+
ADD CONSTRAINT qux PRIMARY KEY (id);
|
|
43
|
+
`;
|
|
44
|
+
const schemaObjects = (0, parsePgDump_1.parsePgDump)(dump);
|
|
45
|
+
const sorted = (0, sortSchemaObjects_1.sortSchemaObjects)(schemaObjects);
|
|
46
|
+
// Extension should come first
|
|
47
|
+
(0, vitest_1.expect)(sorted[0].header).toMatchObject({ Name: 'baz', Type: 'EXTENSION' });
|
|
48
|
+
// Then table
|
|
49
|
+
(0, vitest_1.expect)(sorted[1].header).toMatchObject({ Name: 'foo', Type: 'TABLE' });
|
|
50
|
+
// Then constraint
|
|
51
|
+
(0, vitest_1.expect)(sorted[2].header).toMatchObject({ Name: 'qux', Type: 'CONSTRAINT' });
|
|
52
|
+
// Finally index
|
|
53
|
+
(0, vitest_1.expect)(sorted[3].header).toMatchObject({ Name: 'bar', Type: 'INDEX' });
|
|
54
|
+
});
|
|
55
|
+
(0, vitest_1.test)('sorts constraints by type (PRIMARY, UNIQUE, FOREIGN, CHECK)', () => {
|
|
56
|
+
const dump = (0, multiline_ts_1.default) `
|
|
57
|
+
--
|
|
58
|
+
-- Name: foo foo_check; Type: CONSTRAINT; Schema: public; Owner: postgres
|
|
59
|
+
--
|
|
60
|
+
|
|
61
|
+
ALTER TABLE ONLY public.foo
|
|
62
|
+
ADD CONSTRAINT foo_check CHECK (id > 0);
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
--
|
|
66
|
+
-- Name: foo foo_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres
|
|
67
|
+
--
|
|
68
|
+
|
|
69
|
+
ALTER TABLE ONLY public.foo
|
|
70
|
+
ADD CONSTRAINT foo_fkey FOREIGN KEY (bar_id) REFERENCES public.bar(id);
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
--
|
|
74
|
+
-- Name: foo foo_unique; Type: CONSTRAINT; Schema: public; Owner: postgres
|
|
75
|
+
--
|
|
76
|
+
|
|
77
|
+
ALTER TABLE ONLY public.foo
|
|
78
|
+
ADD CONSTRAINT foo_unique UNIQUE (name);
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
--
|
|
82
|
+
-- Name: foo foo_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
|
|
83
|
+
--
|
|
84
|
+
|
|
85
|
+
ALTER TABLE ONLY public.foo
|
|
86
|
+
ADD CONSTRAINT foo_pkey PRIMARY KEY (id);
|
|
87
|
+
`;
|
|
88
|
+
const schemaObjects = (0, parsePgDump_1.parsePgDump)(dump);
|
|
89
|
+
const sorted = (0, sortSchemaObjects_1.sortSchemaObjects)(schemaObjects);
|
|
90
|
+
// Primary key should come first
|
|
91
|
+
(0, vitest_1.expect)(sorted[0].sql).toContain('PRIMARY KEY');
|
|
92
|
+
// Then unique
|
|
93
|
+
(0, vitest_1.expect)(sorted[1].sql).toContain('UNIQUE');
|
|
94
|
+
// Then check
|
|
95
|
+
(0, vitest_1.expect)(sorted[2].sql).toContain('CHECK');
|
|
96
|
+
// Finally foreign key
|
|
97
|
+
(0, vitest_1.expect)(sorted[3].sql).toContain('FOREIGN KEY');
|
|
98
|
+
});
|
|
99
|
+
(0, vitest_1.test)('sorts indexes alphabetically within the same table', () => {
|
|
100
|
+
const dump = (0, multiline_ts_1.default) `
|
|
101
|
+
--
|
|
102
|
+
-- Name: foo; Type: TABLE; Schema: public; Owner: postgres
|
|
103
|
+
--
|
|
104
|
+
|
|
105
|
+
CREATE TABLE public.foo (
|
|
106
|
+
id integer NOT NULL,
|
|
107
|
+
name text NOT NULL,
|
|
108
|
+
email text
|
|
109
|
+
);
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
--
|
|
113
|
+
-- Name: foo_name_idx; Type: INDEX; Schema: public; Owner: postgres
|
|
114
|
+
--
|
|
115
|
+
|
|
116
|
+
CREATE INDEX foo_name_idx ON public.foo USING btree (name);
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
--
|
|
120
|
+
-- Name: foo_email_idx; Type: INDEX; Schema: public; Owner: postgres
|
|
121
|
+
--
|
|
122
|
+
|
|
123
|
+
CREATE INDEX foo_email_idx ON public.foo USING btree (email);
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
--
|
|
127
|
+
-- Name: foo_id_idx; Type: INDEX; Schema: public; Owner: postgres
|
|
128
|
+
--
|
|
129
|
+
|
|
130
|
+
CREATE INDEX foo_id_idx ON public.foo USING btree (id);
|
|
131
|
+
`;
|
|
132
|
+
const schemaObjects = (0, parsePgDump_1.parsePgDump)(dump);
|
|
133
|
+
const sorted = (0, sortSchemaObjects_1.sortSchemaObjects)(schemaObjects);
|
|
134
|
+
const indexes = sorted.filter((object) => 'Type' in object.header && object.header.Type === 'INDEX');
|
|
135
|
+
(0, vitest_1.expect)(indexes[0].header).toMatchObject({ Name: 'foo_email_idx' });
|
|
136
|
+
(0, vitest_1.expect)(indexes[1].header).toMatchObject({ Name: 'foo_id_idx' });
|
|
137
|
+
(0, vitest_1.expect)(indexes[2].header).toMatchObject({ Name: 'foo_name_idx' });
|
|
138
|
+
});
|
|
139
|
+
(0, vitest_1.test)('sorts comments by type and target', () => {
|
|
140
|
+
const dump = (0, multiline_ts_1.default) `
|
|
141
|
+
--
|
|
142
|
+
-- Name: COLUMN foo.name; Type: COMMENT; Schema: public; Owner: postgres
|
|
143
|
+
--
|
|
144
|
+
|
|
145
|
+
COMMENT ON COLUMN public.foo.name IS 'Name column';
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
--
|
|
149
|
+
-- Name: TABLE foo; Type: COMMENT; Schema: public; Owner: postgres
|
|
150
|
+
--
|
|
151
|
+
|
|
152
|
+
COMMENT ON TABLE public.foo IS 'Foo table';
|
|
153
|
+
|
|
154
|
+
|
|
155
|
+
--
|
|
156
|
+
-- Name: COLUMN foo.id; Type: COMMENT; Schema: public; Owner: postgres
|
|
157
|
+
--
|
|
158
|
+
|
|
159
|
+
COMMENT ON COLUMN public.foo.id IS 'ID column';
|
|
160
|
+
|
|
161
|
+
|
|
162
|
+
--
|
|
163
|
+
-- Name: EXTENSION pgcrypto; Type: COMMENT; Schema: -; Owner: -
|
|
164
|
+
--
|
|
165
|
+
|
|
166
|
+
COMMENT ON EXTENSION pgcrypto IS 'Crypto extension';
|
|
167
|
+
`;
|
|
168
|
+
const schemaObjects = (0, parsePgDump_1.parsePgDump)(dump);
|
|
169
|
+
const sorted = (0, sortSchemaObjects_1.sortSchemaObjects)(schemaObjects);
|
|
170
|
+
const comments = sorted.filter((object) => 'Type' in object.header && object.header.Type === 'COMMENT');
|
|
171
|
+
// Extension comment first
|
|
172
|
+
(0, vitest_1.expect)(comments[0].header).toMatchObject({ Name: 'EXTENSION pgcrypto' });
|
|
173
|
+
// Then table comment
|
|
174
|
+
(0, vitest_1.expect)(comments[1].header).toMatchObject({ Name: 'TABLE foo' });
|
|
175
|
+
// Then column comments sorted by name
|
|
176
|
+
(0, vitest_1.expect)(comments[2].header).toMatchObject({ Name: 'COLUMN foo.id' });
|
|
177
|
+
(0, vitest_1.expect)(comments[3].header).toMatchObject({ Name: 'COLUMN foo.name' });
|
|
178
|
+
});
|
|
179
|
+
(0, vitest_1.test)('groups and sorts schema objects by scope', () => {
|
|
180
|
+
const dump = (0, multiline_ts_1.default) `
|
|
181
|
+
--
|
|
182
|
+
-- Name: foo; Type: TABLE; Schema: public; Owner: postgres
|
|
183
|
+
--
|
|
184
|
+
|
|
185
|
+
CREATE TABLE public.foo (
|
|
186
|
+
id integer NOT NULL,
|
|
187
|
+
name text NOT NULL
|
|
188
|
+
);
|
|
189
|
+
|
|
190
|
+
|
|
191
|
+
--
|
|
192
|
+
-- Name: foo_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
|
|
193
|
+
--
|
|
194
|
+
|
|
195
|
+
ALTER TABLE ONLY public.foo
|
|
196
|
+
ADD CONSTRAINT foo_pkey PRIMARY KEY (id);
|
|
197
|
+
|
|
198
|
+
|
|
199
|
+
--
|
|
200
|
+
-- Name: foo_name_idx; Type: INDEX; Schema: public; Owner: postgres
|
|
201
|
+
--
|
|
202
|
+
|
|
203
|
+
CREATE INDEX foo_name_idx ON public.foo USING btree (name);
|
|
204
|
+
|
|
205
|
+
|
|
206
|
+
--
|
|
207
|
+
-- Name: bar; Type: TABLE; Schema: public; Owner: postgres
|
|
208
|
+
--
|
|
209
|
+
|
|
210
|
+
CREATE TABLE public.bar (
|
|
211
|
+
id integer NOT NULL,
|
|
212
|
+
foo_id integer
|
|
213
|
+
);
|
|
214
|
+
|
|
215
|
+
|
|
216
|
+
--
|
|
217
|
+
-- Name: bar_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
|
|
218
|
+
--
|
|
219
|
+
|
|
220
|
+
ALTER TABLE ONLY public.bar
|
|
221
|
+
ADD CONSTRAINT bar_pkey PRIMARY KEY (id);
|
|
222
|
+
|
|
223
|
+
|
|
224
|
+
--
|
|
225
|
+
-- Name: bar_foo_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres
|
|
226
|
+
--
|
|
227
|
+
|
|
228
|
+
ALTER TABLE ONLY public.bar
|
|
229
|
+
ADD CONSTRAINT bar_foo_id_fkey FOREIGN KEY (foo_id) REFERENCES public.foo(id);
|
|
230
|
+
`;
|
|
231
|
+
const schemaObjects = (0, parsePgDump_1.parsePgDump)(dump);
|
|
232
|
+
const grouped = (0, sortSchemaObjects_1.groupAndSortSchemaObjects)(schemaObjects);
|
|
233
|
+
// Should have two groups for the two tables
|
|
234
|
+
const tableGroups = Array.from(grouped.keys()).filter((key) => key.includes('TABLE:'));
|
|
235
|
+
(0, vitest_1.expect)(tableGroups).toHaveLength(2);
|
|
236
|
+
// Each group should be sorted internally
|
|
237
|
+
for (const [key, objects] of grouped.entries()) {
|
|
238
|
+
if (key.includes('TABLE:public:foo')) {
|
|
239
|
+
// foo table group should have table, constraint, and index
|
|
240
|
+
(0, vitest_1.expect)(objects).toHaveLength(3);
|
|
241
|
+
(0, vitest_1.expect)(objects[0].header).toMatchObject({ Type: 'TABLE' });
|
|
242
|
+
(0, vitest_1.expect)(objects[1].header).toMatchObject({ Type: 'CONSTRAINT' });
|
|
243
|
+
(0, vitest_1.expect)(objects[2].header).toMatchObject({ Type: 'INDEX' });
|
|
244
|
+
}
|
|
245
|
+
else if (key.includes('TABLE:public:bar')) {
|
|
246
|
+
// bar table group should have table and two constraints
|
|
247
|
+
(0, vitest_1.expect)(objects).toHaveLength(3);
|
|
248
|
+
(0, vitest_1.expect)(objects[0].header).toMatchObject({ Type: 'TABLE' });
|
|
249
|
+
(0, vitest_1.expect)(objects[1].header).toMatchObject({ Type: 'CONSTRAINT' });
|
|
250
|
+
(0, vitest_1.expect)(objects[2].header).toMatchObject({ Type: 'FK CONSTRAINT' });
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
});
|
|
254
|
+
(0, vitest_1.test)('sortSchemaObjectsByScope returns flat sorted array', () => {
|
|
255
|
+
const dump = (0, multiline_ts_1.default) `
|
|
256
|
+
--
|
|
257
|
+
-- Name: foo; Type: TABLE; Schema: public; Owner: postgres
|
|
258
|
+
--
|
|
259
|
+
|
|
260
|
+
CREATE TABLE public.foo (
|
|
261
|
+
id integer NOT NULL
|
|
262
|
+
);
|
|
263
|
+
|
|
264
|
+
|
|
265
|
+
--
|
|
266
|
+
-- Name: foo_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
|
|
267
|
+
--
|
|
268
|
+
|
|
269
|
+
ALTER TABLE ONLY public.foo
|
|
270
|
+
ADD CONSTRAINT foo_pkey PRIMARY KEY (id);
|
|
271
|
+
|
|
272
|
+
|
|
273
|
+
--
|
|
274
|
+
-- Name: bar; Type: TABLE; Schema: public; Owner: postgres
|
|
275
|
+
--
|
|
276
|
+
|
|
277
|
+
CREATE TABLE public.bar (
|
|
278
|
+
id integer NOT NULL
|
|
279
|
+
);
|
|
280
|
+
|
|
281
|
+
|
|
282
|
+
--
|
|
283
|
+
-- Name: bar_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
|
|
284
|
+
--
|
|
285
|
+
|
|
286
|
+
ALTER TABLE ONLY public.bar
|
|
287
|
+
ADD CONSTRAINT bar_pkey PRIMARY KEY (id);
|
|
288
|
+
`;
|
|
289
|
+
const schemaObjects = (0, parsePgDump_1.parsePgDump)(dump);
|
|
290
|
+
const sorted = (0, sortSchemaObjects_1.sortSchemaObjectsByScope)(schemaObjects);
|
|
291
|
+
(0, vitest_1.expect)(sorted).toHaveLength(4);
|
|
292
|
+
// Objects should be grouped by table
|
|
293
|
+
// First bar table and its constraint
|
|
294
|
+
(0, vitest_1.expect)(sorted[0].header).toMatchObject({ Name: 'bar', Type: 'TABLE' });
|
|
295
|
+
(0, vitest_1.expect)(sorted[1].header).toMatchObject({
|
|
296
|
+
Name: 'bar_pkey',
|
|
297
|
+
Type: 'CONSTRAINT',
|
|
298
|
+
});
|
|
299
|
+
// Then foo table and its constraint
|
|
300
|
+
(0, vitest_1.expect)(sorted[2].header).toMatchObject({ Name: 'foo', Type: 'TABLE' });
|
|
301
|
+
(0, vitest_1.expect)(sorted[3].header).toMatchObject({
|
|
302
|
+
Name: 'foo_pkey',
|
|
303
|
+
Type: 'CONSTRAINT',
|
|
304
|
+
});
|
|
305
|
+
});
|
|
306
|
+
(0, vitest_1.test)('handles schemas correctly in sorting', () => {
|
|
307
|
+
const dump = (0, multiline_ts_1.default) `
|
|
308
|
+
--
|
|
309
|
+
-- Name: foo; Type: TABLE; Schema: custom; Owner: postgres
|
|
310
|
+
--
|
|
311
|
+
|
|
312
|
+
CREATE TABLE custom.foo (
|
|
313
|
+
id integer NOT NULL
|
|
314
|
+
);
|
|
315
|
+
|
|
316
|
+
|
|
317
|
+
--
|
|
318
|
+
-- Name: foo; Type: TABLE; Schema: public; Owner: postgres
|
|
319
|
+
--
|
|
320
|
+
|
|
321
|
+
CREATE TABLE public.foo (
|
|
322
|
+
id integer NOT NULL
|
|
323
|
+
);
|
|
324
|
+
|
|
325
|
+
|
|
326
|
+
--
|
|
327
|
+
-- Name: bar; Type: TABLE; Schema: -; Owner: postgres
|
|
328
|
+
--
|
|
329
|
+
|
|
330
|
+
CREATE TABLE bar (
|
|
331
|
+
id integer NOT NULL
|
|
332
|
+
);
|
|
333
|
+
`;
|
|
334
|
+
const schemaObjects = (0, parsePgDump_1.parsePgDump)(dump);
|
|
335
|
+
const sorted = (0, sortSchemaObjects_1.sortSchemaObjects)(schemaObjects);
|
|
336
|
+
// Tables with null schema should come first
|
|
337
|
+
(0, vitest_1.expect)(sorted[0].header).toMatchObject({ Name: 'bar', Schema: null });
|
|
338
|
+
// Then sorted by schema name
|
|
339
|
+
(0, vitest_1.expect)(sorted[1].header).toMatchObject({ Name: 'foo', Schema: 'custom' });
|
|
340
|
+
(0, vitest_1.expect)(sorted[2].header).toMatchObject({ Name: 'foo', Schema: 'public' });
|
|
341
|
+
});
|
|
342
|
+
});
|
|
343
|
+
//# sourceMappingURL=sortSchemaObjects.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sortSchemaObjects.test.js","sourceRoot":"","sources":["../src/sortSchemaObjects.test.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -2,24 +2,24 @@
|
|
|
2
2
|
"author": {
|
|
3
3
|
"email": "gajus@gajus.com",
|
|
4
4
|
"name": "Gajus Kuizinas",
|
|
5
|
-
"url": "
|
|
5
|
+
"url": "https://gajus.com"
|
|
6
6
|
},
|
|
7
7
|
"dependencies": {
|
|
8
8
|
"multiline-ts": "^4.0.1",
|
|
9
|
-
"zod": "^3.
|
|
9
|
+
"zod": "^4.3.5"
|
|
10
10
|
},
|
|
11
11
|
"description": "Parses PostgreSQL dump files into an array of schema objects.",
|
|
12
12
|
"devDependencies": {
|
|
13
|
-
"@semantic-release/commit-analyzer": "^
|
|
14
|
-
"@semantic-release/github": "^
|
|
15
|
-
"@semantic-release/npm": "^
|
|
16
|
-
"@types/node": "^
|
|
17
|
-
"cspell": "^6.
|
|
18
|
-
"eslint": "^9.
|
|
19
|
-
"eslint-config-canonical": "^
|
|
20
|
-
"semantic-release": "^
|
|
21
|
-
"typescript": "^5.
|
|
22
|
-
"vitest": "^0.
|
|
13
|
+
"@semantic-release/commit-analyzer": "^13.0.1",
|
|
14
|
+
"@semantic-release/github": "^12.0.2",
|
|
15
|
+
"@semantic-release/npm": "^13.1.3",
|
|
16
|
+
"@types/node": "^25.0.8",
|
|
17
|
+
"cspell": "^9.6.0",
|
|
18
|
+
"eslint": "^9.39.2",
|
|
19
|
+
"eslint-config-canonical": "^47.3.7",
|
|
20
|
+
"semantic-release": "^25.0.2",
|
|
21
|
+
"typescript": "^5.9.3",
|
|
22
|
+
"vitest": "^4.0.17"
|
|
23
23
|
},
|
|
24
24
|
"engines": {
|
|
25
25
|
"node": ">=22"
|
|
@@ -56,5 +56,5 @@
|
|
|
56
56
|
"test:vitest": "vitest --run --passWithNoTests"
|
|
57
57
|
},
|
|
58
58
|
"types": "./dist/index.d.ts",
|
|
59
|
-
"version": "1.
|
|
59
|
+
"version": "1.8.0"
|
|
60
60
|
}
|