@intentius/sql-yodeler 0.1.0 → 0.3.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 +28 -26
- 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/build.js +7 -0
- package/dist/chant/build.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/ci/render.d.ts +289 -0
- package/dist/ci/render.js +688 -0
- package/dist/ci/render.js.map +1 -0
- package/dist/ci/replay.d.ts +17 -0
- package/dist/ci/replay.js +69 -0
- package/dist/ci/replay.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.d.ts +113 -0
- package/dist/commands/apply.js +376 -49
- package/dist/commands/apply.js.map +1 -1
- package/dist/commands/approve.d.ts +5 -0
- package/dist/commands/approve.js +155 -0
- package/dist/commands/approve.js.map +1 -0
- package/dist/commands/checkpoint.d.ts +3 -0
- package/dist/commands/checkpoint.js +78 -0
- package/dist/commands/checkpoint.js.map +1 -0
- package/dist/commands/ci.d.ts +3 -0
- package/dist/commands/ci.js +118 -0
- package/dist/commands/ci.js.map +1 -0
- package/dist/commands/docs.d.ts +11 -0
- package/dist/commands/docs.js +108 -0
- package/dist/commands/docs.js.map +1 -0
- package/dist/commands/drift.d.ts +23 -0
- package/dist/commands/drift.js +263 -18
- package/dist/commands/drift.js.map +1 -1
- package/dist/commands/index.js +16 -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 +25 -8
- 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 +150 -0
- package/dist/commands/override.js.map +1 -0
- package/dist/commands/plan.js +43 -27
- 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/report.d.ts +13 -0
- package/dist/commands/report.js +121 -0
- package/dist/commands/report.js.map +1 -0
- package/dist/commands/revert.d.ts +20 -0
- package/dist/commands/revert.js +246 -0
- package/dist/commands/revert.js.map +1 -0
- package/dist/commands/status.js +44 -17
- package/dist/commands/status.js.map +1 -1
- package/dist/config/base.d.ts +69 -0
- package/dist/config/base.js +121 -0
- package/dist/config/base.js.map +1 -0
- package/dist/config/define.d.ts +223 -3
- package/dist/config/define.js +3 -1
- package/dist/config/define.js.map +1 -1
- package/dist/config/index.d.ts +2 -0
- package/dist/config/index.js +2 -0
- package/dist/config/index.js.map +1 -1
- package/dist/config/load.d.ts +1 -1
- package/dist/config/load.js +150 -5
- package/dist/config/load.js.map +1 -1
- package/dist/config/settings.d.ts +18 -2
- package/dist/config/settings.js +40 -6
- 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/history/postgres/ddl.d.ts +18 -0
- package/dist/history/postgres/ddl.js +27 -2
- package/dist/history/postgres/ddl.js.map +1 -1
- package/dist/history/postgres/store.d.ts +2 -0
- package/dist/history/postgres/store.js +7 -1
- package/dist/history/postgres/store.js.map +1 -1
- package/dist/history/rows.d.ts +16 -3
- package/dist/history/rows.js +30 -1
- package/dist/history/rows.js.map +1 -1
- package/dist/history/store.d.ts +2 -0
- package/dist/history/store.js +2 -2
- package/dist/history/store.js.map +1 -1
- package/dist/index.d.ts +4 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +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 +38 -4
- package/dist/lint/check.js.map +1 -1
- package/dist/lint/report.js +1 -1
- package/dist/lint/report.js.map +1 -1
- package/dist/lint/routines.d.ts +26 -0
- package/dist/lint/routines.js +65 -0
- package/dist/lint/routines.js.map +1 -0
- package/dist/lint/rules.d.ts +16 -4
- package/dist/lint/rules.js +9 -4
- package/dist/lint/rules.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/checkpoint.d.ts +45 -0
- package/dist/migrations/checkpoint.js +110 -0
- package/dist/migrations/checkpoint.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 +3 -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 +33 -0
- package/dist/migrations/document.js +2 -0
- package/dist/migrations/document.js.map +1 -1
- package/dist/migrations/index.d.ts +3 -0
- package/dist/migrations/index.js +3 -0
- package/dist/migrations/index.js.map +1 -1
- package/dist/migrations/routines.d.ts +31 -0
- package/dist/migrations/routines.js +55 -0
- package/dist/migrations/routines.js.map +1 -0
- package/dist/notify/index.d.ts +124 -0
- package/dist/notify/index.js +210 -0
- package/dist/notify/index.js.map +1 -0
- package/dist/notify/verify.d.ts +53 -0
- package/dist/notify/verify.js +71 -0
- package/dist/notify/verify.js.map +1 -0
- 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 +12 -1
- package/dist/pr/model.js +44 -6
- package/dist/pr/model.js.map +1 -1
- package/dist/pr/render.d.ts +3 -1
- package/dist/pr/render.js +63 -4
- package/dist/pr/render.js.map +1 -1
- package/dist/project.d.ts +19 -2
- package/dist/project.js +33 -1
- package/dist/project.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.d.ts +9 -1
- package/dist/replay/replay.js +63 -32
- package/dist/replay/replay.js.map +1 -1
- package/dist/replay/report.js +1 -1
- package/dist/replay/report.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/report/audit.d.ts +138 -0
- package/dist/report/audit.js +202 -0
- package/dist/report/audit.js.map +1 -0
- package/dist/report/jsonl.d.ts +21 -0
- package/dist/report/jsonl.js +52 -0
- package/dist/report/jsonl.js.map +1 -0
- package/dist/report/model.d.ts +68 -0
- package/dist/report/model.js +127 -0
- package/dist/report/model.js.map +1 -0
- package/dist/report/render.d.ts +18 -0
- package/dist/report/render.js +127 -0
- package/dist/report/render.js.map +1 -0
- package/dist/schema-docs/render.d.ts +49 -0
- package/dist/schema-docs/render.js +359 -0
- package/dist/schema-docs/render.js.map +1 -0
- package/dist/schemas.d.ts +37 -0
- package/dist/schemas.js +41 -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/sources/ddl.d.ts +53 -0
- package/dist/sources/ddl.js +347 -0
- package/dist/sources/ddl.js.map +1 -0
- package/dist/sources/index.d.ts +69 -0
- package/dist/sources/index.js +170 -0
- package/dist/sources/index.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/postgres-migration.d.ts +35 -25
- package/dist/steps/postgres-migration.js +42 -29
- package/dist/steps/postgres-migration.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/tenants/index.d.ts +40 -0
- package/dist/tenants/index.js +122 -0
- package/dist/tenants/index.js.map +1 -0
- package/dist/tenants/target.d.ts +23 -0
- package/dist/tenants/target.js +29 -0
- package/dist/tenants/target.js.map +1 -0
- 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 +61 -1
- package/dist/versioned/engine.js +109 -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 +10 -0
- package/dist/versioned/index.js +25 -1
- package/dist/versioned/index.js.map +1 -1
- package/dist/versioned/op.d.ts +16 -1
- package/dist/versioned/op.js +43 -6
- package/dist/versioned/op.js.map +1 -1
- package/dist/versioned/policy.d.ts +98 -0
- package/dist/versioned/policy.js +212 -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 +13 -1
- package/dist/versioned/report.js.map +1 -1
- package/dist/versioned/revert.d.ts +128 -0
- package/dist/versioned/revert.js +251 -0
- package/dist/versioned/revert.js.map +1 -0
- 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/dist/versioned/state.d.ts +25 -0
- package/dist/versioned/state.js +36 -3
- package/dist/versioned/state.js.map +1 -1
- package/dist/waves/index.d.ts +179 -0
- package/dist/waves/index.js +268 -0
- package/dist/waves/index.js.map +1 -0
- package/dist/waves/promotion.d.ts +56 -0
- package/dist/waves/promotion.js +108 -0
- package/dist/waves/promotion.js.map +1 -0
- package/dist/waves/record.d.ts +24 -0
- package/dist/waves/record.js +20 -0
- package/dist/waves/record.js.map +1 -0
- package/package.json +22 -8
- package/schemas/apply.schema.json +428 -0
- package/schemas/checkpoint.schema.json +19 -0
- package/schemas/common.schema.json +213 -0
- package/schemas/drift.schema.json +61 -0
- package/schemas/event.schema.json +36 -0
- package/schemas/init.schema.json +31 -0
- package/schemas/lint-rules.schema.json +54 -0
- package/schemas/lint.schema.json +294 -0
- package/schemas/mcp.schema.json +70 -0
- package/schemas/new.schema.json +71 -0
- package/schemas/plan.schema.json +489 -0
- package/schemas/rebase.schema.json +54 -0
- package/schemas/repair.schema.json +20 -0
- package/schemas/report.schema.json +114 -0
- package/schemas/revert.schema.json +69 -0
- package/schemas/status.schema.json +371 -0
package/dist/config/settings.js
CHANGED
|
@@ -7,12 +7,36 @@
|
|
|
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.
|
|
13
|
+
*
|
|
14
|
+
* A tenant (`<env>/<tenant>`, #56) has its environment's settings, its
|
|
15
|
+
* history database suffixed with `_<tenant>`.
|
|
10
16
|
*/
|
|
11
17
|
import { toTopology, topologyLabel } from "@intentius/chant-lexicon-sql/clickhouse/topology";
|
|
12
18
|
import { DEFAULT_HISTORY_DATABASE } from "../history/ddl.js";
|
|
13
19
|
import { DEFAULT_LOCK_TTL_MS } from "../history/lock.js";
|
|
14
20
|
import { YodelError } from "../project.js";
|
|
15
21
|
import { CONFIG_FILE } from "./load.js";
|
|
22
|
+
import { splitTarget } from "../tenants/target.js";
|
|
23
|
+
/** The variable that sets the lock wait (a duration, as {@link parseDuration} reads it). */
|
|
24
|
+
export const LOCK_WAIT_ENV = "YODEL_LOCK_WAIT";
|
|
25
|
+
const UNITS = { ms: 1, s: 1000, m: 60_000, h: 3_600_000 };
|
|
26
|
+
/**
|
|
27
|
+
* A duration in milliseconds: `90` (seconds), `500ms`, `30s`, `10m`, `1h`,
|
|
28
|
+
* or a sum of them (`1m30s`). `what` names it in the error.
|
|
29
|
+
*/
|
|
30
|
+
export function parseDuration(text, what) {
|
|
31
|
+
const t = text.trim();
|
|
32
|
+
if (/^\d+(\.\d+)?$/.test(t))
|
|
33
|
+
return Math.round(Number(t) * 1000);
|
|
34
|
+
const parts = [...t.matchAll(/(\d+(?:\.\d+)?)(ms|s|m|h)/g)];
|
|
35
|
+
if (t === "" || parts.map((m) => m[0]).join("") !== t) {
|
|
36
|
+
throw new YodelError(`${what} must be a duration such as 90 (seconds), 30s, 10m or 1h, got ${JSON.stringify(text)}`);
|
|
37
|
+
}
|
|
38
|
+
return Math.round(parts.reduce((sum, m) => sum + Number(m[1]) * (UNITS[m[2] ?? "s"] ?? 1000), 0));
|
|
39
|
+
}
|
|
16
40
|
function parse(value, where) {
|
|
17
41
|
try {
|
|
18
42
|
return toTopology(value);
|
|
@@ -26,7 +50,9 @@ export function historyTopologyOf(t) {
|
|
|
26
50
|
return t.kind === "cluster" ? { kind: "cluster", cluster: t.cluster } : t;
|
|
27
51
|
}
|
|
28
52
|
/** The settings of environment `name`; see the module comment for the order. */
|
|
29
|
-
export function environmentSettings(project,
|
|
53
|
+
export function environmentSettings(project, target, env = process.env) {
|
|
54
|
+
// A tenant, <env>/<tenant>, has its environment's settings, and a history of its own (#56).
|
|
55
|
+
const { env: name, tenant } = splitTarget(target);
|
|
30
56
|
const own = project.yodel?.config.environments?.[name];
|
|
31
57
|
const profile = project.config.sql?.profiles?.[name];
|
|
32
58
|
let topology;
|
|
@@ -56,12 +82,18 @@ export function environmentSettings(project, name, env = process.env) {
|
|
|
56
82
|
throw new YodelError(`YODEL_LOCK_TTL must be a number of seconds, got ${JSON.stringify(env.YODEL_LOCK_TTL)}`);
|
|
57
83
|
lockTtlMs = ttl * 1000;
|
|
58
84
|
}
|
|
85
|
+
let lockWaitMs = 0;
|
|
86
|
+
if (own?.lockWait !== undefined)
|
|
87
|
+
lockWaitMs = own.lockWait * 1000;
|
|
88
|
+
else if (env[LOCK_WAIT_ENV])
|
|
89
|
+
lockWaitMs = parseDuration(env[LOCK_WAIT_ENV], LOCK_WAIT_ENV);
|
|
59
90
|
return {
|
|
60
91
|
topology,
|
|
61
92
|
topologySource,
|
|
62
93
|
historyTopology: historyTopologyOf(topology),
|
|
63
|
-
historyDatabase: own?.history?.database ?? (env.YODEL_HISTORY_DATABASE || DEFAULT_HISTORY_DATABASE)
|
|
94
|
+
historyDatabase: `${own?.history?.database ?? (env.YODEL_HISTORY_DATABASE || DEFAULT_HISTORY_DATABASE)}${tenant !== undefined ? `_${tenant}` : ""}`,
|
|
64
95
|
lockTtlMs,
|
|
96
|
+
lockWaitMs,
|
|
65
97
|
};
|
|
66
98
|
}
|
|
67
99
|
/** `cluster:main (yodel.config.ts)`, for a report's header. */
|
|
@@ -70,7 +102,8 @@ export const describeSettingsTopology = (s) => `${topologyLabel(s.topology)} (${
|
|
|
70
102
|
* The declarative path (`yodel plan`, `yodel apply` without migrations) runs
|
|
71
103
|
* chant's planner and applier, which render for `sql.profiles.<env>.topology`
|
|
72
104
|
* and do not read `yodel.config.ts`. A topology set only in yodel.config.ts
|
|
73
|
-
* would be ignored there, so it is refused unless chant's profile says the same
|
|
105
|
+
* would be ignored there, so it is refused unless chant's profile says the same
|
|
106
|
+
* (an unset profile topology is a single node, as chant renders it).
|
|
74
107
|
*/
|
|
75
108
|
export function declarativeTopologyRefusal(project, name) {
|
|
76
109
|
const own = project.yodel?.config.environments?.[name]?.topology;
|
|
@@ -78,11 +111,12 @@ export function declarativeTopologyRefusal(project, name) {
|
|
|
78
111
|
return undefined;
|
|
79
112
|
const profile = project.config.sql?.profiles?.[name]?.topology;
|
|
80
113
|
const ours = parse(own, `${CONFIG_FILE}: environments.${name}.topology`);
|
|
81
|
-
|
|
82
|
-
|
|
114
|
+
// An unset profile topology is a single node to chant, so "single" in yodel.config.ts agrees with it (#25).
|
|
115
|
+
const chants = parse(profile ?? "single", `sql.profiles.${name}.topology`);
|
|
116
|
+
if (JSON.stringify(sorted(chants)) === JSON.stringify(sorted(ours)))
|
|
83
117
|
return undefined;
|
|
84
118
|
return new YodelError(`${CONFIG_FILE} sets environments.${name}.topology to ${topologyLabel(ours)}, but the declarative path plans and applies through chant, which reads sql.profiles.${name}.topology ` +
|
|
85
|
-
`(${
|
|
119
|
+
`(${profile === undefined ? "unset, so a single node" : topologyLabel(chants)}). Set sql.profiles.${name}.topology to the same in chant.config.ts, or leave the topology to chant.config.ts.`);
|
|
86
120
|
}
|
|
87
121
|
const sorted = (t) => Object.entries(t).sort(([a], [b]) => a.localeCompare(b));
|
|
88
122
|
//# sourceMappingURL=settings.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settings.js","sourceRoot":"","sources":["../../src/config/settings.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"settings.js","sourceRoot":"","sources":["../../src/config/settings.ts"],"names":[],"mappings":"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"}
|
package/dist/env-args.d.ts
CHANGED
|
@@ -16,3 +16,9 @@ export declare function usage(verb: string, extra?: readonly string[]): string;
|
|
|
16
16
|
* {@link YodelError} (or any error) into a message on stderr and its exit code.
|
|
17
17
|
*/
|
|
18
18
|
export declare function guarded(verb: string, io: Io, args: readonly string[], help: string, body: () => Promise<number>): Promise<number>;
|
|
19
|
+
/**
|
|
20
|
+
* Wraps each line of a help text longer than `width` columns, continuing
|
|
21
|
+
* where its text starts: after `usage: yodel <verb> `, in an option's or an
|
|
22
|
+
* exit code's description column, else at the line's own indent.
|
|
23
|
+
*/
|
|
24
|
+
export declare function formatHelp(text: string, width?: number): string;
|
package/dist/env-args.js
CHANGED
|
@@ -44,7 +44,7 @@ export function usage(verb, extra = []) {
|
|
|
44
44
|
*/
|
|
45
45
|
export async function guarded(verb, io, args, help, body) {
|
|
46
46
|
if (wantsHelp(args)) {
|
|
47
|
-
io.out(help);
|
|
47
|
+
io.out(formatHelp(help));
|
|
48
48
|
return 0;
|
|
49
49
|
}
|
|
50
50
|
try {
|
|
@@ -59,4 +59,34 @@ export async function guarded(verb, io, args, help, body) {
|
|
|
59
59
|
return 1;
|
|
60
60
|
}
|
|
61
61
|
}
|
|
62
|
+
/**
|
|
63
|
+
* Wraps each line of a help text longer than `width` columns, continuing
|
|
64
|
+
* where its text starts: after `usage: yodel <verb> `, in an option's or an
|
|
65
|
+
* exit code's description column, else at the line's own indent.
|
|
66
|
+
*/
|
|
67
|
+
export function formatHelp(text, width = 80) {
|
|
68
|
+
return text
|
|
69
|
+
.split("\n")
|
|
70
|
+
.map((line) => {
|
|
71
|
+
if (line.length <= width)
|
|
72
|
+
return line;
|
|
73
|
+
const usage = /^usage: yodel \S+ /.exec(line);
|
|
74
|
+
const column = /^(\s*(?:-\S.*?|\d)\s{2,})(?=\S)/.exec(line);
|
|
75
|
+
const indent = " ".repeat(usage ? usage[0].length : column ? (column[1] ?? "").length : (/^\s*/.exec(line)?.[0].length ?? 0));
|
|
76
|
+
const out = [];
|
|
77
|
+
let current = "";
|
|
78
|
+
for (const word of line.split(/(?<=\S) (?=\S)/)) {
|
|
79
|
+
if (current && current.length + 1 + word.length > width) {
|
|
80
|
+
out.push(current);
|
|
81
|
+
current = indent + word.trimStart();
|
|
82
|
+
}
|
|
83
|
+
else
|
|
84
|
+
current = current ? `${current} ${word}` : word;
|
|
85
|
+
}
|
|
86
|
+
if (current)
|
|
87
|
+
out.push(current);
|
|
88
|
+
return out.join("\n");
|
|
89
|
+
})
|
|
90
|
+
.join("\n");
|
|
91
|
+
}
|
|
62
92
|
//# sourceMappingURL=env-args.js.map
|
package/dist/env-args.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"env-args.js","sourceRoot":"","sources":["../src/env-args.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAW1C,uDAAuD;AACvD,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,IAAuB,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AAErG,MAAM,UAAU,YAAY,CAAC,IAAY,EAAE,IAAc,EAAE,QAA2B,EAAE;IACtF,IAAI,MAAoC,CAAC;IACzC,IAAI,CAAC;QACH,MAAM,GAAG,SAAS,CAAC;YACjB,IAAI;YACJ,gBAAgB,EAAE,IAAI;YACtB,MAAM,EAAE,IAAI;YACZ,OAAO,EAAE;gBACP,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;gBACzB,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE;gBACnC,GAAG,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,QAAiB,EAAE,CAAC,CAAC,CAAC;aAChF;SACF,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,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;IAC/F,CAAC;IACD,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,CAAC;IACvC,MAAM,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,WAAW,CAAC;IACnC,IAAI,GAAG,KAAK,SAAS,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;QAAE,MAAM,IAAI,UAAU,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;IACnF,MAAM,OAAO,GAAuC,EAAE,CAAC;IACvD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;QACvB,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACxD,CAAC;IACD,OAAO;QACL,GAAG;QACH,IAAI,EAAE,MAAM,CAAC,IAAI,KAAK,IAAI;QAC1B,GAAG,EAAE,OAAO,MAAM,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE;QAChE,OAAO;KACR,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,KAAK,CAAC,IAAY,EAAE,QAA2B,EAAE;IAC/D,OAAO,gBAAgB,IAAI,oCAAoC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;AACjH,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,IAAY,EAAE,EAAM,EAAE,IAAuB,EAAE,IAAY,EAAE,IAA2B;IACpH,IAAI,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;QACpB,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"env-args.js","sourceRoot":"","sources":["../src/env-args.ts"],"names":[],"mappings":"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"}
|
package/dist/exit.d.ts
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* yodel's exit codes (#13). Every command uses them with these meanings;
|
|
3
|
+
* each command's `--help` lists the ones it can return. `yodel --help` and
|
|
4
|
+
* docs/README.md print {@link EXIT_CODES}, and test/exit-codes.test.ts
|
|
5
|
+
* keeps them in agreement.
|
|
6
|
+
*/
|
|
7
|
+
export declare const EXIT_OK = 0;
|
|
8
|
+
export declare const EXIT_ERROR = 1;
|
|
9
|
+
/** Something yodel will not do itself; drift found, for `yodel drift`. */
|
|
10
|
+
export declare const EXIT_NEEDS_OP = 2;
|
|
11
|
+
/** Something outstanding: an approval, pending migrations, lint errors. */
|
|
12
|
+
export declare const EXIT_OUTSTANDING = 3;
|
|
13
|
+
/** Refused, nothing done. */
|
|
14
|
+
export declare const EXIT_REFUSED = 4;
|
|
15
|
+
/** Another apply holds the lock. */
|
|
16
|
+
export declare const EXIT_LOCKED = 5;
|
|
17
|
+
/** Each code and what it means, one line each. */
|
|
18
|
+
export declare const EXIT_CODES: ReadonlyArray<readonly [number, string]>;
|
|
19
|
+
/** Why `yodel plan` exits 0 with pending migrations, where `yodel status` exits 3. */
|
|
20
|
+
export declare const PLAN_PENDING_NOTE = "yodel plan exits 0 when migrations are pending: it reports, and a CI job that posts the plan on a pull request should not fail because the pull request adds a migration. To gate on pending migrations, use yodel status.";
|
package/dist/exit.js
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* yodel's exit codes (#13). Every command uses them with these meanings;
|
|
3
|
+
* each command's `--help` lists the ones it can return. `yodel --help` and
|
|
4
|
+
* docs/README.md print {@link EXIT_CODES}, and test/exit-codes.test.ts
|
|
5
|
+
* keeps them in agreement.
|
|
6
|
+
*/
|
|
7
|
+
export const EXIT_OK = 0;
|
|
8
|
+
export const EXIT_ERROR = 1;
|
|
9
|
+
/** Something yodel will not do itself; drift found, for `yodel drift`. */
|
|
10
|
+
export const EXIT_NEEDS_OP = 2;
|
|
11
|
+
/** Something outstanding: an approval, pending migrations, lint errors. */
|
|
12
|
+
export const EXIT_OUTSTANDING = 3;
|
|
13
|
+
/** Refused, nothing done. */
|
|
14
|
+
export const EXIT_REFUSED = 4;
|
|
15
|
+
/** Another apply holds the lock. */
|
|
16
|
+
export const EXIT_LOCKED = 5;
|
|
17
|
+
/** Each code and what it means, one line each. */
|
|
18
|
+
export const EXIT_CODES = [
|
|
19
|
+
[EXIT_OK, "done, or nothing to do"],
|
|
20
|
+
[EXIT_ERROR, "an error"],
|
|
21
|
+
[EXIT_NEEDS_OP, "something yodel will not do itself (a change that needs an Op it does not run, a manual step); for yodel drift, drift found"],
|
|
22
|
+
[EXIT_OUTSTANDING, "something outstanding: apply stopped at its approval gate, status found pending migrations, lint found errors"],
|
|
23
|
+
[EXIT_REFUSED, "refused, nothing done: a checksum mismatch, an applied migration gone from the directory, an out-of-order migration, a fork or another problem in the migrations directory, a migration the environment it must run on first has not applied"],
|
|
24
|
+
[EXIT_LOCKED, "another apply holds the lock"],
|
|
25
|
+
];
|
|
26
|
+
/** Why `yodel plan` exits 0 with pending migrations, where `yodel status` exits 3. */
|
|
27
|
+
export const PLAN_PENDING_NOTE = "yodel plan exits 0 when migrations are pending: it reports, and a CI job that posts the plan on a pull request should not fail because the pull request adds a migration. To gate on pending migrations, use yodel status.";
|
|
28
|
+
//# sourceMappingURL=exit.js.map
|
package/dist/exit.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exit.js","sourceRoot":"","sources":["../src/exit.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,CAAC;AACzB,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,CAAC;AAC5B,0EAA0E;AAC1E,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,CAAC;AAC/B,2EAA2E;AAC3E,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAClC,6BAA6B;AAC7B,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAC;AAC9B,oCAAoC;AACpC,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,CAAC;AAE7B,kDAAkD;AAClD,MAAM,CAAC,MAAM,UAAU,GAA6C;IAClE,CAAC,OAAO,EAAE,wBAAwB,CAAC;IACnC,CAAC,UAAU,EAAE,UAAU,CAAC;IACxB,CAAC,aAAa,EAAE,6HAA6H,CAAC;IAC9I,CAAC,gBAAgB,EAAE,+GAA+G,CAAC;IACnI,CAAC,YAAY,EAAE,8OAA8O,CAAC;IAC9P,CAAC,WAAW,EAAE,8BAA8B,CAAC;CAC9C,CAAC;AAEF,sFAAsF;AACtF,MAAM,CAAC,MAAM,iBAAiB,GAC5B,4NAA4N,CAAC"}
|
package/dist/history/client.d.ts
CHANGED
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
* the unit tests.
|
|
5
5
|
*/
|
|
6
6
|
import type { ClickHouseEndpoint } from "@intentius/chant-lexicon-sql/clickhouse/http";
|
|
7
|
+
import { YodelError } from "../project.js";
|
|
7
8
|
export interface QueryOptions {
|
|
8
9
|
/** Server settings for this query alone. `database` sets the default database. */
|
|
9
10
|
settings?: Record<string, string>;
|
|
@@ -13,5 +14,12 @@ export interface ClickHousePort {
|
|
|
13
14
|
}
|
|
14
15
|
/** A port over chant's ClickHouse HTTP client. */
|
|
15
16
|
export declare function httpPort(endpoint: ClickHouseEndpoint): Promise<ClickHousePort>;
|
|
17
|
+
/**
|
|
18
|
+
* A server that did not answer at all (refused, no route, a name that does
|
|
19
|
+
* not resolve): fetch throws `TypeError: fetch failed` with the reason in
|
|
20
|
+
* its cause, and neither names the server. One line that does, instead of
|
|
21
|
+
* a stack trace.
|
|
22
|
+
*/
|
|
23
|
+
export declare function unreachable(endpoint: ClickHouseEndpoint, e: unknown): YodelError | undefined;
|
|
16
24
|
/** The server's message for an error from a port, first line. */
|
|
17
25
|
export declare function serverMessage(e: unknown): string;
|
package/dist/history/client.js
CHANGED
|
@@ -3,13 +3,36 @@
|
|
|
3
3
|
* get rows back. Over chant's own HTTP client in use; an in-memory fake in
|
|
4
4
|
* the unit tests.
|
|
5
5
|
*/
|
|
6
|
+
import { YodelError } from "../project.js";
|
|
6
7
|
/** A port over chant's ClickHouse HTTP client. */
|
|
7
8
|
export async function httpPort(endpoint) {
|
|
8
9
|
const { clickhouseQuery } = await import("@intentius/chant-lexicon-sql/clickhouse/http");
|
|
9
10
|
return {
|
|
10
|
-
query: (sql, options = {}) =>
|
|
11
|
+
query: async (sql, options = {}) => {
|
|
12
|
+
try {
|
|
13
|
+
return await clickhouseQuery(endpoint, sql, options.settings ? { settings: options.settings } : {});
|
|
14
|
+
}
|
|
15
|
+
catch (e) {
|
|
16
|
+
throw unreachable(endpoint, e) ?? e;
|
|
17
|
+
}
|
|
18
|
+
},
|
|
11
19
|
};
|
|
12
20
|
}
|
|
21
|
+
/**
|
|
22
|
+
* A server that did not answer at all (refused, no route, a name that does
|
|
23
|
+
* not resolve): fetch throws `TypeError: fetch failed` with the reason in
|
|
24
|
+
* its cause, and neither names the server. One line that does, instead of
|
|
25
|
+
* a stack trace.
|
|
26
|
+
*/
|
|
27
|
+
export function unreachable(endpoint, e) {
|
|
28
|
+
if (!(e instanceof TypeError) || !/fetch failed/i.test(e.message))
|
|
29
|
+
return undefined;
|
|
30
|
+
const cause = e.cause;
|
|
31
|
+
const c = cause && typeof cause === "object" ? cause : undefined;
|
|
32
|
+
const why = typeof c?.code === "string" ? c.code : typeof c?.message === "string" ? c.message : e.message;
|
|
33
|
+
return new YodelError(`the ClickHouse server at ${redact(endpoint.url)} did not answer (${why}); is it running, and is that the right URL?`);
|
|
34
|
+
}
|
|
35
|
+
const redact = (url) => url.replace(/\/\/[^@/]*@/, "//");
|
|
13
36
|
/** The server's message for an error from a port, first line. */
|
|
14
37
|
export function serverMessage(e) {
|
|
15
38
|
if (e && typeof e === "object" && "serverMessage" in e && typeof e.serverMessage === "string")
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/history/client.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/history/client.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAW3C,kDAAkD;AAClD,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,QAA4B;IACzD,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,8CAA8C,CAAC,CAAC;IACzF,OAAO;QACL,KAAK,EAAE,KAAK,EAAO,GAAW,EAAE,UAAwB,EAAE,EAAE,EAAE;YAC5D,IAAI,CAAC;gBACH,OAAO,MAAM,eAAe,CAAM,QAAQ,EAAE,GAAG,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAC3G,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,MAAM,WAAW,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;YACtC,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,WAAW,CAAC,QAA4B,EAAE,CAAU;IAClE,IAAI,CAAC,CAAC,CAAC,YAAY,SAAS,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;QAAE,OAAO,SAAS,CAAC;IACpF,MAAM,KAAK,GAAI,CAAyB,CAAC,KAAK,CAAC;IAC/C,MAAM,CAAC,GAAG,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAE,KAA+C,CAAC,CAAC,CAAC,SAAS,CAAC;IAC5G,MAAM,GAAG,GAAG,OAAO,CAAC,EAAE,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;IAC1G,OAAO,IAAI,UAAU,CAAC,4BAA4B,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,oBAAoB,GAAG,8CAA8C,CAAC,CAAC;AAC/I,CAAC;AAED,MAAM,MAAM,GAAG,CAAC,GAAW,EAAU,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;AAEzE,iEAAiE;AACjE,MAAM,UAAU,aAAa,CAAC,CAAU;IACtC,IAAI,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,eAAe,IAAI,CAAC,IAAI,OAAO,CAAC,CAAC,aAAa,KAAK,QAAQ;QAAE,OAAO,CAAC,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;IAC7H,OAAO,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AACpD,CAAC"}
|
package/dist/history/lock.d.ts
CHANGED
|
@@ -70,7 +70,11 @@ export declare class LockHeldError extends YodelError {
|
|
|
70
70
|
readonly expiresAt: string;
|
|
71
71
|
readonly where: string;
|
|
72
72
|
readonly clear: string;
|
|
73
|
-
|
|
73
|
+
/** Set when the run waited for it (`--lock-wait`): how long, in words. */
|
|
74
|
+
readonly waited?: string | undefined;
|
|
75
|
+
constructor(holder: string, expiresAt: string, where: string, clear: string,
|
|
76
|
+
/** Set when the run waited for it (`--lock-wait`): how long, in words. */
|
|
77
|
+
waited?: string | undefined);
|
|
74
78
|
}
|
|
75
79
|
export declare class LockLostError extends YodelError {
|
|
76
80
|
constructor(where: string);
|
package/dist/history/lock.js
CHANGED
|
@@ -62,12 +62,18 @@ export class LockHeldError extends YodelError {
|
|
|
62
62
|
expiresAt;
|
|
63
63
|
where;
|
|
64
64
|
clear;
|
|
65
|
-
|
|
66
|
-
|
|
65
|
+
waited;
|
|
66
|
+
constructor(holder, expiresAt, where, clear,
|
|
67
|
+
/** Set when the run waited for it (`--lock-wait`): how long, in words. */
|
|
68
|
+
waited) {
|
|
69
|
+
super(`another apply holds the lock (${where}): owner ${holder}, ${where.startsWith("Postgres advisory lock") ? "since" : "until"} ${expiresAt} UTC. ` +
|
|
70
|
+
(waited ? `This run ${waited}. ` : "") +
|
|
71
|
+
`Wait for it, or once you know it is not running, clear it with: ${clear}`, LOCKED);
|
|
67
72
|
this.holder = holder;
|
|
68
73
|
this.expiresAt = expiresAt;
|
|
69
74
|
this.where = where;
|
|
70
75
|
this.clear = clear;
|
|
76
|
+
this.waited = waited;
|
|
71
77
|
this.name = "LockHeldError";
|
|
72
78
|
}
|
|
73
79
|
}
|
package/dist/history/lock.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lock.js","sourceRoot":"","sources":["../../src/history/lock.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4CG;AAEH,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACzE,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAuB,MAAM,aAAa,CAAC;AACjE,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACjF,OAAO,EAAE,gBAAgB,EAAwB,MAAM,eAAe,CAAC;AAEvE,+CAA+C;AAC/C,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,CAAC;AAExB,+DAA+D;AAC/D,MAAM,CAAC,MAAM,SAAS,GAAG,OAAO,CAAC;AAEjC,wBAAwB;AACxB,MAAM,CAAC,MAAM,mBAAmB,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAgBlD,MAAM,OAAO,aAAc,SAAQ,UAAU;IAEhC;IACA;IACA;IACA;
|
|
1
|
+
{"version":3,"file":"lock.js","sourceRoot":"","sources":["../../src/history/lock.ts"],"names":[],"mappings":"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"}
|
|
@@ -14,6 +14,24 @@ export declare const pgIdent: (name: string) => string;
|
|
|
14
14
|
export declare const pgLiteral: (value: string) => string;
|
|
15
15
|
/** The history table's columns, in the order {@link HISTORY_COLUMNS} (ClickHouse) has them. */
|
|
16
16
|
export declare const PG_HISTORY_COLUMNS: readonly (readonly [name: string, type: string])[];
|
|
17
|
+
/**
|
|
18
|
+
* The CHECK constraints of {@link PG_HISTORY_COLUMNS} by column, as a table
|
|
19
|
+
* made before `yodel revert` (#55) lacks them: {@link pgWidenChecks} widens
|
|
20
|
+
* such a table's to these, in place.
|
|
21
|
+
*/
|
|
22
|
+
export declare const PG_CHECKS: {
|
|
23
|
+
readonly kind: "kind IN ('migration', 'statement', 'step', 'revert')";
|
|
24
|
+
readonly status: "status IN ('started', 'succeeded', 'failed', 'reverted')";
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* The statements that widen an older history table's CHECK constraints to
|
|
28
|
+
* {@link PG_CHECKS}, given each CHECK constraint's name and definition
|
|
29
|
+
* (`pg_get_constraintdef`). None when they already allow every value.
|
|
30
|
+
*/
|
|
31
|
+
export declare function pgWidenChecks(schema: string, constraints: ReadonlyArray<{
|
|
32
|
+
name: string;
|
|
33
|
+
def: string;
|
|
34
|
+
}>): string[];
|
|
17
35
|
/** The columns a row write names: all but `recorded_at`, which is the server's. */
|
|
18
36
|
export declare const PG_WRITTEN_COLUMNS: string[];
|
|
19
37
|
/** `<schema>.history`, quoted. */
|
|
@@ -17,13 +17,13 @@ export const pgLiteral = (value) => `'${value.replace(/'/g, "''")}'`;
|
|
|
17
17
|
export const PG_HISTORY_COLUMNS = [
|
|
18
18
|
["seq", "bigint NOT NULL PRIMARY KEY"],
|
|
19
19
|
["run_id", "text NOT NULL"],
|
|
20
|
-
["kind", "text NOT NULL CHECK (kind IN ('migration', 'statement', 'step'))"],
|
|
20
|
+
["kind", "text NOT NULL CHECK (kind IN ('migration', 'statement', 'step', 'revert'))"],
|
|
21
21
|
["migration_id", "text NOT NULL"],
|
|
22
22
|
["parent", "text NOT NULL DEFAULT ''"],
|
|
23
23
|
["checksum", "text NOT NULL DEFAULT ''"],
|
|
24
24
|
["statement_index", "integer NOT NULL"],
|
|
25
25
|
["statement_sha", "text NOT NULL DEFAULT ''"],
|
|
26
|
-
["status", "text NOT NULL CHECK (status IN ('started', 'succeeded', 'failed'))"],
|
|
26
|
+
["status", "text NOT NULL CHECK (status IN ('started', 'succeeded', 'failed', 'reverted'))"],
|
|
27
27
|
["error", "text NOT NULL DEFAULT ''"],
|
|
28
28
|
["applied_by", "text NOT NULL DEFAULT ''"],
|
|
29
29
|
["plan_digest", "text NOT NULL DEFAULT ''"],
|
|
@@ -31,6 +31,31 @@ export const PG_HISTORY_COLUMNS = [
|
|
|
31
31
|
["note", "text NOT NULL DEFAULT ''"],
|
|
32
32
|
["recorded_at", "timestamptz NOT NULL DEFAULT pg_catalog.clock_timestamp()"],
|
|
33
33
|
];
|
|
34
|
+
/**
|
|
35
|
+
* The CHECK constraints of {@link PG_HISTORY_COLUMNS} by column, as a table
|
|
36
|
+
* made before `yodel revert` (#55) lacks them: {@link pgWidenChecks} widens
|
|
37
|
+
* such a table's to these, in place.
|
|
38
|
+
*/
|
|
39
|
+
export const PG_CHECKS = {
|
|
40
|
+
kind: "kind IN ('migration', 'statement', 'step', 'revert')",
|
|
41
|
+
status: "status IN ('started', 'succeeded', 'failed', 'reverted')",
|
|
42
|
+
};
|
|
43
|
+
/**
|
|
44
|
+
* The statements that widen an older history table's CHECK constraints to
|
|
45
|
+
* {@link PG_CHECKS}, given each CHECK constraint's name and definition
|
|
46
|
+
* (`pg_get_constraintdef`). None when they already allow every value.
|
|
47
|
+
*/
|
|
48
|
+
export function pgWidenChecks(schema, constraints) {
|
|
49
|
+
const out = [];
|
|
50
|
+
for (const [column, check] of Object.entries(PG_CHECKS)) {
|
|
51
|
+
const value = column === "kind" ? "'revert'" : "'reverted'";
|
|
52
|
+
const c = constraints.find((x) => new RegExp(`\\b${column}\\b`).test(x.def));
|
|
53
|
+
if (!c || c.def.includes(value))
|
|
54
|
+
continue;
|
|
55
|
+
out.push(`ALTER TABLE ${pgHistoryTable(schema)} DROP CONSTRAINT ${pgIdent(c.name)}, ADD CONSTRAINT ${pgIdent(c.name)} CHECK (${check})`);
|
|
56
|
+
}
|
|
57
|
+
return out;
|
|
58
|
+
}
|
|
34
59
|
/** The columns a row write names: all but `recorded_at`, which is the server's. */
|
|
35
60
|
export const PG_WRITTEN_COLUMNS = PG_HISTORY_COLUMNS.map(([name]) => name).filter((n) => n !== "recorded_at");
|
|
36
61
|
/** `<schema>.history`, quoted. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ddl.js","sourceRoot":"","sources":["../../../src/history/postgres/ddl.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAE1C,4CAA4C;AAC5C,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,IAAY,EAAU,EAAE,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC;AAEjF,sFAAsF;AACtF,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,KAAa,EAAU,EAAE,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC;AAErF,+FAA+F;AAC/F,MAAM,CAAC,MAAM,kBAAkB,GAAuD;IACpF,CAAC,KAAK,EAAE,6BAA6B,CAAC;IACtC,CAAC,QAAQ,EAAE,eAAe,CAAC;IAC3B,CAAC,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"ddl.js","sourceRoot":"","sources":["../../../src/history/postgres/ddl.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAE1C,4CAA4C;AAC5C,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,IAAY,EAAU,EAAE,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC;AAEjF,sFAAsF;AACtF,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,KAAa,EAAU,EAAE,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC;AAErF,+FAA+F;AAC/F,MAAM,CAAC,MAAM,kBAAkB,GAAuD;IACpF,CAAC,KAAK,EAAE,6BAA6B,CAAC;IACtC,CAAC,QAAQ,EAAE,eAAe,CAAC;IAC3B,CAAC,MAAM,EAAE,4EAA4E,CAAC;IACtF,CAAC,cAAc,EAAE,eAAe,CAAC;IACjC,CAAC,QAAQ,EAAE,0BAA0B,CAAC;IACtC,CAAC,UAAU,EAAE,0BAA0B,CAAC;IACxC,CAAC,iBAAiB,EAAE,kBAAkB,CAAC;IACvC,CAAC,eAAe,EAAE,0BAA0B,CAAC;IAC7C,CAAC,QAAQ,EAAE,gFAAgF,CAAC;IAC5F,CAAC,OAAO,EAAE,0BAA0B,CAAC;IACrC,CAAC,YAAY,EAAE,0BAA0B,CAAC;IAC1C,CAAC,aAAa,EAAE,0BAA0B,CAAC;IAC3C,CAAC,UAAU,EAAE,4BAA4B,CAAC;IAC1C,CAAC,MAAM,EAAE,0BAA0B,CAAC;IACpC,CAAC,aAAa,EAAE,2DAA2D,CAAC;CAC7E,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,IAAI,EAAE,sDAAsD;IAC5D,MAAM,EAAE,0DAA0D;CAC1D,CAAC;AAEX;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,MAAc,EAAE,WAAyD;IACrG,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,KAAK,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;QACxD,MAAM,KAAK,GAAG,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC;QAC5D,MAAM,CAAC,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,MAAM,CAAC,MAAM,MAAM,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC7E,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,SAAS;QAC1C,GAAG,CAAC,IAAI,CAAC,eAAe,cAAc,CAAC,MAAM,CAAC,oBAAoB,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,oBAAoB,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,KAAK,GAAG,CAAC,CAAC;IAC3I,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,mFAAmF;AACnF,MAAM,CAAC,MAAM,kBAAkB,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,aAAa,CAAC,CAAC;AAE9G,kCAAkC;AAClC,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,MAAc,EAAU,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC;AAEzG,kGAAkG;AAClG,MAAM,UAAU,YAAY,CAAC,MAAc;IACzC,MAAM,OAAO,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,KAAK,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC1F,OAAO;QACL,+BAA+B,OAAO,CAAC,MAAM,CAAC,EAAE;QAChD,8BAA8B,cAAc,CAAC,MAAM,CAAC,OAAO,OAAO,KAAK;QACvE,oBAAoB,cAAc,CAAC,MAAM,CAAC,6FAA6F;KACxI,CAAC;AACJ,CAAC"}
|
|
@@ -26,6 +26,8 @@ export declare class PostgresHistoryStore implements HistoryStoreLike {
|
|
|
26
26
|
exists(): Promise<boolean>;
|
|
27
27
|
/** Creates the schema and table when they are not there. */
|
|
28
28
|
ensure(): Promise<void>;
|
|
29
|
+
/** A table made before `yodel revert` (#55) takes its rows only once its CHECK constraints are widened; this widens them, once. */
|
|
30
|
+
allowRevert(): Promise<void>;
|
|
29
31
|
/** Every row, in seq order. Postgres reads are consistent, so the `sync` option the ClickHouse store takes changes nothing here. */
|
|
30
32
|
rows(): Promise<HistoryRow[]>;
|
|
31
33
|
state(): Promise<HistoryState>;
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
import { deriveState } from "../rows.js";
|
|
11
11
|
import { fromRaw } from "../store.js";
|
|
12
12
|
import { HISTORY_TABLE } from "../ddl.js";
|
|
13
|
-
import { pgHistoryDdl, pgHistoryTable, PG_HISTORY_COLUMNS, PG_WRITTEN_COLUMNS } from "./ddl.js";
|
|
13
|
+
import { pgHistoryDdl, pgHistoryTable, pgWidenChecks, PG_HISTORY_COLUMNS, PG_WRITTEN_COLUMNS } from "./ddl.js";
|
|
14
14
|
/** The history's rows read back, `recorded_at` in the ClickHouse table's form (`YYYY-MM-DD hh:mm:ss.ffffff`, UTC). */
|
|
15
15
|
const SELECT = PG_HISTORY_COLUMNS.map(([name]) => name === "recorded_at" ? `pg_catalog.to_char(recorded_at AT TIME ZONE 'UTC', 'YYYY-MM-DD HH24:MI:SS.US') AS recorded_at` : name === "seq" ? "seq::text AS seq" : name).join(", ");
|
|
16
16
|
export class PostgresHistoryStore {
|
|
@@ -35,6 +35,12 @@ export class PostgresHistoryStore {
|
|
|
35
35
|
for (const sql of pgHistoryDdl(this.location.schema))
|
|
36
36
|
await this.client.query(sql);
|
|
37
37
|
}
|
|
38
|
+
/** A table made before `yodel revert` (#55) takes its rows only once its CHECK constraints are widened; this widens them, once. */
|
|
39
|
+
async allowRevert() {
|
|
40
|
+
const constraints = await this.client.query("SELECT c.conname AS name, pg_catalog.pg_get_constraintdef(c.oid) AS def FROM pg_catalog.pg_constraint c JOIN pg_catalog.pg_class t ON t.oid = c.conrelid JOIN pg_catalog.pg_namespace n ON n.oid = t.relnamespace WHERE n.nspname = $1 AND t.relname = $2 AND c.contype = 'c'", [this.location.schema, HISTORY_TABLE]);
|
|
41
|
+
for (const sql of pgWidenChecks(this.location.schema, constraints))
|
|
42
|
+
await this.client.query(sql);
|
|
43
|
+
}
|
|
38
44
|
/** Every row, in seq order. Postgres reads are consistent, so the `sync` option the ClickHouse store takes changes nothing here. */
|
|
39
45
|
async rows() {
|
|
40
46
|
if (!(await this.exists()))
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../../src/history/postgres/store.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,WAAW,EAAsC,MAAM,YAAY,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAyB,MAAM,aAAa,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../../src/history/postgres/store.ts"],"names":[],"mappings":"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"}
|
package/dist/history/rows.d.ts
CHANGED
|
@@ -7,10 +7,19 @@
|
|
|
7
7
|
* `succeeded` is applied. One whose latest row is `failed` (a statement
|
|
8
8
|
* failed) or `started` (the runner died) is part way: it resumes at the
|
|
9
9
|
* first statement whose latest row is not `succeeded`.
|
|
10
|
+
*
|
|
11
|
+
* `yodel revert` (#55) writes `revert` rows, one per statement of the
|
|
12
|
+
* revert as it starts, succeeds or fails, then a migration row `reverted`.
|
|
13
|
+
* A migration whose latest migration row is `reverted` is not applied: it
|
|
14
|
+
* is pending again, its statements' rows no longer count, and applying it
|
|
15
|
+
* again runs every statement. Revert rows count only after the migration's
|
|
16
|
+
* latest migration row, so a revert that failed part way resumes at the
|
|
17
|
+
* revert statement that failed.
|
|
10
18
|
*/
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
19
|
+
/** `reverted`: on a migration row only, written by `yodel revert` (#55). */
|
|
20
|
+
export type HistoryStatus = "started" | "succeeded" | "failed" | "reverted";
|
|
21
|
+
/** `step`: an Op step (#12), recorded as a statement is, its `note` the step's summary (receipts skipped and run). `revert`: a statement of `yodel revert` (#55). */
|
|
22
|
+
export type HistoryKind = "migration" | "statement" | "step" | "revert";
|
|
14
23
|
/** The statement index of a migration's own rows. */
|
|
15
24
|
export declare const MIGRATION_ROW = -1;
|
|
16
25
|
/** One row of the history table, as written and as read back. */
|
|
@@ -72,6 +81,8 @@ export interface MigrationRecord {
|
|
|
72
81
|
appliedSeq: number | undefined;
|
|
73
82
|
/** Each statement's latest row, by index. */
|
|
74
83
|
statements: Map<number, StatementRecord>;
|
|
84
|
+
/** Each revert statement's latest row since the latest migration row, by its index in the revert (#55). */
|
|
85
|
+
reverts: Map<number, StatementRecord>;
|
|
75
86
|
}
|
|
76
87
|
/** A `yodel repair` of an applied migration: the new checksum, who recorded it, when and why. */
|
|
77
88
|
export interface Repair {
|
|
@@ -90,6 +101,8 @@ export interface HistoryState {
|
|
|
90
101
|
}
|
|
91
102
|
/** The state the rows add up to. Rows may come in any order. */
|
|
92
103
|
export declare function deriveState(rows: readonly HistoryRow[]): HistoryState;
|
|
104
|
+
/** Whether the history records the migration reverted (`yodel revert`, #55): its latest migration row is `reverted`. */
|
|
105
|
+
export declare const isReverted: (m: MigrationRecord | undefined) => boolean;
|
|
93
106
|
/** Whether the history records the migration applied. */
|
|
94
107
|
export declare const isApplied: (m: MigrationRecord | undefined) => boolean;
|
|
95
108
|
/** Whether the statement at `index` has already run: its latest row is `succeeded`. Such a statement is never sent again. */
|
package/dist/history/rows.js
CHANGED
|
@@ -7,6 +7,14 @@
|
|
|
7
7
|
* `succeeded` is applied. One whose latest row is `failed` (a statement
|
|
8
8
|
* failed) or `started` (the runner died) is part way: it resumes at the
|
|
9
9
|
* first statement whose latest row is not `succeeded`.
|
|
10
|
+
*
|
|
11
|
+
* `yodel revert` (#55) writes `revert` rows, one per statement of the
|
|
12
|
+
* revert as it starts, succeeds or fails, then a migration row `reverted`.
|
|
13
|
+
* A migration whose latest migration row is `reverted` is not applied: it
|
|
14
|
+
* is pending again, its statements' rows no longer count, and applying it
|
|
15
|
+
* again runs every statement. Revert rows count only after the migration's
|
|
16
|
+
* latest migration row, so a revert that failed part way resumes at the
|
|
17
|
+
* revert statement that failed.
|
|
10
18
|
*/
|
|
11
19
|
import { createHash } from "node:crypto";
|
|
12
20
|
/** The statement index of a migration's own rows. */
|
|
@@ -36,11 +44,30 @@ export function deriveState(rows) {
|
|
|
36
44
|
appliedSeq: undefined,
|
|
37
45
|
repairs: [],
|
|
38
46
|
statements: new Map(),
|
|
47
|
+
reverts: new Map(),
|
|
39
48
|
};
|
|
40
49
|
byId.set(r.migration_id, m);
|
|
41
50
|
order.push(m);
|
|
42
51
|
}
|
|
43
|
-
if (r.kind === "migration"
|
|
52
|
+
if (r.kind === "migration")
|
|
53
|
+
m.reverts = new Map();
|
|
54
|
+
if (r.kind === "migration" && r.status === "reverted") {
|
|
55
|
+
// Reverted: no longer applied. Applied again, every statement runs again.
|
|
56
|
+
m.parent = r.parent === "" ? null : r.parent;
|
|
57
|
+
m.checksum = r.checksum;
|
|
58
|
+
m.status = "reverted";
|
|
59
|
+
m.error = "";
|
|
60
|
+
m.appliedBy = r.applied_by;
|
|
61
|
+
m.planDigest = r.plan_digest;
|
|
62
|
+
m.recordedAt = r.recorded_at ?? "";
|
|
63
|
+
m.seq = r.seq;
|
|
64
|
+
m.appliedSeq = undefined;
|
|
65
|
+
m.statements = new Map();
|
|
66
|
+
}
|
|
67
|
+
else if (r.kind === "revert") {
|
|
68
|
+
m.reverts.set(r.statement_index, { index: r.statement_index, status: r.status, sha: r.statement_sha, error: r.error, seq: r.seq });
|
|
69
|
+
}
|
|
70
|
+
else if (r.kind === "migration" && r.status === "succeeded" && m.status === "succeeded" && m.appliedSeq !== undefined) {
|
|
44
71
|
// Already applied: a repair. It records a new checksum; the migration was applied when and by whom it was.
|
|
45
72
|
m.parent = r.parent === "" ? null : r.parent;
|
|
46
73
|
m.checksum = r.checksum;
|
|
@@ -66,6 +93,8 @@ export function deriveState(rows) {
|
|
|
66
93
|
}
|
|
67
94
|
return { migrations: order, byId, maxSeq };
|
|
68
95
|
}
|
|
96
|
+
/** Whether the history records the migration reverted (`yodel revert`, #55): its latest migration row is `reverted`. */
|
|
97
|
+
export const isReverted = (m) => m?.status === "reverted";
|
|
69
98
|
/** Whether the history records the migration applied. */
|
|
70
99
|
export const isApplied = (m) => m?.status === "succeeded";
|
|
71
100
|
/** Whether the statement at `index` has already run: its latest row is `succeeded`. Such a statement is never sent again. */
|