pipework 0.17.0 → 0.18.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/CHANGELOG.md +21 -0
- package/dist/REFERENCE.md +1190 -0
- package/dist/core/config/app-pool.d.ts +17 -0
- package/dist/core/config/app-pool.d.ts.map +1 -0
- package/dist/core/config/app-pool.js +18 -0
- package/dist/core/config/app-pool.js.map +1 -0
- package/dist/core/config/load.js +5 -5
- package/dist/core/config/load.js.map +1 -1
- package/dist/core/config/resolve.d.ts +12 -2
- package/dist/core/config/resolve.d.ts.map +1 -1
- package/dist/core/config/resolve.js +27 -9
- package/dist/core/config/resolve.js.map +1 -1
- package/dist/core/validation/rls-role.d.ts.map +1 -1
- package/dist/core/validation/rls-role.js +2 -1
- package/dist/core/validation/rls-role.js.map +1 -1
- package/dist/data/migrate/apply.d.ts +5 -7
- package/dist/data/migrate/apply.d.ts.map +1 -1
- package/dist/data/migrate/apply.js +7 -95
- package/dist/data/migrate/apply.js.map +1 -1
- package/dist/data/migrate/post-process.d.ts.map +1 -1
- package/dist/data/migrate/post-process.js +15 -5
- package/dist/data/migrate/post-process.js.map +1 -1
- package/dist/data/migrate/safety.d.ts.map +1 -1
- package/dist/data/migrate/safety.js +12 -7
- package/dist/data/migrate/safety.js.map +1 -1
- package/dist/data/migrate/statements.d.ts +50 -0
- package/dist/data/migrate/statements.d.ts.map +1 -0
- package/dist/data/migrate/statements.js +225 -0
- package/dist/data/migrate/statements.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* One SQL scanner, shared by everything in the migrate pipeline that has to
|
|
3
|
+
* reason about statement boundaries.
|
|
4
|
+
*
|
|
5
|
+
* There were two hand-rolled splitters before this, and they disagreed. The
|
|
6
|
+
* runner (`parseStatements`) learned string literals and dollar-quoted bodies
|
|
7
|
+
* in #317 so a plpgsql function body would survive; the safety gate kept a
|
|
8
|
+
* `sql.split(';')` that then discarded any fragment starting with `--`. Since
|
|
9
|
+
* a statement and the comment above it land in the *same* fragment, the gate
|
|
10
|
+
* dropped comment-led statements entirely and reported migrations clean that
|
|
11
|
+
* dropped tables (#334). Neither splitter knew about block comments or quoted
|
|
12
|
+
* identifiers.
|
|
13
|
+
*
|
|
14
|
+
* The rules, in one place:
|
|
15
|
+
*
|
|
16
|
+
* - `--` runs to end of line; block comments nest, per Postgres.
|
|
17
|
+
* - Comments are removed, replaced by whitespace so they still separate tokens.
|
|
18
|
+
* - `'…'`, `"…"` and `$tag$…$tag$` are copied verbatim — a `;` or `--` inside
|
|
19
|
+
* them is content, not syntax. Backslash escapes apply only in `E'…'`.
|
|
20
|
+
* - Comment state and quote state are decided in the same pass. That ordering
|
|
21
|
+
* is load-bearing: an apostrophe in a comment (`-- the migration's ancestors`)
|
|
22
|
+
* must not open a string literal, and a `--` inside a literal must not open
|
|
23
|
+
* a comment. Either check running first, alone, gets the other case wrong.
|
|
24
|
+
* - An unterminated comment or literal runs to end of input; the SQL is invalid
|
|
25
|
+
* either way and Postgres is what should say so.
|
|
26
|
+
*/
|
|
27
|
+
const IDENT_CHAR = /[A-Za-z0-9_]/;
|
|
28
|
+
const STATEMENT_BREAKPOINT = '--> statement-breakpoint';
|
|
29
|
+
/** Splits SQL into statements, stripping comments. */
|
|
30
|
+
export function scanStatements(sql, options = {}) {
|
|
31
|
+
const statements = [];
|
|
32
|
+
let buf = '';
|
|
33
|
+
const flush = () => {
|
|
34
|
+
const stmt = buf.trim();
|
|
35
|
+
if (stmt.length > 0)
|
|
36
|
+
statements.push(stmt);
|
|
37
|
+
buf = '';
|
|
38
|
+
};
|
|
39
|
+
let i = 0;
|
|
40
|
+
while (i < sql.length) {
|
|
41
|
+
const c = sql[i];
|
|
42
|
+
const next = sql[i + 1];
|
|
43
|
+
// Line comment — runs to the newline, which is left to land as whitespace.
|
|
44
|
+
if (c === '-' && next === '-') {
|
|
45
|
+
const nl = sql.indexOf('\n', i);
|
|
46
|
+
const end = nl === -1 ? sql.length : nl;
|
|
47
|
+
if (options.breakpointSeparator === true && sql.slice(i, end).trim() === STATEMENT_BREAKPOINT)
|
|
48
|
+
flush();
|
|
49
|
+
i = end;
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
// Block comment — Postgres nests these, so track depth.
|
|
53
|
+
if (c === '/' && next === '*') {
|
|
54
|
+
i = skipBlockComment(sql, i);
|
|
55
|
+
buf += ' ';
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
// Dollar-quoted body — nothing inside is special, only the matching tag ends it.
|
|
59
|
+
const tag = dollarTagAt(sql, i);
|
|
60
|
+
if (tag !== null) {
|
|
61
|
+
const close = sql.indexOf(tag, i + tag.length);
|
|
62
|
+
const end = close === -1 ? sql.length : close + tag.length;
|
|
63
|
+
buf += sql.slice(i, end);
|
|
64
|
+
i = end;
|
|
65
|
+
continue;
|
|
66
|
+
}
|
|
67
|
+
// String literal. Backslashes escape only in an E'' string.
|
|
68
|
+
if (c === "'") {
|
|
69
|
+
const end = consumeQuoted(sql, i, "'", isEscapeString(sql, i));
|
|
70
|
+
buf += sql.slice(i, end);
|
|
71
|
+
i = end;
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
// Quoted identifier.
|
|
75
|
+
if (c === '"') {
|
|
76
|
+
const end = consumeQuoted(sql, i, '"', false);
|
|
77
|
+
buf += sql.slice(i, end);
|
|
78
|
+
i = end;
|
|
79
|
+
continue;
|
|
80
|
+
}
|
|
81
|
+
if (c === ';') {
|
|
82
|
+
flush();
|
|
83
|
+
i++;
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
buf += c;
|
|
87
|
+
i++;
|
|
88
|
+
}
|
|
89
|
+
flush();
|
|
90
|
+
return statements;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Removes comments, leaving literals and dollar-quoted bodies intact and
|
|
94
|
+
* statement separators where they were. For callers that need to test SQL
|
|
95
|
+
* against a pattern without a comment supplying a false match or hiding a
|
|
96
|
+
* real one.
|
|
97
|
+
*/
|
|
98
|
+
export function stripComments(sql) {
|
|
99
|
+
let out = '';
|
|
100
|
+
let i = 0;
|
|
101
|
+
while (i < sql.length) {
|
|
102
|
+
const c = sql[i];
|
|
103
|
+
const next = sql[i + 1];
|
|
104
|
+
if (c === '-' && next === '-') {
|
|
105
|
+
const nl = sql.indexOf('\n', i);
|
|
106
|
+
i = nl === -1 ? sql.length : nl;
|
|
107
|
+
continue;
|
|
108
|
+
}
|
|
109
|
+
if (c === '/' && next === '*') {
|
|
110
|
+
i = skipBlockComment(sql, i);
|
|
111
|
+
out += ' ';
|
|
112
|
+
continue;
|
|
113
|
+
}
|
|
114
|
+
const tag = dollarTagAt(sql, i);
|
|
115
|
+
if (tag !== null) {
|
|
116
|
+
const close = sql.indexOf(tag, i + tag.length);
|
|
117
|
+
const end = close === -1 ? sql.length : close + tag.length;
|
|
118
|
+
out += sql.slice(i, end);
|
|
119
|
+
i = end;
|
|
120
|
+
continue;
|
|
121
|
+
}
|
|
122
|
+
if (c === "'" || c === '"') {
|
|
123
|
+
const end = consumeQuoted(sql, i, c, c === "'" && isEscapeString(sql, i));
|
|
124
|
+
out += sql.slice(i, end);
|
|
125
|
+
i = end;
|
|
126
|
+
continue;
|
|
127
|
+
}
|
|
128
|
+
out += c;
|
|
129
|
+
i++;
|
|
130
|
+
}
|
|
131
|
+
return out;
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Index of the first character of actual SQL in `sql` — i.e. past any leading
|
|
135
|
+
* whitespace and comments. Lets a text rewriter skip a leading comment block
|
|
136
|
+
* without rewriting words inside it.
|
|
137
|
+
*/
|
|
138
|
+
export function codeStartOffset(sql) {
|
|
139
|
+
let i = 0;
|
|
140
|
+
while (i < sql.length) {
|
|
141
|
+
const c = sql[i];
|
|
142
|
+
if (/\s/.test(c)) {
|
|
143
|
+
i++;
|
|
144
|
+
continue;
|
|
145
|
+
}
|
|
146
|
+
if (c === '-' && sql[i + 1] === '-') {
|
|
147
|
+
const nl = sql.indexOf('\n', i);
|
|
148
|
+
i = nl === -1 ? sql.length : nl;
|
|
149
|
+
continue;
|
|
150
|
+
}
|
|
151
|
+
if (c === '/' && sql[i + 1] === '*') {
|
|
152
|
+
i = skipBlockComment(sql, i);
|
|
153
|
+
continue;
|
|
154
|
+
}
|
|
155
|
+
return i;
|
|
156
|
+
}
|
|
157
|
+
return sql.length;
|
|
158
|
+
}
|
|
159
|
+
/** `start` indexes the opening `/*`. Returns the index just past the matching close. */
|
|
160
|
+
function skipBlockComment(sql, start) {
|
|
161
|
+
let depth = 0;
|
|
162
|
+
let i = start;
|
|
163
|
+
while (i < sql.length) {
|
|
164
|
+
if (sql[i] === '/' && sql[i + 1] === '*') {
|
|
165
|
+
depth++;
|
|
166
|
+
i += 2;
|
|
167
|
+
continue;
|
|
168
|
+
}
|
|
169
|
+
if (sql[i] === '*' && sql[i + 1] === '/') {
|
|
170
|
+
depth--;
|
|
171
|
+
i += 2;
|
|
172
|
+
if (depth === 0)
|
|
173
|
+
return i;
|
|
174
|
+
continue;
|
|
175
|
+
}
|
|
176
|
+
i++;
|
|
177
|
+
}
|
|
178
|
+
return sql.length;
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Returns the dollar-quote tag opening at `i` (`$$`, `$body$`), or null.
|
|
182
|
+
* Tags may not start with a digit, which is what keeps `$1` positional
|
|
183
|
+
* parameters from being read as the start of a quoted body.
|
|
184
|
+
*/
|
|
185
|
+
function dollarTagAt(sql, i) {
|
|
186
|
+
if (sql[i] !== '$')
|
|
187
|
+
return null;
|
|
188
|
+
let j = i + 1;
|
|
189
|
+
while (j < sql.length && IDENT_CHAR.test(sql[j]))
|
|
190
|
+
j++;
|
|
191
|
+
if (sql[j] !== '$')
|
|
192
|
+
return null;
|
|
193
|
+
if (/[0-9]/.test(sql[i + 1] ?? ''))
|
|
194
|
+
return null;
|
|
195
|
+
return sql.slice(i, j + 1);
|
|
196
|
+
}
|
|
197
|
+
/** True when the quote at `i` opens an `E''` escape string. */
|
|
198
|
+
function isEscapeString(sql, i) {
|
|
199
|
+
const prev = sql[i - 1];
|
|
200
|
+
if (prev !== 'e' && prev !== 'E')
|
|
201
|
+
return false;
|
|
202
|
+
const before = sql[i - 2];
|
|
203
|
+
return before === undefined || !IDENT_CHAR.test(before);
|
|
204
|
+
}
|
|
205
|
+
/** Returns the index just past the closing quote, or end of input if unterminated. */
|
|
206
|
+
function consumeQuoted(sql, start, quote, backslashEscapes) {
|
|
207
|
+
let i = start + 1;
|
|
208
|
+
while (i < sql.length) {
|
|
209
|
+
const c = sql[i];
|
|
210
|
+
if (backslashEscapes && c === '\\') {
|
|
211
|
+
i += 2;
|
|
212
|
+
continue;
|
|
213
|
+
}
|
|
214
|
+
if (c === quote) {
|
|
215
|
+
if (sql[i + 1] === quote) {
|
|
216
|
+
i += 2;
|
|
217
|
+
continue;
|
|
218
|
+
}
|
|
219
|
+
return i + 1;
|
|
220
|
+
}
|
|
221
|
+
i++;
|
|
222
|
+
}
|
|
223
|
+
return sql.length;
|
|
224
|
+
}
|
|
225
|
+
//# sourceMappingURL=statements.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"statements.js","sourceRoot":"","sources":["../../../src/data/migrate/statements.ts"],"names":[],"mappings":"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"}
|