pipework 0.18.0 → 0.19.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/cli/commands/migrate.d.ts +16 -0
- package/dist/cli/commands/migrate.d.ts.map +1 -1
- package/dist/cli/commands/migrate.js +35 -4
- package/dist/cli/commands/migrate.js.map +1 -1
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +0 -2
- package/dist/cli/index.js.map +1 -1
- package/dist/data/migrate/check.d.ts +11 -4
- package/dist/data/migrate/check.d.ts.map +1 -1
- package/dist/data/migrate/check.js +40 -22
- package/dist/data/migrate/check.js.map +1 -1
- package/dist/data/migrate/index.d.ts +2 -1
- package/dist/data/migrate/index.d.ts.map +1 -1
- package/dist/data/migrate/index.js +1 -0
- package/dist/data/migrate/index.js.map +1 -1
- package/dist/data/migrate/pragma.d.ts +35 -0
- package/dist/data/migrate/pragma.d.ts.map +1 -0
- package/dist/data/migrate/pragma.js +47 -0
- package/dist/data/migrate/pragma.js.map +1 -0
- package/dist/data/migrate/run.d.ts +1 -3
- package/dist/data/migrate/run.d.ts.map +1 -1
- package/dist/data/migrate/run.js +9 -9
- package/dist/data/migrate/run.js.map +1 -1
- package/dist/data/migrate/safety.d.ts +1 -1
- package/dist/data/migrate/safety.d.ts.map +1 -1
- package/dist/data/migrate/safety.js +30 -14
- package/dist/data/migrate/safety.js.map +1 -1
- package/dist/data/migrate/statements.d.ts +15 -0
- package/dist/data/migrate/statements.d.ts.map +1 -1
- package/dist/data/migrate/statements.js +65 -0
- package/dist/data/migrate/statements.js.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,26 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.19.0
|
|
4
|
+
|
|
5
|
+
- **Breaking: `--allow-destructive` and `--acknowledge-lock` are removed and now fail loudly. Authorization for a hazardous migration is declared in that migration's own file.** A flag authorizes an *invocation*, and invocations live in deploy workflows: the first destructive migration that has to ship puts the flag into CI permanently, and from that moment every later migration is pre-approved by a decision nobody revisits, invisibly, in a file no migration review ever opens. 0.18.0 made the gate see correctly; this makes the gate's answer mean something in an unattended pipeline, which is where migrations actually run.
|
|
6
|
+
|
|
7
|
+
A pragma authorizes a *file*:
|
|
8
|
+
|
|
9
|
+
```sql
|
|
10
|
+
-- pipework:expect-destructive
|
|
11
|
+
DROP TABLE "graph_co_change_edges";
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
It is written by the person writing the destructive statement, at the moment they write it. It appears in the diff, so it is reviewed. It is versioned, so history records who approved which drop. It cannot go blanket — a pragma in `0065` says nothing about `0071`, and each hazard class needs its own (`expect-destructive`, `expect-locking`, `expect-dynamic`); declaring one does not declare the others. The deploy command stays a bare `pipework migrate` forever, so there is no flag left to erode. Pragmas are recognized only on their own comment line, so prose mentioning one authorizes nothing, and the tracker's existing content-hash check means one cannot be added to an already-applied migration unnoticed.
|
|
15
|
+
|
|
16
|
+
Passing either flag is a hard error naming the pragma to use instead, rather than a silent no-op: a pipeline still passing them is a pipeline that has been running ungated and should find out. `MigrateOptions.allowDestructive` / `.acknowledgeLock` are gone from the programmatic API for the same reason.
|
|
17
|
+
|
|
18
|
+
- **Behavior change: a migration containing `EXECUTE` is reported as a new `dynamic` hazard.** SQL assembled at runtime is not analyzable by a gate that reads text, so rather than pretend to see through it, the gate names it and asks for `-- pipework:expect-dynamic`. This is what makes the literal handling below safe.
|
|
19
|
+
- **Fix: DDL keywords in string literals no longer raise false hazards.** `INSERT INTO notes VALUES ('a; DROP TABLE decoy;')` drops nothing, and 0.18.0 flagged it. Literal *contents* are now blanked before rules match, because a literal is data — what makes literal text dangerous is something `EXECUTE`ing it, which is structural and now has its own rule, rather than a guess about the text. Dollar-quoted bodies are still scanned (`DO $$ BEGIN DROP TABLE x; END $$` executes during the migration), while literals *inside* those bodies are blanked like any other.
|
|
20
|
+
- **`Severity` gains `'dynamic'`; `MigrationCheckResult` gains `hasDynamic` and `declared`, and each entry in `fileHazards` gains `undeclared`** naming the hazard classes that file raises but does not declare. `formatCheckResult` reports per-file and prints the exact line to add to each migration.
|
|
21
|
+
|
|
22
|
+
Upgrading: run `pipework migrate` with no flags. It names every pending migration that needs a declaration and the line to paste. Applied migrations are untouched — the tracker still scopes the scan to pending entries, so history needs no annotation.
|
|
23
|
+
|
|
3
24
|
## 0.18.0
|
|
4
25
|
|
|
5
26
|
- **Fix: the migration safety gate no longer skips every statement that has a comment above it.** `splitStatements` split on `;` and then discarded any fragment beginning with `--`. A statement and its preceding comment land in the *same* fragment, so a comment-led statement was thrown away before any hazard rule ran and `checkMigrations` reported the file **clean** — the failure ran in the fail-open direction, and `pipework migrate` applied a comment-led `DROP TABLE` with no `--allow-destructive`. Reported against a codebase where 70 of 93 committed migrations lead with a comment, i.e. most statements in most migrations were never scanned. Comments are now stripped by a scanner rather than used to discard fragments. Issue #334.
|
|
@@ -6,4 +6,20 @@ export interface MigrateCommandOptions {
|
|
|
6
6
|
acknowledgeLock: boolean | undefined;
|
|
7
7
|
}
|
|
8
8
|
export declare function migrate(options: MigrateCommandOptions): Promise<void>;
|
|
9
|
+
/**
|
|
10
|
+
* `--allow-destructive` / `--acknowledge-lock` authorized an *invocation*, so
|
|
11
|
+
* the first destructive migration that had to ship put them into a deploy
|
|
12
|
+
* workflow permanently and every migration after that was pre-approved by a
|
|
13
|
+
* decision nobody revisits. Authorization is per-migration now, declared in
|
|
14
|
+
* the file that raises the hazard, where review can see it.
|
|
15
|
+
*
|
|
16
|
+
* Failing loudly rather than ignoring them is the point: a pipeline still
|
|
17
|
+
* passing these is a pipeline that has been running ungated.
|
|
18
|
+
*
|
|
19
|
+
* Returns the error text, or null when neither flag was passed.
|
|
20
|
+
*/
|
|
21
|
+
export declare function rejectRetiredFlags(options: {
|
|
22
|
+
allowDestructive: boolean | undefined;
|
|
23
|
+
acknowledgeLock: boolean | undefined;
|
|
24
|
+
}): string | null;
|
|
9
25
|
//# sourceMappingURL=migrate.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/migrate.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,MAAM,GAAG,SAAS,CAAA;IACtB,GAAG,EAAE,MAAM,CAAA;IACX,OAAO,EAAE,OAAO,GAAG,SAAS,CAAA;IAC5B,gBAAgB,EAAE,OAAO,GAAG,SAAS,CAAA;IACrC,eAAe,EAAE,OAAO,GAAG,SAAS,CAAA;CACrC;AAED,wBAAsB,OAAO,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/migrate.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,MAAM,GAAG,SAAS,CAAA;IACtB,GAAG,EAAE,MAAM,CAAA;IACX,OAAO,EAAE,OAAO,GAAG,SAAS,CAAA;IAC5B,gBAAgB,EAAE,OAAO,GAAG,SAAS,CAAA;IACrC,eAAe,EAAE,OAAO,GAAG,SAAS,CAAA;CACrC;AAED,wBAAsB,OAAO,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,CA0D3E;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE;IAC1C,gBAAgB,EAAE,OAAO,GAAG,SAAS,CAAA;IACrC,eAAe,EAAE,OAAO,GAAG,SAAS,CAAA;CACrC,GAAG,MAAM,GAAG,IAAI,CAmBhB"}
|
|
@@ -8,6 +8,11 @@ export async function migrate(options) {
|
|
|
8
8
|
' Run `pipework init` to create one.\n');
|
|
9
9
|
process.exit(1);
|
|
10
10
|
}
|
|
11
|
+
const rejection = rejectRetiredFlags(options);
|
|
12
|
+
if (rejection !== null) {
|
|
13
|
+
logError(rejection);
|
|
14
|
+
process.exit(1);
|
|
15
|
+
}
|
|
11
16
|
const instance = await discoverInstance(options.cwd);
|
|
12
17
|
if (instance.config.environment === 'production' && options.confirm !== true) {
|
|
13
18
|
logError('Refusing to run migrations in production without --confirm.\n\n' +
|
|
@@ -18,10 +23,7 @@ export async function migrate(options) {
|
|
|
18
23
|
if (instance.config.environment === 'production') {
|
|
19
24
|
warn('Running migrations against PRODUCTION database.');
|
|
20
25
|
}
|
|
21
|
-
const migrateOptions = {
|
|
22
|
-
allowDestructive: options.allowDestructive === true,
|
|
23
|
-
acknowledgeLock: options.acknowledgeLock === true,
|
|
24
|
-
};
|
|
26
|
+
const migrateOptions = {};
|
|
25
27
|
try {
|
|
26
28
|
if (options.db !== undefined) {
|
|
27
29
|
info(`Migrating database: ${options.db}`);
|
|
@@ -48,4 +50,33 @@ export async function migrate(options) {
|
|
|
48
50
|
await instance.pool.closeAll();
|
|
49
51
|
}
|
|
50
52
|
}
|
|
53
|
+
/**
|
|
54
|
+
* `--allow-destructive` / `--acknowledge-lock` authorized an *invocation*, so
|
|
55
|
+
* the first destructive migration that had to ship put them into a deploy
|
|
56
|
+
* workflow permanently and every migration after that was pre-approved by a
|
|
57
|
+
* decision nobody revisits. Authorization is per-migration now, declared in
|
|
58
|
+
* the file that raises the hazard, where review can see it.
|
|
59
|
+
*
|
|
60
|
+
* Failing loudly rather than ignoring them is the point: a pipeline still
|
|
61
|
+
* passing these is a pipeline that has been running ungated.
|
|
62
|
+
*
|
|
63
|
+
* Returns the error text, or null when neither flag was passed.
|
|
64
|
+
*/
|
|
65
|
+
export function rejectRetiredFlags(options) {
|
|
66
|
+
const used = [
|
|
67
|
+
options.allowDestructive === true ? '--allow-destructive' : null,
|
|
68
|
+
options.acknowledgeLock === true ? '--acknowledge-lock' : null,
|
|
69
|
+
].filter((f) => f !== null);
|
|
70
|
+
if (used.length === 0)
|
|
71
|
+
return null;
|
|
72
|
+
return (`${used.join(' and ')} ${used.length > 1 ? 'are' : 'is'} no longer accepted.\n\n` +
|
|
73
|
+
' Authorization belongs in the migration, not the deploy command.\n' +
|
|
74
|
+
' A flag here approves every migration this pipeline will ever run;\n' +
|
|
75
|
+
' a pragma approves the one file it is written in, in the diff where\n' +
|
|
76
|
+
' it is reviewed.\n\n' +
|
|
77
|
+
' Run `pipework migrate` with no flags. It will name each migration\n' +
|
|
78
|
+
' that needs a declaration and the exact line to add, e.g.\n\n' +
|
|
79
|
+
' -- pipework:expect-destructive\n' +
|
|
80
|
+
' DROP TABLE "graph_co_change_edges";\n');
|
|
81
|
+
}
|
|
51
82
|
//# sourceMappingURL=migrate.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"migrate.js","sourceRoot":"","sources":["../../../src/cli/commands/migrate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,QAAQ,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AAUrE,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,OAA8B;IAC1D,MAAM,EAAE,gBAAgB,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,+BAA+B,CAAC,CAAA;IACtF,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,oBAAoB,EAAE,GAAG,MAAM,MAAM,CAAC,2BAA2B,CAAC,CAAA;IAClG,MAAM,EAAE,iBAAiB,EAAE,GAAG,MAAM,MAAM,CAAC,6BAA6B,CAAC,CAAA;IAEzE,IAAI,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC;QACrC,QAAQ,CACN,2DAA2D;YAC3D,wCAAwC,CACzC,CAAA;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,gBAAgB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;IAEpD,IAAI,QAAQ,CAAC,MAAM,CAAC,WAAW,KAAK,YAAY,IAAI,OAAO,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;QAC7E,QAAQ,CACN,iEAAiE;YACjE,oFAAoF;YACpF,qCAAqC,CACtC,CAAA;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,IAAI,QAAQ,CAAC,MAAM,CAAC,WAAW,KAAK,YAAY,EAAE,CAAC;QACjD,IAAI,CAAC,iDAAiD,CAAC,CAAA;IACzD,CAAC;IAED,MAAM,cAAc,GAAG
|
|
1
|
+
{"version":3,"file":"migrate.js","sourceRoot":"","sources":["../../../src/cli/commands/migrate.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAoEA,wBAAsB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAmLvD"}
|
package/dist/cli/index.js
CHANGED
|
@@ -27,8 +27,6 @@ ${bold('Options:')}
|
|
|
27
27
|
--version, -v Show version
|
|
28
28
|
--name Migration name (used with generate)
|
|
29
29
|
--confirm Required for production migrations
|
|
30
|
-
--allow-destructive Permit destructive DDL (DROP TABLE, DROP COLUMN, etc.)
|
|
31
|
-
--acknowledge-lock Permit operations that acquire heavy locks
|
|
32
30
|
--tenant Tenant ID for tenant-scoped scripts
|
|
33
31
|
--job-type Override job type (default: "script")
|
|
34
32
|
|
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAA;AACpD,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAEzC,MAAM,KAAK,GAAG;EACZ,IAAI,CAAC,UAAU,CAAC;;EAEhB,IAAI,CAAC,WAAW,CAAC;;;;;;;;;;;;;;;;;EAiBjB,IAAI,CAAC,UAAU,CAAC
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,13 +1,20 @@
|
|
|
1
1
|
import { type MigrationHazard, type Severity } from './safety.js';
|
|
2
|
+
import { type PragmaKind } from './pragma.js';
|
|
2
3
|
import type { AppliedState } from './applied.js';
|
|
4
|
+
export interface FileHazards {
|
|
5
|
+
file: string;
|
|
6
|
+
hazards: MigrationHazard[];
|
|
7
|
+
/** Hazard classes this file raises but does not declare a pragma for. */
|
|
8
|
+
undeclared: PragmaKind[];
|
|
9
|
+
}
|
|
3
10
|
export interface MigrationCheckResult {
|
|
4
11
|
safe: boolean;
|
|
5
12
|
hasDestructive: boolean;
|
|
6
13
|
hasLocking: boolean;
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
14
|
+
hasDynamic: boolean;
|
|
15
|
+
/** True when every hazard raised is declared by its own migration. */
|
|
16
|
+
declared: boolean;
|
|
17
|
+
fileHazards: FileHazards[];
|
|
11
18
|
}
|
|
12
19
|
/**
|
|
13
20
|
* Scans pending migrations for destructive and locking operations.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../../../src/data/migrate/check.ts"],"names":[],"mappings":"AAEA,OAAO,EAA6B,KAAK,eAAe,EAAE,KAAK,QAAQ,EAAE,MAAM,aAAa,CAAA;AAC5F,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAEhD,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,OAAO,CAAA;IACb,cAAc,EAAE,OAAO,CAAA;IACvB,UAAU,EAAE,OAAO,CAAA;IACnB,
|
|
1
|
+
{"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../../../src/data/migrate/check.ts"],"names":[],"mappings":"AAEA,OAAO,EAA6B,KAAK,eAAe,EAAE,KAAK,QAAQ,EAAE,MAAM,aAAa,CAAA;AAC5F,OAAO,EAAyB,KAAK,UAAU,EAAE,MAAM,aAAa,CAAA;AACpE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAEhD,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,eAAe,EAAE,CAAA;IAC1B,yEAAyE;IACzE,UAAU,EAAE,UAAU,EAAE,CAAA;CACzB;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,OAAO,CAAA;IACb,cAAc,EAAE,OAAO,CAAA;IACvB,UAAU,EAAE,OAAO,CAAA;IACnB,UAAU,EAAE,OAAO,CAAA;IACnB,sEAAsE;IACtE,QAAQ,EAAE,OAAO,CAAA;IACjB,WAAW,EAAE,WAAW,EAAE,CAAA;CAC3B;AAYD;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAAC,gBAAgB,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,IAAI,GAAG,oBAAoB,CAuD7G;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,oBAAoB,GAAG,MAAM,CA6BtE;AAED,YAAY,EAAE,eAAe,EAAE,QAAQ,EAAE,CAAA"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { readFileSync, existsSync } from 'node:fs';
|
|
2
2
|
import { join } from 'node:path';
|
|
3
3
|
import { analyzeSQL, formatHazards } from './safety.js';
|
|
4
|
+
import { hasPragma, PRAGMA_FOR } from './pragma.js';
|
|
4
5
|
/**
|
|
5
6
|
* Scans pending migrations for destructive and locking operations.
|
|
6
7
|
*
|
|
@@ -15,12 +16,14 @@ import { analyzeSQL, formatHazards } from './safety.js';
|
|
|
15
16
|
export function checkMigrations(migrationsFolder, applied) {
|
|
16
17
|
const journalPath = join(migrationsFolder, 'meta', '_journal.json');
|
|
17
18
|
if (!existsSync(journalPath)) {
|
|
18
|
-
return { safe: true, hasDestructive: false, hasLocking: false, fileHazards: [] };
|
|
19
|
+
return { safe: true, hasDestructive: false, hasLocking: false, hasDynamic: false, declared: true, fileHazards: [] };
|
|
19
20
|
}
|
|
20
21
|
const journal = JSON.parse(readFileSync(journalPath, 'utf-8'));
|
|
21
22
|
const fileHazards = [];
|
|
22
23
|
let hasDestructive = false;
|
|
23
24
|
let hasLocking = false;
|
|
25
|
+
let hasDynamic = false;
|
|
26
|
+
let declared = true;
|
|
24
27
|
const isApplied = (entry) => {
|
|
25
28
|
if (applied === undefined || applied === null)
|
|
26
29
|
return false;
|
|
@@ -37,41 +40,56 @@ export function checkMigrations(migrationsFolder, applied) {
|
|
|
37
40
|
const sql = readFileSync(sqlPath, 'utf-8');
|
|
38
41
|
const hazards = analyzeSQL(sql);
|
|
39
42
|
if (hazards.length > 0) {
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
43
|
+
// A hazard is authorized by a pragma in the migration that raises it —
|
|
44
|
+
// never by a flag on the deploy command, which would authorize this
|
|
45
|
+
// migration and every migration after it. Checked per file, per class.
|
|
46
|
+
const undeclared = [];
|
|
47
|
+
for (const kind of ['destructive', 'locking', 'dynamic']) {
|
|
48
|
+
if (!hazards.some(h => h.severity === kind))
|
|
49
|
+
continue;
|
|
50
|
+
if (kind === 'destructive')
|
|
51
|
+
hasDestructive = true;
|
|
52
|
+
if (kind === 'locking')
|
|
53
|
+
hasLocking = true;
|
|
54
|
+
if (kind === 'dynamic')
|
|
55
|
+
hasDynamic = true;
|
|
56
|
+
if (!hasPragma(sql, kind)) {
|
|
57
|
+
undeclared.push(kind);
|
|
58
|
+
declared = false;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
fileHazards.push({ file: `${entry.tag}.sql`, hazards, undeclared });
|
|
45
62
|
}
|
|
46
63
|
}
|
|
47
64
|
return {
|
|
48
|
-
safe: !hasDestructive && !hasLocking,
|
|
65
|
+
safe: !hasDestructive && !hasLocking && !hasDynamic,
|
|
49
66
|
hasDestructive,
|
|
50
67
|
hasLocking,
|
|
68
|
+
hasDynamic,
|
|
69
|
+
declared,
|
|
51
70
|
fileHazards,
|
|
52
71
|
};
|
|
53
72
|
}
|
|
54
73
|
export function formatCheckResult(result) {
|
|
55
|
-
if (result.
|
|
74
|
+
if (result.declared)
|
|
56
75
|
return '';
|
|
57
76
|
const lines = [];
|
|
58
|
-
const
|
|
59
|
-
const
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
if (lCount > 0)
|
|
64
|
-
parts.push(`${lCount} locking`);
|
|
65
|
-
lines.push(`Migration safety check: ${parts.join(' and ')} operation${dCount + lCount > 1 ? 's' : ''} detected.\n`);
|
|
66
|
-
for (const { file, hazards } of result.fileHazards) {
|
|
77
|
+
const undeclaredFiles = result.fileHazards.filter(f => f.undeclared.length > 0);
|
|
78
|
+
const n = undeclaredFiles.length;
|
|
79
|
+
lines.push(`Migration safety check: ${n} migration${n > 1 ? 's' : ''} raise${n > 1 ? '' : 's'} ` +
|
|
80
|
+
`hazards that ${n > 1 ? 'their own files do' : 'its own file does'} not declare.\n`);
|
|
81
|
+
for (const { file, hazards } of undeclaredFiles) {
|
|
67
82
|
lines.push(formatHazards(hazards, file));
|
|
68
83
|
}
|
|
69
84
|
lines.push('');
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
85
|
+
lines.push('Authorization belongs in the migration, not the deploy command.');
|
|
86
|
+
lines.push('Add the matching line to the top of each file above and commit it,');
|
|
87
|
+
lines.push('so the approval is reviewed in the diff and recorded in history:');
|
|
88
|
+
lines.push('');
|
|
89
|
+
for (const { file, undeclared } of undeclaredFiles) {
|
|
90
|
+
for (const kind of undeclared) {
|
|
91
|
+
lines.push(` ${file}: -- ${PRAGMA_FOR[kind]}`);
|
|
92
|
+
}
|
|
75
93
|
}
|
|
76
94
|
return lines.join('\n');
|
|
77
95
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"check.js","sourceRoot":"","sources":["../../../src/data/migrate/check.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAClD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,UAAU,EAAE,aAAa,EAAuC,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"check.js","sourceRoot":"","sources":["../../../src/data/migrate/check.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAClD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,UAAU,EAAE,aAAa,EAAuC,MAAM,aAAa,CAAA;AAC5F,OAAO,EAAE,SAAS,EAAE,UAAU,EAAmB,MAAM,aAAa,CAAA;AA8BpE;;;;;;;;;;GAUG;AACH,MAAM,UAAU,eAAe,CAAC,gBAAwB,EAAE,OAA6B;IACrF,MAAM,WAAW,GAAG,IAAI,CAAC,gBAAgB,EAAE,MAAM,EAAE,eAAe,CAAC,CAAA;IACnE,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC7B,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,CAAA;IACrH,CAAC;IAED,MAAM,OAAO,GAAY,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAA;IACvE,MAAM,WAAW,GAAkB,EAAE,CAAA;IACrC,IAAI,cAAc,GAAG,KAAK,CAAA;IAC1B,IAAI,UAAU,GAAG,KAAK,CAAA;IACtB,IAAI,UAAU,GAAG,KAAK,CAAA;IACtB,IAAI,QAAQ,GAAG,IAAI,CAAA;IAEnB,MAAM,SAAS,GAAG,CAAC,KAAmB,EAAW,EAAE;QACjD,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,IAAI;YAAE,OAAO,KAAK,CAAA;QAC3D,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM;YAAE,OAAO,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QAC/D,OAAO,KAAK,CAAC,IAAI,IAAI,OAAO,CAAC,SAAS,CAAA;IACxC,CAAC,CAAA;IAED,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACpC,IAAI,SAAS,CAAC,KAAK,CAAC;YAAE,SAAQ;QAE9B,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,EAAE,GAAG,KAAK,CAAC,GAAG,MAAM,CAAC,CAAA;QAC1D,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;YAAE,SAAQ;QAElC,MAAM,GAAG,GAAG,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;QAC1C,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,CAAC,CAAA;QAE/B,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,uEAAuE;YACvE,oEAAoE;YACpE,uEAAuE;YACvE,MAAM,UAAU,GAAiB,EAAE,CAAA;YACnC,KAAK,MAAM,IAAI,IAAI,CAAC,aAAa,EAAE,SAAS,EAAE,SAAS,CAAU,EAAE,CAAC;gBAClE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,IAAI,CAAC;oBAAE,SAAQ;gBACrD,IAAI,IAAI,KAAK,aAAa;oBAAE,cAAc,GAAG,IAAI,CAAA;gBACjD,IAAI,IAAI,KAAK,SAAS;oBAAE,UAAU,GAAG,IAAI,CAAA;gBACzC,IAAI,IAAI,KAAK,SAAS;oBAAE,UAAU,GAAG,IAAI,CAAA;gBACzC,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,CAAC;oBAC1B,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;oBACrB,QAAQ,GAAG,KAAK,CAAA;gBAClB,CAAC;YACH,CAAC;YACD,WAAW,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAA;QACrE,CAAC;IACH,CAAC;IAED,OAAO;QACL,IAAI,EAAE,CAAC,cAAc,IAAI,CAAC,UAAU,IAAI,CAAC,UAAU;QACnD,cAAc;QACd,UAAU;QACV,UAAU;QACV,QAAQ;QACR,WAAW;KACZ,CAAA;AACH,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,MAA4B;IAC5D,IAAI,MAAM,CAAC,QAAQ;QAAE,OAAO,EAAE,CAAA;IAE9B,MAAM,KAAK,GAAa,EAAE,CAAA;IAC1B,MAAM,eAAe,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;IAC/E,MAAM,CAAC,GAAG,eAAe,CAAC,MAAM,CAAA;IAEhC,KAAK,CAAC,IAAI,CACR,2BAA2B,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG;QACrF,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,mBAAmB,iBAAiB,CACpF,CAAA;IAED,KAAK,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,eAAe,EAAE,CAAC;QAChD,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAA;IAC1C,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACd,KAAK,CAAC,IAAI,CAAC,iEAAiE,CAAC,CAAA;IAC7E,KAAK,CAAC,IAAI,CAAC,oEAAoE,CAAC,CAAA;IAChF,KAAK,CAAC,IAAI,CAAC,kEAAkE,CAAC,CAAA;IAC9E,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAEd,KAAK,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,eAAe,EAAE,CAAC;QACnD,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;YAC9B,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,SAAS,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QAClD,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACzB,CAAC"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export { migrateAll, migrateOne, UnsafeMigrationError, type MigrateResult, type MigrateOptions } from './run.js';
|
|
2
|
-
export { checkMigrations, formatCheckResult, type MigrationCheckResult, type MigrationHazard, type Severity } from './check.js';
|
|
2
|
+
export { checkMigrations, formatCheckResult, type MigrationCheckResult, type FileHazards, type MigrationHazard, type Severity } from './check.js';
|
|
3
|
+
export { hasPragma, PRAGMA_FOR, type PragmaKind } from './pragma.js';
|
|
3
4
|
export { readAppliedState, type AppliedState } from './applied.js';
|
|
4
5
|
export { analyzeSQL } from './safety.js';
|
|
5
6
|
export { generateForDatabase, type GenerateResult } from './generate.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/data/migrate/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,oBAAoB,EAAE,KAAK,aAAa,EAAE,KAAK,cAAc,EAAE,MAAM,UAAU,CAAA;AAChH,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,KAAK,oBAAoB,EAAE,KAAK,eAAe,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/data/migrate/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,oBAAoB,EAAE,KAAK,aAAa,EAAE,KAAK,cAAc,EAAE,MAAM,UAAU,CAAA;AAChH,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,KAAK,oBAAoB,EAAE,KAAK,WAAW,EAAE,KAAK,eAAe,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,CAAA;AACjJ,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,KAAK,UAAU,EAAE,MAAM,aAAa,CAAA;AACpE,OAAO,EAAE,gBAAgB,EAAE,KAAK,YAAY,EAAE,MAAM,cAAc,CAAA;AAClE,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,mBAAmB,EAAE,KAAK,cAAc,EAAE,MAAM,eAAe,CAAA;AACxE,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAA;AACxD,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAA"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export { migrateAll, migrateOne, UnsafeMigrationError } from './run.js';
|
|
2
2
|
export { checkMigrations, formatCheckResult } from './check.js';
|
|
3
|
+
export { hasPragma, PRAGMA_FOR } from './pragma.js';
|
|
3
4
|
export { readAppliedState } from './applied.js';
|
|
4
5
|
export { analyzeSQL } from './safety.js';
|
|
5
6
|
export { generateForDatabase } from './generate.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/data/migrate/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,oBAAoB,EAA2C,MAAM,UAAU,CAAA;AAChH,OAAO,EAAE,eAAe,EAAE,iBAAiB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/data/migrate/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,oBAAoB,EAA2C,MAAM,UAAU,CAAA;AAChH,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAoF,MAAM,YAAY,CAAA;AACjJ,OAAO,EAAE,SAAS,EAAE,UAAU,EAAmB,MAAM,aAAa,CAAA;AACpE,OAAO,EAAE,gBAAgB,EAAqB,MAAM,cAAc,CAAA;AAClE,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,mBAAmB,EAAuB,MAAM,eAAe,CAAA;AACxE,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAA;AACxD,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAA"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Migration pragmas — per-file declarations read from the migration's own
|
|
3
|
+
* comments.
|
|
4
|
+
*
|
|
5
|
+
* Authorization for a hazardous migration lives here rather than on the
|
|
6
|
+
* `pipework migrate` command line, and the distinction is the whole point.
|
|
7
|
+
* A CLI flag authorizes an *invocation*: it is written once, into a deploy
|
|
8
|
+
* workflow, by someone who cannot know what migration 0071 will contain nine
|
|
9
|
+
* months later. The first destructive migration that has to ship puts
|
|
10
|
+
* `--allow-destructive` in CI permanently, and from then on the gate is
|
|
11
|
+
* decorative — every later migration is pre-approved by a decision nobody
|
|
12
|
+
* revisits, and nothing about it shows up in review.
|
|
13
|
+
*
|
|
14
|
+
* A pragma authorizes a *file*. It is written by the person writing the
|
|
15
|
+
* destructive statement, at the moment they write it; it appears in the diff,
|
|
16
|
+
* so it is reviewed; it is versioned, so `git log` says who approved which
|
|
17
|
+
* drop; and it cannot go blanket — a pragma in 0065 says nothing about 0071.
|
|
18
|
+
* The deploy command stays a bare `pipework migrate` forever, which means
|
|
19
|
+
* there is no flag to erode.
|
|
20
|
+
*
|
|
21
|
+
* The migration tracker already records a content hash per applied migration
|
|
22
|
+
* and refuses edited-but-applied files, so a pragma cannot be quietly added
|
|
23
|
+
* after the fact.
|
|
24
|
+
*/
|
|
25
|
+
export declare const PRAGMA_PREFIX = "-- pipework:";
|
|
26
|
+
/** Hazard classes that require a per-migration declaration. */
|
|
27
|
+
export type PragmaKind = 'destructive' | 'locking' | 'dynamic';
|
|
28
|
+
export declare const PRAGMA_FOR: Record<PragmaKind, string>;
|
|
29
|
+
/**
|
|
30
|
+
* True when `sql` declares the given pragma. Pragmas are recognized only on
|
|
31
|
+
* their own comment line, so prose that happens to mention one does not
|
|
32
|
+
* authorize anything.
|
|
33
|
+
*/
|
|
34
|
+
export declare function hasPragma(sql: string, kind: PragmaKind): boolean;
|
|
35
|
+
//# sourceMappingURL=pragma.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pragma.d.ts","sourceRoot":"","sources":["../../../src/data/migrate/pragma.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,eAAO,MAAM,aAAa,iBAAiB,CAAA;AAE3C,+DAA+D;AAC/D,MAAM,MAAM,UAAU,GAAG,aAAa,GAAG,SAAS,GAAG,SAAS,CAAA;AAE9D,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAIjD,CAAA;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAQhE"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Migration pragmas — per-file declarations read from the migration's own
|
|
3
|
+
* comments.
|
|
4
|
+
*
|
|
5
|
+
* Authorization for a hazardous migration lives here rather than on the
|
|
6
|
+
* `pipework migrate` command line, and the distinction is the whole point.
|
|
7
|
+
* A CLI flag authorizes an *invocation*: it is written once, into a deploy
|
|
8
|
+
* workflow, by someone who cannot know what migration 0071 will contain nine
|
|
9
|
+
* months later. The first destructive migration that has to ship puts
|
|
10
|
+
* `--allow-destructive` in CI permanently, and from then on the gate is
|
|
11
|
+
* decorative — every later migration is pre-approved by a decision nobody
|
|
12
|
+
* revisits, and nothing about it shows up in review.
|
|
13
|
+
*
|
|
14
|
+
* A pragma authorizes a *file*. It is written by the person writing the
|
|
15
|
+
* destructive statement, at the moment they write it; it appears in the diff,
|
|
16
|
+
* so it is reviewed; it is versioned, so `git log` says who approved which
|
|
17
|
+
* drop; and it cannot go blanket — a pragma in 0065 says nothing about 0071.
|
|
18
|
+
* The deploy command stays a bare `pipework migrate` forever, which means
|
|
19
|
+
* there is no flag to erode.
|
|
20
|
+
*
|
|
21
|
+
* The migration tracker already records a content hash per applied migration
|
|
22
|
+
* and refuses edited-but-applied files, so a pragma cannot be quietly added
|
|
23
|
+
* after the fact.
|
|
24
|
+
*/
|
|
25
|
+
export const PRAGMA_PREFIX = '-- pipework:';
|
|
26
|
+
export const PRAGMA_FOR = {
|
|
27
|
+
destructive: 'pipework:expect-destructive',
|
|
28
|
+
locking: 'pipework:expect-locking',
|
|
29
|
+
dynamic: 'pipework:expect-dynamic',
|
|
30
|
+
};
|
|
31
|
+
/**
|
|
32
|
+
* True when `sql` declares the given pragma. Pragmas are recognized only on
|
|
33
|
+
* their own comment line, so prose that happens to mention one does not
|
|
34
|
+
* authorize anything.
|
|
35
|
+
*/
|
|
36
|
+
export function hasPragma(sql, kind) {
|
|
37
|
+
const wanted = PRAGMA_FOR[kind];
|
|
38
|
+
for (const line of sql.split('\n')) {
|
|
39
|
+
const trimmed = line.trim();
|
|
40
|
+
if (!trimmed.startsWith('--'))
|
|
41
|
+
continue;
|
|
42
|
+
if (trimmed.slice(2).trim() === wanted)
|
|
43
|
+
return true;
|
|
44
|
+
}
|
|
45
|
+
return false;
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=pragma.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pragma.js","sourceRoot":"","sources":["../../../src/data/migrate/pragma.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,MAAM,CAAC,MAAM,aAAa,GAAG,cAAc,CAAA;AAK3C,MAAM,CAAC,MAAM,UAAU,GAA+B;IACpD,WAAW,EAAE,6BAA6B;IAC1C,OAAO,EAAE,yBAAyB;IAClC,OAAO,EAAE,yBAAyB;CACnC,CAAA;AAED;;;;GAIG;AACH,MAAM,UAAU,SAAS,CAAC,GAAW,EAAE,IAAgB;IACrD,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,CAAA;IAC/B,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACnC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAA;QAC3B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,SAAQ;QACvC,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,MAAM;YAAE,OAAO,IAAI,CAAA;IACrD,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC"}
|
|
@@ -2,8 +2,6 @@ import type { Manifold } from '../../core/pipework.js';
|
|
|
2
2
|
import type { ResolvedDatabase } from '../../core/config/index.js';
|
|
3
3
|
import { type MigrationCheckResult } from './check.js';
|
|
4
4
|
export interface MigrateOptions {
|
|
5
|
-
allowDestructive?: boolean;
|
|
6
|
-
acknowledgeLock?: boolean;
|
|
7
5
|
}
|
|
8
6
|
export interface MigrateResult {
|
|
9
7
|
database: string;
|
|
@@ -17,5 +15,5 @@ export declare class UnsafeMigrationError extends Error {
|
|
|
17
15
|
constructor(check: MigrationCheckResult, message: string);
|
|
18
16
|
}
|
|
19
17
|
export declare function migrateAll(instance: Manifold, options?: MigrateOptions): Promise<MigrateResult[]>;
|
|
20
|
-
export declare function migrateOne(instance: Manifold, dbConfig: ResolvedDatabase,
|
|
18
|
+
export declare function migrateOne(instance: Manifold, dbConfig: ResolvedDatabase, _options?: MigrateOptions): Promise<MigrateResult>;
|
|
21
19
|
//# sourceMappingURL=run.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../../src/data/migrate/run.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAA;AACtD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAA;AAElE,OAAO,EAAmB,KAAK,oBAAoB,EAAE,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../../src/data/migrate/run.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAA;AACtD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAA;AAElE,OAAO,EAAmB,KAAK,oBAAoB,EAAE,MAAM,YAAY,CAAA;AAQvE,MAAM,WAAW,cAAc;CAAG;AAElC,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAA;IAChB,aAAa,EAAE,MAAM,CAAA;IACrB,UAAU,EAAE,MAAM,EAAE,CAAA;IACpB,WAAW,EAAE,oBAAoB,CAAA;CAClC;AAED,qBAAa,oBAAqB,SAAQ,KAAK;aAG3B,KAAK,EAAE,oBAAoB;IAF7C,SAAkB,IAAI,0BAAyB;gBAE7B,KAAK,EAAE,oBAAoB,EAC3C,OAAO,EAAE,MAAM;CAIlB;AAED,wBAAsB,UAAU,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAU3G;AAED,wBAAsB,UAAU,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,gBAAgB,EAAE,QAAQ,GAAE,cAAmB,GAAG,OAAO,CAAC,aAAa,CAAC,CA4CtI"}
|
package/dist/data/migrate/run.js
CHANGED
|
@@ -21,7 +21,7 @@ export async function migrateAll(instance, options = {}) {
|
|
|
21
21
|
}
|
|
22
22
|
return results;
|
|
23
23
|
}
|
|
24
|
-
export async function migrateOne(instance, dbConfig,
|
|
24
|
+
export async function migrateOne(instance, dbConfig, _options = {}) {
|
|
25
25
|
const conn = instance.pool.getOrCreate(dbConfig);
|
|
26
26
|
// Scope the safety gate to pending migrations only — hazards in already-applied
|
|
27
27
|
// migrations are history, not a decision the operator still gets to make.
|
|
@@ -29,14 +29,14 @@ export async function migrateOne(instance, dbConfig, options = {}) {
|
|
|
29
29
|
// history can never run a clean no-op `migrate`.
|
|
30
30
|
const safetyCheck = dbConfig.migrations !== undefined
|
|
31
31
|
? checkMigrations(dbConfig.migrations, await readAppliedState(conn.drizzle, dbConfig.migrationTable))
|
|
32
|
-
: { safe: true, hasDestructive: false, hasLocking: false, fileHazards: [] };
|
|
33
|
-
if (safetyCheck.
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
throw new UnsafeMigrationError(safetyCheck, `Migration for "${dbConfig.name}"
|
|
39
|
-
`
|
|
32
|
+
: { safe: true, hasDestructive: false, hasLocking: false, hasDynamic: false, declared: true, fileHazards: [] };
|
|
33
|
+
if (!safetyCheck.declared) {
|
|
34
|
+
const files = safetyCheck.fileHazards.filter(f => f.undeclared.length > 0);
|
|
35
|
+
const detail = files
|
|
36
|
+
.map(f => `${f.file} (${f.undeclared.join(', ')})`)
|
|
37
|
+
.join(', ');
|
|
38
|
+
throw new UnsafeMigrationError(safetyCheck, `Migration for "${dbConfig.name}" raises hazards that its own file does not declare: ${detail}. ` +
|
|
39
|
+
`Add the matching \`-- pipework:expect-*\` pragma to each migration and commit it.`);
|
|
40
40
|
}
|
|
41
41
|
let extensionsCreated = [];
|
|
42
42
|
if (dbConfig.extensions.length > 0) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../../src/data/migrate/run.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAA;AAGvC,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AACtD,OAAO,EAAE,eAAe,EAA6B,MAAM,YAAY,CAAA;AACvE,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../../src/data/migrate/run.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"safety.d.ts","sourceRoot":"","sources":["../../../src/data/migrate/safety.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,QAAQ,GAAG,aAAa,GAAG,SAAS,GAAG,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"safety.d.ts","sourceRoot":"","sources":["../../../src/data/migrate/safety.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,QAAQ,GAAG,aAAa,GAAG,SAAS,GAAG,SAAS,GAAG,MAAM,CAAA;AAErE,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,QAAQ,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,MAAM,CAAA;CACnB;AAuGD,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe,EAAE,CAwBzD;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,eAAe,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAoB9E"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { scanStatements } from './statements.js';
|
|
1
|
+
import { scanStatements, blankLiterals } from './statements.js';
|
|
2
2
|
const RULES = [
|
|
3
3
|
// ── Destructive (data loss / backward-incompatible) ───────────────────
|
|
4
4
|
{
|
|
@@ -74,15 +74,31 @@ const RULES = [
|
|
|
74
74
|
suggestion: 'Add the column nullable, backfill, then SET NOT NULL — or give it a DEFAULT so existing rows can be filled.',
|
|
75
75
|
except: /\bDEFAULT\b/i,
|
|
76
76
|
},
|
|
77
|
+
// ── Dynamic (SQL assembled at runtime — unanalyzable) ────────────────
|
|
78
|
+
{
|
|
79
|
+
// The gate reads text; `EXECUTE` runs text that does not exist yet. Rather
|
|
80
|
+
// than pretend to see through it, name it. This is also what lets string
|
|
81
|
+
// literals be treated as the inert data they almost always are: a literal
|
|
82
|
+
// is dangerous exactly when something EXECUTEs it, and that is structural
|
|
83
|
+
// rather than a guess about its contents (#334).
|
|
84
|
+
pattern: /\bEXECUTE\b/i,
|
|
85
|
+
severity: 'dynamic',
|
|
86
|
+
operation: 'dynamic SQL (EXECUTE)',
|
|
87
|
+
suggestion: 'The gate cannot analyze SQL built at runtime. Prefer static DDL; if runtime assembly is required, declare it in the migration.',
|
|
88
|
+
},
|
|
77
89
|
];
|
|
78
90
|
export function analyzeSQL(sql) {
|
|
79
91
|
const statements = scanStatements(sql);
|
|
80
92
|
const hazards = [];
|
|
81
93
|
for (const stmt of statements) {
|
|
94
|
+
// Rules match against the statement with string-literal contents blanked:
|
|
95
|
+
// literals are data, and DDL keywords sitting in seed data execute
|
|
96
|
+
// nothing. Dollar-quoted bodies stay intact — those are code.
|
|
97
|
+
const subject = blankLiterals(stmt);
|
|
82
98
|
for (const rule of RULES) {
|
|
83
|
-
if (!rule.pattern.test(
|
|
99
|
+
if (!rule.pattern.test(subject))
|
|
84
100
|
continue;
|
|
85
|
-
if (rule.except !== undefined && rule.except.test(
|
|
101
|
+
if (rule.except !== undefined && rule.except.test(subject))
|
|
86
102
|
continue;
|
|
87
103
|
hazards.push({
|
|
88
104
|
severity: rule.severity,
|
|
@@ -95,19 +111,19 @@ export function analyzeSQL(sql) {
|
|
|
95
111
|
return hazards;
|
|
96
112
|
}
|
|
97
113
|
export function formatHazards(hazards, file) {
|
|
98
|
-
const destructive = hazards.filter(h => h.severity === 'destructive');
|
|
99
|
-
const locking = hazards.filter(h => h.severity === 'locking');
|
|
100
114
|
const lines = [];
|
|
101
115
|
lines.push(` ${file}:`);
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
}
|
|
107
|
-
for (const
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
116
|
+
const label = {
|
|
117
|
+
destructive: '✗ DESTRUCTIVE',
|
|
118
|
+
locking: '⚠ LOCKING',
|
|
119
|
+
dynamic: '? DYNAMIC',
|
|
120
|
+
};
|
|
121
|
+
for (const severity of ['destructive', 'locking', 'dynamic']) {
|
|
122
|
+
for (const h of hazards.filter(x => x.severity === severity)) {
|
|
123
|
+
lines.push(` ${label[severity]}: ${h.operation}`);
|
|
124
|
+
lines.push(` ${truncate(h.statement, 120)}`);
|
|
125
|
+
lines.push(` → ${h.suggestion}`);
|
|
126
|
+
}
|
|
111
127
|
}
|
|
112
128
|
return lines.join('\n');
|
|
113
129
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"safety.js","sourceRoot":"","sources":["../../../src/data/migrate/safety.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;
|
|
1
|
+
{"version":3,"file":"safety.js","sourceRoot":"","sources":["../../../src/data/migrate/safety.ts"],"names":[],"mappings":"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"}
|
|
@@ -41,6 +41,21 @@ export declare function scanStatements(sql: string, options?: ScanOptions): stri
|
|
|
41
41
|
* real one.
|
|
42
42
|
*/
|
|
43
43
|
export declare function stripComments(sql: string): string;
|
|
44
|
+
/**
|
|
45
|
+
* Replaces the *contents* of `'…'` string literals with spaces, keeping the
|
|
46
|
+
* quotes and the overall length.
|
|
47
|
+
*
|
|
48
|
+
* A string literal in a migration is data — `INSERT INTO notes VALUES
|
|
49
|
+
* ('a; DROP TABLE x')` drops nothing. Matching hazard rules against literal
|
|
50
|
+
* text raises a hazard for inert seed data, and no amount of pattern-tuning
|
|
51
|
+
* fixes that, because "is this text dangerous" is not answerable from the
|
|
52
|
+
* text. What makes a literal dangerous is `EXECUTE` running it, which is a
|
|
53
|
+
* structural fact and gets its own rule.
|
|
54
|
+
*
|
|
55
|
+
* Dollar-quoted bodies are deliberately NOT blanked: `DO $$ BEGIN DROP TABLE
|
|
56
|
+
* x; END $$` is code, and it executes during the migration.
|
|
57
|
+
*/
|
|
58
|
+
export declare function blankLiterals(sql: string): string;
|
|
44
59
|
/**
|
|
45
60
|
* Index of the first character of actual SQL in `sql` — i.e. past any leading
|
|
46
61
|
* whitespace and comments. Lets a text rewriter skip a leading comment block
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"statements.d.ts","sourceRoot":"","sources":["../../../src/data/migrate/statements.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAMH,MAAM,WAAW,WAAW;IAC1B;;;;OAIG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAA;CAC9B;AAED,sDAAsD;AACtD,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,WAAgB,GAAG,MAAM,EAAE,CAqE/E;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAmCjD;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAoBnD"}
|
|
1
|
+
{"version":3,"file":"statements.d.ts","sourceRoot":"","sources":["../../../src/data/migrate/statements.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAMH,MAAM,WAAW,WAAW;IAC1B;;;;OAIG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAA;CAC9B;AAED,sDAAsD;AACtD,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,WAAgB,GAAG,MAAM,EAAE,CAqE/E;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAmCjD;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAmDjD;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAoBnD"}
|
|
@@ -130,6 +130,71 @@ export function stripComments(sql) {
|
|
|
130
130
|
}
|
|
131
131
|
return out;
|
|
132
132
|
}
|
|
133
|
+
/**
|
|
134
|
+
* Replaces the *contents* of `'…'` string literals with spaces, keeping the
|
|
135
|
+
* quotes and the overall length.
|
|
136
|
+
*
|
|
137
|
+
* A string literal in a migration is data — `INSERT INTO notes VALUES
|
|
138
|
+
* ('a; DROP TABLE x')` drops nothing. Matching hazard rules against literal
|
|
139
|
+
* text raises a hazard for inert seed data, and no amount of pattern-tuning
|
|
140
|
+
* fixes that, because "is this text dangerous" is not answerable from the
|
|
141
|
+
* text. What makes a literal dangerous is `EXECUTE` running it, which is a
|
|
142
|
+
* structural fact and gets its own rule.
|
|
143
|
+
*
|
|
144
|
+
* Dollar-quoted bodies are deliberately NOT blanked: `DO $$ BEGIN DROP TABLE
|
|
145
|
+
* x; END $$` is code, and it executes during the migration.
|
|
146
|
+
*/
|
|
147
|
+
export function blankLiterals(sql) {
|
|
148
|
+
let out = '';
|
|
149
|
+
let i = 0;
|
|
150
|
+
while (i < sql.length) {
|
|
151
|
+
const c = sql[i];
|
|
152
|
+
const next = sql[i + 1];
|
|
153
|
+
if (c === '-' && next === '-') {
|
|
154
|
+
const nl = sql.indexOf('\n', i);
|
|
155
|
+
const end = nl === -1 ? sql.length : nl;
|
|
156
|
+
out += sql.slice(i, end);
|
|
157
|
+
i = end;
|
|
158
|
+
continue;
|
|
159
|
+
}
|
|
160
|
+
if (c === '/' && next === '*') {
|
|
161
|
+
const end = skipBlockComment(sql, i);
|
|
162
|
+
out += sql.slice(i, end);
|
|
163
|
+
i = end;
|
|
164
|
+
continue;
|
|
165
|
+
}
|
|
166
|
+
const tag = dollarTagAt(sql, i);
|
|
167
|
+
if (tag !== null) {
|
|
168
|
+
// A dollar-quoted body is code, so it is kept — but the literals inside
|
|
169
|
+
// that code are still data, so recurse rather than copying it whole.
|
|
170
|
+
// `DO $$ BEGIN DROP TABLE x; END $$` must keep its DROP TABLE, while
|
|
171
|
+
// `DO $$ BEGIN EXECUTE 'DROP TABLE x'; END $$` must lose it and be
|
|
172
|
+
// caught by the EXECUTE rule instead.
|
|
173
|
+
const close = sql.indexOf(tag, i + tag.length);
|
|
174
|
+
const end = close === -1 ? sql.length : close + tag.length;
|
|
175
|
+
const inner = sql.slice(i + tag.length, close === -1 ? sql.length : close);
|
|
176
|
+
out += tag + blankLiterals(inner) + (close === -1 ? '' : tag);
|
|
177
|
+
i = end;
|
|
178
|
+
continue;
|
|
179
|
+
}
|
|
180
|
+
if (c === "'") {
|
|
181
|
+
const end = consumeQuoted(sql, i, "'", isEscapeString(sql, i));
|
|
182
|
+
const body = sql.slice(i + 1, Math.max(i + 1, end - 1));
|
|
183
|
+
out += "'" + body.replace(/[^\n]/g, ' ') + (end - i >= 2 ? "'" : '');
|
|
184
|
+
i = end;
|
|
185
|
+
continue;
|
|
186
|
+
}
|
|
187
|
+
if (c === '"') {
|
|
188
|
+
const end = consumeQuoted(sql, i, '"', false);
|
|
189
|
+
out += sql.slice(i, end);
|
|
190
|
+
i = end;
|
|
191
|
+
continue;
|
|
192
|
+
}
|
|
193
|
+
out += c;
|
|
194
|
+
i++;
|
|
195
|
+
}
|
|
196
|
+
return out;
|
|
197
|
+
}
|
|
133
198
|
/**
|
|
134
199
|
* Index of the first character of actual SQL in `sql` — i.e. past any leading
|
|
135
200
|
* whitespace and comments. Lets a text rewriter skip a leading comment block
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"statements.js","sourceRoot":"","sources":["../../../src/data/migrate/statements.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"statements.js","sourceRoot":"","sources":["../../../src/data/migrate/statements.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,MAAM,UAAU,GAAG,cAAc,CAAA;AAEjC,MAAM,oBAAoB,GAAG,0BAA0B,CAAA;AAWvD,sDAAsD;AACtD,MAAM,UAAU,cAAc,CAAC,GAAW,EAAE,UAAuB,EAAE;IACnE,MAAM,UAAU,GAAa,EAAE,CAAA;IAC/B,IAAI,GAAG,GAAG,EAAE,CAAA;IAEZ,MAAM,KAAK,GAAG,GAAS,EAAE;QACvB,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,EAAE,CAAA;QACvB,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;YAAE,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC1C,GAAG,GAAG,EAAE,CAAA;IACV,CAAC,CAAA;IAED,IAAI,CAAC,GAAG,CAAC,CAAA;IACT,OAAO,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC;QACtB,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,CAAE,CAAA;QACjB,MAAM,IAAI,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;QAEvB,2EAA2E;QAC3E,IAAI,CAAC,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YAC9B,MAAM,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAA;YAC/B,MAAM,GAAG,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAA;YACvC,IAAI,OAAO,CAAC,mBAAmB,KAAK,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,oBAAoB;gBAAE,KAAK,EAAE,CAAA;YACtG,CAAC,GAAG,GAAG,CAAA;YACP,SAAQ;QACV,CAAC;QAED,wDAAwD;QACxD,IAAI,CAAC,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YAC9B,CAAC,GAAG,gBAAgB,CAAC,GAAG,EAAE,CAAC,CAAC,CAAA;YAC5B,GAAG,IAAI,GAAG,CAAA;YACV,SAAQ;QACV,CAAC;QAED,iFAAiF;QACjF,MAAM,GAAG,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,CAAC,CAAA;QAC/B,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YACjB,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,CAAA;YAC9C,MAAM,GAAG,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,GAAG,CAAC,MAAM,CAAA;YAC1D,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;YACxB,CAAC,GAAG,GAAG,CAAA;YACP,SAAQ;QACV,CAAC;QAED,4DAA4D;QAC5D,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;YACd,MAAM,GAAG,GAAG,aAAa,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,cAAc,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAA;YAC9D,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;YACxB,CAAC,GAAG,GAAG,CAAA;YACP,SAAQ;QACV,CAAC;QAED,qBAAqB;QACrB,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;YACd,MAAM,GAAG,GAAG,aAAa,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,CAAA;YAC7C,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;YACxB,CAAC,GAAG,GAAG,CAAA;YACP,SAAQ;QACV,CAAC;QAED,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;YACd,KAAK,EAAE,CAAA;YACP,CAAC,EAAE,CAAA;YACH,SAAQ;QACV,CAAC;QAED,GAAG,IAAI,CAAC,CAAA;QACR,CAAC,EAAE,CAAA;IACL,CAAC;IAED,KAAK,EAAE,CAAA;IACP,OAAO,UAAU,CAAA;AACnB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,GAAW;IACvC,IAAI,GAAG,GAAG,EAAE,CAAA;IACZ,IAAI,CAAC,GAAG,CAAC,CAAA;IACT,OAAO,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC;QACtB,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,CAAE,CAAA;QACjB,MAAM,IAAI,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;QAEvB,IAAI,CAAC,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YAC9B,MAAM,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAA;YAC/B,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAA;YAC/B,SAAQ;QACV,CAAC;QACD,IAAI,CAAC,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YAC9B,CAAC,GAAG,gBAAgB,CAAC,GAAG,EAAE,CAAC,CAAC,CAAA;YAC5B,GAAG,IAAI,GAAG,CAAA;YACV,SAAQ;QACV,CAAC;QACD,MAAM,GAAG,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,CAAC,CAAA;QAC/B,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YACjB,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,CAAA;YAC9C,MAAM,GAAG,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,GAAG,CAAC,MAAM,CAAA;YAC1D,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;YACxB,CAAC,GAAG,GAAG,CAAA;YACP,SAAQ;QACV,CAAC;QACD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;YAC3B,MAAM,GAAG,GAAG,aAAa,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,GAAG,IAAI,cAAc,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAA;YACzE,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;YACxB,CAAC,GAAG,GAAG,CAAA;YACP,SAAQ;QACV,CAAC;QACD,GAAG,IAAI,CAAC,CAAA;QACR,CAAC,EAAE,CAAA;IACL,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,aAAa,CAAC,GAAW;IACvC,IAAI,GAAG,GAAG,EAAE,CAAA;IACZ,IAAI,CAAC,GAAG,CAAC,CAAA;IACT,OAAO,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC;QACtB,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,CAAE,CAAA;QACjB,MAAM,IAAI,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;QAEvB,IAAI,CAAC,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YAC9B,MAAM,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAA;YAC/B,MAAM,GAAG,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAA;YACvC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;YACxB,CAAC,GAAG,GAAG,CAAA;YACP,SAAQ;QACV,CAAC;QACD,IAAI,CAAC,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YAC9B,MAAM,GAAG,GAAG,gBAAgB,CAAC,GAAG,EAAE,CAAC,CAAC,CAAA;YACpC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;YACxB,CAAC,GAAG,GAAG,CAAA;YACP,SAAQ;QACV,CAAC;QACD,MAAM,GAAG,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,CAAC,CAAA;QAC/B,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YACjB,wEAAwE;YACxE,qEAAqE;YACrE,qEAAqE;YACrE,mEAAmE;YACnE,sCAAsC;YACtC,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,CAAA;YAC9C,MAAM,GAAG,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,GAAG,CAAC,MAAM,CAAA;YAC1D,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAA;YAC1E,GAAG,IAAI,GAAG,GAAG,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;YAC7D,CAAC,GAAG,GAAG,CAAA;YACP,SAAQ;QACV,CAAC;QACD,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;YACd,MAAM,GAAG,GAAG,aAAa,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,cAAc,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAA;YAC9D,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAA;YACvD,GAAG,IAAI,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;YACpE,CAAC,GAAG,GAAG,CAAA;YACP,SAAQ;QACV,CAAC;QACD,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;YACd,MAAM,GAAG,GAAG,aAAa,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,CAAA;YAC7C,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;YACxB,CAAC,GAAG,GAAG,CAAA;YACP,SAAQ;QACV,CAAC;QACD,GAAG,IAAI,CAAC,CAAA;QACR,CAAC,EAAE,CAAA;IACL,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,GAAW;IACzC,IAAI,CAAC,GAAG,CAAC,CAAA;IACT,OAAO,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC;QACtB,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,CAAE,CAAA;QACjB,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;YACjB,CAAC,EAAE,CAAA;YACH,SAAQ;QACV,CAAC;QACD,IAAI,CAAC,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;YACpC,MAAM,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAA;YAC/B,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAA;YAC/B,SAAQ;QACV,CAAC;QACD,IAAI,CAAC,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;YACpC,CAAC,GAAG,gBAAgB,CAAC,GAAG,EAAE,CAAC,CAAC,CAAA;YAC5B,SAAQ;QACV,CAAC;QACD,OAAO,CAAC,CAAA;IACV,CAAC;IACD,OAAO,GAAG,CAAC,MAAM,CAAA;AACnB,CAAC;AAED,wFAAwF;AACxF,SAAS,gBAAgB,CAAC,GAAW,EAAE,KAAa;IAClD,IAAI,KAAK,GAAG,CAAC,CAAA;IACb,IAAI,CAAC,GAAG,KAAK,CAAA;IACb,OAAO,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC;QACtB,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;YACzC,KAAK,EAAE,CAAA;YACP,CAAC,IAAI,CAAC,CAAA;YACN,SAAQ;QACV,CAAC;QACD,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;YACzC,KAAK,EAAE,CAAA;YACP,CAAC,IAAI,CAAC,CAAA;YACN,IAAI,KAAK,KAAK,CAAC;gBAAE,OAAO,CAAC,CAAA;YACzB,SAAQ;QACV,CAAC;QACD,CAAC,EAAE,CAAA;IACL,CAAC;IACD,OAAO,GAAG,CAAC,MAAM,CAAA;AACnB,CAAC;AAED;;;;GAIG;AACH,SAAS,WAAW,CAAC,GAAW,EAAE,CAAS;IACzC,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG;QAAE,OAAO,IAAI,CAAA;IAC/B,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IACb,OAAO,CAAC,GAAG,GAAG,CAAC,MAAM,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAE,CAAC;QAAE,CAAC,EAAE,CAAA;IACtD,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG;QAAE,OAAO,IAAI,CAAA;IAC/B,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;QAAE,OAAO,IAAI,CAAA;IAC/C,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAA;AAC5B,CAAC;AAED,+DAA+D;AAC/D,SAAS,cAAc,CAAC,GAAW,EAAE,CAAS;IAC5C,MAAM,IAAI,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;IACvB,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG;QAAE,OAAO,KAAK,CAAA;IAC9C,MAAM,MAAM,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;IACzB,OAAO,MAAM,KAAK,SAAS,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;AACzD,CAAC;AAED,sFAAsF;AACtF,SAAS,aAAa,CAAC,GAAW,EAAE,KAAa,EAAE,KAAa,EAAE,gBAAyB;IACzF,IAAI,CAAC,GAAG,KAAK,GAAG,CAAC,CAAA;IACjB,OAAO,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC;QACtB,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,CAAE,CAAA;QACjB,IAAI,gBAAgB,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;YACnC,CAAC,IAAI,CAAC,CAAA;YACN,SAAQ;QACV,CAAC;QACD,IAAI,CAAC,KAAK,KAAK,EAAE,CAAC;YAChB,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,EAAE,CAAC;gBACzB,CAAC,IAAI,CAAC,CAAA;gBACN,SAAQ;YACV,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,CAAA;QACd,CAAC;QACD,CAAC,EAAE,CAAA;IACL,CAAC;IACD,OAAO,GAAG,CAAC,MAAM,CAAA;AACnB,CAAC"}
|