@chkit/plugin-backfill 0.1.0-beta.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/dist/state.js ADDED
@@ -0,0 +1,198 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { existsSync } from 'node:fs';
3
+ import { appendFile, mkdir, readFile, readdir, writeFile } from 'node:fs/promises';
4
+ import { dirname, join, resolve } from 'node:path';
5
+ import { BackfillConfigError } from './errors.js';
6
+ export function hashId(input) {
7
+ return createHash('sha256').update(input).digest('hex');
8
+ }
9
+ export function nowIso() {
10
+ return new Date().toISOString();
11
+ }
12
+ export function stableSerialize(value) {
13
+ if (value === null || typeof value !== 'object') {
14
+ return JSON.stringify(value);
15
+ }
16
+ if (Array.isArray(value)) {
17
+ return `[${value.map((item) => stableSerialize(item)).join(',')}]`;
18
+ }
19
+ const entries = Object.entries(value).sort(([a], [b]) => a.localeCompare(b));
20
+ return `{${entries
21
+ .map(([key, item]) => `${JSON.stringify(key)}:${stableSerialize(item)}`)
22
+ .join(',')}}`;
23
+ }
24
+ export function computeCompatibilityToken(input) {
25
+ return hashId(stableSerialize({
26
+ planId: input.plan.planId,
27
+ target: input.plan.target,
28
+ from: input.plan.from,
29
+ to: input.plan.to,
30
+ planOptions: input.plan.options,
31
+ runtimeDefaults: input.options.defaults,
32
+ runtimePolicy: input.options.policy,
33
+ runtimeLimits: input.options.limits,
34
+ }));
35
+ }
36
+ export function planIdentity(target, from, to, chunkHours) {
37
+ return `${target}|${from}|${to}|${chunkHours}`;
38
+ }
39
+ export function computeBackfillStateDir(config, configPath, options) {
40
+ if (options.stateDir && options.stateDir.length > 0) {
41
+ return resolve(dirname(configPath), options.stateDir);
42
+ }
43
+ return resolve(dirname(configPath), config.metaDir, 'backfill');
44
+ }
45
+ export function backfillPaths(stateDir, planId) {
46
+ const plansDir = join(stateDir, 'plans');
47
+ const runsDir = join(stateDir, 'runs');
48
+ const eventsDir = join(stateDir, 'events');
49
+ return {
50
+ stateDir,
51
+ plansDir,
52
+ runsDir,
53
+ eventsDir,
54
+ planPath: join(plansDir, `${planId}.json`),
55
+ runPath: join(runsDir, `${planId}.json`),
56
+ eventPath: join(eventsDir, `${planId}.ndjson`),
57
+ };
58
+ }
59
+ async function readJsonMaybe(filePath) {
60
+ if (!existsSync(filePath))
61
+ return null;
62
+ return JSON.parse(await readFile(filePath, 'utf8'));
63
+ }
64
+ export async function writeJson(filePath, value) {
65
+ await mkdir(dirname(filePath), { recursive: true });
66
+ await writeFile(filePath, `${JSON.stringify(value, null, 2)}\n`, 'utf8');
67
+ }
68
+ async function appendEvent(eventPath, event) {
69
+ await mkdir(dirname(eventPath), { recursive: true });
70
+ await appendFile(eventPath, `${JSON.stringify({ at: nowIso(), ...event })}\n`, 'utf8');
71
+ }
72
+ export async function readExistingPlan(planPath) {
73
+ return readJsonMaybe(planPath);
74
+ }
75
+ export async function readPlan(input) {
76
+ const stateDir = computeBackfillStateDir(input.config, input.configPath, input.options);
77
+ const paths = backfillPaths(stateDir, input.planId);
78
+ const plan = await readJsonMaybe(paths.planPath);
79
+ if (!plan) {
80
+ throw new BackfillConfigError(`Backfill plan not found: ${paths.planPath}`);
81
+ }
82
+ return {
83
+ plan,
84
+ planPath: paths.planPath,
85
+ stateDir,
86
+ };
87
+ }
88
+ export async function readRun(runPath) {
89
+ return readJsonMaybe(runPath);
90
+ }
91
+ export function createRunState(input) {
92
+ const startedAt = nowIso();
93
+ return {
94
+ planId: input.plan.planId,
95
+ target: input.plan.target,
96
+ status: 'planned',
97
+ createdAt: startedAt,
98
+ startedAt,
99
+ updatedAt: startedAt,
100
+ replayDone: input.execution.replayDone ?? false,
101
+ replayFailed: input.execution.replayFailed ?? false,
102
+ compatibilityToken: computeCompatibilityToken({
103
+ plan: input.plan,
104
+ options: input.options,
105
+ }),
106
+ options: input.plan.options,
107
+ chunks: input.plan.chunks.map((chunk) => ({
108
+ id: chunk.id,
109
+ from: chunk.from,
110
+ to: chunk.to,
111
+ status: 'pending',
112
+ attempts: 0,
113
+ idempotencyToken: chunk.idempotencyToken,
114
+ sqlTemplate: chunk.sqlTemplate,
115
+ })),
116
+ };
117
+ }
118
+ export async function collectActiveRunTargets(runsDir) {
119
+ const active = new Map();
120
+ if (!existsSync(runsDir))
121
+ return active;
122
+ const entries = await readdir(runsDir, { withFileTypes: true });
123
+ for (const entry of entries) {
124
+ if (!entry.isFile() || !entry.name.endsWith('.json'))
125
+ continue;
126
+ const file = join(runsDir, entry.name);
127
+ const run = await readRun(file);
128
+ if (!run)
129
+ continue;
130
+ if (run.status !== 'running')
131
+ continue;
132
+ active.set(run.planId, run.target);
133
+ }
134
+ return active;
135
+ }
136
+ export async function listPlanIds(plansDir) {
137
+ if (!existsSync(plansDir))
138
+ return [];
139
+ const entries = await readdir(plansDir, { withFileTypes: true });
140
+ return entries
141
+ .filter((entry) => entry.isFile() && entry.name.endsWith('.json'))
142
+ .map((entry) => entry.name.replace(/\.json$/, ''))
143
+ .sort();
144
+ }
145
+ export function summarizeRunStatus(run, runPath, eventPath) {
146
+ const summary = {
147
+ total: run.chunks.length,
148
+ pending: 0,
149
+ running: 0,
150
+ done: 0,
151
+ failed: 0,
152
+ skipped: 0,
153
+ };
154
+ let attempts = 0;
155
+ for (const chunk of run.chunks) {
156
+ attempts += chunk.attempts;
157
+ if (chunk.status === 'pending')
158
+ summary.pending += 1;
159
+ if (chunk.status === 'running')
160
+ summary.running += 1;
161
+ if (chunk.status === 'done')
162
+ summary.done += 1;
163
+ if (chunk.status === 'failed')
164
+ summary.failed += 1;
165
+ if (chunk.status === 'skipped')
166
+ summary.skipped += 1;
167
+ }
168
+ return {
169
+ planId: run.planId,
170
+ target: run.target,
171
+ status: run.status,
172
+ totals: summary,
173
+ attempts,
174
+ updatedAt: run.updatedAt,
175
+ runPath,
176
+ eventPath,
177
+ lastError: run.lastError,
178
+ };
179
+ }
180
+ export async function persistRunAndEvent(input) {
181
+ input.run.updatedAt = nowIso();
182
+ await writeJson(input.runPath, input.run);
183
+ await appendEvent(input.eventPath, input.event);
184
+ }
185
+ export function ensureRunCompatibility(input) {
186
+ if (!input.run.compatibilityToken)
187
+ return;
188
+ const expected = computeCompatibilityToken({
189
+ plan: input.plan,
190
+ options: input.options,
191
+ });
192
+ if (input.run.compatibilityToken === expected)
193
+ return;
194
+ if (input.forceCompatibility)
195
+ return;
196
+ throw new BackfillConfigError(`Run compatibility check failed for plan ${input.plan.planId}. Runtime options changed since last checkpoint. Retry with --force-compatibility to acknowledge override.`);
197
+ }
198
+ //# sourceMappingURL=state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.js","sourceRoot":"","sources":["../src/state.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,229 @@
1
+ import type { ChxInlinePluginRegistration, ResolvedChxConfig } from '@chkit/core';
2
+ export interface BackfillPluginDefaults {
3
+ chunkHours?: number;
4
+ maxParallelChunks?: number;
5
+ maxRetriesPerChunk?: number;
6
+ requireIdempotencyToken?: boolean;
7
+ }
8
+ export interface BackfillPluginPolicy {
9
+ requireDryRunBeforeRun?: boolean;
10
+ requireExplicitWindow?: boolean;
11
+ blockOverlappingRuns?: boolean;
12
+ failCheckOnRequiredPendingBackfill?: boolean;
13
+ }
14
+ export interface BackfillPluginLimits {
15
+ maxWindowHours?: number;
16
+ minChunkMinutes?: number;
17
+ }
18
+ export interface BackfillPluginOptions {
19
+ stateDir?: string;
20
+ defaults?: BackfillPluginDefaults;
21
+ policy?: BackfillPluginPolicy;
22
+ limits?: BackfillPluginLimits;
23
+ }
24
+ export interface NormalizedBackfillPluginOptions {
25
+ stateDir?: string;
26
+ defaults: Required<BackfillPluginDefaults>;
27
+ policy: Required<BackfillPluginPolicy>;
28
+ limits: Required<BackfillPluginLimits>;
29
+ }
30
+ export type BackfillPlanStatus = 'planned' | 'running' | 'paused' | 'completed' | 'failed' | 'cancelled';
31
+ export interface BackfillChunk {
32
+ id: string;
33
+ from: string;
34
+ to: string;
35
+ status: 'pending' | 'running' | 'done' | 'failed' | 'skipped';
36
+ attempts: number;
37
+ idempotencyToken: string;
38
+ sqlTemplate: string;
39
+ lastError?: string;
40
+ }
41
+ export interface BackfillPlanState {
42
+ planId: string;
43
+ target: string;
44
+ createdAt: string;
45
+ status: BackfillPlanStatus;
46
+ from: string;
47
+ to: string;
48
+ chunks: BackfillChunk[];
49
+ options: {
50
+ chunkHours: number;
51
+ maxParallelChunks: number;
52
+ maxRetriesPerChunk: number;
53
+ requireIdempotencyToken: boolean;
54
+ };
55
+ policy: Required<BackfillPluginPolicy>;
56
+ limits: Required<BackfillPluginLimits>;
57
+ }
58
+ export interface BackfillRunChunkState {
59
+ id: string;
60
+ from: string;
61
+ to: string;
62
+ status: 'pending' | 'running' | 'done' | 'failed' | 'skipped';
63
+ attempts: number;
64
+ idempotencyToken: string;
65
+ sqlTemplate: string;
66
+ startedAt?: string;
67
+ completedAt?: string;
68
+ lastError?: string;
69
+ }
70
+ export interface BackfillRunState {
71
+ planId: string;
72
+ target: string;
73
+ status: BackfillPlanStatus;
74
+ createdAt: string;
75
+ startedAt: string;
76
+ updatedAt: string;
77
+ completedAt?: string;
78
+ lastError?: string;
79
+ replayDone: boolean;
80
+ replayFailed: boolean;
81
+ compatibilityToken: string;
82
+ options: BackfillPlanState['options'];
83
+ chunks: BackfillRunChunkState[];
84
+ }
85
+ export interface BackfillStatusSummary {
86
+ planId: string;
87
+ target: string;
88
+ status: BackfillPlanStatus;
89
+ totals: {
90
+ total: number;
91
+ pending: number;
92
+ running: number;
93
+ done: number;
94
+ failed: number;
95
+ skipped: number;
96
+ };
97
+ attempts: number;
98
+ updatedAt: string;
99
+ runPath: string;
100
+ eventPath: string;
101
+ lastError?: string;
102
+ }
103
+ export interface BackfillPluginCheckContext {
104
+ command: 'check';
105
+ config: ResolvedChxConfig;
106
+ configPath: string;
107
+ jsonMode: boolean;
108
+ options: Record<string, unknown>;
109
+ }
110
+ export interface BackfillPluginCheckResult {
111
+ plugin: string;
112
+ evaluated: boolean;
113
+ ok: boolean;
114
+ findings: Array<{
115
+ code: 'backfill_required_pending' | 'backfill_plan_missing' | 'backfill_plan_stale' | 'backfill_overlap_blocked' | 'backfill_window_exceeds_limit' | 'backfill_chunk_failed_retry_exhausted' | 'backfill_policy_relaxed';
116
+ message: string;
117
+ severity: 'info' | 'warn' | 'error';
118
+ metadata?: Record<string, unknown>;
119
+ }>;
120
+ metadata?: Record<string, unknown>;
121
+ }
122
+ export interface BuildBackfillPlanOutput {
123
+ plan: BackfillPlanState;
124
+ planPath: string;
125
+ existed: boolean;
126
+ }
127
+ export interface ReadPlanOutput {
128
+ plan: BackfillPlanState;
129
+ planPath: string;
130
+ stateDir: string;
131
+ }
132
+ export interface BackfillPathSet {
133
+ stateDir: string;
134
+ plansDir: string;
135
+ runsDir: string;
136
+ eventsDir: string;
137
+ planPath: string;
138
+ runPath: string;
139
+ eventPath: string;
140
+ }
141
+ export interface BackfillExecutionOptions {
142
+ replayDone?: boolean;
143
+ replayFailed?: boolean;
144
+ forceOverlap?: boolean;
145
+ forceCompatibility?: boolean;
146
+ simulation?: {
147
+ failChunkId?: string;
148
+ failCount?: number;
149
+ };
150
+ }
151
+ export interface BackfillDoctorReport {
152
+ planId: string;
153
+ status: BackfillPlanStatus;
154
+ issueCodes: string[];
155
+ recommendations: string[];
156
+ failedChunkIds: string[];
157
+ }
158
+ export interface ExecuteBackfillRunOutput {
159
+ run: BackfillRunState;
160
+ status: BackfillStatusSummary;
161
+ runPath: string;
162
+ eventPath: string;
163
+ }
164
+ export interface BackfillPluginCommandContext {
165
+ args: string[];
166
+ jsonMode: boolean;
167
+ options: Record<string, unknown>;
168
+ config: ResolvedChxConfig;
169
+ configPath: string;
170
+ print: (value: unknown) => void;
171
+ }
172
+ export interface BackfillPlugin {
173
+ manifest: {
174
+ name: 'backfill';
175
+ apiVersion: 1;
176
+ version?: string;
177
+ };
178
+ commands: Array<{
179
+ name: 'plan' | 'run' | 'resume' | 'status' | 'cancel' | 'doctor';
180
+ description: string;
181
+ run: (context: BackfillPluginCommandContext) => undefined | number | Promise<undefined | number>;
182
+ }>;
183
+ hooks?: {
184
+ onConfigLoaded?: (context: {
185
+ command: string;
186
+ configPath: string;
187
+ options: Record<string, unknown>;
188
+ }) => void;
189
+ onCheck?: (context: BackfillPluginCheckContext) => BackfillPluginCheckResult | undefined | Promise<BackfillPluginCheckResult | undefined>;
190
+ onCheckReport?: (context: {
191
+ result: BackfillPluginCheckResult;
192
+ print: (line: string) => void;
193
+ }) => void | Promise<void>;
194
+ };
195
+ }
196
+ export type BackfillPluginRegistration = ChxInlinePluginRegistration<BackfillPlugin, BackfillPluginOptions>;
197
+ export interface ParsedPlanArgs {
198
+ target: string;
199
+ from: string;
200
+ to: string;
201
+ chunkHours?: number;
202
+ forceLargeWindow: boolean;
203
+ }
204
+ export interface ParsedRunArgs {
205
+ planId: string;
206
+ replayDone: boolean;
207
+ replayFailed: boolean;
208
+ forceOverlap: boolean;
209
+ forceCompatibility: boolean;
210
+ simulateFailChunk?: string;
211
+ simulateFailCount: number;
212
+ }
213
+ export interface ParsedResumeArgs {
214
+ planId: string;
215
+ replayDone: boolean;
216
+ replayFailed: boolean;
217
+ forceOverlap: boolean;
218
+ forceCompatibility: boolean;
219
+ }
220
+ export interface ParsedStatusArgs {
221
+ planId: string;
222
+ }
223
+ export interface ParsedCancelArgs {
224
+ planId: string;
225
+ }
226
+ export interface ParsedDoctorArgs {
227
+ planId: string;
228
+ }
229
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,2BAA2B,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAEjF,MAAM,WAAW,sBAAsB;IACrC,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,uBAAuB,CAAC,EAAE,OAAO,CAAA;CAClC;AAED,MAAM,WAAW,oBAAoB;IACnC,sBAAsB,CAAC,EAAE,OAAO,CAAA;IAChC,qBAAqB,CAAC,EAAE,OAAO,CAAA;IAC/B,oBAAoB,CAAC,EAAE,OAAO,CAAA;IAC9B,kCAAkC,CAAC,EAAE,OAAO,CAAA;CAC7C;AAED,MAAM,WAAW,oBAAoB;IACnC,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,eAAe,CAAC,EAAE,MAAM,CAAA;CACzB;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,QAAQ,CAAC,EAAE,sBAAsB,CAAA;IACjC,MAAM,CAAC,EAAE,oBAAoB,CAAA;IAC7B,MAAM,CAAC,EAAE,oBAAoB,CAAA;CAC9B;AAED,MAAM,WAAW,+BAA+B;IAC9C,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,QAAQ,CAAC,sBAAsB,CAAC,CAAA;IAC1C,MAAM,EAAE,QAAQ,CAAC,oBAAoB,CAAC,CAAA;IACtC,MAAM,EAAE,QAAQ,CAAC,oBAAoB,CAAC,CAAA;CACvC;AAED,MAAM,MAAM,kBAAkB,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,GAAG,WAAW,GAAG,QAAQ,GAAG,WAAW,CAAA;AAExG,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,MAAM,GAAG,QAAQ,GAAG,SAAS,CAAA;IAC7D,QAAQ,EAAE,MAAM,CAAA;IAChB,gBAAgB,EAAE,MAAM,CAAA;IACxB,WAAW,EAAE,MAAM,CAAA;IACnB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,kBAAkB,CAAA;IAC1B,IAAI,EAAE,MAAM,CAAA;IACZ,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,EAAE,aAAa,EAAE,CAAA;IACvB,OAAO,EAAE;QACP,UAAU,EAAE,MAAM,CAAA;QAClB,iBAAiB,EAAE,MAAM,CAAA;QACzB,kBAAkB,EAAE,MAAM,CAAA;QAC1B,uBAAuB,EAAE,OAAO,CAAA;KACjC,CAAA;IACD,MAAM,EAAE,QAAQ,CAAC,oBAAoB,CAAC,CAAA;IACtC,MAAM,EAAE,QAAQ,CAAC,oBAAoB,CAAC,CAAA;CACvC;AAED,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,MAAM,GAAG,QAAQ,GAAG,SAAS,CAAA;IAC7D,QAAQ,EAAE,MAAM,CAAA;IAChB,gBAAgB,EAAE,MAAM,CAAA;IACxB,WAAW,EAAE,MAAM,CAAA;IACnB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,kBAAkB,CAAA;IAC1B,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,OAAO,CAAA;IACnB,YAAY,EAAE,OAAO,CAAA;IACrB,kBAAkB,EAAE,MAAM,CAAA;IAC1B,OAAO,EAAE,iBAAiB,CAAC,SAAS,CAAC,CAAA;IACrC,MAAM,EAAE,qBAAqB,EAAE,CAAA;CAChC;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,kBAAkB,CAAA;IAC1B,MAAM,EAAE;QACN,KAAK,EAAE,MAAM,CAAA;QACb,OAAO,EAAE,MAAM,CAAA;QACf,OAAO,EAAE,MAAM,CAAA;QACf,IAAI,EAAE,MAAM,CAAA;QACZ,MAAM,EAAE,MAAM,CAAA;QACd,OAAO,EAAE,MAAM,CAAA;KAChB,CAAA;IACD,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,0BAA0B;IACzC,OAAO,EAAE,OAAO,CAAA;IAChB,MAAM,EAAE,iBAAiB,CAAA;IACzB,UAAU,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,OAAO,CAAA;IACjB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACjC;AAED,MAAM,WAAW,yBAAyB;IACxC,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,OAAO,CAAA;IAClB,EAAE,EAAE,OAAO,CAAA;IACX,QAAQ,EAAE,KAAK,CAAC;QACd,IAAI,EACA,2BAA2B,GAC3B,uBAAuB,GACvB,qBAAqB,GACrB,0BAA0B,GAC1B,+BAA+B,GAC/B,uCAAuC,GACvC,yBAAyB,CAAA;QAC7B,OAAO,EAAE,MAAM,CAAA;QACf,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAA;QACnC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KACnC,CAAC,CAAA;IACF,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACnC;AAED,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,iBAAiB,CAAA;IACvB,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,OAAO,CAAA;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,iBAAiB,CAAA;IACvB,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,wBAAwB;IACvC,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,kBAAkB,CAAC,EAAE,OAAO,CAAA;IAC5B,UAAU,CAAC,EAAE;QACX,WAAW,CAAC,EAAE,MAAM,CAAA;QACpB,SAAS,CAAC,EAAE,MAAM,CAAA;KACnB,CAAA;CACF;AAED,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,kBAAkB,CAAA;IAC1B,UAAU,EAAE,MAAM,EAAE,CAAA;IACpB,eAAe,EAAE,MAAM,EAAE,CAAA;IACzB,cAAc,EAAE,MAAM,EAAE,CAAA;CACzB;AAED,MAAM,WAAW,wBAAwB;IACvC,GAAG,EAAE,gBAAgB,CAAA;IACrB,MAAM,EAAE,qBAAqB,CAAA;IAC7B,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,4BAA4B;IAC3C,IAAI,EAAE,MAAM,EAAE,CAAA;IACd,QAAQ,EAAE,OAAO,CAAA;IACjB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAChC,MAAM,EAAE,iBAAiB,CAAA;IACzB,UAAU,EAAE,MAAM,CAAA;IAClB,KAAK,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAA;CAChC;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE;QACR,IAAI,EAAE,UAAU,CAAA;QAChB,UAAU,EAAE,CAAC,CAAA;QACb,OAAO,CAAC,EAAE,MAAM,CAAA;KACjB,CAAA;IACD,QAAQ,EAAE,KAAK,CAAC;QACd,IAAI,EAAE,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAA;QAChE,WAAW,EAAE,MAAM,CAAA;QACnB,GAAG,EAAE,CAAC,OAAO,EAAE,4BAA4B,KAAK,SAAS,GAAG,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,MAAM,CAAC,CAAA;KACjG,CAAC,CAAA;IACF,KAAK,CAAC,EAAE;QACN,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE;YAAE,OAAO,EAAE,MAAM,CAAC;YAAC,UAAU,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;SAAE,KAAK,IAAI,CAAA;QAC7G,OAAO,CAAC,EAAE,CACR,OAAO,EAAE,0BAA0B,KAChC,yBAAyB,GAAG,SAAS,GAAG,OAAO,CAAC,yBAAyB,GAAG,SAAS,CAAC,CAAA;QAC3F,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE;YACxB,MAAM,EAAE,yBAAyB,CAAA;YACjC,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;SAC9B,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;KAC3B,CAAA;CACF;AAED,MAAM,MAAM,0BAA0B,GAAG,2BAA2B,CAClE,cAAc,EACd,qBAAqB,CACtB,CAAA;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;IACZ,EAAE,EAAE,MAAM,CAAA;IACV,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,gBAAgB,EAAE,OAAO,CAAA;CAC1B;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,EAAE,OAAO,CAAA;IACnB,YAAY,EAAE,OAAO,CAAA;IACrB,YAAY,EAAE,OAAO,CAAA;IACrB,kBAAkB,EAAE,OAAO,CAAA;IAC3B,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,iBAAiB,EAAE,MAAM,CAAA;CAC1B;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,EAAE,OAAO,CAAA;IACnB,YAAY,EAAE,OAAO,CAAA;IACrB,YAAY,EAAE,OAAO,CAAA;IACrB,kBAAkB,EAAE,OAAO,CAAA;CAC5B;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAA;CACf"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,27 @@
1
+ {
2
+ "name": "@chkit/plugin-backfill",
3
+ "version": "0.1.0-beta.0",
4
+ "type": "module",
5
+ "main": "./dist/index.js",
6
+ "types": "./dist/index.d.ts",
7
+ "exports": {
8
+ ".": {
9
+ "types": "./dist/index.d.ts",
10
+ "default": "./dist/index.js"
11
+ }
12
+ },
13
+ "files": [
14
+ "dist"
15
+ ],
16
+ "scripts": {
17
+ "build": "tsc -p tsconfig.json",
18
+ "dev": "tsc -p tsconfig.json --watch",
19
+ "typecheck": "tsc -p tsconfig.json --noEmit",
20
+ "lint": "biome lint src",
21
+ "test": "bun test src",
22
+ "clean": "rm -rf dist"
23
+ },
24
+ "dependencies": {
25
+ "@chkit/core": "workspace:*"
26
+ }
27
+ }