@intentius/sql-yodeler 0.3.0 → 0.4.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/README.md +1 -1
- package/dist/apply-steps/index.d.ts +65 -0
- package/dist/apply-steps/index.js +106 -0
- package/dist/apply-steps/index.js.map +1 -0
- package/dist/approval-mode/index.d.ts +78 -0
- package/dist/approval-mode/index.js +105 -0
- package/dist/approval-mode/index.js.map +1 -0
- package/dist/chant/access.d.ts +87 -0
- package/dist/chant/access.js +169 -0
- package/dist/chant/access.js.map +1 -0
- package/dist/chant/drift.d.ts +17 -1
- package/dist/chant/drift.js +55 -2
- package/dist/chant/drift.js.map +1 -1
- package/dist/chant/plan.d.ts +18 -2
- package/dist/chant/plan.js +21 -3
- package/dist/chant/plan.js.map +1 -1
- package/dist/ci/render.d.ts +54 -10
- package/dist/ci/render.js +249 -52
- package/dist/ci/render.js.map +1 -1
- package/dist/cleanup/index.d.ts +86 -0
- package/dist/cleanup/index.js +207 -0
- package/dist/cleanup/index.js.map +1 -0
- package/dist/commands/apply.js +153 -20
- package/dist/commands/apply.js.map +1 -1
- package/dist/commands/approve.d.ts +13 -0
- package/dist/commands/approve.js +206 -24
- package/dist/commands/approve.js.map +1 -1
- package/dist/commands/ci.js +12 -0
- package/dist/commands/ci.js.map +1 -1
- package/dist/commands/cleanup.d.ts +13 -0
- package/dist/commands/cleanup.js +138 -0
- package/dist/commands/cleanup.js.map +1 -0
- package/dist/commands/config.d.ts +3 -0
- package/dist/commands/config.js +136 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/drift.js +34 -3
- package/dist/commands/drift.js.map +1 -1
- package/dist/commands/index.js +6 -0
- package/dist/commands/index.js.map +1 -1
- package/dist/commands/lint.js +30 -6
- package/dist/commands/lint.js.map +1 -1
- package/dist/commands/new.js +133 -34
- package/dist/commands/new.js.map +1 -1
- package/dist/commands/plan.js +42 -5
- package/dist/commands/plan.js.map +1 -1
- package/dist/commands/test.d.ts +3 -0
- package/dist/commands/test.js +164 -0
- package/dist/commands/test.js.map +1 -0
- package/dist/config/define.d.ts +117 -2
- package/dist/config/define.js +2 -0
- package/dist/config/define.js.map +1 -1
- package/dist/config/load.js +74 -10
- package/dist/config/load.js.map +1 -1
- package/dist/config/settings.d.ts +18 -0
- package/dist/config/settings.js +26 -0
- package/dist/config/settings.js.map +1 -1
- package/dist/credentials.d.ts +119 -0
- package/dist/credentials.js +119 -0
- package/dist/credentials.js.map +1 -0
- package/dist/exit.js +1 -1
- package/dist/exit.js.map +1 -1
- package/dist/index.d.ts +5 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/init/adopt.js +1 -1
- package/dist/init/adopt.js.map +1 -1
- package/dist/init/clickhouse-access.d.ts +64 -0
- package/dist/init/clickhouse-access.js +211 -0
- package/dist/init/clickhouse-access.js.map +1 -0
- package/dist/init/live.d.ts +4 -0
- package/dist/init/live.js +16 -0
- package/dist/init/live.js.map +1 -1
- package/dist/lint/access.d.ts +18 -0
- package/dist/lint/access.js +34 -0
- package/dist/lint/access.js.map +1 -0
- package/dist/lint/check.js +23 -6
- package/dist/lint/check.js.map +1 -1
- package/dist/lint/config.d.ts +7 -1
- package/dist/lint/config.js +11 -5
- package/dist/lint/config.js.map +1 -1
- package/dist/lint/index.d.ts +2 -0
- package/dist/lint/index.js +2 -0
- package/dist/lint/index.js.map +1 -1
- package/dist/lint/naming.d.ts +62 -0
- package/dist/lint/naming.js +138 -0
- package/dist/lint/naming.js.map +1 -0
- package/dist/lint/rules.d.ts +37 -4
- package/dist/lint/rules.js +16 -4
- package/dist/lint/rules.js.map +1 -1
- package/dist/lint/schema-checks.d.ts +63 -0
- package/dist/lint/schema-checks.js +128 -0
- package/dist/lint/schema-checks.js.map +1 -0
- package/dist/lint/statements.d.ts +22 -1
- package/dist/lint/statements.js +40 -1
- package/dist/lint/statements.js.map +1 -1
- package/dist/mcp/tools.d.ts +1 -1
- package/dist/mcp/tools.js +1 -1
- package/dist/mcp/tools.js.map +1 -1
- package/dist/migrations/checkpoint.js +0 -2
- package/dist/migrations/checkpoint.js.map +1 -1
- package/dist/migrations/checks.d.ts +19 -1
- package/dist/migrations/checks.js +15 -0
- package/dist/migrations/checks.js.map +1 -1
- package/dist/migrations/create.d.ts +13 -4
- package/dist/migrations/create.js +24 -9
- package/dist/migrations/create.js.map +1 -1
- package/dist/migrations/routines.d.ts +5 -15
- package/dist/migrations/routines.js +5 -30
- package/dist/migrations/routines.js.map +1 -1
- package/dist/pr/model.d.ts +4 -1
- package/dist/pr/model.js +13 -5
- package/dist/pr/model.js.map +1 -1
- package/dist/pr/render.d.ts +4 -1
- package/dist/pr/render.js +22 -8
- package/dist/pr/render.js.map +1 -1
- package/dist/pr/tenants.d.ts +37 -0
- package/dist/pr/tenants.js +138 -0
- package/dist/pr/tenants.js.map +1 -0
- package/dist/probe.d.ts +27 -0
- package/dist/probe.js +106 -0
- package/dist/probe.js.map +1 -0
- package/dist/project.d.ts +16 -0
- package/dist/project.js +29 -1
- package/dist/project.js.map +1 -1
- package/dist/replay/clickhouse.d.ts +31 -0
- package/dist/replay/clickhouse.js +103 -6
- package/dist/replay/clickhouse.js.map +1 -1
- package/dist/replay/replay.d.ts +5 -2
- package/dist/replay/replay.js.map +1 -1
- package/dist/report/audit.d.ts +1 -1
- package/dist/report/audit.js +20 -3
- package/dist/report/audit.js.map +1 -1
- package/dist/schemas.d.ts +3 -1
- package/dist/schemas.js +2 -0
- package/dist/schemas.js.map +1 -1
- package/dist/sources/ddl.d.ts +15 -20
- package/dist/sources/ddl.js +34 -328
- package/dist/sources/ddl.js.map +1 -1
- package/dist/sources/index.js +2 -2
- package/dist/sources/index.js.map +1 -1
- package/dist/steps/backfill.d.ts +40 -5
- package/dist/steps/backfill.js +128 -8
- package/dist/steps/backfill.js.map +1 -1
- package/dist/steps/index.d.ts +19 -1
- package/dist/steps/index.js +34 -7
- package/dist/steps/index.js.map +1 -1
- package/dist/steps/kinds.d.ts +42 -4
- package/dist/steps/kinds.js +88 -14
- package/dist/steps/kinds.js.map +1 -1
- package/dist/steps/postgres-migration.d.ts +3 -0
- package/dist/steps/postgres-migration.js +7 -3
- package/dist/steps/postgres-migration.js.map +1 -1
- package/dist/steps/rebuild.d.ts +15 -6
- package/dist/steps/rebuild.js +12 -9
- package/dist/steps/rebuild.js.map +1 -1
- package/dist/tenants/index.d.ts +2 -1
- package/dist/tenants/index.js +3 -4
- package/dist/tenants/index.js.map +1 -1
- package/dist/tenants/wave.d.ts +128 -0
- package/dist/tenants/wave.js +254 -0
- package/dist/tenants/wave.js.map +1 -0
- package/dist/testing/define.d.ts +62 -0
- package/dist/testing/define.js +32 -0
- package/dist/testing/define.js.map +1 -0
- package/dist/testing/files.d.ts +5 -0
- package/dist/testing/files.js +18 -0
- package/dist/testing/files.js.map +1 -0
- package/dist/testing/report.d.ts +14 -0
- package/dist/testing/report.js +83 -0
- package/dist/testing/report.js.map +1 -0
- package/dist/testing/run.d.ts +104 -0
- package/dist/testing/run.js +328 -0
- package/dist/testing/run.js.map +1 -0
- package/dist/versioned/approval.d.ts +6 -0
- package/dist/versioned/approval.js +11 -5
- package/dist/versioned/approval.js.map +1 -1
- package/dist/versioned/checks.d.ts +8 -2
- package/dist/versioned/checks.js +34 -13
- package/dist/versioned/checks.js.map +1 -1
- package/dist/versioned/driver.d.ts +2 -2
- package/dist/versioned/engine.d.ts +10 -0
- package/dist/versioned/engine.js +8 -4
- package/dist/versioned/engine.js.map +1 -1
- package/dist/versioned/explain.d.ts +2 -0
- package/dist/versioned/explain.js +3 -1
- package/dist/versioned/explain.js.map +1 -1
- package/dist/versioned/state.js +1 -1
- package/dist/versioned/state.js.map +1 -1
- package/dist/waves/index.d.ts +58 -13
- package/dist/waves/index.js +109 -24
- package/dist/waves/index.js.map +1 -1
- package/dist/waves/record.d.ts +10 -0
- package/dist/waves/record.js.map +1 -1
- package/package.json +7 -7
- package/schemas/apply.schema.json +1 -1
- package/schemas/cleanup.schema.json +40 -0
- package/schemas/lint-rules.schema.json +4 -0
- package/schemas/new.schema.json +41 -3
- package/schemas/plan.schema.json +39 -0
- package/schemas/report.schema.json +1 -1
- package/schemas/test.schema.json +41 -0
package/dist/lint/rules.d.ts
CHANGED
|
@@ -9,12 +9,18 @@
|
|
|
9
9
|
* config lowers them and nothing silences them, because a migration that
|
|
10
10
|
* breaks one cannot be applied safely or cannot be checked at all.
|
|
11
11
|
* - Statement rules, from the classes chant's classifier gives each step:
|
|
12
|
-
* `destructive`, `pg-rewrite`, `pg-lock`, `pg-signature`, `
|
|
13
|
-
* `ch-rebuild
|
|
12
|
+
* `destructive`, `pg-rewrite`, `pg-lock`, `pg-signature`, `pg-access`,
|
|
13
|
+
* `pg-rls-not-forced` (a warning), `ch-mutation`, `ch-rebuild`,
|
|
14
|
+
* `ch-access`, `data-dependent` (a warning: a statement that can fail
|
|
15
|
+
* on the rows already there, with the pre-check yodel apply runs first),
|
|
16
|
+
* and `naming` (the names a migration adds, against `lint.naming`).
|
|
14
17
|
* Errors by default; a line `-- yodel:allow <rule> <reason>` above the
|
|
15
18
|
* statement in `migration.sql` silences one for that statement, and the
|
|
16
19
|
* reason is recorded in the history when the migration applies.
|
|
17
20
|
*
|
|
21
|
+
* The lexicon's schema checks (`SQLPG101`, `SQLCH113`, ...) are rules too,
|
|
22
|
+
* in `./schema-checks.ts`: silenceable, at the level the check gives.
|
|
23
|
+
*
|
|
18
24
|
* The rest (`refused-step`, `pg-routine-in-use`, `migration-sql`,
|
|
19
25
|
* `silence`) say a migration will not apply as written or a silence is
|
|
20
26
|
* wrong. Their level can be
|
|
@@ -33,6 +39,8 @@ export interface LintRule {
|
|
|
33
39
|
configurable: boolean;
|
|
34
40
|
/** The dialect it applies to; both when absent. */
|
|
35
41
|
dialect?: "clickhouse" | "postgres";
|
|
42
|
+
/** One of the sql lexicon's schema checks (`./schema-checks.ts`). */
|
|
43
|
+
schema?: boolean;
|
|
36
44
|
}
|
|
37
45
|
export declare const LINT_RULES: {
|
|
38
46
|
readonly fork: LintRule;
|
|
@@ -52,8 +60,33 @@ export declare const LINT_RULES: {
|
|
|
52
60
|
readonly configurable: true;
|
|
53
61
|
readonly dialect: "postgres";
|
|
54
62
|
};
|
|
63
|
+
readonly "pg-access": LintRule;
|
|
64
|
+
readonly "pg-rls-not-forced": {
|
|
65
|
+
readonly id: "pg-rls-not-forced";
|
|
66
|
+
readonly summary: "Postgres: a table's row-level security is enabled but not forced, so the table's owner (often the role that applies) bypasses its policies";
|
|
67
|
+
readonly level: "warning";
|
|
68
|
+
readonly silenceable: true;
|
|
69
|
+
readonly configurable: true;
|
|
70
|
+
readonly dialect: "postgres";
|
|
71
|
+
};
|
|
72
|
+
readonly "data-dependent": {
|
|
73
|
+
readonly id: "data-dependent";
|
|
74
|
+
readonly summary: "Postgres: a statement that can fail on the rows already there (a unique index over duplicates, SET NOT NULL over NULLs, a check or foreign key some row breaks); yodel apply runs its pre-check first and refuses when it counts any";
|
|
75
|
+
readonly level: "warning";
|
|
76
|
+
readonly silenceable: true;
|
|
77
|
+
readonly configurable: true;
|
|
78
|
+
readonly dialect: "postgres";
|
|
79
|
+
};
|
|
80
|
+
readonly naming: {
|
|
81
|
+
readonly id: "naming";
|
|
82
|
+
readonly summary: "a table, column, index or constraint the migration adds breaks yodel.config.ts lint.naming";
|
|
83
|
+
readonly level: "error";
|
|
84
|
+
readonly silenceable: true;
|
|
85
|
+
readonly configurable: true;
|
|
86
|
+
};
|
|
55
87
|
readonly "ch-mutation": LintRule;
|
|
56
88
|
readonly "ch-rebuild": LintRule;
|
|
89
|
+
readonly "ch-access": LintRule;
|
|
57
90
|
readonly "refused-step": LintRule;
|
|
58
91
|
readonly "migration-sql": LintRule;
|
|
59
92
|
readonly silence: LintRule;
|
|
@@ -61,5 +94,5 @@ export declare const LINT_RULES: {
|
|
|
61
94
|
export type LintRuleId = keyof typeof LINT_RULES;
|
|
62
95
|
export declare const ruleIds: LintRuleId[];
|
|
63
96
|
export declare const isRuleId: (id: string) => id is LintRuleId;
|
|
64
|
-
/** The rules a `-- yodel:allow` line can name. */
|
|
65
|
-
export declare const silenceableRules: () =>
|
|
97
|
+
/** The rules a `-- yodel:allow` line can name: the statement rules, and the lexicon's schema checks. */
|
|
98
|
+
export declare const silenceableRules: () => string[];
|
package/dist/lint/rules.js
CHANGED
|
@@ -9,17 +9,24 @@
|
|
|
9
9
|
* config lowers them and nothing silences them, because a migration that
|
|
10
10
|
* breaks one cannot be applied safely or cannot be checked at all.
|
|
11
11
|
* - Statement rules, from the classes chant's classifier gives each step:
|
|
12
|
-
* `destructive`, `pg-rewrite`, `pg-lock`, `pg-signature`, `
|
|
13
|
-
* `ch-rebuild
|
|
12
|
+
* `destructive`, `pg-rewrite`, `pg-lock`, `pg-signature`, `pg-access`,
|
|
13
|
+
* `pg-rls-not-forced` (a warning), `ch-mutation`, `ch-rebuild`,
|
|
14
|
+
* `ch-access`, `data-dependent` (a warning: a statement that can fail
|
|
15
|
+
* on the rows already there, with the pre-check yodel apply runs first),
|
|
16
|
+
* and `naming` (the names a migration adds, against `lint.naming`).
|
|
14
17
|
* Errors by default; a line `-- yodel:allow <rule> <reason>` above the
|
|
15
18
|
* statement in `migration.sql` silences one for that statement, and the
|
|
16
19
|
* reason is recorded in the history when the migration applies.
|
|
17
20
|
*
|
|
21
|
+
* The lexicon's schema checks (`SQLPG101`, `SQLCH113`, ...) are rules too,
|
|
22
|
+
* in `./schema-checks.ts`: silenceable, at the level the check gives.
|
|
23
|
+
*
|
|
18
24
|
* The rest (`refused-step`, `pg-routine-in-use`, `migration-sql`,
|
|
19
25
|
* `silence`) say a migration will not apply as written or a silence is
|
|
20
26
|
* wrong. Their level can be
|
|
21
27
|
* changed in `yodel.config.ts`, but they cannot be silenced.
|
|
22
28
|
*/
|
|
29
|
+
import { SCHEMA_RULES } from "./schema-checks.js";
|
|
23
30
|
const integrity = (id, summary) => ({ id, summary, level: "error", silenceable: false, configurable: false });
|
|
24
31
|
const statement = (id, summary, dialect) => ({ id, summary, level: "error", silenceable: true, configurable: true, ...(dialect ? { dialect } : {}) });
|
|
25
32
|
const shape = (id, summary, level = "error") => ({ id, summary, level, silenceable: false, configurable: true });
|
|
@@ -34,14 +41,19 @@ export const LINT_RULES = {
|
|
|
34
41
|
"pg-lock": statement("pg-lock", "Postgres: holds a lock that blocks writes for a whole scan or index build (an index without CONCURRENTLY, a constraint validated in place)", "postgres"),
|
|
35
42
|
"pg-signature": statement("pg-signature", "Postgres: a function or procedure dropped and created with another signature or result; a caller written for the old one fails", "postgres"),
|
|
36
43
|
"pg-routine-in-use": { id: "pg-routine-in-use", summary: "Postgres: a function dropped while a trigger the migration's schema declares still executes it; the DROP fails", level: "error", silenceable: false, configurable: true, dialect: "postgres" },
|
|
44
|
+
"pg-access": statement("pg-access", "Postgres: takes access away: a privilege revoked, a policy dropped, or row-level security turned off or no longer forced on the table's owner", "postgres"),
|
|
45
|
+
"pg-rls-not-forced": { id: "pg-rls-not-forced", summary: "Postgres: a table's row-level security is enabled but not forced, so the table's owner (often the role that applies) bypasses its policies", level: "warning", silenceable: true, configurable: true, dialect: "postgres" },
|
|
46
|
+
"data-dependent": { id: "data-dependent", summary: "Postgres: a statement that can fail on the rows already there (a unique index over duplicates, SET NOT NULL over NULLs, a check or foreign key some row breaks); yodel apply runs its pre-check first and refuses when it counts any", level: "warning", silenceable: true, configurable: true, dialect: "postgres" },
|
|
47
|
+
naming: { id: "naming", summary: "a table, column, index or constraint the migration adds breaks yodel.config.ts lint.naming", level: "error", silenceable: true, configurable: true },
|
|
37
48
|
"ch-mutation": statement("ch-mutation", "ClickHouse: starts a mutation that rewrites existing parts in the background, with no rollback", "clickhouse"),
|
|
38
49
|
"ch-rebuild": statement("ch-rebuild", "ClickHouse: a rebuild, every row copied into a new table and swapped in (ClickHouseRebuildOp)", "clickhouse"),
|
|
50
|
+
"ch-access": statement("ch-access", "ClickHouse: takes access away: a privilege or role revoked from a user or role (SQLCH274)", "clickhouse"),
|
|
39
51
|
"refused-step": shape("refused-step", "a step yodel apply refuses to run: a manual step, or an Op step it does not run"),
|
|
40
52
|
"migration-sql": shape("migration-sql", "migration.sql does not hold a statement as migration.json records it; apply runs migration.json's"),
|
|
41
53
|
silence: shape("silence", "a yodel:allow line that is malformed, names a rule no statement can silence, has no reason, or silences nothing"),
|
|
42
54
|
};
|
|
43
55
|
export const ruleIds = Object.keys(LINT_RULES);
|
|
44
56
|
export const isRuleId = (id) => Object.hasOwn(LINT_RULES, id);
|
|
45
|
-
/** The rules a `-- yodel:allow` line can name. */
|
|
46
|
-
export const silenceableRules = () => ruleIds.filter((id) => LINT_RULES[id].silenceable);
|
|
57
|
+
/** The rules a `-- yodel:allow` line can name: the statement rules, and the lexicon's schema checks. */
|
|
58
|
+
export const silenceableRules = () => [...ruleIds.filter((id) => LINT_RULES[id].silenceable), ...Object.keys(SCHEMA_RULES)];
|
|
47
59
|
//# sourceMappingURL=rules.js.map
|
package/dist/lint/rules.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rules.js","sourceRoot":"","sources":["../../src/lint/rules.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"rules.js","sourceRoot":"","sources":["../../src/lint/rules.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The sql lexicon's schema checks (#51) inside `yodel lint`: the post-synth
|
|
3
|
+
* checks `chant lint` runs over a build (a table with no primary key, a
|
|
4
|
+
* foreign key with no index, a column type to avoid, an engine or setting
|
|
5
|
+
* the pinned server does not have), run here on each migration's recorded
|
|
6
|
+
* schema, so a project has one lint command and one configuration.
|
|
7
|
+
*
|
|
8
|
+
* A finding is reported in the migration whose recorded schema first has
|
|
9
|
+
* it: the parent's schema is checked too, and what it already had is not
|
|
10
|
+
* reported again. It is put at the migration's first step on the object it
|
|
11
|
+
* names, so a `-- yodel:allow <id> <reason>` line above that step silences
|
|
12
|
+
* it, as for a statement rule.
|
|
13
|
+
*
|
|
14
|
+
* Levels: each check's rule id (`SQLPG101`, `SQLCH113`) is a lint rule.
|
|
15
|
+
* `yodel.config.ts` `lint.rules` sets it first; else `chant.config.ts`
|
|
16
|
+
* `lint.rules`, which `chant lint` reads; else the level the check gives
|
|
17
|
+
* the finding (an `info` finding is a warning here).
|
|
18
|
+
*
|
|
19
|
+
* The checks read the objects as `chant build` serializes them (their
|
|
20
|
+
* columns, keys and engine besides the DDL); an object recorded with its
|
|
21
|
+
* DDL only is not checked.
|
|
22
|
+
*/
|
|
23
|
+
import type { BuildOutput } from "../chant/build.js";
|
|
24
|
+
import type { Migration } from "../migrations/index.js";
|
|
25
|
+
import type { LevelSetting, LintLevel, LintRule } from "./rules.js";
|
|
26
|
+
export type Dialect = "clickhouse" | "postgres";
|
|
27
|
+
/** Every schema check the lexicon ships, as a lint rule: silenceable, its level set in config. */
|
|
28
|
+
export declare const SCHEMA_RULES: Readonly<Record<string, LintRule>>;
|
|
29
|
+
export declare const isSchemaRule: (id: string) => boolean;
|
|
30
|
+
/** One schema check's finding in a recorded schema. */
|
|
31
|
+
export interface SchemaDiagnostic {
|
|
32
|
+
rule: string;
|
|
33
|
+
/** The level the check gave it. */
|
|
34
|
+
level: LintLevel;
|
|
35
|
+
message: string;
|
|
36
|
+
/** The export it names, when it names one. */
|
|
37
|
+
entity?: string;
|
|
38
|
+
}
|
|
39
|
+
/** Runs every schema check over one recorded schema. A check that throws is reported as a finding of its own. */
|
|
40
|
+
export declare function schemaDiagnostics(schema: BuildOutput): SchemaDiagnostic[];
|
|
41
|
+
/** A level from `chant.config.ts` `lint.rules`: a severity string, or `[severity, options]`. */
|
|
42
|
+
export declare function chantLevel(value: unknown): LevelSetting | undefined;
|
|
43
|
+
/** A schema finding before its silence is applied: where it is, and its level unless `yodel.config.ts` sets the rule's. */
|
|
44
|
+
export interface SchemaFinding {
|
|
45
|
+
rule: string;
|
|
46
|
+
migration: string;
|
|
47
|
+
message: string;
|
|
48
|
+
step?: number;
|
|
49
|
+
object?: string;
|
|
50
|
+
/** Undefined when `yodel.config.ts` sets the rule's level, which then applies. */
|
|
51
|
+
level?: LintLevel;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* The schema findings of every migration: each check's findings on its
|
|
55
|
+
* recorded schema that its parent's recorded schema does not have.
|
|
56
|
+
* `configured` are the rule ids `yodel.config.ts` sets; `chantRules` is
|
|
57
|
+
* `chant.config.ts`'s `lint.rules`.
|
|
58
|
+
*/
|
|
59
|
+
export declare function schemaFindings(migrations: readonly Migration[], options: {
|
|
60
|
+
dialect?: Dialect | undefined;
|
|
61
|
+
configured: ReadonlySet<string>;
|
|
62
|
+
chantRules?: Record<string, unknown> | undefined;
|
|
63
|
+
}): SchemaFinding[];
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The sql lexicon's schema checks (#51) inside `yodel lint`: the post-synth
|
|
3
|
+
* checks `chant lint` runs over a build (a table with no primary key, a
|
|
4
|
+
* foreign key with no index, a column type to avoid, an engine or setting
|
|
5
|
+
* the pinned server does not have), run here on each migration's recorded
|
|
6
|
+
* schema, so a project has one lint command and one configuration.
|
|
7
|
+
*
|
|
8
|
+
* A finding is reported in the migration whose recorded schema first has
|
|
9
|
+
* it: the parent's schema is checked too, and what it already had is not
|
|
10
|
+
* reported again. It is put at the migration's first step on the object it
|
|
11
|
+
* names, so a `-- yodel:allow <id> <reason>` line above that step silences
|
|
12
|
+
* it, as for a statement rule.
|
|
13
|
+
*
|
|
14
|
+
* Levels: each check's rule id (`SQLPG101`, `SQLCH113`) is a lint rule.
|
|
15
|
+
* `yodel.config.ts` `lint.rules` sets it first; else `chant.config.ts`
|
|
16
|
+
* `lint.rules`, which `chant lint` reads; else the level the check gives
|
|
17
|
+
* the finding (an `info` finding is a warning here).
|
|
18
|
+
*
|
|
19
|
+
* The checks read the objects as `chant build` serializes them (their
|
|
20
|
+
* columns, keys and engine besides the DDL); an object recorded with its
|
|
21
|
+
* DDL only is not checked.
|
|
22
|
+
*/
|
|
23
|
+
import { postSynthChecks } from "@intentius/chant-lexicon-sql/lint/post-synth";
|
|
24
|
+
const dialectOf = (id) => (id.startsWith("SQLCH") ? "clickhouse" : id.startsWith("SQLPG") ? "postgres" : undefined);
|
|
25
|
+
/** Every schema check the lexicon ships, as a lint rule: silenceable, its level set in config. */
|
|
26
|
+
export const SCHEMA_RULES = Object.fromEntries(postSynthChecks.map((c) => {
|
|
27
|
+
const dialect = dialectOf(c.id);
|
|
28
|
+
return [c.id, { id: c.id, summary: `schema check: ${c.description}`, level: "warning", silenceable: true, configurable: true, schema: true, ...(dialect ? { dialect } : {}) }];
|
|
29
|
+
}));
|
|
30
|
+
export const isSchemaRule = (id) => Object.hasOwn(SCHEMA_RULES, id);
|
|
31
|
+
/** Objects as `chant build` writes them carry their name besides the DDL; one with the DDL alone is left out. */
|
|
32
|
+
const serialized = (o) => typeof o.name === "string";
|
|
33
|
+
/** Runs every schema check over one recorded schema. A check that throws is reported as a finding of its own. */
|
|
34
|
+
export function schemaDiagnostics(schema) {
|
|
35
|
+
if (!Array.isArray(schema.objects))
|
|
36
|
+
return [];
|
|
37
|
+
const value = { ...schema, objects: schema.objects.filter(serialized) };
|
|
38
|
+
if (value.objects.length === 0)
|
|
39
|
+
return [];
|
|
40
|
+
const outputs = new Map([["sql", JSON.stringify(value)]]);
|
|
41
|
+
const ctx = {
|
|
42
|
+
outputs,
|
|
43
|
+
entities: new Map(),
|
|
44
|
+
docs: [{ lexicon: "sql", index: 0, format: "json", value }],
|
|
45
|
+
buildResult: { outputs, entities: new Map(), warnings: [], errors: [], sourceFileCount: 0 },
|
|
46
|
+
};
|
|
47
|
+
const out = [];
|
|
48
|
+
for (const check of postSynthChecks) {
|
|
49
|
+
const dialect = dialectOf(check.id);
|
|
50
|
+
if (dialect !== undefined && dialect !== schema.dialect)
|
|
51
|
+
continue;
|
|
52
|
+
let found;
|
|
53
|
+
try {
|
|
54
|
+
found = check.check(ctx);
|
|
55
|
+
}
|
|
56
|
+
catch (e) {
|
|
57
|
+
out.push({ rule: check.id, level: "error", message: `${check.id} could not run on the recorded schema: ${(e instanceof Error ? e.message : String(e)).split("\n")[0] ?? ""}` });
|
|
58
|
+
continue;
|
|
59
|
+
}
|
|
60
|
+
for (const d of found) {
|
|
61
|
+
out.push({ rule: d.checkId, level: d.severity === "error" ? "error" : "warning", message: d.message, ...(d.entity !== undefined ? { entity: d.entity } : {}) });
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return out;
|
|
65
|
+
}
|
|
66
|
+
/** A level from `chant.config.ts` `lint.rules`: a severity string, or `[severity, options]`. */
|
|
67
|
+
export function chantLevel(value) {
|
|
68
|
+
const s = Array.isArray(value) ? value[0] : value;
|
|
69
|
+
if (s === "off")
|
|
70
|
+
return "off";
|
|
71
|
+
if (s === "error")
|
|
72
|
+
return "error";
|
|
73
|
+
if (s === "warning" || s === "info")
|
|
74
|
+
return "warning";
|
|
75
|
+
return undefined;
|
|
76
|
+
}
|
|
77
|
+
const keyOf = (d) => `${d.rule}\u0000${d.entity ?? ""}\u0000${d.message}`;
|
|
78
|
+
/**
|
|
79
|
+
* The schema findings of every migration: each check's findings on its
|
|
80
|
+
* recorded schema that its parent's recorded schema does not have.
|
|
81
|
+
* `configured` are the rule ids `yodel.config.ts` sets; `chantRules` is
|
|
82
|
+
* `chant.config.ts`'s `lint.rules`.
|
|
83
|
+
*/
|
|
84
|
+
export function schemaFindings(migrations, options) {
|
|
85
|
+
const byId = new Map(migrations.map((m) => [m.id, m]));
|
|
86
|
+
const cache = new Map();
|
|
87
|
+
const diagnostics = (m) => {
|
|
88
|
+
let d = cache.get(m.id);
|
|
89
|
+
if (!d) {
|
|
90
|
+
const schema = m.document.schema;
|
|
91
|
+
d = schema.dialect === "clickhouse" || schema.dialect === "postgres" ? schemaDiagnostics(schema) : [];
|
|
92
|
+
cache.set(m.id, d);
|
|
93
|
+
}
|
|
94
|
+
return d;
|
|
95
|
+
};
|
|
96
|
+
const out = [];
|
|
97
|
+
for (const m of migrations) {
|
|
98
|
+
const d = m.document.dialect;
|
|
99
|
+
if (d !== "clickhouse" && d !== "postgres")
|
|
100
|
+
continue;
|
|
101
|
+
if (options.dialect !== undefined && d !== options.dialect)
|
|
102
|
+
continue;
|
|
103
|
+
const parent = m.parent === null ? undefined : byId.get(m.parent);
|
|
104
|
+
const before = new Set((parent ? diagnostics(parent) : []).map(keyOf));
|
|
105
|
+
for (const diag of diagnostics(m)) {
|
|
106
|
+
if (before.has(keyOf(diag)))
|
|
107
|
+
continue;
|
|
108
|
+
let level;
|
|
109
|
+
if (!options.configured.has(diag.rule)) {
|
|
110
|
+
const set = chantLevel(options.chantRules?.[diag.rule]);
|
|
111
|
+
if (set === "off")
|
|
112
|
+
continue;
|
|
113
|
+
level = set ?? diag.level;
|
|
114
|
+
}
|
|
115
|
+
const step = diag.entity === undefined ? -1 : m.document.steps.findIndex((s) => s.object === diag.entity);
|
|
116
|
+
out.push({
|
|
117
|
+
rule: diag.rule,
|
|
118
|
+
migration: m.id,
|
|
119
|
+
message: `${step >= 0 ? `step ${String(step)}: ` : ""}${diag.message}`,
|
|
120
|
+
...(step >= 0 ? { step } : {}),
|
|
121
|
+
...(step >= 0 ? { object: m.document.steps[step]?.name ?? diag.entity } : diag.entity !== undefined ? { object: diag.entity } : {}),
|
|
122
|
+
...(level !== undefined ? { level } : {}),
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
return out;
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=schema-checks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-checks.js","sourceRoot":"","sources":["../../src/lint/schema-checks.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,9 +5,18 @@
|
|
|
5
5
|
*
|
|
6
6
|
* - `destructive`: a statement marked destructive (a table or column drop),
|
|
7
7
|
* or an Op step one of whose changes is.
|
|
8
|
+
* - `pg-access`: a Postgres statement that takes access away (#45): a
|
|
9
|
+
* privilege revoked (SQLPG297), a policy dropped (SQLPG292), row-level
|
|
10
|
+
* security turned off or no longer forced (SQLPG293). A revoke on an
|
|
11
|
+
* object the same migration creates (`REVOKE EXECUTE ... FROM PUBLIC` on
|
|
12
|
+
* a new function) takes nothing from anyone and is left out.
|
|
8
13
|
* - `ch-mutation`: a ClickHouse statement of class `rewrite`, or one that
|
|
9
14
|
* waits for its mutation (a column type or TTL change).
|
|
10
15
|
* - `ch-rebuild`: a `ClickHouseRebuildOp` step.
|
|
16
|
+
* - `ch-access`: a ClickHouse statement that takes access away (#46): a
|
|
17
|
+
* privilege or role revoked (SQLCH274). ClickHouse takes no `REVOKE`
|
|
18
|
+
* declaration, so each one revokes what a grantee holds and no
|
|
19
|
+
* declaration grants any more.
|
|
11
20
|
* - `pg-rewrite`: a Postgres statement of class `rewrite` (ACCESS EXCLUSIVE
|
|
12
21
|
* for a rewrite or a full scan).
|
|
13
22
|
* - `pg-lock`: a Postgres statement that blocks writes for a whole build or
|
|
@@ -17,6 +26,12 @@
|
|
|
17
26
|
* foreign key or domain constraint validated in place rather than added
|
|
18
27
|
* `NOT VALID` (SQLPG219, SQLPG262).
|
|
19
28
|
*
|
|
29
|
+
* - `data-dependent`: a Postgres statement chant marks as able to fail on
|
|
30
|
+
* the rows already there (its `precheck`: a unique index over
|
|
31
|
+
* duplicates, SET NOT NULL over NULLs, a check or foreign key a row
|
|
32
|
+
* breaks). The finding shows the pre-check, which yodel apply runs before
|
|
33
|
+
* the migration's first statement and refuses on when it is not 0.
|
|
34
|
+
*
|
|
20
35
|
* `COMMENT ON` statements are skipped: chant writes one after a `CREATE`
|
|
21
36
|
* with the same rule, and a comment is catalog only.
|
|
22
37
|
*
|
|
@@ -32,7 +47,13 @@ export interface StepFinding {
|
|
|
32
47
|
}
|
|
33
48
|
/** What lint cannot read in a step, or `undefined`. */
|
|
34
49
|
export declare function unreadableStep(dialect: Dialect, step: MigrationStep): string | undefined;
|
|
50
|
+
/** What a step is read with: the names of the objects its migration creates (`schema.table`, `schema.fn(args)`), from {@link createdObjects}. */
|
|
51
|
+
export interface StepContext {
|
|
52
|
+
created?: ReadonlySet<string>;
|
|
53
|
+
}
|
|
54
|
+
/** The objects a migration's statements create, by the name each step carries. */
|
|
55
|
+
export declare function createdObjects(steps: readonly MigrationStep[]): Set<string>;
|
|
35
56
|
/** The statement-rule findings for one step, before levels and silences. */
|
|
36
|
-
export declare function stepFindings(dialect: Dialect, step: MigrationStep): StepFinding[];
|
|
57
|
+
export declare function stepFindings(dialect: Dialect, step: MigrationStep, context?: StepContext): StepFinding[];
|
|
37
58
|
/** Why yodel apply refuses a step, or `undefined` for one it runs. */
|
|
38
59
|
export declare function refusedStep(step: MigrationStep): string | undefined;
|
package/dist/lint/statements.js
CHANGED
|
@@ -5,9 +5,18 @@
|
|
|
5
5
|
*
|
|
6
6
|
* - `destructive`: a statement marked destructive (a table or column drop),
|
|
7
7
|
* or an Op step one of whose changes is.
|
|
8
|
+
* - `pg-access`: a Postgres statement that takes access away (#45): a
|
|
9
|
+
* privilege revoked (SQLPG297), a policy dropped (SQLPG292), row-level
|
|
10
|
+
* security turned off or no longer forced (SQLPG293). A revoke on an
|
|
11
|
+
* object the same migration creates (`REVOKE EXECUTE ... FROM PUBLIC` on
|
|
12
|
+
* a new function) takes nothing from anyone and is left out.
|
|
8
13
|
* - `ch-mutation`: a ClickHouse statement of class `rewrite`, or one that
|
|
9
14
|
* waits for its mutation (a column type or TTL change).
|
|
10
15
|
* - `ch-rebuild`: a `ClickHouseRebuildOp` step.
|
|
16
|
+
* - `ch-access`: a ClickHouse statement that takes access away (#46): a
|
|
17
|
+
* privilege or role revoked (SQLCH274). ClickHouse takes no `REVOKE`
|
|
18
|
+
* declaration, so each one revokes what a grantee holds and no
|
|
19
|
+
* declaration grants any more.
|
|
11
20
|
* - `pg-rewrite`: a Postgres statement of class `rewrite` (ACCESS EXCLUSIVE
|
|
12
21
|
* for a rewrite or a full scan).
|
|
13
22
|
* - `pg-lock`: a Postgres statement that blocks writes for a whole build or
|
|
@@ -17,6 +26,12 @@
|
|
|
17
26
|
* foreign key or domain constraint validated in place rather than added
|
|
18
27
|
* `NOT VALID` (SQLPG219, SQLPG262).
|
|
19
28
|
*
|
|
29
|
+
* - `data-dependent`: a Postgres statement chant marks as able to fail on
|
|
30
|
+
* the rows already there (its `precheck`: a unique index over
|
|
31
|
+
* duplicates, SET NOT NULL over NULLs, a check or foreign key a row
|
|
32
|
+
* breaks). The finding shows the pre-check, which yodel apply runs before
|
|
33
|
+
* the migration's first statement and refuses on when it is not 0.
|
|
34
|
+
*
|
|
20
35
|
* `COMMENT ON` statements are skipped: chant writes one after a `CREATE`
|
|
21
36
|
* with the same rule, and a comment is catalog only.
|
|
22
37
|
*
|
|
@@ -27,6 +42,7 @@
|
|
|
27
42
|
import { CLASSIFIER_RULES } from "@intentius/chant-lexicon-sql/clickhouse/plan/rules";
|
|
28
43
|
import { PG_CLASSIFIER_RULES } from "@intentius/chant-lexicon-sql/postgres/plan/rules";
|
|
29
44
|
import { planStep, REBUILD_OP } from "../steps/kinds.js";
|
|
45
|
+
import { takesAccessAway } from "../chant/access.js";
|
|
30
46
|
const catalog = (dialect) => (dialect === "clickhouse" ? CLASSIFIER_RULES : PG_CLASSIFIER_RULES);
|
|
31
47
|
/** The classifier rule's id and title, e.g. `SQLCH202 Drop a column`. */
|
|
32
48
|
function titled(dialect, rule) {
|
|
@@ -77,8 +93,21 @@ export function unreadableStep(dialect, step) {
|
|
|
77
93
|
}
|
|
78
94
|
return undefined;
|
|
79
95
|
}
|
|
96
|
+
const CREATE = /^\s*CREATE\b/i;
|
|
97
|
+
const REVOKE_ON = /\bON\s+(?:TABLE|SEQUENCE|FUNCTION|PROCEDURE|ROUTINE|SCHEMA)\s+(.+?)\s+FROM\b/is;
|
|
98
|
+
/** The objects a migration's statements create, by the name each step carries. */
|
|
99
|
+
export function createdObjects(steps) {
|
|
100
|
+
return new Set(steps.flatMap((s) => (s.kind === "statement" && s.class === "create" && CREATE.test(s.sql) ? [s.name.replace(/\s+/g, "")] : [])));
|
|
101
|
+
}
|
|
102
|
+
/** A REVOKE on an object `created` holds: nobody had the privilege before the migration. */
|
|
103
|
+
function revokesOnNew(step, created) {
|
|
104
|
+
if (step.rule !== "SQLPG297" || !created || created.size === 0)
|
|
105
|
+
return false;
|
|
106
|
+
const on = REVOKE_ON.exec(step.sql)?.[1];
|
|
107
|
+
return on !== undefined && on.split(",").every((n) => created.has(n.replace(/\s+/g, "")));
|
|
108
|
+
}
|
|
80
109
|
/** The statement-rule findings for one step, before levels and silences. */
|
|
81
|
-
export function stepFindings(dialect, step) {
|
|
110
|
+
export function stepFindings(dialect, step, context = {}) {
|
|
82
111
|
const out = [];
|
|
83
112
|
if (step.kind === "statement") {
|
|
84
113
|
if (COMMENT.test(step.sql))
|
|
@@ -89,6 +118,11 @@ export function stepFindings(dialect, step) {
|
|
|
89
118
|
if (dialect === "clickhouse" && (step.class === "rewrite" || step.waitsForMutation === true)) {
|
|
90
119
|
out.push({ rule: "ch-mutation", message: `${what}: a mutation that rewrites existing parts in the background, with no rollback` });
|
|
91
120
|
}
|
|
121
|
+
if (dialect === "clickhouse") {
|
|
122
|
+
const away = takesAccessAway(step);
|
|
123
|
+
if (away)
|
|
124
|
+
out.push({ rule: "ch-access", message: `${what}: ${away}, which changes what a user or role can do: ${step.sql.split("\n")[0] ?? ""}` });
|
|
125
|
+
}
|
|
92
126
|
if (dialect === "postgres") {
|
|
93
127
|
if (step.class === "rewrite") {
|
|
94
128
|
const r = catalog(dialect)[step.rule];
|
|
@@ -97,6 +131,11 @@ export function stepFindings(dialect, step) {
|
|
|
97
131
|
const lock = pgLock(step);
|
|
98
132
|
if (lock)
|
|
99
133
|
out.push({ rule: "pg-lock", message: `${what}: ${lock}` });
|
|
134
|
+
if (step.precheck)
|
|
135
|
+
out.push({ rule: "data-dependent", message: `${what}: can fail on the rows already there (${step.precheck.detail}); yodel apply runs this pre-check before the migration's first statement and refuses when it is not 0: ${step.precheck.sql}` });
|
|
136
|
+
const away = takesAccessAway(step);
|
|
137
|
+
if (away && !revokesOnNew(step, context.created))
|
|
138
|
+
out.push({ rule: "pg-access", message: `${what}: ${away}, which changes what a role can do: ${step.sql.split("\n")[0] ?? ""}` });
|
|
100
139
|
}
|
|
101
140
|
return out;
|
|
102
141
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"statements.js","sourceRoot":"","sources":["../../src/lint/statements.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"statements.js","sourceRoot":"","sources":["../../src/lint/statements.ts"],"names":[],"mappings":"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"}
|
package/dist/mcp/tools.d.ts
CHANGED
|
@@ -11,7 +11,7 @@ import { SCHEMA_VERSION } from "../schemas.js";
|
|
|
11
11
|
/** The only verbs a tool may run, and only with the flags {@link runVerb} allows. */
|
|
12
12
|
export declare const READ_VERBS: Readonly<Record<string, Command>>;
|
|
13
13
|
/** Never a tool, and never run by one: each writes to a database, a history, the migrations directory or the gate ledger. */
|
|
14
|
-
export declare const WRITE_VERBS: readonly ["apply", "approve", "override", "repair", "revert", "rebase", "new", "checkpoint", "init"];
|
|
14
|
+
export declare const WRITE_VERBS: readonly ["apply", "approve", "override", "repair", "revert", "rebase", "new", "checkpoint", "init", "test"];
|
|
15
15
|
export interface ToolEnvelope {
|
|
16
16
|
schema: typeof SCHEMA_VERSION;
|
|
17
17
|
tool: string;
|
package/dist/mcp/tools.js
CHANGED
|
@@ -17,7 +17,7 @@ import { status } from "../commands/status.js";
|
|
|
17
17
|
/** The only verbs a tool may run, and only with the flags {@link runVerb} allows. */
|
|
18
18
|
export const READ_VERBS = { status, plan, lint, drift };
|
|
19
19
|
/** Never a tool, and never run by one: each writes to a database, a history, the migrations directory or the gate ledger. */
|
|
20
|
-
export const WRITE_VERBS = ["apply", "approve", "override", "repair", "revert", "rebase", "new", "checkpoint", "init"];
|
|
20
|
+
export const WRITE_VERBS = ["apply", "approve", "override", "repair", "revert", "rebase", "new", "checkpoint", "init", "test"];
|
|
21
21
|
/** Flags that make a read verb write: a replay database, a checksum, a forge comment, the Op's Apply step. */
|
|
22
22
|
const WRITE_FLAGS = ["--replay", "--reset", "--reset-shared", "--keep", "--update-checksum", "--comment", "--execute"];
|
|
23
23
|
/** Throws when any tool could write: a write verb by name, a verb outside {@link READ_VERBS}, or no read-only annotation. */
|
package/dist/mcp/tools.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/mcp/tools.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC1E,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAC7C,OAAO,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AAC3C,OAAO,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAE/C,qFAAqF;AACrF,MAAM,CAAC,MAAM,UAAU,GAAsC,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;AAE3F,6HAA6H;AAC7H,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,CAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/mcp/tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -23,7 +23,6 @@ import { YodelError } from "../project.js";
|
|
|
23
23
|
import { computeChecksum } from "./checksum.js";
|
|
24
24
|
import { emptyBuild, migrationId, refusedSteps, renderMigrationSql } from "./create.js";
|
|
25
25
|
import { MIGRATION_FORMAT, serializeDocument, sortKeys } from "./document.js";
|
|
26
|
-
import { relabelTriggerCreates } from "./routines.js";
|
|
27
26
|
/** `sha256:<hex>` of a recorded schema, over its JSON with every object's keys sorted. */
|
|
28
27
|
export function schemaSha(schema) {
|
|
29
28
|
return `sha256:${createHash("sha256").update(JSON.stringify(sortKeys(schema)), "utf8").digest("hex")}`;
|
|
@@ -54,7 +53,6 @@ export function createCheckpoint(options) {
|
|
|
54
53
|
catch (e) {
|
|
55
54
|
throw new YodelError(e instanceof Error ? e.message : String(e));
|
|
56
55
|
}
|
|
57
|
-
statements = relabelTriggerCreates(statements, before, schema);
|
|
58
56
|
const refused = refusedSteps(statements.steps);
|
|
59
57
|
if (refused.length > 0) {
|
|
60
58
|
throw new YodelError(`${parent.id}'s recorded schema cannot be created by statements alone (${refused.map((s) => `${s.object}: ${s.kind} step`).join(", ")}); a checkpoint holds statements only`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"checkpoint.js","sourceRoot":"","sources":["../../src/migrations/checkpoint.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,cAAc,EAAyB,MAAM,mDAAmD,CAAC;AAC1G,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE3C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACxF,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,QAAQ,EAA+C,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"checkpoint.js","sourceRoot":"","sources":["../../src/migrations/checkpoint.ts"],"names":[],"mappings":"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"}
|