@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.
Files changed (297) hide show
  1. package/README.md +28 -26
  2. package/dist/bin.js +15 -0
  3. package/dist/bin.js.map +1 -1
  4. package/dist/chant/apply.d.ts +9 -1
  5. package/dist/chant/apply.js +13 -1
  6. package/dist/chant/apply.js.map +1 -1
  7. package/dist/chant/build.js +7 -0
  8. package/dist/chant/build.js.map +1 -1
  9. package/dist/chant/drift.d.ts +69 -1
  10. package/dist/chant/drift.js +152 -5
  11. package/dist/chant/drift.js.map +1 -1
  12. package/dist/chant/runnable.d.ts +19 -0
  13. package/dist/chant/runnable.js +47 -0
  14. package/dist/chant/runnable.js.map +1 -0
  15. package/dist/ci/render.d.ts +289 -0
  16. package/dist/ci/render.js +688 -0
  17. package/dist/ci/render.js.map +1 -0
  18. package/dist/ci/replay.d.ts +17 -0
  19. package/dist/ci/replay.js +69 -0
  20. package/dist/ci/replay.js.map +1 -0
  21. package/dist/cli.d.ts +4 -0
  22. package/dist/cli.js +40 -0
  23. package/dist/cli.js.map +1 -1
  24. package/dist/command.d.ts +6 -0
  25. package/dist/command.js.map +1 -1
  26. package/dist/commands/apply.d.ts +113 -0
  27. package/dist/commands/apply.js +376 -49
  28. package/dist/commands/apply.js.map +1 -1
  29. package/dist/commands/approve.d.ts +5 -0
  30. package/dist/commands/approve.js +155 -0
  31. package/dist/commands/approve.js.map +1 -0
  32. package/dist/commands/checkpoint.d.ts +3 -0
  33. package/dist/commands/checkpoint.js +78 -0
  34. package/dist/commands/checkpoint.js.map +1 -0
  35. package/dist/commands/ci.d.ts +3 -0
  36. package/dist/commands/ci.js +118 -0
  37. package/dist/commands/ci.js.map +1 -0
  38. package/dist/commands/docs.d.ts +11 -0
  39. package/dist/commands/docs.js +108 -0
  40. package/dist/commands/docs.js.map +1 -0
  41. package/dist/commands/drift.d.ts +23 -0
  42. package/dist/commands/drift.js +263 -18
  43. package/dist/commands/drift.js.map +1 -1
  44. package/dist/commands/index.js +16 -0
  45. package/dist/commands/index.js.map +1 -1
  46. package/dist/commands/init.d.ts +3 -0
  47. package/dist/commands/init.js +15 -11
  48. package/dist/commands/init.js.map +1 -1
  49. package/dist/commands/lint.js +25 -8
  50. package/dist/commands/lint.js.map +1 -1
  51. package/dist/commands/mcp.d.ts +3 -0
  52. package/dist/commands/mcp.js +50 -0
  53. package/dist/commands/mcp.js.map +1 -0
  54. package/dist/commands/new.d.ts +2 -0
  55. package/dist/commands/new.js +134 -10
  56. package/dist/commands/new.js.map +1 -1
  57. package/dist/commands/override.d.ts +3 -0
  58. package/dist/commands/override.js +150 -0
  59. package/dist/commands/override.js.map +1 -0
  60. package/dist/commands/plan.js +43 -27
  61. package/dist/commands/plan.js.map +1 -1
  62. package/dist/commands/repair.d.ts +11 -0
  63. package/dist/commands/repair.js +15 -7
  64. package/dist/commands/repair.js.map +1 -1
  65. package/dist/commands/report.d.ts +13 -0
  66. package/dist/commands/report.js +121 -0
  67. package/dist/commands/report.js.map +1 -0
  68. package/dist/commands/revert.d.ts +20 -0
  69. package/dist/commands/revert.js +246 -0
  70. package/dist/commands/revert.js.map +1 -0
  71. package/dist/commands/status.js +44 -17
  72. package/dist/commands/status.js.map +1 -1
  73. package/dist/config/base.d.ts +69 -0
  74. package/dist/config/base.js +121 -0
  75. package/dist/config/base.js.map +1 -0
  76. package/dist/config/define.d.ts +223 -3
  77. package/dist/config/define.js +3 -1
  78. package/dist/config/define.js.map +1 -1
  79. package/dist/config/index.d.ts +2 -0
  80. package/dist/config/index.js +2 -0
  81. package/dist/config/index.js.map +1 -1
  82. package/dist/config/load.d.ts +1 -1
  83. package/dist/config/load.js +150 -5
  84. package/dist/config/load.js.map +1 -1
  85. package/dist/config/settings.d.ts +18 -2
  86. package/dist/config/settings.js +40 -6
  87. package/dist/config/settings.js.map +1 -1
  88. package/dist/env-args.d.ts +6 -0
  89. package/dist/env-args.js +31 -1
  90. package/dist/env-args.js.map +1 -1
  91. package/dist/exit.d.ts +20 -0
  92. package/dist/exit.js +28 -0
  93. package/dist/exit.js.map +1 -0
  94. package/dist/history/client.d.ts +8 -0
  95. package/dist/history/client.js +24 -1
  96. package/dist/history/client.js.map +1 -1
  97. package/dist/history/lock.d.ts +5 -1
  98. package/dist/history/lock.js +8 -2
  99. package/dist/history/lock.js.map +1 -1
  100. package/dist/history/postgres/ddl.d.ts +18 -0
  101. package/dist/history/postgres/ddl.js +27 -2
  102. package/dist/history/postgres/ddl.js.map +1 -1
  103. package/dist/history/postgres/store.d.ts +2 -0
  104. package/dist/history/postgres/store.js +7 -1
  105. package/dist/history/postgres/store.js.map +1 -1
  106. package/dist/history/rows.d.ts +16 -3
  107. package/dist/history/rows.js +30 -1
  108. package/dist/history/rows.js.map +1 -1
  109. package/dist/history/store.d.ts +2 -0
  110. package/dist/history/store.js +2 -2
  111. package/dist/history/store.js.map +1 -1
  112. package/dist/index.d.ts +4 -1
  113. package/dist/index.js +1 -0
  114. package/dist/index.js.map +1 -1
  115. package/dist/init/adopt.js +8 -3
  116. package/dist/init/adopt.js.map +1 -1
  117. package/dist/init/live.d.ts +11 -0
  118. package/dist/init/live.js +25 -2
  119. package/dist/init/live.js.map +1 -1
  120. package/dist/lint/check.d.ts +8 -1
  121. package/dist/lint/check.js +38 -4
  122. package/dist/lint/check.js.map +1 -1
  123. package/dist/lint/report.js +1 -1
  124. package/dist/lint/report.js.map +1 -1
  125. package/dist/lint/routines.d.ts +26 -0
  126. package/dist/lint/routines.js +65 -0
  127. package/dist/lint/routines.js.map +1 -0
  128. package/dist/lint/rules.d.ts +16 -4
  129. package/dist/lint/rules.js +9 -4
  130. package/dist/lint/rules.js.map +1 -1
  131. package/dist/mcp/server.d.ts +40 -0
  132. package/dist/mcp/server.js +106 -0
  133. package/dist/mcp/server.js.map +1 -0
  134. package/dist/mcp/tools.d.ts +72 -0
  135. package/dist/mcp/tools.js +178 -0
  136. package/dist/mcp/tools.js.map +1 -0
  137. package/dist/migrations/checkpoint.d.ts +45 -0
  138. package/dist/migrations/checkpoint.js +110 -0
  139. package/dist/migrations/checkpoint.js.map +1 -0
  140. package/dist/migrations/checks.d.ts +28 -0
  141. package/dist/migrations/checks.js +97 -0
  142. package/dist/migrations/checks.js.map +1 -0
  143. package/dist/migrations/create.d.ts +3 -1
  144. package/dist/migrations/create.js +3 -0
  145. package/dist/migrations/create.js.map +1 -1
  146. package/dist/migrations/directory.js +4 -0
  147. package/dist/migrations/directory.js.map +1 -1
  148. package/dist/migrations/document.d.ts +33 -0
  149. package/dist/migrations/document.js +2 -0
  150. package/dist/migrations/document.js.map +1 -1
  151. package/dist/migrations/index.d.ts +3 -0
  152. package/dist/migrations/index.js +3 -0
  153. package/dist/migrations/index.js.map +1 -1
  154. package/dist/migrations/routines.d.ts +31 -0
  155. package/dist/migrations/routines.js +55 -0
  156. package/dist/migrations/routines.js.map +1 -0
  157. package/dist/notify/index.d.ts +124 -0
  158. package/dist/notify/index.js +210 -0
  159. package/dist/notify/index.js.map +1 -0
  160. package/dist/notify/verify.d.ts +53 -0
  161. package/dist/notify/verify.js +71 -0
  162. package/dist/notify/verify.js.map +1 -0
  163. package/dist/pr/forge.d.ts +4 -0
  164. package/dist/pr/forge.js +21 -7
  165. package/dist/pr/forge.js.map +1 -1
  166. package/dist/pr/issue.d.ts +68 -0
  167. package/dist/pr/issue.js +107 -0
  168. package/dist/pr/issue.js.map +1 -0
  169. package/dist/pr/model.d.ts +12 -1
  170. package/dist/pr/model.js +44 -6
  171. package/dist/pr/model.js.map +1 -1
  172. package/dist/pr/render.d.ts +3 -1
  173. package/dist/pr/render.js +63 -4
  174. package/dist/pr/render.js.map +1 -1
  175. package/dist/project.d.ts +19 -2
  176. package/dist/project.js +33 -1
  177. package/dist/project.js.map +1 -1
  178. package/dist/replay/index.d.ts +3 -0
  179. package/dist/replay/index.js +3 -0
  180. package/dist/replay/index.js.map +1 -1
  181. package/dist/replay/replay.d.ts +9 -1
  182. package/dist/replay/replay.js +63 -32
  183. package/dist/replay/replay.js.map +1 -1
  184. package/dist/replay/report.js +1 -1
  185. package/dist/replay/report.js.map +1 -1
  186. package/dist/replay/shared.d.ts +28 -0
  187. package/dist/replay/shared.js +77 -0
  188. package/dist/replay/shared.js.map +1 -0
  189. package/dist/report/audit.d.ts +138 -0
  190. package/dist/report/audit.js +202 -0
  191. package/dist/report/audit.js.map +1 -0
  192. package/dist/report/jsonl.d.ts +21 -0
  193. package/dist/report/jsonl.js +52 -0
  194. package/dist/report/jsonl.js.map +1 -0
  195. package/dist/report/model.d.ts +68 -0
  196. package/dist/report/model.js +127 -0
  197. package/dist/report/model.js.map +1 -0
  198. package/dist/report/render.d.ts +18 -0
  199. package/dist/report/render.js +127 -0
  200. package/dist/report/render.js.map +1 -0
  201. package/dist/schema-docs/render.d.ts +49 -0
  202. package/dist/schema-docs/render.js +359 -0
  203. package/dist/schema-docs/render.js.map +1 -0
  204. package/dist/schemas.d.ts +37 -0
  205. package/dist/schemas.js +41 -0
  206. package/dist/schemas.js.map +1 -0
  207. package/dist/server.d.ts +40 -0
  208. package/dist/server.js +87 -0
  209. package/dist/server.js.map +1 -0
  210. package/dist/sources/ddl.d.ts +53 -0
  211. package/dist/sources/ddl.js +347 -0
  212. package/dist/sources/ddl.js.map +1 -0
  213. package/dist/sources/index.d.ts +69 -0
  214. package/dist/sources/index.js +170 -0
  215. package/dist/sources/index.js.map +1 -0
  216. package/dist/steps/backfill.d.ts +21 -17
  217. package/dist/steps/backfill.js +20 -20
  218. package/dist/steps/backfill.js.map +1 -1
  219. package/dist/steps/index.d.ts +2 -2
  220. package/dist/steps/index.js +3 -3
  221. package/dist/steps/index.js.map +1 -1
  222. package/dist/steps/postgres-migration.d.ts +35 -25
  223. package/dist/steps/postgres-migration.js +42 -29
  224. package/dist/steps/postgres-migration.js.map +1 -1
  225. package/dist/steps/rebuild.d.ts +15 -15
  226. package/dist/steps/rebuild.js +17 -24
  227. package/dist/steps/rebuild.js.map +1 -1
  228. package/dist/tenants/index.d.ts +40 -0
  229. package/dist/tenants/index.js +122 -0
  230. package/dist/tenants/index.js.map +1 -0
  231. package/dist/tenants/target.d.ts +23 -0
  232. package/dist/tenants/target.js +29 -0
  233. package/dist/tenants/target.js.map +1 -0
  234. package/dist/versioned/checks.d.ts +29 -0
  235. package/dist/versioned/checks.js +54 -0
  236. package/dist/versioned/checks.js.map +1 -0
  237. package/dist/versioned/clickhouse.js +8 -0
  238. package/dist/versioned/clickhouse.js.map +1 -1
  239. package/dist/versioned/driver.d.ts +10 -0
  240. package/dist/versioned/engine.d.ts +61 -1
  241. package/dist/versioned/engine.js +109 -6
  242. package/dist/versioned/engine.js.map +1 -1
  243. package/dist/versioned/explain.js +7 -2
  244. package/dist/versioned/explain.js.map +1 -1
  245. package/dist/versioned/index.d.ts +10 -0
  246. package/dist/versioned/index.js +25 -1
  247. package/dist/versioned/index.js.map +1 -1
  248. package/dist/versioned/op.d.ts +16 -1
  249. package/dist/versioned/op.js +43 -6
  250. package/dist/versioned/op.js.map +1 -1
  251. package/dist/versioned/policy.d.ts +98 -0
  252. package/dist/versioned/policy.js +212 -0
  253. package/dist/versioned/policy.js.map +1 -0
  254. package/dist/versioned/postgres/driver.d.ts +3 -1
  255. package/dist/versioned/postgres/driver.js +30 -3
  256. package/dist/versioned/postgres/driver.js.map +1 -1
  257. package/dist/versioned/postgres/waits.d.ts +46 -0
  258. package/dist/versioned/postgres/waits.js +78 -0
  259. package/dist/versioned/postgres/waits.js.map +1 -0
  260. package/dist/versioned/report.d.ts +3 -0
  261. package/dist/versioned/report.js +13 -1
  262. package/dist/versioned/report.js.map +1 -1
  263. package/dist/versioned/revert.d.ts +128 -0
  264. package/dist/versioned/revert.js +251 -0
  265. package/dist/versioned/revert.js.map +1 -0
  266. package/dist/versioned/stand-down.d.ts +30 -0
  267. package/dist/versioned/stand-down.js +56 -0
  268. package/dist/versioned/stand-down.js.map +1 -0
  269. package/dist/versioned/state.d.ts +25 -0
  270. package/dist/versioned/state.js +36 -3
  271. package/dist/versioned/state.js.map +1 -1
  272. package/dist/waves/index.d.ts +179 -0
  273. package/dist/waves/index.js +268 -0
  274. package/dist/waves/index.js.map +1 -0
  275. package/dist/waves/promotion.d.ts +56 -0
  276. package/dist/waves/promotion.js +108 -0
  277. package/dist/waves/promotion.js.map +1 -0
  278. package/dist/waves/record.d.ts +24 -0
  279. package/dist/waves/record.js +20 -0
  280. package/dist/waves/record.js.map +1 -0
  281. package/package.json +22 -8
  282. package/schemas/apply.schema.json +428 -0
  283. package/schemas/checkpoint.schema.json +19 -0
  284. package/schemas/common.schema.json +213 -0
  285. package/schemas/drift.schema.json +61 -0
  286. package/schemas/event.schema.json +36 -0
  287. package/schemas/init.schema.json +31 -0
  288. package/schemas/lint-rules.schema.json +54 -0
  289. package/schemas/lint.schema.json +294 -0
  290. package/schemas/mcp.schema.json +70 -0
  291. package/schemas/new.schema.json +71 -0
  292. package/schemas/plan.schema.json +489 -0
  293. package/schemas/rebase.schema.json +54 -0
  294. package/schemas/repair.schema.json +20 -0
  295. package/schemas/report.schema.json +114 -0
  296. package/schemas/revert.schema.json +69 -0
  297. package/schemas/status.schema.json +371 -0
