@intentius/sql-yodeler 0.1.0 → 0.2.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 +26 -24
- package/dist/bin.js +15 -0
- package/dist/bin.js.map +1 -1
- package/dist/chant/apply.d.ts +9 -1
- package/dist/chant/apply.js +13 -1
- package/dist/chant/apply.js.map +1 -1
- package/dist/chant/drift.d.ts +69 -1
- package/dist/chant/drift.js +152 -5
- package/dist/chant/drift.js.map +1 -1
- package/dist/chant/runnable.d.ts +19 -0
- package/dist/chant/runnable.js +47 -0
- package/dist/chant/runnable.js.map +1 -0
- package/dist/cli.d.ts +4 -0
- package/dist/cli.js +40 -0
- package/dist/cli.js.map +1 -1
- package/dist/command.d.ts +6 -0
- package/dist/command.js.map +1 -1
- package/dist/commands/apply.js +161 -41
- package/dist/commands/apply.js.map +1 -1
- package/dist/commands/approve.d.ts +5 -0
- package/dist/commands/approve.js +111 -0
- package/dist/commands/approve.js.map +1 -0
- package/dist/commands/drift.d.ts +11 -0
- package/dist/commands/drift.js +247 -18
- 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/init.d.ts +3 -0
- package/dist/commands/init.js +15 -11
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/lint.js +14 -5
- package/dist/commands/lint.js.map +1 -1
- package/dist/commands/mcp.d.ts +3 -0
- package/dist/commands/mcp.js +50 -0
- package/dist/commands/mcp.js.map +1 -0
- package/dist/commands/new.d.ts +2 -0
- package/dist/commands/new.js +134 -10
- package/dist/commands/new.js.map +1 -1
- package/dist/commands/override.d.ts +3 -0
- package/dist/commands/override.js +118 -0
- package/dist/commands/override.js.map +1 -0
- package/dist/commands/plan.js +38 -26
- package/dist/commands/plan.js.map +1 -1
- package/dist/commands/repair.d.ts +11 -0
- package/dist/commands/repair.js +15 -7
- package/dist/commands/repair.js.map +1 -1
- package/dist/commands/status.js +12 -12
- package/dist/commands/status.js.map +1 -1
- package/dist/config/define.d.ts +101 -3
- package/dist/config/define.js +1 -1
- package/dist/config/define.js.map +1 -1
- package/dist/config/load.js +64 -4
- package/dist/config/load.js.map +1 -1
- package/dist/config/settings.d.ts +14 -1
- package/dist/config/settings.js +32 -4
- package/dist/config/settings.js.map +1 -1
- package/dist/env-args.d.ts +6 -0
- package/dist/env-args.js +31 -1
- package/dist/env-args.js.map +1 -1
- package/dist/exit.d.ts +20 -0
- package/dist/exit.js +28 -0
- package/dist/exit.js.map +1 -0
- package/dist/history/client.d.ts +8 -0
- package/dist/history/client.js +24 -1
- package/dist/history/client.js.map +1 -1
- package/dist/history/lock.d.ts +5 -1
- package/dist/history/lock.js +8 -2
- package/dist/history/lock.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/init/adopt.js +8 -3
- package/dist/init/adopt.js.map +1 -1
- package/dist/init/live.d.ts +11 -0
- package/dist/init/live.js +25 -2
- package/dist/init/live.js.map +1 -1
- package/dist/lint/check.d.ts +8 -1
- package/dist/lint/check.js +23 -4
- package/dist/lint/check.js.map +1 -1
- package/dist/mcp/server.d.ts +40 -0
- package/dist/mcp/server.js +106 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/tools.d.ts +72 -0
- package/dist/mcp/tools.js +178 -0
- package/dist/mcp/tools.js.map +1 -0
- package/dist/migrations/checks.d.ts +28 -0
- package/dist/migrations/checks.js +97 -0
- package/dist/migrations/checks.js.map +1 -0
- package/dist/migrations/create.d.ts +3 -1
- package/dist/migrations/create.js +1 -0
- package/dist/migrations/create.js.map +1 -1
- package/dist/migrations/directory.js +4 -0
- package/dist/migrations/directory.js.map +1 -1
- package/dist/migrations/document.d.ts +23 -0
- package/dist/migrations/document.js +1 -0
- package/dist/migrations/document.js.map +1 -1
- package/dist/migrations/index.d.ts +1 -0
- package/dist/migrations/index.js +1 -0
- package/dist/migrations/index.js.map +1 -1
- package/dist/pr/forge.d.ts +4 -0
- package/dist/pr/forge.js +21 -7
- package/dist/pr/forge.js.map +1 -1
- package/dist/pr/issue.d.ts +68 -0
- package/dist/pr/issue.js +107 -0
- package/dist/pr/issue.js.map +1 -0
- package/dist/pr/model.d.ts +9 -1
- package/dist/pr/model.js +30 -6
- package/dist/pr/model.js.map +1 -1
- package/dist/pr/render.d.ts +3 -1
- package/dist/pr/render.js +36 -3
- package/dist/pr/render.js.map +1 -1
- package/dist/replay/index.d.ts +3 -0
- package/dist/replay/index.js +3 -0
- package/dist/replay/index.js.map +1 -1
- package/dist/replay/replay.js +1 -1
- package/dist/replay/replay.js.map +1 -1
- package/dist/replay/shared.d.ts +28 -0
- package/dist/replay/shared.js +77 -0
- package/dist/replay/shared.js.map +1 -0
- package/dist/schemas.d.ts +34 -0
- package/dist/schemas.js +38 -0
- package/dist/schemas.js.map +1 -0
- package/dist/server.d.ts +40 -0
- package/dist/server.js +87 -0
- package/dist/server.js.map +1 -0
- package/dist/steps/backfill.d.ts +21 -17
- package/dist/steps/backfill.js +20 -20
- package/dist/steps/backfill.js.map +1 -1
- package/dist/steps/index.d.ts +2 -2
- package/dist/steps/index.js +3 -3
- package/dist/steps/index.js.map +1 -1
- package/dist/steps/rebuild.d.ts +15 -15
- package/dist/steps/rebuild.js +17 -24
- package/dist/steps/rebuild.js.map +1 -1
- package/dist/versioned/checks.d.ts +29 -0
- package/dist/versioned/checks.js +54 -0
- package/dist/versioned/checks.js.map +1 -0
- package/dist/versioned/clickhouse.js +8 -0
- package/dist/versioned/clickhouse.js.map +1 -1
- package/dist/versioned/driver.d.ts +10 -0
- package/dist/versioned/engine.d.ts +55 -1
- package/dist/versioned/engine.js +99 -6
- package/dist/versioned/engine.js.map +1 -1
- package/dist/versioned/explain.js +7 -2
- package/dist/versioned/explain.js.map +1 -1
- package/dist/versioned/index.d.ts +9 -0
- package/dist/versioned/index.js +24 -1
- package/dist/versioned/index.js.map +1 -1
- package/dist/versioned/op.d.ts +10 -0
- package/dist/versioned/op.js +36 -4
- package/dist/versioned/op.js.map +1 -1
- package/dist/versioned/policy.d.ts +67 -0
- package/dist/versioned/policy.js +161 -0
- package/dist/versioned/policy.js.map +1 -0
- package/dist/versioned/postgres/driver.d.ts +3 -1
- package/dist/versioned/postgres/driver.js +30 -3
- package/dist/versioned/postgres/driver.js.map +1 -1
- package/dist/versioned/postgres/waits.d.ts +46 -0
- package/dist/versioned/postgres/waits.js +78 -0
- package/dist/versioned/postgres/waits.js.map +1 -0
- package/dist/versioned/report.d.ts +3 -0
- package/dist/versioned/report.js +4 -1
- package/dist/versioned/report.js.map +1 -1
- package/dist/versioned/stand-down.d.ts +30 -0
- package/dist/versioned/stand-down.js +56 -0
- package/dist/versioned/stand-down.js.map +1 -0
- package/package.json +18 -8
- package/schemas/apply.schema.json +269 -0
- package/schemas/common.schema.json +213 -0
- package/schemas/drift.schema.json +36 -0
- package/schemas/init.schema.json +31 -0
- package/schemas/lint-rules.schema.json +54 -0
- package/schemas/lint.schema.json +290 -0
- package/schemas/mcp.schema.json +70 -0
- package/schemas/new.schema.json +71 -0
- package/schemas/plan.schema.json +371 -0
- package/schemas/rebase.schema.json +54 -0
- package/schemas/repair.schema.json +20 -0
- package/schemas/status.schema.json +310 -0
package/dist/commands/plan.js
CHANGED
|
@@ -5,13 +5,17 @@ import { declarativeTopologyRefusal, describeSettingsTopology, environmentSettin
|
|
|
5
5
|
import { buildSchema } from "../chant/build.js";
|
|
6
6
|
import { planEnvironment, planExitCode, planJson, renderPlan } from "../chant/plan.js";
|
|
7
7
|
import { hasMigrations } from "../versioned/index.js";
|
|
8
|
+
import { describeServer, probeServer } from "../server.js";
|
|
9
|
+
import { runnable } from "../chant/runnable.js";
|
|
8
10
|
import { decodeSubject } from "../versioned/explain.js";
|
|
9
11
|
import { collectVersionedPlan } from "../pr/model.js";
|
|
10
12
|
import { commentMarker, planJsonVersioned, renderPlanMarkdown, renderPlanText, subjectIn } from "../pr/render.js";
|
|
11
13
|
import { resolveForgeTarget } from "../pr/forge.js";
|
|
12
14
|
import { commentClient, findComment, upsertComment } from "../pr/comment.js";
|
|
13
|
-
const usage = "usage: yodel plan <env> [--json] [--dir <project>] [--format text|markdown|json]
|
|
14
|
-
" [--
|
|
15
|
+
const usage = "usage: yodel plan <env> [--json] [--dir <project>] [--format text|markdown|json]\n" +
|
|
16
|
+
" [--allow-out-of-order] [--op <name>]\n" +
|
|
17
|
+
" [--comment [--forge github|gitlab|forgejo]\n" +
|
|
18
|
+
" [--repo <repo>] [--pr <n>] [--api-url <url>] [--token-env <VAR>]]";
|
|
15
19
|
const help = `${usage}
|
|
16
20
|
|
|
17
21
|
Declarative project (no migrations/ directory): shows the classified change
|
|
@@ -27,35 +31,42 @@ When chant's gate ledger holds an approval of the migrations Op's gate for
|
|
|
27
31
|
another digest, it says what moved since. Reads only.
|
|
28
32
|
|
|
29
33
|
Options:
|
|
30
|
-
--json
|
|
31
|
-
--format <f>
|
|
32
|
-
|
|
33
|
-
--
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
--
|
|
45
|
-
|
|
46
|
-
|
|
34
|
+
--json print the plan as JSON (the same as --format json)
|
|
35
|
+
--format <f> text (default), markdown (the pull request comment),
|
|
36
|
+
json
|
|
37
|
+
--allow-out-of-order versioned: the plan yodel apply --allow-out-of-order
|
|
38
|
+
would run
|
|
39
|
+
--op <name> versioned: the migrations Op, when more than one
|
|
40
|
+
applies <env>
|
|
41
|
+
--comment versioned: post the markdown as one comment on the
|
|
42
|
+
pull (merge) request, updating the one posted before;
|
|
43
|
+
prints the text plan. The forge, repository, request
|
|
44
|
+
and API come from the CI job's environment
|
|
45
|
+
(GitHub Actions, GitLab CI, Forgejo Actions) unless
|
|
46
|
+
given:
|
|
47
|
+
--forge <f> github, gitlab or forgejo
|
|
48
|
+
--repo <repo> owner/name (GitHub, Forgejo) or the project id (GitLab)
|
|
49
|
+
--pr <n> the pull request number or merge request iid
|
|
50
|
+
--api-url <url> the REST API base (https://api.github.com,
|
|
51
|
+
https://gitlab.example/api/v4,
|
|
52
|
+
https://forgejo.example/api/v1)
|
|
53
|
+
--token-env <VAR> the variable holding the token (default GITHUB_TOKEN;
|
|
54
|
+
GITLAB_TOKEN; FORGEJO_TOKEN, else GITHUB_TOKEN)
|
|
55
|
+
-C, --dir <dir> the project directory (default: the working directory)
|
|
47
56
|
|
|
48
57
|
Exit codes:
|
|
49
58
|
0 every change can be made in place, or there is none; versioned: apply
|
|
50
|
-
would run (or has nothing to do)
|
|
59
|
+
would run (or has nothing to do). Pending migrations still exit 0: plan
|
|
60
|
+
reports, and a CI job that posts it should not fail because a pull
|
|
61
|
+
request adds a migration; yodel status exits 3 for them
|
|
51
62
|
2 a change needs its own Op: a ClickHouse rebuild, a Postgres expand and
|
|
52
63
|
contract (declarative); versioned: a pending migration has an Op or
|
|
53
64
|
manual step apply does not run yet
|
|
54
65
|
4 versioned: apply would refuse: a checksum mismatch, an applied migration
|
|
55
|
-
gone from the directory, an out-of-order migration
|
|
66
|
+
gone from the directory, an out-of-order migration, a fork or another
|
|
67
|
+
problem in the migrations directory
|
|
56
68
|
1 no plan could be made: a bad config, an unknown environment, a declaration
|
|
57
|
-
chant cannot build, a
|
|
58
|
-
read, a comment the forge refused
|
|
69
|
+
chant cannot build, a server it cannot read, a comment the forge refused
|
|
59
70
|
`;
|
|
60
71
|
function parsePlanArgs(args) {
|
|
61
72
|
let parsed;
|
|
@@ -136,10 +147,11 @@ async function declarativePlan(project, env, json, io) {
|
|
|
136
147
|
const build = await buildSchema(project);
|
|
137
148
|
try {
|
|
138
149
|
const result = await planEnvironment(project, env, build);
|
|
150
|
+
const server = await probeServer(project, env);
|
|
139
151
|
if (json)
|
|
140
|
-
io.out(`${JSON.stringify(planJson(result), null, 2)}\n`);
|
|
152
|
+
io.out(`${JSON.stringify({ ...planJson(result), ...(server ? { server } : {}) }, null, 2)}\n`);
|
|
141
153
|
else
|
|
142
|
-
io.out(`${await renderPlan(result, `Plan for ${env.name} (${project.dialect}, sql.profiles.${env.name}${topology})`)}\n`);
|
|
154
|
+
io.out(`${await renderPlan(result, `Plan for ${env.name} (${server ? describeServer(server) : project.dialect}, sql.profiles.${env.name}${topology})`)}\n`);
|
|
143
155
|
return planExitCode(result);
|
|
144
156
|
}
|
|
145
157
|
finally {
|
|
@@ -165,7 +177,7 @@ async function versionedPlan(project, env, a, io) {
|
|
|
165
177
|
else if (a.format === "markdown")
|
|
166
178
|
io.out(renderPlanMarkdown(result));
|
|
167
179
|
else
|
|
168
|
-
io.out(renderPlanText(result));
|
|
180
|
+
io.out(renderPlanText(result, { runnable: (c) => runnable(c, project.dir) }));
|
|
169
181
|
return code;
|
|
170
182
|
}
|
|
171
183
|
//# sourceMappingURL=plan.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plan.js","sourceRoot":"","sources":["../../src/commands/plan.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,UAAU,EAAkC,MAAM,eAAe,CAAC;AAC5G,OAAO,EAAE,0BAA0B,EAAE,wBAAwB,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAClH,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACvF,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAClH,OAAO,EAAE,kBAAkB,EAAmB,MAAM,gBAAgB,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAE7E,MAAM,KAAK,GACT,
|
|
1
|
+
{"version":3,"file":"plan.js","sourceRoot":"","sources":["../../src/commands/plan.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,14 @@
|
|
|
1
1
|
import type { Command } from "../command.js";
|
|
2
2
|
/** `yodel repair <id> --reason ... <env>`; the exit codes are in `help`. */
|
|
3
3
|
export declare const repair: Command;
|
|
4
|
+
/** `yodel repair --json` (schemas/repair.schema.json). */
|
|
5
|
+
export declare function repairJson(r: {
|
|
6
|
+
id: string;
|
|
7
|
+
environment: string;
|
|
8
|
+
oldChecksum: string;
|
|
9
|
+
newChecksum: string;
|
|
10
|
+
reason: string;
|
|
11
|
+
seq: number;
|
|
12
|
+
runId: string;
|
|
13
|
+
migrationJsonUpdated: boolean;
|
|
14
|
+
}): Record<string, unknown>;
|
package/dist/commands/repair.js
CHANGED
|
@@ -7,15 +7,17 @@ import { MIGRATION_JSON, scanMigrations, serializeDocument, verifyChecksum } fro
|
|
|
7
7
|
import { appliedBy, newRunContext, withLock } from "../history/index.js";
|
|
8
8
|
import { closeVersioned, migrationsDir, openVersioned } from "../versioned/index.js";
|
|
9
9
|
import { checkRepair, repairRow } from "../rebase/repair.js";
|
|
10
|
-
|
|
10
|
+
/** A migration directory's name: `<YYYYMMDDTHHMM>-<name>`. */
|
|
11
|
+
const MIGRATION_ID = /^\d{8}T\d{4}-/;
|
|
12
|
+
const usage = 'usage: yodel repair <env> <id> --reason "<text>" [--json] [--dir <project>]\n (or yodel repair <id> --reason "<text>" <env>)';
|
|
11
13
|
const help = `${usage}
|
|
12
14
|
|
|
13
15
|
Records an intended edit to a migration that is already applied in <env>:
|
|
14
16
|
appends a row to the environment's history table (yodel.config.ts
|
|
15
17
|
history.database, else YODEL_HISTORY_DATABASE, default yodeler; on
|
|
16
|
-
Postgres the schema of that name) with the
|
|
17
|
-
|
|
18
|
-
the files with the new checksum. Nothing is run on the server: the edit is
|
|
18
|
+
Postgres the schema of that name) with the checksum the migration's files
|
|
19
|
+
have now and the reason, under the apply lock. After it, yodel status and
|
|
20
|
+
yodel apply compare the files with the new checksum. Nothing is run on the server: the edit is
|
|
19
21
|
recorded, not applied. Repair each environment the migration ran in.
|
|
20
22
|
|
|
21
23
|
When migration.json's own checksum field is stale too (it is not part of
|
|
@@ -48,9 +50,11 @@ function parseRepairArgs(args) {
|
|
|
48
50
|
throw new YodelError(`${e instanceof Error ? e.message : String(e)}\n${usage}`);
|
|
49
51
|
}
|
|
50
52
|
const { values, positionals } = parsed;
|
|
51
|
-
|
|
52
|
-
if (id === undefined || env === undefined || rest.length > 0)
|
|
53
|
+
if (positionals.length !== 2)
|
|
53
54
|
throw new YodelError(usage);
|
|
55
|
+
// <env> <id>, as every other command takes the environment first, or <id> ... <env> (#19): the id is the one shaped like one.
|
|
56
|
+
const [first = "", second = ""] = positionals;
|
|
57
|
+
const [id, env] = MIGRATION_ID.test(first) && !MIGRATION_ID.test(second) ? [first, second] : [second, first];
|
|
54
58
|
const reason = typeof values.reason === "string" ? values.reason.trim() : "";
|
|
55
59
|
if (reason === "")
|
|
56
60
|
throw new YodelError(`a repair needs a reason: --reason "<why the files changed>"\n${usage}`);
|
|
@@ -86,6 +90,10 @@ export const repair = {
|
|
|
86
90
|
}
|
|
87
91
|
}),
|
|
88
92
|
};
|
|
93
|
+
/** `yodel repair --json` (schemas/repair.schema.json). */
|
|
94
|
+
export function repairJson(r) {
|
|
95
|
+
return { repaired: true, ...r };
|
|
96
|
+
}
|
|
89
97
|
async function repairWith(venv, m, { id, envName, reason, json, io }) {
|
|
90
98
|
checkRepair(m, id, await venv.store.state(), envName); // refuse before taking the lock
|
|
91
99
|
const lock = await venv.driver.acquireLock(appliedBy());
|
|
@@ -100,7 +108,7 @@ async function repairWith(venv, m, { id, envName, reason, json, io }) {
|
|
|
100
108
|
});
|
|
101
109
|
const synced = syncRecordedChecksum(m);
|
|
102
110
|
if (json) {
|
|
103
|
-
io.out(`${JSON.stringify({
|
|
111
|
+
io.out(`${JSON.stringify(repairJson({ id, environment: envName, oldChecksum: row.check.oldChecksum, newChecksum: row.check.newChecksum, reason, seq: row.r.seq, runId: row.r.run_id, migrationJsonUpdated: synced }), null, 2)}\n`);
|
|
104
112
|
}
|
|
105
113
|
else {
|
|
106
114
|
io.out([
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repair.js","sourceRoot":"","sources":["../../src/commands/repair.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACpD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC5E,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,iBAAiB,EAAE,cAAc,EAAkB,MAAM,wBAAwB,CAAC;AAC3H,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AACzE,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,aAAa,EAAqB,MAAM,uBAAuB,CAAC;AACxG,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAE7D,MAAM,KAAK,GAAG,
|
|
1
|
+
{"version":3,"file":"repair.js","sourceRoot":"","sources":["../../src/commands/repair.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACpD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC5E,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,iBAAiB,EAAE,cAAc,EAAkB,MAAM,wBAAwB,CAAC;AAC3H,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AACzE,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,aAAa,EAAqB,MAAM,uBAAuB,CAAC;AACxG,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAE7D,8DAA8D;AAC9D,MAAM,YAAY,GAAG,eAAe,CAAC;AAErC,MAAM,KAAK,GAAG,oIAAoI,CAAC;AAEnJ,MAAM,IAAI,GAAG,GAAG,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;CAyBpB,CAAC;AAEF,SAAS,eAAe,CAAC,IAAc;IACrC,IAAI,MAAoC,CAAC;IACzC,IAAI,CAAC;QACH,MAAM,GAAG,SAAS,CAAC;YACjB,IAAI;YACJ,gBAAgB,EAAE,IAAI;YACtB,MAAM,EAAE,IAAI;YACZ,OAAO,EAAE,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;SACxG,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,IAAI,UAAU,CAAC,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC;IAClF,CAAC;IACD,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,CAAC;IACvC,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC;IAC1D,8HAA8H;IAC9H,MAAM,CAAC,KAAK,GAAG,EAAE,EAAE,MAAM,GAAG,EAAE,CAAC,GAAG,WAAW,CAAC;IAC9C,MAAM,CAAC,EAAE,EAAE,GAAG,CAAC,GAAG,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAC7G,MAAM,MAAM,GAAG,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC7E,IAAI,MAAM,KAAK,EAAE;QAAE,MAAM,IAAI,UAAU,CAAC,gEAAgE,KAAK,EAAE,CAAC,CAAC;IACjH,OAAO,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,KAAK,IAAI,EAAE,GAAG,EAAE,OAAO,MAAM,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC;AAC3H,CAAC;AAED,0HAA0H;AAC1H,SAAS,oBAAoB,CAAC,CAAY;IACxC,MAAM,KAAK,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;IAChC,IAAI,KAAK,CAAC,EAAE;QAAE,OAAO,KAAK,CAAC;IAC3B,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;IACzC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,cAAc,YAAY,CAAC,CAAC;IACxD,aAAa,CAAC,GAAG,EAAE,iBAAiB,CAAC,EAAE,GAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAA6B,EAAE,QAAQ,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAC5H,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACtB,OAAO,IAAI,CAAC;AACd,CAAC;AAED,4EAA4E;AAC5E,MAAM,CAAC,MAAM,MAAM,GAAY;IAC7B,IAAI,EAAE,QAAQ;IACd,OAAO,EAAE,+DAA+D;IACxE,WAAW,EAAE,IAAI;IACjB,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,CAChB,OAAO,CAAC,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,IAAI,EAAE;QAC3C,MAAM,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;QACnE,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,GAAG,CAAC,CAAC;QACvC,MAAM,GAAG,GAAG,kBAAkB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAC9C,MAAM,CAAC,GAAG,cAAc,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QACrF,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QAC/C,IAAI,CAAC;YACH,OAAO,MAAM,UAAU,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;QAChF,CAAC;gBAAS,CAAC;YACT,MAAM,cAAc,CAAC,IAAI,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC,CAAC;CACL,CAAC;AAEF,0DAA0D;AAC1D,MAAM,UAAU,UAAU,CAAC,CAA2J;IACpL,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC;AAClC,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,IAAkB,EAAE,CAAwB,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAA0E;IAC/K,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,gCAAgC;IAEvF,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,SAAS,EAAE,CAAC,CAAC;IACxD,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI;QAAE,EAAE,CAAC,GAAG,CAAC,SAAS,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC;IAC3D,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,EAAE,KAAK,IAAI,EAAE;QAC1D,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACvC,MAAM,KAAK,GAAG,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;QACjD,MAAM,CAAC,GAAG,SAAS,CAAC,EAAE,SAAS,EAAE,CAAc,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,aAAa,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,CAAC;QACtI,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7B,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC;IACtB,CAAC,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,oBAAoB,CAAC,CAAc,CAAC,CAAC;IAEpD,IAAI,IAAI,EAAE,CAAC;QACT,EAAE,CAAC,GAAG,CACJ,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,EAAE,EAAE,WAAW,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,CAAC,KAAK,CAAC,WAAW,EAAE,WAAW,EAAE,GAAG,CAAC,KAAK,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,oBAAoB,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAC5N,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,EAAE,CAAC,GAAG,CACJ;YACE,YAAY,EAAE,OAAO,OAAO,eAAe,IAAI,CAAC,QAAQ,CAAC,QAAQ,IAAI;YACrE,mBAAmB,GAAG,CAAC,KAAK,CAAC,WAAW,EAAE;YAC1C,mBAAmB,GAAG,CAAC,KAAK,CAAC,WAAW,EAAE;YAC1C,aAAa,MAAM,EAAE;YACrB,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,cAAc,oCAAoC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC5E,EAAE;SACH,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;IACJ,CAAC;IACD,OAAO,CAAC,CAAC;AAEX,CAAC"}
|
package/dist/commands/status.js
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { guarded, parseEnvArgs, usage } from "../env-args.js";
|
|
2
2
|
import { loadProject, resolveEnvironment } from "../project.js";
|
|
3
|
-
import {
|
|
4
|
-
import { closeVersioned, migrationsDir, openVersioned, renderStatus, statusJson, statusReport } from "../versioned/index.js";
|
|
3
|
+
import { closeVersioned, openVersioned, readChain, renderStatus, statusJson, statusReport } from "../versioned/index.js";
|
|
5
4
|
/** Exit code: migrations are pending, and nothing is wrong. */
|
|
6
5
|
export const STATUS_PENDING = 3;
|
|
7
6
|
/** Exit code: a checksum mismatch, an applied migration gone from the directory, or an out-of-order migration. */
|
|
@@ -10,11 +9,12 @@ const help = `${usage("status")}
|
|
|
10
9
|
|
|
11
10
|
Lists the environment's migrations against its history table
|
|
12
11
|
(yodel.config.ts history.database, else YODEL_HISTORY_DATABASE, default
|
|
13
|
-
yodeler) and its topology: applied, pending, out of order (pending, but
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
12
|
+
yodeler) and its topology: applied, pending, out of order (pending, but
|
|
13
|
+
before an applied migration in the chain), failed part way (with the
|
|
14
|
+
statement it resumes at), and checksum mismatches (an applied migration
|
|
15
|
+
whose files changed, or that is gone from the directory). When yodel apply
|
|
16
|
+
would run, prints the plan digest it would ask approval for. Reads only;
|
|
17
|
+
takes no lock.
|
|
18
18
|
|
|
19
19
|
Options:
|
|
20
20
|
--json print the status as JSON
|
|
@@ -23,11 +23,11 @@ Options:
|
|
|
23
23
|
Exit codes:
|
|
24
24
|
0 every migration is applied
|
|
25
25
|
3 migrations are pending (failed part way included), and nothing is wrong
|
|
26
|
-
4 a checksum mismatch, an applied migration gone from the directory,
|
|
27
|
-
out-of-order migration (apply refuses it without --allow-out-of-order)
|
|
26
|
+
4 a checksum mismatch, an applied migration gone from the directory, an
|
|
27
|
+
out-of-order migration (apply refuses it without --allow-out-of-order),
|
|
28
|
+
or a fork or another problem in the migrations directory
|
|
28
29
|
2 a pending migration has a manual step or an Op step yodel apply does not run
|
|
29
|
-
1 the status could not be read: a bad config, a
|
|
30
|
-
directory, a server that does not answer
|
|
30
|
+
1 the status could not be read: a bad config, a server that does not answer
|
|
31
31
|
`;
|
|
32
32
|
/** `yodel status <env>`; the exit codes are in `help`. */
|
|
33
33
|
export const status = {
|
|
@@ -38,7 +38,7 @@ export const status = {
|
|
|
38
38
|
const { env: name, json, dir } = parseEnvArgs("status", args);
|
|
39
39
|
const project = await loadProject(dir);
|
|
40
40
|
const env = resolveEnvironment(project, name);
|
|
41
|
-
const ordered =
|
|
41
|
+
const ordered = readChain(project);
|
|
42
42
|
const venv = await openVersioned(project, env);
|
|
43
43
|
const report = await statusReport(venv, ordered, { sync: false }).finally(() => closeVersioned(venv));
|
|
44
44
|
if (json)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,SAAS,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAEzH,+DAA+D;AAC/D,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC;AAChC,kHAAkH;AAClH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC;AAEhC,MAAM,IAAI,GAAG,GAAG,KAAK,CAAC,QAAQ,CAAC;;;;;;;;;;;;;;;;;;;;;;;CAuB9B,CAAC;AAEF,0DAA0D;AAC1D,MAAM,CAAC,MAAM,MAAM,GAAY;IAC7B,IAAI,EAAE,QAAQ;IACd,OAAO,EAAE,mDAAmD;IAC5D,WAAW,EAAE,IAAI;IACjB,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,CAChB,OAAO,CAAC,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,IAAI,EAAE;QAC3C,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,YAAY,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAC9D,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,GAAG,CAAC,CAAC;QACvC,MAAM,GAAG,GAAG,kBAAkB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAC9C,MAAM,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;QACnC,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QAC/C,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC;QACtG,IAAI,IAAI;YAAE,EAAE,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QACrE,4EAA4E;;YACvE,EAAE,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;QAC7D,IAAI,MAAM,CAAC,OAAO;YAAE,OAAO,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC;QACnD,OAAO,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/D,CAAC,CAAC;CACL,CAAC"}
|
package/dist/config/define.d.ts
CHANGED
|
@@ -10,12 +10,13 @@
|
|
|
10
10
|
* export default defineConfig({
|
|
11
11
|
* environments: {
|
|
12
12
|
* dev: { topology: "single" },
|
|
13
|
-
* prod: { topology: "cluster:main", history: { database: "yodeler" }, lockTtl: 1800 },
|
|
13
|
+
* prod: { topology: "cluster:main", history: { database: "yodeler" }, lockTtl: 1800, lockWait: 600 },
|
|
14
14
|
* },
|
|
15
15
|
* });
|
|
16
16
|
* ```
|
|
17
17
|
*/
|
|
18
18
|
import type { Topology } from "@intentius/chant-lexicon-sql/clickhouse/topology";
|
|
19
|
+
import type { LevelSetting, LintRuleId } from "../lint/rules.js";
|
|
19
20
|
export type { Topology };
|
|
20
21
|
/**
|
|
21
22
|
* A ClickHouse topology in its string form (`single`, `cluster:<name>`,
|
|
@@ -39,12 +40,109 @@ export interface EnvironmentConfig {
|
|
|
39
40
|
};
|
|
40
41
|
/** The apply lock's TTL, in seconds. Default: `YODEL_LOCK_TTL`, then 900. */
|
|
41
42
|
lockTtl?: number;
|
|
43
|
+
/**
|
|
44
|
+
* How long, in seconds, an apply waits for the lock another apply holds
|
|
45
|
+
* before it gives up (exit 5). `yodel apply --lock-wait` overrides it.
|
|
46
|
+
* Default: `YODEL_LOCK_WAIT`, then 0 (give up at once).
|
|
47
|
+
*/
|
|
48
|
+
lockWait?: number;
|
|
42
49
|
}
|
|
43
50
|
export interface YodelConfig {
|
|
44
51
|
/** Keyed by the environment's name in `sql.profiles`. */
|
|
45
52
|
environments?: Record<string, EnvironmentConfig>;
|
|
46
|
-
/**
|
|
47
|
-
lint?:
|
|
53
|
+
/** `yodel lint`'s rule levels: `{ rules: { destructive: "warning" } }`. A misspelled rule name is a type error. */
|
|
54
|
+
lint?: LintConfig;
|
|
55
|
+
/** Rules over the plan (#53) that `yodel plan` reports and `yodel apply` enforces; see {@link PolicyConfig}. */
|
|
56
|
+
policy?: PolicyConfig;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Rules over the versioned plan (#53). `yodel plan` shows each rule's
|
|
60
|
+
* outcome, and `yodel apply` refuses (exit 4) a plan a rule denies, unless
|
|
61
|
+
* someone {@link PolicyConfig.overriders} lists recorded an override of that
|
|
62
|
+
* rule for exactly that plan digest (`yodel override <env> --rule <id>
|
|
63
|
+
* --reason <text>`).
|
|
64
|
+
*
|
|
65
|
+
* ```ts
|
|
66
|
+
* policy: {
|
|
67
|
+
* overriders: ["alice", "bob"],
|
|
68
|
+
* rules: [
|
|
69
|
+
* { id: "no-drops-in-prod", environments: ["prod"], refuse: { classes: ["drop"], destructive: true } },
|
|
70
|
+
* { id: "silences-cite-a-ticket", silences: { reason: /\b[A-Z]+-\d+\b/ } },
|
|
71
|
+
* { id: "no-rebuilds-in-hours", environments: ["prod"], check: (plan) => {
|
|
72
|
+
* const hour = new Date(plan.now).getUTCHours();
|
|
73
|
+
* const rebuilds = plan.pending.flatMap((m) => m.steps.filter((s) => s.classes.includes("rebuild")));
|
|
74
|
+
* return hour >= 8 && hour < 18 && rebuilds.length > 0 ? "a rebuild between 08:00 and 18:00 UTC" : undefined;
|
|
75
|
+
* } },
|
|
76
|
+
* ],
|
|
77
|
+
* }
|
|
78
|
+
* ```
|
|
79
|
+
*/
|
|
80
|
+
export interface PolicyConfig {
|
|
81
|
+
rules: PolicyRule[];
|
|
82
|
+
/** Who may override a rule: an override recorded by anyone else does not count. None listed, no override counts. */
|
|
83
|
+
overriders?: string[];
|
|
84
|
+
}
|
|
85
|
+
/** One rule. It denies the plan when any of `refuse`, `silences` or `check` does. */
|
|
86
|
+
export interface PolicyRule {
|
|
87
|
+
/** Names it in output, in the refusal and in `yodel override --rule`: lowercase letters, digits, `-` and `_`. */
|
|
88
|
+
id: string;
|
|
89
|
+
description?: string;
|
|
90
|
+
/** The environments it applies to. Default: every one. */
|
|
91
|
+
environments?: string[];
|
|
92
|
+
/** Denies a pending step of one of these classes (`drop`, `rebuild`, `rewrite`, ...), or a destructive one when `destructive` is true. */
|
|
93
|
+
refuse?: {
|
|
94
|
+
classes?: string[];
|
|
95
|
+
destructive?: boolean;
|
|
96
|
+
};
|
|
97
|
+
/** Denies a `-- yodel:allow` silence (of one of `rules`, default any) whose reason does not match `reason`. */
|
|
98
|
+
silences?: {
|
|
99
|
+
rules?: string[];
|
|
100
|
+
reason: RegExp;
|
|
101
|
+
};
|
|
102
|
+
/** A predicate over the plan: a message (or several) or `false` denies it; `undefined`, `true` or `[]` allows it. */
|
|
103
|
+
check?: (plan: PolicyPlan) => string | string[] | boolean | undefined;
|
|
104
|
+
}
|
|
105
|
+
/** What a policy rule sees: the plan `yodel apply` would run. Plain JSON. */
|
|
106
|
+
export interface PolicyPlan {
|
|
107
|
+
environment: string;
|
|
108
|
+
dialect: "clickhouse" | "postgres";
|
|
109
|
+
/** When the plan is evaluated, ISO 8601 in UTC. */
|
|
110
|
+
now: string;
|
|
111
|
+
/** The migrations the run would apply, in order. */
|
|
112
|
+
pending: PolicyMigration[];
|
|
113
|
+
}
|
|
114
|
+
export interface PolicyMigration {
|
|
115
|
+
id: string;
|
|
116
|
+
checksum: string;
|
|
117
|
+
outOfOrder: boolean;
|
|
118
|
+
steps: PolicyStep[];
|
|
119
|
+
/** Its `-- yodel:allow` silences. */
|
|
120
|
+
silences: Array<{
|
|
121
|
+
step: number;
|
|
122
|
+
rule: string;
|
|
123
|
+
reason: string;
|
|
124
|
+
}>;
|
|
125
|
+
}
|
|
126
|
+
export interface PolicyStep {
|
|
127
|
+
index: number;
|
|
128
|
+
kind: "statement" | "op" | "manual";
|
|
129
|
+
object: string;
|
|
130
|
+
name: string;
|
|
131
|
+
/** A statement's class, or every class an Op or manual step's changes have. */
|
|
132
|
+
classes: string[];
|
|
133
|
+
destructive: boolean;
|
|
134
|
+
/** The rules that classified it. */
|
|
135
|
+
rules: string[];
|
|
136
|
+
/** A statement's SQL. */
|
|
137
|
+
sql?: string;
|
|
138
|
+
/** An Op step's Op. */
|
|
139
|
+
op?: string;
|
|
140
|
+
}
|
|
141
|
+
/** The rules `lint.rules` can set: every lint rule, and the replay check's. */
|
|
142
|
+
export type LintRuleName = LintRuleId | "replay";
|
|
143
|
+
export interface LintConfig {
|
|
144
|
+
/** Each rule's level. The integrity rules (fork, directory, checksum, unreadable-object) are always errors. */
|
|
145
|
+
rules?: Partial<Record<LintRuleName, LevelSetting>>;
|
|
48
146
|
}
|
|
49
147
|
/** Returns `config` as is; it types the default export of `yodel.config.ts`. */
|
|
50
148
|
export declare const defineConfig: (config: YodelConfig) => YodelConfig;
|
package/dist/config/define.js
CHANGED
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
* export default defineConfig({
|
|
11
11
|
* environments: {
|
|
12
12
|
* dev: { topology: "single" },
|
|
13
|
-
* prod: { topology: "cluster:main", history: { database: "yodeler" }, lockTtl: 1800 },
|
|
13
|
+
* prod: { topology: "cluster:main", history: { database: "yodeler" }, lockTtl: 1800, lockWait: 600 },
|
|
14
14
|
* },
|
|
15
15
|
* });
|
|
16
16
|
* ```
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"define.js","sourceRoot":"","sources":["../../src/config/define.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;
|
|
1
|
+
{"version":3,"file":"define.js","sourceRoot":"","sources":["../../src/config/define.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAsIH,gFAAgF;AAChF,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,MAAmB,EAAe,EAAE,CAAC,MAAM,CAAC"}
|
package/dist/config/load.js
CHANGED
|
@@ -39,8 +39,8 @@ function checkEnvironment(value, where) {
|
|
|
39
39
|
if (!isRecord(value))
|
|
40
40
|
throw new YodelError(`${where}: expected an object`);
|
|
41
41
|
for (const k of Object.keys(value)) {
|
|
42
|
-
if (!["topology", "history", "lockTtl"].includes(k))
|
|
43
|
-
throw new YodelError(`${where}.${k}: unknown setting (expected topology, history, lockTtl)`);
|
|
42
|
+
if (!["topology", "history", "lockTtl", "lockWait"].includes(k))
|
|
43
|
+
throw new YodelError(`${where}.${k}: unknown setting (expected topology, history, lockTtl, lockWait)`);
|
|
44
44
|
}
|
|
45
45
|
if (value.topology !== undefined)
|
|
46
46
|
checkTopology(value.topology, `${where}.topology`);
|
|
@@ -57,8 +57,66 @@ function checkEnvironment(value, where) {
|
|
|
57
57
|
if (value.lockTtl !== undefined && !(typeof value.lockTtl === "number" && Number.isFinite(value.lockTtl) && value.lockTtl > 0)) {
|
|
58
58
|
throw new YodelError(`${where}.lockTtl: expected a number of seconds greater than 0`);
|
|
59
59
|
}
|
|
60
|
+
if (value.lockWait !== undefined && !(typeof value.lockWait === "number" && Number.isFinite(value.lockWait) && value.lockWait >= 0)) {
|
|
61
|
+
throw new YodelError(`${where}.lockWait: expected a number of seconds, 0 or more`);
|
|
62
|
+
}
|
|
60
63
|
return value;
|
|
61
64
|
}
|
|
65
|
+
const RULE_ID = /^[a-z0-9][a-z0-9_-]*$/;
|
|
66
|
+
function checkPolicy(value, where, profiles) {
|
|
67
|
+
if (!isRecord(value))
|
|
68
|
+
throw new YodelError(`${where}: expected { rules: [...], overriders?: [...] }`);
|
|
69
|
+
for (const k of Object.keys(value))
|
|
70
|
+
if (k !== "rules" && k !== "overriders")
|
|
71
|
+
throw new YodelError(`${where}.${k}: unknown setting (expected rules, overriders)`);
|
|
72
|
+
if (value.overriders !== undefined && !(Array.isArray(value.overriders) && value.overriders.every((o) => typeof o === "string" && o !== ""))) {
|
|
73
|
+
throw new YodelError(`${where}.overriders: expected a list of names`);
|
|
74
|
+
}
|
|
75
|
+
if (!Array.isArray(value.rules))
|
|
76
|
+
throw new YodelError(`${where}.rules: expected a list of rules`);
|
|
77
|
+
const seen = new Set();
|
|
78
|
+
for (const [i, rule] of value.rules.entries()) {
|
|
79
|
+
const at = `${where}.rules[${String(i)}]`;
|
|
80
|
+
if (!isRecord(rule))
|
|
81
|
+
throw new YodelError(`${at}: expected an object`);
|
|
82
|
+
for (const k of Object.keys(rule)) {
|
|
83
|
+
if (!["id", "description", "environments", "refuse", "silences", "check"].includes(k))
|
|
84
|
+
throw new YodelError(`${at}.${k}: unknown setting (expected id, description, environments, refuse, silences, check)`);
|
|
85
|
+
}
|
|
86
|
+
if (typeof rule.id !== "string" || !RULE_ID.test(rule.id))
|
|
87
|
+
throw new YodelError(`${at}.id: lowercase letters, digits, - and _, got ${JSON.stringify(rule.id)}`);
|
|
88
|
+
if (seen.has(rule.id))
|
|
89
|
+
throw new YodelError(`${at}.id: two rules are named ${rule.id}`);
|
|
90
|
+
seen.add(rule.id);
|
|
91
|
+
if (rule.environments !== undefined) {
|
|
92
|
+
if (!Array.isArray(rule.environments) || !rule.environments.every((e) => typeof e === "string"))
|
|
93
|
+
throw new YodelError(`${at}.environments: expected a list of environment names`);
|
|
94
|
+
const unknown = profiles ? rule.environments.filter((e) => !profiles.includes(e)) : [];
|
|
95
|
+
if (unknown.length > 0)
|
|
96
|
+
throw new YodelError(`${at}.environments: ${unknown.join(", ")} ${unknown.length === 1 ? "is not an environment" : "are not environments"} chant.config.ts declares`);
|
|
97
|
+
}
|
|
98
|
+
if (rule.refuse === undefined && rule.silences === undefined && rule.check === undefined)
|
|
99
|
+
throw new YodelError(`${at}: a rule needs refuse, silences or check`);
|
|
100
|
+
if (rule.refuse !== undefined) {
|
|
101
|
+
const r = rule.refuse;
|
|
102
|
+
if (!isRecord(r) || Object.keys(r).some((k) => k !== "classes" && k !== "destructive"))
|
|
103
|
+
throw new YodelError(`${at}.refuse: expected { classes?: [...], destructive?: true }`);
|
|
104
|
+
if (r.classes !== undefined && !(Array.isArray(r.classes) && r.classes.every((c) => typeof c === "string")))
|
|
105
|
+
throw new YodelError(`${at}.refuse.classes: expected a list of classes`);
|
|
106
|
+
if (r.destructive !== undefined && typeof r.destructive !== "boolean")
|
|
107
|
+
throw new YodelError(`${at}.refuse.destructive: expected true or false`);
|
|
108
|
+
}
|
|
109
|
+
if (rule.silences !== undefined) {
|
|
110
|
+
const s = rule.silences;
|
|
111
|
+
if (!isRecord(s) || !(s.reason instanceof RegExp) || Object.keys(s).some((k) => k !== "rules" && k !== "reason"))
|
|
112
|
+
throw new YodelError(`${at}.silences: expected { reason: /pattern/, rules?: [...] }`);
|
|
113
|
+
if (s.rules !== undefined && !(Array.isArray(s.rules) && s.rules.every((x) => typeof x === "string")))
|
|
114
|
+
throw new YodelError(`${at}.silences.rules: expected a list of lint rules`);
|
|
115
|
+
}
|
|
116
|
+
if (rule.check !== undefined && typeof rule.check !== "function")
|
|
117
|
+
throw new YodelError(`${at}.check: expected a function of the plan`);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
62
120
|
/**
|
|
63
121
|
* Checks a loaded config's shape. `environments` names each environment by
|
|
64
122
|
* its `sql.profiles` name; one that chant.config.ts does not declare is an
|
|
@@ -68,9 +126,11 @@ export function checkYodelConfig(value, path, profiles) {
|
|
|
68
126
|
if (!isRecord(value))
|
|
69
127
|
throw new YodelError(`${path}: the default export must be a config object (export default defineConfig({ ... }))`);
|
|
70
128
|
for (const k of Object.keys(value)) {
|
|
71
|
-
if (k !== "environments" && k !== "lint")
|
|
72
|
-
throw new YodelError(`${path}: unknown setting ${k} (expected environments, lint)`);
|
|
129
|
+
if (k !== "environments" && k !== "lint" && k !== "policy")
|
|
130
|
+
throw new YodelError(`${path}: unknown setting ${k} (expected environments, lint, policy)`);
|
|
73
131
|
}
|
|
132
|
+
if (value.policy !== undefined)
|
|
133
|
+
checkPolicy(value.policy, `${path}: policy`, profiles);
|
|
74
134
|
if (value.lint !== undefined && !isRecord(value.lint))
|
|
75
135
|
throw new YodelError(`${path}: lint: expected an object`);
|
|
76
136
|
if (value.environments !== undefined) {
|
package/dist/config/load.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"load.js","sourceRoot":"","sources":["../../src/config/load.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"load.js","sourceRoot":"","sources":["../../src/config/load.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,6 +7,9 @@
|
|
|
7
7
|
* | topology | `environments.<env>.topology` | `sql.profiles.<env>.topology` | `YODEL_TOPOLOGY` | `single` |
|
|
8
8
|
* | history database | `environments.<env>.history.database` | | `YODEL_HISTORY_DATABASE`| `yodeler`|
|
|
9
9
|
* | lock TTL | `environments.<env>.lockTtl` (seconds) | | `YODEL_LOCK_TTL` | 900 |
|
|
10
|
+
* | lock wait | `environments.<env>.lockWait` (seconds)| | `YODEL_LOCK_WAIT` | 0 |
|
|
11
|
+
*
|
|
12
|
+
* `yodel apply --lock-wait <duration>` sets the lock wait over all three.
|
|
10
13
|
*/
|
|
11
14
|
import { type Topology } from "@intentius/chant-lexicon-sql/clickhouse/topology";
|
|
12
15
|
import type { HistoryTopology } from "../history/topology.js";
|
|
@@ -24,7 +27,16 @@ export interface EnvironmentSettings {
|
|
|
24
27
|
historyTopology: HistoryTopology;
|
|
25
28
|
historyDatabase: string;
|
|
26
29
|
lockTtlMs: number;
|
|
30
|
+
/** How long an apply waits for a lock another apply holds; 0 gives up at once (exit 5). */
|
|
31
|
+
lockWaitMs: number;
|
|
27
32
|
}
|
|
33
|
+
/** The variable that sets the lock wait (a duration, as {@link parseDuration} reads it). */
|
|
34
|
+
export declare const LOCK_WAIT_ENV = "YODEL_LOCK_WAIT";
|
|
35
|
+
/**
|
|
36
|
+
* A duration in milliseconds: `90` (seconds), `500ms`, `30s`, `10m`, `1h`,
|
|
37
|
+
* or a sum of them (`1m30s`). `what` names it in the error.
|
|
38
|
+
*/
|
|
39
|
+
export declare function parseDuration(text: string, what: string): number;
|
|
28
40
|
/** The topology the history's DDL is written for. */
|
|
29
41
|
export declare function historyTopologyOf(t: Topology): HistoryTopology;
|
|
30
42
|
/** The settings of environment `name`; see the module comment for the order. */
|
|
@@ -35,6 +47,7 @@ export declare const describeSettingsTopology: (s: Pick<EnvironmentSettings, "to
|
|
|
35
47
|
* The declarative path (`yodel plan`, `yodel apply` without migrations) runs
|
|
36
48
|
* chant's planner and applier, which render for `sql.profiles.<env>.topology`
|
|
37
49
|
* and do not read `yodel.config.ts`. A topology set only in yodel.config.ts
|
|
38
|
-
* would be ignored there, so it is refused unless chant's profile says the same
|
|
50
|
+
* would be ignored there, so it is refused unless chant's profile says the same
|
|
51
|
+
* (an unset profile topology is a single node, as chant renders it).
|
|
39
52
|
*/
|
|
40
53
|
export declare function declarativeTopologyRefusal(project: Pick<Project, "config" | "yodel">, name: string): YodelError | undefined;
|