@chkit/plugin-backfill 0.1.0-beta.19 → 0.1.0-beta.20

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 (63) hide show
  1. package/dist/async-backfill.d.ts +64 -0
  2. package/dist/async-backfill.d.ts.map +1 -0
  3. package/dist/async-backfill.js +251 -0
  4. package/dist/async-backfill.js.map +1 -0
  5. package/dist/check.d.ts +9 -0
  6. package/dist/check.d.ts.map +1 -0
  7. package/dist/check.js +79 -0
  8. package/dist/check.js.map +1 -0
  9. package/dist/chunking/analyze.d.ts +38 -0
  10. package/dist/chunking/analyze.d.ts.map +1 -0
  11. package/dist/chunking/analyze.js +76 -0
  12. package/dist/chunking/analyze.js.map +1 -0
  13. package/dist/chunking/build.d.ts +11 -0
  14. package/dist/chunking/build.d.ts.map +1 -0
  15. package/dist/chunking/build.js +51 -0
  16. package/dist/chunking/build.js.map +1 -0
  17. package/dist/chunking/introspect.d.ts +34 -0
  18. package/dist/chunking/introspect.d.ts.map +1 -0
  19. package/dist/chunking/introspect.js +96 -0
  20. package/dist/chunking/introspect.js.map +1 -0
  21. package/dist/chunking/splitter.d.ts +20 -0
  22. package/dist/chunking/splitter.d.ts.map +1 -0
  23. package/dist/chunking/splitter.js +76 -0
  24. package/dist/chunking/splitter.js.map +1 -0
  25. package/dist/chunking/sql.d.ts +12 -0
  26. package/dist/chunking/sql.d.ts.map +1 -0
  27. package/dist/chunking/sql.js +221 -0
  28. package/dist/chunking/sql.js.map +1 -0
  29. package/dist/chunking/types.d.ts +29 -0
  30. package/dist/chunking/types.d.ts.map +1 -0
  31. package/dist/chunking/types.js +2 -0
  32. package/dist/chunking/types.js.map +1 -0
  33. package/dist/index.d.ts +6 -0
  34. package/dist/index.d.ts.map +1 -1
  35. package/dist/index.js +2 -0
  36. package/dist/index.js.map +1 -1
  37. package/dist/options.d.ts +151 -4
  38. package/dist/options.d.ts.map +1 -1
  39. package/dist/options.js +160 -143
  40. package/dist/options.js.map +1 -1
  41. package/dist/payload.d.ts +6 -20
  42. package/dist/payload.d.ts.map +1 -1
  43. package/dist/payload.js +7 -21
  44. package/dist/payload.js.map +1 -1
  45. package/dist/planner.d.ts +4 -31
  46. package/dist/planner.d.ts.map +1 -1
  47. package/dist/planner.js +85 -336
  48. package/dist/planner.js.map +1 -1
  49. package/dist/plugin.d.ts +4 -3
  50. package/dist/plugin.d.ts.map +1 -1
  51. package/dist/plugin.js +234 -228
  52. package/dist/plugin.js.map +1 -1
  53. package/dist/queries.d.ts +21 -0
  54. package/dist/queries.d.ts.map +1 -0
  55. package/dist/queries.js +113 -0
  56. package/dist/queries.js.map +1 -0
  57. package/dist/state.d.ts +7 -31
  58. package/dist/state.d.ts.map +1 -1
  59. package/dist/state.js +33 -132
  60. package/dist/state.js.map +1 -1
  61. package/dist/types.d.ts +32 -124
  62. package/dist/types.d.ts.map +1 -1
  63. package/package.json +5 -3
package/dist/plugin.js CHANGED
@@ -1,87 +1,121 @@
1
- import process from 'node:process';
2
- import { createInterface } from 'node:readline/promises';
3
1
  import { createClickHouseExecutor } from '@chkit/clickhouse';
4
2
  import { wrapPluginRun } from '@chkit/core';
5
- import { PLAN_FLAGS, PLAN_ID_FLAGS, RESUME_FLAGS, RUN_FLAGS, parseCancelArgs, parseDoctorArgs, parsePlanArgs, parseResumeArgs, parseRunArgs, parseStatusArgs, } from './args.js';
6
- import { loadTimeColumnInfo } from './detect.js';
3
+ import { executeBackfill } from './async-backfill.js';
7
4
  import { BackfillConfigError } from './errors.js';