@@ -10,12 +10,16 @@
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";
20
+ import type { DdlSource } from "../sources/index.js";
21
+ import type { NotifyConfig } from "../notify/index.js";
22
+ export type { NotifyConfig };
19
23
  export type { Topology };
20
24
  /**
21
25
  * A ClickHouse topology in its string form (`single`, `cluster:<name>`,
@@ -39,12 +43,228 @@ export interface EnvironmentConfig {
39
43
  };
40
44
  /** The apply lock's TTL, in seconds. Default: `YODEL_LOCK_TTL`, then 900. */
41
45
  lockTtl?: number;
46
+ /**
47
+ * How long, in seconds, an apply waits for the lock another apply holds
48
+ * before it gives up (exit 5). `yodel apply --lock-wait` overrides it.
49
+ * Default: `YODEL_LOCK_WAIT`, then 0 (give up at once).
50
+ */
51
+ lockWait?: number;
52
+ /**
53
+ * A tenant set (#56): the environment is many targets with one schema,
54
+ * each a ClickHouse database or a Postgres schema of the profile's server.
55
+ * The profile names one database (ClickHouse `databases`) or schema
56
+ * (Postgres `schemas`), the template the migrations are written against;
57
+ * each tenant gets them with that name replaced by its own. A tenant is
58
+ * named `<env>/<tenant>` (`yodel apply prod/acme`), keeps a history of its
59
+ * own (`<history database>_<tenant>`), and its wave applies to every
60
+ * tenant behind one gate. See {@link TenantSet}.
61
+ */
62
+ tenants?: TenantSet;
63
+ }
64
+ /**
65
+ * The tenants of an environment: a list of names, a file of them (one per
66
+ * line, or a JSON array), or a read-only SQL query whose first column lists
67
+ * them, run on the environment's server with its profile (its reader
68
+ * outside an apply job).
69
+ *
70
+ * ```ts
71
+ * tenants: ["acme", "globex"]
72
+ * tenants: { file: "tenants.txt" }
73
+ * tenants: { query: "SELECT nspname FROM pg_namespace WHERE nspname LIKE 'tenant_%'" }
74
+ * ```
75
+ */
76
+ export type TenantSet = string[] | {
77
+ file: string;
78
+ } | {
79
+ query: string;
80
+ };
81
+ /** When an environment's wave waits for an approval (chant's wave gate policy). */
82
+ export type WaveGate = "always" | "on-destructive" | "never";
83
+ export declare const WAVE_GATES: readonly WaveGate[];
84
+ /**
85
+ * One wave of the apply pipeline: an environment, applied after the waves
86
+ * before it, behind its own gate.
87
+ */
88
+ export interface WaveConfig {
89
+ /** The environment, by its name in `sql.profiles`. */
90
+ env: string;
91
+ /**
92
+ * When the wave waits for an approval of its plan:
93
+ *
94
+ * - `always` (the default): whenever it has a migration to apply;
95
+ * - `on-destructive`: when a pending step is destructive, a Postgres
96
+ * rewrite or lock-heavy statement, a ClickHouse mutation or rebuild, or
97
+ * an Op or manual step;
98
+ * - `never`: never. Review and branch protection are all that stand in
99
+ * front of it.
100
+ *
101
+ * The pipeline reads it from the commit a change merges onto, never from
102
+ * the change itself.
103
+ */
104
+ gate?: WaveGate;
105
+ /**
106
+ * The environment that must have applied a migration first: `yodel
107
+ * apply <env>` reads its history (with its reader) and refuses, exit 4,
108
+ * any pending migration it does not record as applied with the same
109
+ * checksum. Default: the wave before this one; `false` for none. Both
110
+ * the working tree's and the base commit's requirement are enforced, so a
111
+ * change cannot drop its own.
112
+ */
113
+ requires?: string | false;
114
+ /**
115
+ * A tenant set's wave (#56): split it into a deciding job, which plans
116
+ * every tenant and decides the gate once over all of them, and this many
117
+ * share jobs, each applying a slice of the tenants. A share job refuses
118
+ * (exit 4), naming it, a tenant whose plan moved since the decision, and
119
+ * applies the rest. Default 1: one job plans, decides and applies.
120
+ */
121
+ shares?: number;
122
+ }
123
+ /** A forge `yodel ci` renders pipelines for. */
124
+ export type CiForge = "github" | "gitlab" | "forgejo";
125
+ export declare const CI_FORGES: readonly CiForge[];
126
+ /** `yodel ci` (#65): what the project's pipelines are rendered for. */
127
+ export interface CiConfig {
128
+ /** The forges to render for. Default: all three. A forge left out gets no files, and `yodel ci --check` does not read its old ones. */
129
+ forges?: CiForge[];
130
+ /**
131
+ * The project's own jobs: a module, relative to the project (such as
132
+ * `ci/jobs.ts`), exporting `actions` (jobs declared with the github
133
+ * lexicon, for GitHub and Forgejo) and `gitlab` (the gitlab lexicon's),
134
+ * each keyed by the job's name. `yodel ci` adds them to the pull request
135
+ * pipeline after yodel's own jobs, so they survive every render.
136
+ */
137
+ jobs?: string;
138
+ /**
139
+ * The image every job runs in (#66): the CI image
140
+ * `ghcr.io/intentius/sql-yodeler:<version>@sha256:<digest>`, pinned by its
141
+ * digest, which carries node, yodel, chant and the lexicons. Jobs then run
142
+ * no `npm ci`. Default: `node:22-bookworm`, and each job runs `npm ci`.
143
+ */
144
+ image?: string;
42
145
  }
43
146
  export interface YodelConfig {
44
147
  /** Keyed by the environment's name in `sql.profiles`. */
45
148
  environments?: Record<string, EnvironmentConfig>;
46
- /** Reserved for `yodel lint`'s rule levels. */
47
- lint?: Record<string, unknown>;
149
+ /**
150
+ * The apply pipeline's waves, in order. An environment no wave names
151
+ * waits for an approval whenever it has a migration to apply, as under
152
+ * gate `always`.
153
+ */
154
+ waves?: WaveConfig[];
155
+ /** `yodel lint`'s rule levels: `{ rules: { destructive: "warning" } }`. A misspelled rule name is a type error. */
156
+ lint?: LintConfig;
157
+ /** Rules over the plan (#53) that `yodel plan` reports and `yodel apply` enforces; see {@link PolicyConfig}. */
158
+ policy?: PolicyConfig;
159
+ /**
160
+ * Webhook events (#61): the NAMES of the environment variables holding a
161
+ * webhook's URL and signing key, and optionally a Slack incoming webhook's
162
+ * URL. `{ webhook: "YODEL_WEBHOOK_URL", key: "YODEL_WEBHOOK_KEY" }`.
163
+ */
164
+ notify?: NotifyConfig;
165
+ /**
166
+ * DDL sources (#67): schema an ORM defines, read from the DDL it prints,
167
+ * keyed by a name. Each is written out as declarations in
168
+ * `<sourceDir>/<name>.generated.ts` before every build. See
169
+ * {@link DdlSource}.
170
+ */
171
+ sources?: Record<string, DdlSource>;
172
+ /** `yodel ci`: the forges to render the pipelines for, and the project's own jobs; see {@link CiConfig}. */
173
+ ci?: CiConfig;
174
+ }
175
+ /**
176
+ * Rules over the versioned plan (#53). `yodel plan` shows each rule's
177
+ * outcome, and `yodel apply` refuses (exit 4) a plan a rule denies, unless
178
+ * someone {@link PolicyConfig.overriders} lists recorded an override of that
179
+ * rule for exactly that plan digest (`yodel override <env> --rule <id>
180
+ * --reason <text>`).
181
+ *
182
+ * ```ts
183
+ * policy: {
184
+ * overriders: ["alice", "bob"],
185
+ * rules: [
186
+ * { id: "no-drops-in-prod", environments: ["prod"], refuse: { classes: ["drop"], destructive: true } },
187
+ * { id: "silences-cite-a-ticket", silences: { reason: /\b[A-Z]+-\d+\b/ } },
188
+ * { id: "no-rebuilds-in-hours", environments: ["prod"], check: (plan) => {
189
+ * const hour = new Date(plan.now).getUTCHours();
190
+ * const rebuilds = plan.pending.flatMap((m) => m.steps.filter((s) => s.classes.includes("rebuild")));
191
+ * return hour >= 8 && hour < 18 && rebuilds.length > 0 ? "a rebuild between 08:00 and 18:00 UTC" : undefined;
192
+ * } },
193
+ * ],
194
+ * }
195
+ * ```
196
+ */
197
+ export interface PolicyConfig {
198
+ rules: PolicyRule[];
199
+ /** Who may override a rule: an override recorded by anyone else does not count. None listed, no override counts. */
200
+ overriders?: string[];
201
+ }
202
+ /** One rule. It denies the plan when any of `refuse`, `silences` or `check` does. */
203
+ export interface PolicyRule {
204
+ /** Names it in output, in the refusal and in `yodel override --rule`: lowercase letters, digits, `-` and `_`. */
205
+ id: string;
206
+ description?: string;
207
+ /** The environments it applies to. Default: every one. */
208
+ environments?: string[];
209
+ /** Denies a pending step of one of these classes (`drop`, `rebuild`, `rewrite`, ...), or a destructive one when `destructive` is true. */
210
+ refuse?: {
211
+ classes?: string[];
212
+ destructive?: boolean;
213
+ };
214
+ /** Denies a `-- yodel:allow` silence (of one of `rules`, default any) whose reason does not match `reason`. */
215
+ silences?: {
216
+ rules?: string[];
217
+ reason: RegExp;
218
+ };
219
+ /** A predicate over the plan: a message (or several) or `false` denies it; `undefined`, `true` or `[]` allows it. */
220
+ check?: (plan: PolicyPlan) => string | string[] | boolean | undefined;
221
+ }
222
+ /** What a policy rule sees: the plan `yodel apply` would run. Plain JSON. */
223
+ export interface PolicyPlan {
224
+ environment: string;
225
+ dialect: "clickhouse" | "postgres";
226
+ /** When the plan is evaluated, ISO 8601 in UTC. */
227
+ now: string;
228
+ /** The migrations the run would apply, in order. For a revert, the one migration reverted, its steps the revert's statements. */
229
+ pending: PolicyMigration[];
230
+ /** Present when the plan is a revert (`yodel revert`): the migration undone and the one it goes back to (null: an empty schema). */
231
+ revert?: {
232
+ id: string;
233
+ to: string | null;
234
+ };
235
+ }
236
+ export interface PolicyMigration {
237
+ id: string;
238
+ checksum: string;
239
+ outOfOrder: boolean;
240
+ steps: PolicyStep[];
241
+ /** Its `-- yodel:allow` silences. */
242
+ silences: Array<{
243
+ step: number;
244
+ rule: string;
245
+ reason: string;
246
+ }>;
247
+ }
248
+ export interface PolicyStep {
249
+ index: number;
250
+ kind: "statement" | "op" | "manual";
251
+ object: string;
252
+ name: string;
253
+ /** A statement's class, or every class an Op or manual step's changes have. */
254
+ classes: string[];
255
+ destructive: boolean;
256
+ /** The rules that classified it. */
257
+ rules: string[];
258
+ /** A statement's SQL. */
259
+ sql?: string;
260
+ /** An Op step's Op. */
261
+ op?: string;
262
+ }
263
+ /** The rules `lint.rules` can set: every lint rule, and the replay check's. */
264
+ export type LintRuleName = LintRuleId | "replay";
265
+ export interface LintConfig {
266
+ /** Each rule's level. The integrity rules (fork, directory, checksum, unreadable-object) are always errors. */
267
+ rules?: Partial<Record<LintRuleName, LevelSetting>>;
48
268
  }