8
- import { normalizeBackfillOptions, mergeOptions, validateBaseOptions } from './options.js';
9
- import { planPayload, runPayload, statusPayload, cancelPayload, doctorPayload } from './payload.js';
5
+ import { PLAN_FLAGS, PLAN_ID_FLAGS, RESUME_FLAGS, RUN_FLAGS, PluginConfigSchema, resolveCheckOptions, resolvePlanOptions, resolveResumeOptions, resolveRunOptions, resolveStatusOptions, } from './options.js';
6
+ import { planPayload, statusPayload, cancelPayload, doctorPayload } from './payload.js';
10
7
  import { buildBackfillPlan } from './planner.js';
11
- import { cancelBackfillRun, evaluateBackfillCheck, executeBackfillRun, getBackfillDoctorReport, getBackfillStatus, resumeBackfillRun, } from './runtime.js';
12
- async function resolveTimeColumn(input) {
13
- if (input.flagValue)
14
- return input.flagValue;
15
- const { schemaTimeColumn, candidates } = await loadTimeColumnInfo(input.target, input.schemaGlobs, input.configPath);
16
- if (schemaTimeColumn)
17
- return schemaTimeColumn;
18
- if (input.defaults.timeColumn)
19
- return input.defaults.timeColumn;
20
- if (candidates.length === 0) {
21
- throw new BackfillConfigError(`Cannot determine time column for ${input.target}. Specify --time-column <column>, set plugins.backfill.timeColumn in table schema, or set defaults.timeColumn in plugin config.`);
22
- }
23
- if (input.jsonMode) {
24
- // biome-ignore lint/style/noNonNullAssertion: length checked above
25
- return candidates[0].name;
26
- }
27
- if (candidates.length === 1) {
28
- return confirmSingleCandidate(candidates[0], input.target);
29
- }
30
- return selectFromCandidates(candidates, input.target);
8
+ import { evaluateBackfillCheck } from './check.js';
9
+ import { cancelBackfillRun, getBackfillDoctorReport, getBackfillStatus } from './queries.js';
10
+ import { backfillPaths, ensureEnvironmentMatch, nowIso, readPlan, readRun, summarizeRunStatus, writeJson, } from './state.js';
11
+ function formatBytes(bytes) {
12
+ if (bytes >= 1024 ** 4)
13
+ return `${(bytes / 1024 ** 4).toFixed(1)} TiB`;
14
+ if (bytes >= 1024 ** 3)
15
+ return `${(bytes / 1024 ** 3).toFixed(1)} GiB`;
16
+ if (bytes >= 1024 ** 2)
17
+ return `${(bytes / 1024 ** 2).toFixed(1)} MiB`;
18
+ if (bytes >= 1024)
19
+ return `${(bytes / 1024).toFixed(1)} KiB`;
20
+ return `${bytes} B`;
31
21
  }
32
- async function confirmSingleCandidate(candidate, target) {
33
- const label = `${candidate.name} (${candidate.type}${candidate.source === 'order_by' ? ', in ORDER BY' : ''})`;
34
- const rl = createInterface({ input: process.stdin, output: process.stdout });
35
- try {
36
- const response = await rl.question(`Detected time column for ${target}: ${label}\nUse ${candidate.name}? [Y/n]: `);
37
- const trimmed = response.trim().toLowerCase();
38
- if (trimmed === '' || trimmed === 'y' || trimmed === 'yes') {
39
- return candidate.name;
22
+ async function runBackfill(input) {
23
+ const { plan, stateDir } = await readPlan({
24
+ planId: input.planId,
25
+ configPath: input.configPath,
26
+ config: input.config,
27
+ stateDir: input.stateDir,
28
+ });
29
+ ensureEnvironmentMatch({
30
+ plan,
31
+ clickhouse: input.clickhouse,
32
+ forceEnvironment: input.forceEnvironment,
33
+ });
34
+ const paths = backfillPaths(stateDir, plan.planId);
35
+ // Check for existing run state
36
+ const existingRun = await readRun(paths.runPath);
37
+ const resumeFrom = input.resumeFrom;
38
+ if (existingRun && !resumeFrom) {
39
+ // `run` command (no resumeFrom) must not silently continue an existing run.
40
+ // Users should use `backfill resume` instead.
41
+ const status = existingRun.status;
42
+ if (status === 'completed') {
43
+ throw new BackfillConfigError(`Run already completed for plan ${plan.planId}. Nothing to do.`);
40
44
  }
41
- throw new BackfillConfigError(`Time column not confirmed. Specify --time-column <column> explicitly.`);
42
- }
43
- finally {
44
- rl.close();
45
+ if (status === 'cancelled') {
46
+ throw new BackfillConfigError(`Run is cancelled for plan ${plan.planId}. Create a new plan or inspect with backfill doctor.`);
47
+ }
48
+ throw new BackfillConfigError(`A run already exists for plan ${plan.planId} (status: ${status}). Use backfill resume to continue.`);
45
49
  }
46
- }
47
- async function selectFromCandidates(candidates, target) {
48
- const rl = createInterface({ input: process.stdin, output: process.stdout });
50
+ const db = createClickHouseExecutor(input.clickhouse);
49
51
  try {
50
- console.log(`Detected time column candidates for ${target}:`);
51
- for (let i = 0; i < candidates.length; i++) {
52
- const c = candidates[i];
53
- const suffix = c.source === 'order_by' ? ', in ORDER BY' : '';
54
- console.log(` ${i + 1}. ${c.name} (${c.type}${suffix})`);
52
+ const runState = {
53
+ planId: plan.planId,
54
+ target: plan.target,
55
+ status: 'running',
56
+ startedAt: existingRun?.startedAt ?? nowIso(),
57
+ updatedAt: nowIso(),
58
+ progress: resumeFrom ?? {},
59
+ };
60
+ await writeJson(paths.runPath, runState);
61
+ const result = await executeBackfill({
62
+ executor: db,
63
+ planId: plan.planId,
64
+ chunks: plan.chunks.map((c) => ({ id: c.id, from: c.from, to: c.to })),
65
+ buildQuery: (chunk) => {
66
+ const planChunk = plan.chunks.find((c) => c.id === chunk.id);
67
+ if (!planChunk)
68
+ throw new Error(`Chunk ${chunk.id} not found in plan`);
69
+ return planChunk.sqlTemplate;
70
+ },
71
+ concurrency: input.concurrency,
72
+ pollIntervalMs: input.pollIntervalMs,
73
+ resumeFrom,
74
+ replayFailed: input.replayFailed,
75
+ onProgress: async (progress) => {
76
+ runState.progress = progress;
77
+ runState.updatedAt = nowIso();
78
+ await writeJson(paths.runPath, runState);
79
+ },
80
+ });
81
+ runState.status = result.failed > 0 ? 'failed' : 'completed';
82
+ runState.completedAt = nowIso();
83
+ runState.updatedAt = nowIso();
84
+ runState.progress = result.progress;
85
+ if (result.failed > 0) {
86
+ const failedEntry = Object.values(result.progress).find((c) => c.status === 'failed');
87
+ runState.lastError = failedEntry?.error ?? 'One or more chunks failed';
55
88
  }
56
- const response = await rl.question(`Select time column [1-${candidates.length}]: `);
57
- const index = Number(response.trim()) - 1;
58
- if (!Number.isInteger(index) || index < 0 || index >= candidates.length) {
59
- throw new BackfillConfigError(`Invalid selection. Specify --time-column <column> explicitly.`);
89
+ await writeJson(paths.runPath, runState);
90
+ const summary = summarizeRunStatus(runState, paths.runPath, plan);
91
+ if (input.jsonMode) {
92
+ input.print({
93
+ ok: result.failed === 0,
94
+ planId: plan.planId,
95
+ status: runState.status,
96
+ chunkCounts: summary.totals,
97
+ rowsWritten: summary.rowsWritten,
98
+ runPath: paths.runPath,
99
+ lastError: runState.lastError,
100
+ });
60
101
  }
61
- // biome-ignore lint/style/noNonNullAssertion: index bounds checked above
62
- return candidates[index].name;
102
+ else {
103
+ let line = `Backfill ${plan.planId}: ${runState.status} (done=${summary.totals.done}/${summary.totals.total}, ${summary.rowsWritten} rows written)`;
104
+ if (runState.lastError)
105
+ line += ` \u2014 ${runState.lastError}`;
106
+ input.print(line);
107
+ if (runState.status === 'completed' && summary.rowsWritten === 0) {
108
+ input.print('Warning: 0 rows written across all chunks. Verify that source data exists in the time range and passes the query\'s WHERE filters.');
109
+ }
110
+ }
111
+ return result.failed > 0 ? 1 : 0;
63
112
  }
64
113
  finally {
65
- rl.close();
114
+ await db.close();
66
115
  }
67
116
  }
68
- function createBackfillCommand(base, input) {
69
- return async (context) => wrapPluginRun({
70
- command: input.name,
71
- label: input.label,
72
- jsonMode: context.jsonMode,
73
- print: context.print,
74
- configErrorClass: BackfillConfigError,
75
- fn: async () => {
76
- const effectiveOptions = mergeOptions(base, context.options);
77
- validateBaseOptions(effectiveOptions);
78
- return input.run({ context, effectiveOptions });
79
- },
80
- });
81
- }
82
117
  export function createBackfillPlugin(options = {}) {
83
- const base = normalizeBackfillOptions(options);
84
- validateBaseOptions(base);
118
+ const config = PluginConfigSchema.parse(options);
85
119
  return {
86
120
  manifest: {
87
121
  name: 'backfill',
@@ -92,105 +126,78 @@ export function createBackfillPlugin(options = {}) {
92
126
  name: 'plan',
93
127
  description: 'Build a deterministic backfill plan and persist immutable plan state',
94
128
  flags: PLAN_FLAGS,
95
- run: createBackfillCommand(base, {
96
- name: 'plan',
129
+ run: async (context) => wrapPluginRun({
130
+ command: 'plan',
97
131
  label: 'Backfill plan',
98
- async run({ context, effectiveOptions }) {
99
- const parsed = parsePlanArgs(context.flags);
100
- const timeColumn = await resolveTimeColumn({
101
- flagValue: parsed.timeColumn,
102
- defaults: effectiveOptions.defaults,
103
- target: parsed.target,
104
- schemaGlobs: context.config.schema,
105
- configPath: context.configPath,
106
- jsonMode: context.jsonMode,
107
- });
108
- const output = await buildBackfillPlan({
109
- target: parsed.target,
110
- from: parsed.from,
111
- to: parsed.to,
112
- timeColumn,
113
- config: context.config,
114
- configPath: context.configPath,
115
- options: effectiveOptions,
116
- chunkHours: parsed.chunkHours,
117
- forceLargeWindow: parsed.forceLargeWindow,
118
- force: parsed.force,
119
- clickhouse: context.config.clickhouse,
120
- });
121
- const payload = planPayload(output);
122
- if (context.jsonMode) {
123
- context.print(payload);
124
- }
125
- else {
126
- context.print(`Backfill plan ${payload.planId} for ${payload.target} (${payload.chunkCount} chunks at ${payload.chunkHours}h, time column: ${payload.timeColumn}) -> ${payload.planPath}${payload.existed ? ' [existing]' : ''}`);
132
+ jsonMode: context.jsonMode,
133
+ print: context.print,
134
+ configErrorClass: BackfillConfigError,
135
+ fn: async () => {
136
+ const opts = resolvePlanOptions(config, context.options, context.flags);
137
+ if (!context.config.clickhouse) {
138
+ throw new BackfillConfigError('ClickHouse connection is required for backfill planning. Configure clickhouse in your clickhouse.config.ts.');
127
139
  }
128
- return 0;
129
- },
130
- }),
131
- },
132
- {
133
- name: 'run',
134
- description: 'Execute a planned backfill with checkpointed chunk progress',
135
- flags: RUN_FLAGS,
136
- run: createBackfillCommand(base, {
137
- name: 'run',
138
- label: 'Backfill run',
139
- async run({ context, effectiveOptions }) {
140
- const parsed = parseRunArgs(context.flags);
141
- const db = context.config.clickhouse
142
- ? createClickHouseExecutor(context.config.clickhouse)
143
- : undefined;
140
+ const db = createClickHouseExecutor(context.config.clickhouse);
144
141
  try {
145
- const output = await executeBackfillRun({
146
- planId: parsed.planId,
147
- config: context.config,
142
+ const output = await buildBackfillPlan({
143
+ opts,
148
144
  configPath: context.configPath,
149
- options: effectiveOptions,
150
- execution: {
151
- replayDone: parsed.replayDone,
152
- replayFailed: parsed.replayFailed,
153
- forceOverlap: parsed.forceOverlap,
154
- forceCompatibility: parsed.forceCompatibility,
155
- forceEnvironment: parsed.forceEnvironment,
156
- simulation: {
157
- failChunkId: parsed.simulateFailChunk,
158
- failCount: parsed.simulateFailCount,
159
- },
160
- },
161
- execute: db ? async (sql) => { await db.command(sql); return undefined; } : undefined,
145
+ config: context.config,
162
146
  clickhouse: context.config.clickhouse,
147
+ clickhouseQuery: async (sql) => {
148
+ const result = await db.query(sql);
149
+ return result;
150
+ },
163
151
  });
164
- const payload = {
165
- ...runPayload(output),
166
- command: 'run',
167
- };
168
- if (payload.noop) {
169
- if (!context.jsonMode) {
170
- context.print(`Plan ${payload.planId} is already completed (${payload.chunkCounts.done}/${payload.chunkCounts.total} chunks done). Nothing to do.`);
171
- }
172
- else {
173
- context.print(payload);
174
- }
175
- return 0;
176
- }
152
+ const payload = planPayload(output);
177
153
  if (context.jsonMode) {
178
154
  context.print(payload);
179
155
  }
180
156
  else {
181
- let line = `Backfill run ${payload.planId}: ${payload.status} (done=${payload.chunkCounts.done}/${payload.chunkCounts.total}, ${payload.rowsWritten} rows written)`;
182
- if (payload.lastError)
183
- line += ` \u2014 ${payload.lastError}`;
184
- context.print(line);
185
- if (payload.status === 'completed' && payload.rowsWritten === 0) {
186
- context.print('Warning: 0 rows written across all chunks. Verify that source data exists in the time range and passes the query\'s WHERE filters.');
187
- }
157
+ const partitionCount = output.plan.partitions?.length ?? 0;
158
+ const totalBytes = output.plan.partitions
159
+ ? formatBytes(output.plan.partitions.reduce((sum, p) => sum + p.bytesOnDisk, 0))
160
+ : 'unknown';
161
+ const sortKeyLabel = output.plan.sortKey
162
+ ? `, sort key: ${output.plan.sortKey.column} (${output.plan.sortKey.category})`
163
+ : '';
164
+ context.print(`Backfill plan ${payload.planId} for ${payload.target} (${payload.chunkCount} chunks across ${partitionCount} partitions, ~${totalBytes}${sortKeyLabel}) -> ${payload.planPath}`);
188
165
  }
189
- return payload.ok ? 0 : 1;
166
+ return 0;
190
167
  }
191
168
  finally {
192
- await db?.close();
169
+ await db.close();
170
+ }
171
+ },
172
+ }),
173
+ },
174
+ {
175
+ name: 'run',
176
+ description: 'Execute a planned backfill with async query submission and polling',
177
+ flags: RUN_FLAGS,
178
+ run: async (context) => wrapPluginRun({
179
+ command: 'run',
180
+ label: 'Backfill run',
181
+ jsonMode: context.jsonMode,
182
+ print: context.print,
183
+ configErrorClass: BackfillConfigError,
184
+ fn: async () => {
185
+ const opts = resolveRunOptions(config, context.options, context.flags);
186
+ if (!context.config.clickhouse) {
187
+ throw new BackfillConfigError('ClickHouse connection is required for backfill execution. Configure clickhouse in your clickhouse.config.ts.');
193
188
  }
189
+ return runBackfill({
190
+ planId: opts.planId,
191
+ forceEnvironment: opts.forceEnvironment,
192
+ concurrency: opts.concurrency,
193
+ pollIntervalMs: opts.pollIntervalMs,
194
+ stateDir: opts.stateDir,
195
+ configPath: context.configPath,
196
+ config: context.config,
197
+ clickhouse: context.config.clickhouse,
198
+ print: context.print,
199
+ jsonMode: context.jsonMode,
200
+ });
194
201
  },
195
202
  }),
196
203
  },
@@ -198,60 +205,51 @@ export function createBackfillPlugin(options = {}) {
198
205
  name: 'resume',
199
206
  description: 'Resume a backfill run from last checkpoint',
200
207
  flags: RESUME_FLAGS,
201
- run: createBackfillCommand(base, {
202
- name: 'resume',
208
+ run: async (context) => wrapPluginRun({
209
+ command: 'resume',
203
210
  label: 'Backfill resume',
204
- async run({ context, effectiveOptions }) {
205
- const parsed = parseResumeArgs(context.flags);
206
- const db = context.config.clickhouse
207
- ? createClickHouseExecutor(context.config.clickhouse)
208
- : undefined;
209
- try {
210
- const output = await resumeBackfillRun({
211
- planId: parsed.planId,
212
- config: context.config,
213
- configPath: context.configPath,
214
- options: effectiveOptions,
215
- execution: {
216
- replayDone: parsed.replayDone,
217
- replayFailed: parsed.replayFailed,
218
- forceOverlap: parsed.forceOverlap,
219
- forceCompatibility: parsed.forceCompatibility,
220
- forceEnvironment: parsed.forceEnvironment,
221
- },
222
- execute: db ? async (sql) => { await db.command(sql); return undefined; } : undefined,
223
- clickhouse: context.config.clickhouse,
224
- });
225
- const payload = {
226
- ...runPayload(output),
227
- command: 'resume',
228
- };
229
- if (payload.noop) {
230
- if (!context.jsonMode) {
231
- context.print(`Plan ${payload.planId} is already completed (${payload.chunkCounts.done}/${payload.chunkCounts.total} chunks done). Nothing to do.`);
232
- }
233
- else {
234
- context.print(payload);
235
- }
236
- return 0;
237
- }
211
+ jsonMode: context.jsonMode,
212
+ print: context.print,
213
+ configErrorClass: BackfillConfigError,
214
+ fn: async () => {
215
+ const opts = resolveResumeOptions(config, context.options, context.flags);
216
+ if (!context.config.clickhouse) {
217
+ throw new BackfillConfigError('ClickHouse connection is required for backfill execution. Configure clickhouse in your clickhouse.config.ts.');
218
+ }
219
+ const { stateDir } = await readPlan({
220
+ planId: opts.planId,
221
+ configPath: context.configPath,
222
+ config: context.config,
223
+ stateDir: opts.stateDir,
224
+ });
225
+ const paths = backfillPaths(stateDir, opts.planId);
226
+ const existingRun = await readRun(paths.runPath);
227
+ if (!existingRun) {
228
+ throw new BackfillConfigError(`Run state not found for plan ${opts.planId}. Start with backfill run before resume.`);
229
+ }
230
+ if (existingRun.status === 'completed') {
238
231
  if (context.jsonMode) {
239
- context.print(payload);
232
+ context.print({ ok: true, noop: true, planId: opts.planId, status: 'completed', message: 'Run already completed. Nothing to resume.' });
240
233
  }
241
234
  else {
242
- let line = `Backfill resume ${payload.planId}: ${payload.status} (done=${payload.chunkCounts.done}/${payload.chunkCounts.total}, ${payload.rowsWritten} rows written)`;
243
- if (payload.lastError)
244
- line += ` \u2014 ${payload.lastError}`;
245
- context.print(line);
246
- if (payload.status === 'completed' && payload.rowsWritten === 0) {
247
- context.print('Warning: 0 rows written across all chunks. Verify that source data exists in the time range and passes the query\'s WHERE filters.');
248
- }
235
+ context.print(`Backfill ${opts.planId}: already completed. Nothing to resume.`);
249
236
  }
250
- return payload.ok ? 0 : 1;
251
- }
252
- finally {
253
- await db?.close();
237
+ return 0;
254
238
  }
239
+ return runBackfill({
240
+ planId: opts.planId,
241
+ forceEnvironment: opts.forceEnvironment,
242
+ concurrency: opts.concurrency,
243
+ pollIntervalMs: opts.pollIntervalMs,
244
+ stateDir: opts.stateDir,
245
+ resumeFrom: existingRun.progress,
246
+ replayFailed: opts.replayFailed,
247
+ configPath: context.configPath,
248
+ config: context.config,
249
+ clickhouse: context.config.clickhouse,
250
+ print: context.print,
251
+ jsonMode: context.jsonMode,
252
+ });
255
253
  },
256
254
  }),
257
255
  },
@@ -259,16 +257,19 @@ export function createBackfillPlugin(options = {}) {
259
257
  name: 'status',
260
258
  description: 'Show checkpoint and chunk progress for a backfill run',
261
259
  flags: PLAN_ID_FLAGS,
262
- run: createBackfillCommand(base, {
263
- name: 'status',
260
+ run: async (context) => wrapPluginRun({
261
+ command: 'status',
264
262
  label: 'Backfill status',
265
- async run({ context, effectiveOptions }) {
266
- const parsed = parseStatusArgs(context.flags);
263
+ jsonMode: context.jsonMode,
264
+ print: context.print,
265
+ configErrorClass: BackfillConfigError,
266
+ fn: async () => {
267
+ const opts = resolveStatusOptions(config, context.options, context.flags);
267
268
  const summary = await getBackfillStatus({
268
- planId: parsed.planId,
269
+ planId: opts.planId,
269
270
  config: context.config,
270
271
  configPath: context.configPath,
271
- options: effectiveOptions,
272
+ stateDir: opts.stateDir,
272
273
  });
273
274
  const payload = statusPayload(summary);
274
275
  if (context.jsonMode) {
@@ -291,16 +292,19 @@ export function createBackfillPlugin(options = {}) {
291
292
  name: 'cancel',
292
293
  description: 'Cancel an in-progress backfill run and prevent further chunk execution',
293
294
  flags: PLAN_ID_FLAGS,
294
- run: createBackfillCommand(base, {
295
- name: 'cancel',
295
+ run: async (context) => wrapPluginRun({
296
+ command: 'cancel',
296
297
  label: 'Backfill cancel',
297
- async run({ context, effectiveOptions }) {
298
- const parsed = parseCancelArgs(context.flags);
298
+ jsonMode: context.jsonMode,
299
+ print: context.print,
300
+ configErrorClass: BackfillConfigError,
301
+ fn: async () => {
302
+ const opts = resolveStatusOptions(config, context.options, context.flags);
299
303
  const summary = await cancelBackfillRun({
300
- planId: parsed.planId,
304
+ planId: opts.planId,
301
305
  config: context.config,
302
306
  configPath: context.configPath,
303
- options: effectiveOptions,
307
+ stateDir: opts.stateDir,
304
308
  });
305
309
  const payload = cancelPayload(summary);
306
310
  if (context.jsonMode) {
@@ -317,16 +321,19 @@ export function createBackfillPlugin(options = {}) {
317
321
  name: 'doctor',
318
322
  description: 'Provide actionable remediation steps for failed or pending backfill runs',
319
323
  flags: PLAN_ID_FLAGS,
320
- run: createBackfillCommand(base, {
321
- name: 'doctor',
324
+ run: async (context) => wrapPluginRun({
325
+ command: 'doctor',
322
326
  label: 'Backfill doctor',
323
- async run({ context, effectiveOptions }) {
324
- const parsed = parseDoctorArgs(context.flags);
327
+ jsonMode: context.jsonMode,
328
+ print: context.print,
329
+ configErrorClass: BackfillConfigError,
330
+ fn: async () => {
331
+ const opts = resolveStatusOptions(config, context.options, context.flags);
325
332
  const report = await getBackfillDoctorReport({
326
- planId: parsed.planId,
333
+ planId: opts.planId,
327
334
  config: context.config,
328
335
  configPath: context.configPath,
329
- options: effectiveOptions,
336
+ stateDir: opts.stateDir,
330
337
  });
331
338
  const payload = doctorPayload(report);
332
339
  if (context.jsonMode) {
@@ -345,16 +352,15 @@ export function createBackfillPlugin(options = {}) {
345
352
  ],
346
353
  hooks: {
347
354
  onConfigLoaded({ options: runtimeOptions }) {
348
- const merged = mergeOptions(base, runtimeOptions);
349
- validateBaseOptions(merged);
355
+ resolveCheckOptions(config, runtimeOptions);
350
356
  },
351
- async onCheck({ config, configPath, options: runtimeOptions }) {
352
- const effectiveOptions = mergeOptions(base, runtimeOptions);
353
- validateBaseOptions(effectiveOptions);
357
+ async onCheck({ config: appConfig, configPath, options: runtimeOptions }) {
358
+ const opts = resolveCheckOptions(config, runtimeOptions);
354
359
  return evaluateBackfillCheck({
355
360
  configPath,
356
- config,
357
- options: effectiveOptions,
361
+ config: appConfig,
362
+ stateDir: opts.stateDir,
363
+ failCheckOnRequiredPendingBackfill: opts.failCheckOnRequiredPendingBackfill,
358
364
  });
359
365
  },
360
366
  onCheckReport({ result, print }) {
@@ -370,7 +376,7 @@ export function createBackfillPlugin(options = {}) {
370
376
  }
371
377
  export function backfill(options = {}) {
372
378
  return {
373
- plugin: createBackfillPlugin(),
379
+ plugin: createBackfillPlugin(options),
374
380
  name: 'backfill',
375
381
  enabled: true,
376
382
  options,
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"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"}