49
269
  /** Returns `config` as is; it types the default export of `yodel.config.ts`. */
50
270
  export declare const defineConfig: (config: YodelConfig) => YodelConfig;
@@ -10,11 +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
+ export const WAVE_GATES = ["always", "on-destructive", "never"];
19
+ export const CI_FORGES = ["github", "gitlab", "forgejo"];
18
20
  /** Returns `config` as is; it types the default export of `yodel.config.ts`. */
19
21
  export const defineConfig = (config) => config;
20
22
  //# sourceMappingURL=define.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"define.js","sourceRoot":"","sources":["../../src/config/define.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAsCH,gFAAgF;AAChF,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,MAAmB,EAAe,EAAE,CAAC,MAAM,CAAC"}
1
+ {"version":3,"file":"define.js","sourceRoot":"","sources":["../../src/config/define.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAwEH,MAAM,CAAC,MAAM,UAAU,GAAwB,CAAC,QAAQ,EAAE,gBAAgB,EAAE,OAAO,CAAC,CAAC;AA6CrF,MAAM,CAAC,MAAM,SAAS,GAAuB,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;AA6I7E,gFAAgF;AAChF,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,MAAmB,EAAe,EAAE,CAAC,MAAM,CAAC"}
@@ -5,7 +5,9 @@
5
5
  * defineConfig({ environments: { <env>: { topology, history, lockTtl } } })
6
6
  * loadYodelConfig(dir, profiles) the file, checked; undefined when there is none
7
7
  * environmentSettings(project, env) topology, history database, lock TTL, with their fallbacks
8
+ * loadYodelConfigAtBase(dir) the file as the base commit has it (./base.ts)
8
9
  */
10
+ export * from "./base.js";
9
11
  export * from "./define.js";
10
12
  export * from "./load.js";
11
13
  export * from "./settings.js";
@@ -5,7 +5,9 @@
5
5
  * defineConfig({ environments: { <env>: { topology, history, lockTtl } } })
6
6
  * loadYodelConfig(dir, profiles) the file, checked; undefined when there is none
7
7
  * environmentSettings(project, env) topology, history database, lock TTL, with their fallbacks
8
+ * loadYodelConfigAtBase(dir) the file as the base commit has it (./base.ts)
8
9
  */
10
+ export * from "./base.js";
9
11
  export * from "./define.js";
10
12
  export * from "./load.js";
11
13
  export * from "./settings.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,eAAe,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,eAAe,CAAC"}
@@ -2,7 +2,7 @@
2
2
  * Finding, loading and checking `yodel.config.ts`. The file is optional; a
3
3
  * project without one gets `undefined` and every setting's default.
4
4
  */
5
- import type { YodelConfig } from "./define.js";
5
+ import { type YodelConfig } from "./define.js";
6
6
  export declare const CONFIG_FILE = "yodel.config.ts";
7
7
  /**
8
8
  * Checks a loaded config's shape. `environments` names each environment by
@@ -7,6 +7,10 @@ import { join } from "node:path";
7
7
  import { pathToFileURL } from "node:url";
8
8
  import { parseTopology } from "@intentius/chant-lexicon-sql/clickhouse/topology";
9
9
  import { YodelError } from "../project.js";
10
+ import { CI_FORGES, WAVE_GATES } from "./define.js";
11
+ import { notifyConfigProblem } from "../notify/index.js";
12
+ import { checkSources } from "../sources/index.js";
13
+ import { TENANT_NAME } from "../tenants/target.js";
10
14
  export const CONFIG_FILE = "yodel.config.ts";
11
15
  const isRecord = (v) => typeof v === "object" && v !== null && !Array.isArray(v);
12
16
  const TOPOLOGY_KINDS = ["single", "cluster", "replicated", "cloud"];
@@ -39,9 +43,11 @@ function checkEnvironment(value, where) {
39
43
  if (!isRecord(value))
40
44
  throw new YodelError(`${where}: expected an object`);
41
45
  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)`);
46
+ if (!["topology", "history", "lockTtl", "lockWait", "tenants"].includes(k))
47
+ throw new YodelError(`${where}.${k}: unknown setting (expected topology, history, lockTtl, lockWait, tenants)`);
44
48
  }
49
+ if (value.tenants !== undefined)
50
+ checkTenants(value.tenants, `${where}.tenants`);
45
51
  if (value.topology !== undefined)
46
52
  checkTopology(value.topology, `${where}.topology`);
47
53
  if (value.history !== undefined) {
@@ -57,8 +63,134 @@ function checkEnvironment(value, where) {
57
63
  if (value.lockTtl !== undefined && !(typeof value.lockTtl === "number" && Number.isFinite(value.lockTtl) && value.lockTtl > 0)) {
58
64
  throw new YodelError(`${where}.lockTtl: expected a number of seconds greater than 0`);
59
65
  }
66
+ if (value.lockWait !== undefined && !(typeof value.lockWait === "number" && Number.isFinite(value.lockWait) && value.lockWait >= 0)) {
67
+ throw new YodelError(`${where}.lockWait: expected a number of seconds, 0 or more`);
68
+ }
60
69
  return value;
61
70
  }
71
+ function checkTenants(value, where) {
72
+ if (Array.isArray(value)) {
73
+ const bad = value.filter((t) => typeof t !== "string" || !TENANT_NAME.test(t));
74
+ if (bad.length > 0)
75
+ throw new YodelError(`${where}: ${bad.map((b) => JSON.stringify(b)).join(", ")} ${bad.length === 1 ? "is not a tenant name" : "are not tenant names"} (letters, digits and _, not starting with a digit)`);
76
+ if (new Set(value).size !== value.length)
77
+ throw new YodelError(`${where}: a tenant is listed twice`);
78
+ return;
79
+ }
80
+ const keys = isRecord(value) ? Object.keys(value) : [];
81
+ if (!isRecord(value) || keys.length !== 1 || !["file", "query"].includes(keys[0] ?? "") || typeof value[keys[0] ?? ""] !== "string" || value[keys[0] ?? ""] === "") {
82
+ throw new YodelError(`${where}: expected a list of tenant names, { file: "<path>" } or { query: "<SQL>" }`);
83
+ }
84
+ }
85
+ const RULE_ID = /^[a-z0-9][a-z0-9_-]*$/;
86
+ function checkPolicy(value, where, profiles) {
87
+ if (!isRecord(value))
88
+ throw new YodelError(`${where}: expected { rules: [...], overriders?: [...] }`);
89
+ for (const k of Object.keys(value))
90
+ if (k !== "rules" && k !== "overriders")
91
+ throw new YodelError(`${where}.${k}: unknown setting (expected rules, overriders)`);
92
+ if (value.overriders !== undefined && !(Array.isArray(value.overriders) && value.overriders.every((o) => typeof o === "string" && o !== ""))) {
93
+ throw new YodelError(`${where}.overriders: expected a list of names`);
94
+ }
95
+ if (!Array.isArray(value.rules))
96
+ throw new YodelError(`${where}.rules: expected a list of rules`);
97
+ const seen = new Set();
98
+ for (const [i, rule] of value.rules.entries()) {
99
+ const at = `${where}.rules[${String(i)}]`;
100
+ if (!isRecord(rule))
101
+ throw new YodelError(`${at}: expected an object`);
102
+ for (const k of Object.keys(rule)) {
103
+ if (!["id", "description", "environments", "refuse", "silences", "check"].includes(k))
104
+ throw new YodelError(`${at}.${k}: unknown setting (expected id, description, environments, refuse, silences, check)`);
105
+ }
106
+ if (typeof rule.id !== "string" || !RULE_ID.test(rule.id))
107
+ throw new YodelError(`${at}.id: lowercase letters, digits, - and _, got ${JSON.stringify(rule.id)}`);
108
+ if (seen.has(rule.id))
109
+ throw new YodelError(`${at}.id: two rules are named ${rule.id}`);
110
+ seen.add(rule.id);
111
+ if (rule.environments !== undefined) {
112
+ if (!Array.isArray(rule.environments) || !rule.environments.every((e) => typeof e === "string"))
113
+ throw new YodelError(`${at}.environments: expected a list of environment names`);
114
+ const unknown = profiles ? rule.environments.filter((e) => !profiles.includes(e)) : [];
115
+ if (unknown.length > 0)
116
+ throw new YodelError(`${at}.environments: ${unknown.join(", ")} ${unknown.length === 1 ? "is not an environment" : "are not environments"} chant.config.ts declares`);
117
+ }
118
+ if (rule.refuse === undefined && rule.silences === undefined && rule.check === undefined)
119
+ throw new YodelError(`${at}: a rule needs refuse, silences or check`);
120
+ if (rule.refuse !== undefined) {
121
+ const r = rule.refuse;
122
+ if (!isRecord(r) || Object.keys(r).some((k) => k !== "classes" && k !== "destructive"))
123
+ throw new YodelError(`${at}.refuse: expected { classes?: [...], destructive?: true }`);
124
+ if (r.classes !== undefined && !(Array.isArray(r.classes) && r.classes.every((c) => typeof c === "string")))
125
+ throw new YodelError(`${at}.refuse.classes: expected a list of classes`);
126
+ if (r.destructive !== undefined && typeof r.destructive !== "boolean")
127
+ throw new YodelError(`${at}.refuse.destructive: expected true or false`);
128
+ }
129
+ if (rule.silences !== undefined) {
130
+ const s = rule.silences;
131
+ if (!isRecord(s) || !(s.reason instanceof RegExp) || Object.keys(s).some((k) => k !== "rules" && k !== "reason"))
132
+ throw new YodelError(`${at}.silences: expected { reason: /pattern/, rules?: [...] }`);
133
+ if (s.rules !== undefined && !(Array.isArray(s.rules) && s.rules.every((x) => typeof x === "string")))
134
+ throw new YodelError(`${at}.silences.rules: expected a list of lint rules`);
135
+ }
136
+ if (rule.check !== undefined && typeof rule.check !== "function")
137
+ throw new YodelError(`${at}.check: expected a function of the plan`);
138
+ }
139
+ }
140
+ const notDeclared = (profiles) => (profiles.length > 0 ? ` (sql.profiles: ${profiles.join(", ")})` : " (it declares no sql.profiles)");
141
+ function checkWaves(value, where, profiles) {
142
+ if (!Array.isArray(value))
143
+ throw new YodelError(`${where}: expected a list of { env, gate }, in the order they apply`);
144
+ const seen = new Set();
145
+ value.forEach((wave, i) => {
146
+ const at = `${where}[${String(i)}]`;
147
+ if (!isRecord(wave))
148
+ throw new YodelError(`${at}: expected { env, gate }`);
149
+ for (const k of Object.keys(wave))
150
+ if (!["env", "gate", "requires", "shares"].includes(k))
151
+ throw new YodelError(`${at}.${k}: unknown setting (expected env, gate, requires, shares)`);
152
+ if (wave.shares !== undefined && !(typeof wave.shares === "number" && Number.isInteger(wave.shares) && wave.shares >= 1))
153
+ throw new YodelError(`${at}.shares: expected a whole number from 1`);
154
+ const env = wave.env;
155
+ if (typeof env !== "string" || env === "")
156
+ throw new YodelError(`${at}.env: expected an environment's name`);
157
+ if (profiles && !profiles.includes(env))
158
+ throw new YodelError(`${at}.env: ${env} is not an environment chant.config.ts declares${notDeclared(profiles)}`);
159
+ if (seen.has(env))
160
+ throw new YodelError(`${at}.env: ${env} has a wave already; an environment is one wave`);
161
+ seen.add(env);
162
+ if (wave.gate !== undefined && !WAVE_GATES.includes(wave.gate)) {
163
+ throw new YodelError(`${at}.gate: ${JSON.stringify(wave.gate)} is not a gate policy (expected ${WAVE_GATES.join(", ")})`);
164
+ }
165
+ const req = wave.requires;
166
+ if (req !== undefined && req !== false) {
167
+ if (typeof req !== "string" || req === "")
168
+ throw new YodelError(`${at}.requires: expected an environment's name, or false`);
169
+ if (req === env)
170
+ throw new YodelError(`${at}.requires: ${env} cannot require itself`);
171
+ if (profiles && !profiles.includes(req))
172
+ throw new YodelError(`${at}.requires: ${req} is not an environment chant.config.ts declares${notDeclared(profiles)}`);
173
+ }
174
+ });
175
+ }
176
+ /** An image reference pinned by digest. */
177
+ const CI_IMAGE = /^[^\s@]+@sha256:[0-9a-f]{64}$/;
178
+ function checkCi(value, where) {
179
+ if (!isRecord(value))
180
+ throw new YodelError(`${where}: expected { forges?, jobs?, image? }`);
181
+ for (const k of Object.keys(value))
182
+ if (!["forges", "jobs", "image"].includes(k))
183
+ throw new YodelError(`${where}.${k}: unknown setting (expected forges, jobs, image)`);
184
+ if (value.image !== undefined && (typeof value.image !== "string" || !CI_IMAGE.test(value.image))) {
185
+ throw new YodelError(`${where}.image: the CI image pinned by its digest, ghcr.io/intentius/sql-yodeler:<version>@sha256:<digest> (the release's image job writes the digest to its summary)`);
186
+ }
187
+ const forges = value.forges;
188
+ if (forges !== undefined && !(Array.isArray(forges) && forges.length > 0 && forges.every((f) => CI_FORGES.includes(f)))) {
189
+ throw new YodelError(`${where}.forges: a list of ${CI_FORGES.join(", ")}`);
190
+ }
191
+ if (value.jobs !== undefined && (typeof value.jobs !== "string" || value.jobs === ""))
192
+ throw new YodelError(`${where}.jobs: the path of the module that declares the project's own jobs, such as "ci/jobs.ts"`);
193
+ }
62
194
  /**
63
195
  * Checks a loaded config's shape. `environments` names each environment by
64
196
  * its `sql.profiles` name; one that chant.config.ts does not declare is an
@@ -68,9 +200,22 @@ export function checkYodelConfig(value, path, profiles) {
68
200
  if (!isRecord(value))
69
201
  throw new YodelError(`${path}: the default export must be a config object (export default defineConfig({ ... }))`);
70
202
  for (const k of Object.keys(value)) {
71
- if (k !== "environments" && k !== "lint")
72
- throw new YodelError(`${path}: unknown setting ${k} (expected environments, lint)`);
203
+ if (!["environments", "lint", "policy", "notify", "sources", "waves", "ci"].includes(k))
204
+ throw new YodelError(`${path}: unknown setting ${k} (expected environments, lint, policy, notify, sources, waves, ci)`);
205
+ }
206
+ if (value.ci !== undefined)
207
+ checkCi(value.ci, `${path}: ci`);
208
+ if (value.sources !== undefined)
209
+ checkSources(value.sources, `${path}: sources`);
210
+ if (value.notify !== undefined) {
211
+ const problem = notifyConfigProblem(value.notify);
212
+ if (problem)
213
+ throw new YodelError(`${path}: ${problem}`);
73
214
  }
215
+ if (value.policy !== undefined)
216
+ checkPolicy(value.policy, `${path}: policy`, profiles);
217
+ if (value.waves !== undefined)
218
+ checkWaves(value.waves, `${path}: waves`, profiles);
74
219
  if (value.lint !== undefined && !isRecord(value.lint))
75
220
  throw new YodelError(`${path}: lint: expected an object`);
76
221
  if (value.environments !== undefined) {
@@ -79,7 +224,7 @@ export function checkYodelConfig(value, path, profiles) {
79
224
  for (const [name, env] of Object.entries(value.environments)) {
80
225
  checkEnvironment(env, `${path}: environments.${name}`);
81
226
  if (profiles && !profiles.includes(name)) {
82
- throw new YodelError(`${path}: environments.${name} is not an environment chant.config.ts declares` + (profiles.length > 0 ? ` (sql.profiles: ${profiles.join(", ")})` : " (it declares no sql.profiles)"));
227
+ throw new YodelError(`${path}: environments.${name} is not an environment chant.config.ts declares${notDeclared(profiles)}`);
83
228
  }
84
229
  }
85
230
  }
@@ -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,12 @@
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 { type Topology } from "@intentius/chant-lexicon-sql/clickhouse/topology";
12
18
  import type { HistoryTopology } from "../history/topology.js";
@@ -24,17 +30,27 @@ export interface EnvironmentSettings {
24
30
  historyTopology: HistoryTopology;
25
31
  historyDatabase: string;
26
32
  lockTtlMs: number;
33
+ /** How long an apply waits for a lock another apply holds; 0 gives up at once (exit 5). */
34
+ lockWaitMs: number;
27
35
  }
36
+ /** The variable that sets the lock wait (a duration, as {@link parseDuration} reads it). */
37
+ export declare const LOCK_WAIT_ENV = "YODEL_LOCK_WAIT";
38
+ /**
39
+ * A duration in milliseconds: `90` (seconds), `500ms`, `30s`, `10m`, `1h`,
40
+ * or a sum of them (`1m30s`). `what` names it in the error.
41
+ */
42
+ export declare function parseDuration(text: string, what: string): number;
28
43
  /** The topology the history's DDL is written for. */
29
44
  export declare function historyTopologyOf(t: Topology): HistoryTopology;
30
45
  /** The settings of environment `name`; see the module comment for the order. */
31
- export declare function environmentSettings(project: Pick<Project, "config" | "yodel">, name: string, env?: NodeJS.ProcessEnv): EnvironmentSettings;
46
+ export declare function environmentSettings(project: Pick<Project, "config" | "yodel">, target: string, env?: NodeJS.ProcessEnv): EnvironmentSettings;
32
47
  /** `cluster:main (yodel.config.ts)`, for a report's header. */
33
48
  export declare const describeSettingsTopology: (s: Pick<EnvironmentSettings, "topology" | "topologySource">) => string;
34
49
  /**
35
50
  * The declarative path (`yodel plan`, `yodel apply` without migrations) runs
36
51
  * chant's planner and applier, which render for `sql.profiles.<env>.topology`
37
52
  * 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.
53
+ * would be ignored there, so it is refused unless chant's profile says the same
54
+ * (an unset profile topology is a single node, as chant renders it).
39
55
  */
40
56
  export declare function declarativeTopologyRefusal(project: Pick<Project, "config" | "yodel">, name: string): YodelError | undefined;