testeiya 0.7.0 → 0.8.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 (59) hide show
  1. package/PIPELINES.md +332 -0
  2. package/README.md +114 -1
  3. package/dist/prompt/testomat.io.js +2 -2
  4. package/dist/prompt/testomat.io.js.map +1 -1
  5. package/dist/src/args.js +104 -1
  6. package/dist/src/args.js.map +1 -1
  7. package/dist/src/checkpoint.js +0 -21
  8. package/dist/src/checkpoint.js.map +1 -1
  9. package/dist/src/cli.js +42 -1
  10. package/dist/src/cli.js.map +1 -1
  11. package/dist/src/git.js +68 -0
  12. package/dist/src/git.js.map +1 -0
  13. package/dist/src/mcp.js +4 -20
  14. package/dist/src/mcp.js.map +1 -1
  15. package/dist/src/output.js +16 -3
  16. package/dist/src/output.js.map +1 -1
  17. package/dist/src/pipeline/command-stage.js +27 -0
  18. package/dist/src/pipeline/command-stage.js.map +1 -0
  19. package/dist/src/pipeline/diagram.js +103 -0
  20. package/dist/src/pipeline/diagram.js.map +1 -0
  21. package/dist/src/pipeline/gate.js +59 -0
  22. package/dist/src/pipeline/gate.js.map +1 -0
  23. package/dist/src/pipeline/launcher.js +74 -0
  24. package/dist/src/pipeline/launcher.js.map +1 -0
  25. package/dist/src/pipeline/log.js +70 -0
  26. package/dist/src/pipeline/log.js.map +1 -0
  27. package/dist/src/pipeline/pipeline-file.js +242 -0
  28. package/dist/src/pipeline/pipeline-file.js.map +1 -0
  29. package/dist/src/pipeline/pipeline.js +415 -0
  30. package/dist/src/pipeline/pipeline.js.map +1 -0
  31. package/dist/src/pipeline/report.js +61 -0
  32. package/dist/src/pipeline/report.js.map +1 -0
  33. package/dist/src/pipeline/spec.js +2 -0
  34. package/dist/src/pipeline/spec.js.map +1 -0
  35. package/dist/src/pipeline/stage.js +150 -0
  36. package/dist/src/pipeline/stage.js.map +1 -0
  37. package/dist/src/pipeline/state.js +70 -0
  38. package/dist/src/pipeline/state.js.map +1 -0
  39. package/dist/src/pipeline/task-stage.js +84 -0
  40. package/dist/src/pipeline/task-stage.js.map +1 -0
  41. package/dist/src/pipeline/variables.js +41 -0
  42. package/dist/src/pipeline/variables.js.map +1 -0
  43. package/dist/src/run.js +6 -3
  44. package/dist/src/run.js.map +1 -1
  45. package/mcp-tools.json +1092 -2110
  46. package/package.json +7 -5
  47. package/pipelines/api-testing.yml +39 -0
  48. package/pipelines/issue-test-cases.yml +41 -0
  49. package/pipelines/pr-review.yml +43 -0
  50. package/pipelines/regression.yml +39 -0
  51. package/pipelines/web-testing.yml +50 -0
  52. package/prompt/testomat.io.ts +5 -5
  53. package/skills/skills.lock.json +2 -2
  54. package/skills/testomatio/test-management/improve-test-cases/SKILL.md +1 -1
  55. package/skills/testomatio/test-management/qa-test-code-coverage/SKILL.md +2 -2
  56. package/skills/testomatio/test-management/qa-write-test-cases/SKILL.md +3 -3
  57. package/skills/testomatio/test-management/scan-automation-project/SKILL.md +8 -8
  58. package/skills/testomatio/test-management/sync-test-cases-with-tms/SKILL.md +9 -9
  59. package/skills/testomatio/test-management/sync-test-cases-with-tms/references/TESTOMATIO_CLI.md +4 -4
@@ -0,0 +1,415 @@
1
+ import { existsSync, mkdirSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from "node:fs";
2
+ import { tmpdir } from "node:os";
3
+ import { join, resolve, sep } from "node:path";
4
+ import { fileURLToPath } from "node:url";
5
+ import { chalkStderr as c } from "chalk";
6
+ import { Git } from "../git.js";
7
+ import { UsageError } from "../model.js";
8
+ import { CommandStage } from "./command-stage.js";
9
+ import { Diagram } from "./diagram.js";
10
+ import { Gate } from "./gate.js";
11
+ import { Launcher } from "./launcher.js";
12
+ import { log } from "./log.js";
13
+ import { PipelineFile } from "./pipeline-file.js";
14
+ import { Report } from "./report.js";
15
+ import { CHANGES_FILE, COPY_FILE, PipelineState, STATE_FILE, } from "./state.js";
16
+ import { TaskStage } from "./task-stage.js";
17
+ import { Variables } from "./variables.js";
18
+ // A job-level reply, thread or session file belongs to a single task, never to
19
+ // every stage of a pipeline.
20
+ const JOB_ONLY = ["TESTEIYA_FOLLOW_UP", "TESTEIYA_THREAD", "TESTEIYA_SESSION_FILE"];
21
+ /**
22
+ * One run of a pipeline file. It picks the round, checks the gates, runs the
23
+ * stages in order through one folder, then a summary that is the only report.
24
+ */
25
+ export class Pipeline {
26
+ options;
27
+ cwd = process.cwd();
28
+ git = new Git(this.cwd);
29
+ launcher = new Launcher(this.cwd);
30
+ cli;
31
+ constructor(options) {
32
+ this.options = options;
33
+ this.cli = options.cli ?? fileURLToPath(new URL("../cli.js", import.meta.url));
34
+ }
35
+ static list(json) {
36
+ const pipelines = PipelineFile.bundled();
37
+ if (json) {
38
+ process.stdout.write(`${JSON.stringify({ pipelines }, null, 2)}\n`);
39
+ return 0;
40
+ }
41
+ process.stdout.write("\n");
42
+ for (const pipeline of pipelines) {
43
+ process.stdout.write(` ${pipeline.name.padEnd(14)} ${c.dim(pipeline.description)}\n`);
44
+ }
45
+ process.stdout.write('\n Run one with: testeiya pipeline <name>, or pass your own .yml\n\n');
46
+ return 0;
47
+ }
48
+ async run() {
49
+ const { options, cwd } = this;
50
+ const file = PipelineFile.find(options.name);
51
+ const named = file.read();
52
+ const dir = this.folder(named.name);
53
+ if (dir === cwd || cwd.startsWith(dir + sep)) {
54
+ throw new UsageError("--dir must be a folder of its own, not the checkout or a folder above it");
55
+ }
56
+ const previous = PipelineState.read(dir);
57
+ const commit = await this.git.headCommit();
58
+ const history = previous?.rounds ?? [];
59
+ const retry = Boolean(previous && previous.commit === commit && PipelineState.STOPPED.includes(previous.status));
60
+ const again = Boolean(previous && !retry && previous.status !== "skipped" && previous.commit === commit);
61
+ const spec = this.spec(file, named, dir, retry);
62
+ const gates = this.gates(spec);
63
+ const stages = this.stages(spec.stages);
64
+ let round = history.length + 1;
65
+ let since = history.at(-1)?.commit ?? null;
66
+ if (retry || again) {
67
+ round = previous.round;
68
+ since = previous.since;
69
+ }
70
+ let aiProblem = null;
71
+ if (this.needsAi(stages))
72
+ aiProblem = await this.aiProblem();
73
+ if (aiProblem && !options.dryRun)
74
+ throw new UsageError(aiProblem);
75
+ const vars = this.variables(spec, dir, round);
76
+ const changes = await this.git.changes(since, vars.toEnv());
77
+ const results = await this.checkGates(gates, [spec.when, ...stages.map((stage) => stage.spec.when)].flat(), vars, changes);
78
+ log.header(spec.name, round, changes, dir);
79
+ const blocked = spec.when.find((name) => !results.get(name));
80
+ if (blocked) {
81
+ const reason = gates.get(blocked).message;
82
+ log.skipped(reason);
83
+ if (options.dryRun)
84
+ return 0;
85
+ const state = new PipelineState(dir, { name: spec.name, round, commit, since, status: "skipped", reason, stages: [], rounds: history });
86
+ state.save();
87
+ if (options.json)
88
+ process.stdout.write(`${JSON.stringify(state, null, 2)}\n`);
89
+ return 0;
90
+ }
91
+ // After the skip: a job gated on a pull request may name one that only exists when the gate passes.
92
+ const report = await Report.prepare(options);
93
+ if (options.dryRun)
94
+ return this.dryRun(stages, gates, results, aiProblem);
95
+ let created = previous?.created ?? [];
96
+ mkdirSync(dir, { recursive: true });
97
+ if (!retry) {
98
+ // A new round clears what the last one wrote and keeps the sessions.
99
+ for (const name of created)
100
+ rmSync(join(dir, name), { recursive: true, force: true });
101
+ created = [];
102
+ writeFileSync(join(dir, COPY_FILE), file.text());
103
+ }
104
+ if (changes.files)
105
+ writeFileSync(join(dir, CHANGES_FILE), `${changes.files.join("\n")}\n`);
106
+ this.checkInputs(stages, dir);
107
+ let kept = null;
108
+ if (retry)
109
+ kept = previous;
110
+ const state = new PipelineState(dir, {
111
+ name: spec.name,
112
+ round,
113
+ commit,
114
+ since,
115
+ status: "running",
116
+ stages: stages.map((stage) => this.keptRecord(stage, kept)),
117
+ rounds: history,
118
+ created,
119
+ });
120
+ state.trackFiles();
121
+ return this.runStages({ spec, stages, gates, results, state, vars, report, dir });
122
+ }
123
+ /** Validates the file, then checks every gate it declares. Runs no stage. */
124
+ async check() {
125
+ const file = PipelineFile.find(this.options.name);
126
+ const named = file.read();
127
+ const dir = this.folder(named.name, false);
128
+ const spec = this.spec(file, named, dir, false);
129
+ const gates = this.gates(spec);
130
+ const stages = this.stages(spec.stages);
131
+ this.checkInputs(stages, dir);
132
+ log.valid(spec.name, file.path);
133
+ let aiProblem = null;
134
+ if (this.needsAi(stages))
135
+ aiProblem = await this.aiProblem();
136
+ const vars = this.variables(spec, dir, 1);
137
+ const since = PipelineState.read(dir)?.rounds.at(-1)?.commit ?? null;
138
+ const changes = await this.git.changes(since, vars.toEnv());
139
+ const results = await this.checkGates(gates, [...gates.keys()], vars, changes);
140
+ const checked = [...results].map(([name, passed]) => ({ name, passed, message: gates.get(name).message }));
141
+ if (this.needsAi(stages))
142
+ checked.unshift({ name: "ai", passed: !aiProblem, message: aiProblem ?? "" });
143
+ const failed = checked.filter((gate) => !gate.passed).length;
144
+ if (this.options.json) {
145
+ process.stdout.write(`${JSON.stringify({ name: spec.name, file: file.path, gates: checked }, null, 2)}\n`);
146
+ }
147
+ for (const gate of checked)
148
+ log.gate(gate.name, gate.passed, gate.message);
149
+ if (this.options.diagram) {
150
+ const passed = new Map(checked.map((gate) => [gate.name, gate.passed]));
151
+ const path = resolve(`${spec.name}.diagram.md`);
152
+ writeFileSync(path, new Diagram(spec, stages, passed).toMarkdown());
153
+ log.note(c.dim(`\n Diagram: ${path}`));
154
+ }
155
+ log.checked(failed);
156
+ if (failed)
157
+ return 1;
158
+ return 0;
159
+ }
160
+ async runStages(run) {
161
+ const { stages, state, results, gates } = run;
162
+ this.launcher.watchInterrupt();
163
+ state.save();
164
+ let stopped = false;
165
+ for (const [index, stage] of stages.entries()) {
166
+ const record = state.record.stages[index];
167
+ if (record.status === "pass" || record.status === "fail") {
168
+ log.stage(record, "kept from the last attempt");
169
+ continue;
170
+ }
171
+ if (stopped) {
172
+ record.status = "not-run";
173
+ continue;
174
+ }
175
+ const closed = stage.closedGate(results);
176
+ if (closed) {
177
+ stage.skip(record, gates.get(closed).message);
178
+ stopped = stage.stopsOn("gate");
179
+ state.save();
180
+ continue;
181
+ }
182
+ if (stage instanceof CommandStage && this.inputsSkipped(stage, run)) {
183
+ stage.skip(record, "its inputs come from skipped stages");
184
+ state.save();
185
+ continue;
186
+ }
187
+ await stage.run(this.context(run, stages.length === 1), record);
188
+ state.save();
189
+ const status = record.status;
190
+ if (status === "interrupted")
191
+ break;
192
+ if (status === "broken" || status === "timeout")
193
+ stopped = true;
194
+ if (status === "fail" && stage.stopsOn("fail"))
195
+ stopped = true;
196
+ }
197
+ if (this.launcher.interrupted)
198
+ return this.interrupted(state);
199
+ state.record.status = PipelineState.verdict(state.record.stages);
200
+ state.save();
201
+ if (stages.length > 1 && state.record.stages.some((record) => record.status !== "skipped" && record.status !== "not-run")) {
202
+ await this.summarize(run);
203
+ if (this.launcher.interrupted)
204
+ return this.interrupted(state);
205
+ }
206
+ state.finishRound();
207
+ state.save();
208
+ if (this.options.json)
209
+ process.stdout.write(`${JSON.stringify(state, null, 2)}\n`);
210
+ if (state.record.status === "pass")
211
+ return 0;
212
+ if (state.record.status === "fail" && this.options.exitZero)
213
+ return 0;
214
+ return 1;
215
+ }
216
+ /** The summary reads every stage and writes the one report that is posted. */
217
+ async summarize(run) {
218
+ const { state } = run;
219
+ const record = { id: "summary", status: "not-run" };
220
+ state.record.stages.push(record);
221
+ await this.summaryStage(run).run(this.context(run, true), record);
222
+ // The verdict came from the stages; the summary only explains it.
223
+ if (record.status === "fail") {
224
+ record.status = "pass";
225
+ delete record.reason;
226
+ }
227
+ if (!this.launcher.interrupted)
228
+ state.record.status = PipelineState.verdict(state.record.stages);
229
+ }
230
+ summaryStage(run) {
231
+ const { spec, stages, state } = run;
232
+ const files = state.record.stages.flatMap((record) => {
233
+ const stage = stages.find((entry) => entry.id === record.id);
234
+ const own = [record.report, record.log, ...(stage?.spec.outputs ?? [])];
235
+ return own.filter((name) => Boolean(name));
236
+ });
237
+ const lines = ["/pipeline-report", "", `Write the final report of the "${spec.name}" pipeline, round ${state.record.round}.`];
238
+ if (spec.summary)
239
+ lines.push("", spec.summary.trim());
240
+ lines.push("", `Read pipeline.json first. The verdict is ${state.record.status}. Explain it, never change it.`, `Stage files: ${files.join(", ") || "none"}`);
241
+ return new TaskStage({ id: "summary", task: lines.join("\n"), session: "summary", inputs: [STATE_FILE], outputs: [], when: [], stopOn: [] });
242
+ }
243
+ context(run, reporter) {
244
+ let report = null;
245
+ if (reporter)
246
+ report = run.report;
247
+ return {
248
+ dir: run.dir,
249
+ vars: run.vars,
250
+ launcher: this.launcher,
251
+ cli: this.cli,
252
+ model: this.options.model,
253
+ report,
254
+ missing: (input) => this.whyMissing(input, run),
255
+ };
256
+ }
257
+ interrupted(state) {
258
+ state.record.status = "interrupted";
259
+ for (const record of state.record.stages)
260
+ if (record.status === "running")
261
+ record.status = "interrupted";
262
+ state.save();
263
+ log.interrupted();
264
+ return 130;
265
+ }
266
+ /** A retry finishes the round it started, so a file edited since cannot reorder the stages half-way through. */
267
+ spec(file, named, dir, retry) {
268
+ let spec = named;
269
+ const copy = join(dir, COPY_FILE);
270
+ if (retry && existsSync(copy)) {
271
+ spec = file.parse(readFileSync(copy, "utf8"));
272
+ if (spec.name !== named.name)
273
+ throw new UsageError(`${dir} holds a run of "${spec.name}", not "${named.name}"`);
274
+ }
275
+ // Gates passed with --gate join `when`: the CI job decides if the run happens at all.
276
+ for (const name of Object.keys(this.options.gates ?? {})) {
277
+ if (spec.gates[name])
278
+ throw new UsageError(`--gate ${name}: the pipeline already defines this gate`);
279
+ }
280
+ return { ...spec, when: [...spec.when, ...Object.keys(this.options.gates ?? {})] };
281
+ }
282
+ gates(spec) {
283
+ const gates = new Map();
284
+ for (const [name, gate] of Object.entries(spec.gates))
285
+ gates.set(name, new Gate(name, gate));
286
+ for (const [name, run] of Object.entries(this.options.gates ?? {}))
287
+ gates.set(name, Gate.command(name, run));
288
+ return gates;
289
+ }
290
+ /** An output may not take a file another stage writes on its own. */
291
+ stages(specs) {
292
+ const stages = specs.map((spec) => {
293
+ if (spec.run !== undefined)
294
+ return new CommandStage(spec);
295
+ return new TaskStage(spec);
296
+ });
297
+ for (const stage of stages) {
298
+ for (const output of stage.spec.outputs) {
299
+ const owner = stages.find((other) => other.files().includes(output));
300
+ if (owner)
301
+ throw new UsageError(`stage "${stage.id}" output ${output} is a file stage "${owner.id}" writes itself`);
302
+ }
303
+ }
304
+ return stages;
305
+ }
306
+ variables(spec, dir, round) {
307
+ const sets = this.options.sets ?? {};
308
+ return new Variables({ ...process.env })
309
+ .with({ ...sets, PIPELINE_DIR: dir, PIPELINE_NAME: spec.name, PIPELINE_ROUND: String(round) })
310
+ .withExpanded(spec.env)
311
+ .with(sets)
312
+ .without(JOB_ONLY);
313
+ }
314
+ /** Each gate once. A shallow clone cannot say what changed, and a silent skip would look like a quiet pull request. */
315
+ async checkGates(gates, names, vars, changes) {
316
+ const used = [...new Set(names)];
317
+ if (!changes.files && used.some((name) => gates.get(name).readsChanges)) {
318
+ throw new UsageError(`cannot read the changes: ${changes.error}. Check out with full history (fetch-depth: 0)`);
319
+ }
320
+ const results = new Map();
321
+ for (const name of used)
322
+ results.set(name, await gates.get(name).passes({ cwd: this.cwd, vars, changes }));
323
+ return results;
324
+ }
325
+ /** Every input comes from an earlier stage, the runner, or the folder itself. */
326
+ checkInputs(stages, dir) {
327
+ for (const [index, stage] of stages.entries()) {
328
+ for (const input of stage.inputs()) {
329
+ if (input === CHANGES_FILE || existsSync(join(dir, input)))
330
+ continue;
331
+ if (stages.slice(0, index).some((earlier) => earlier.produces(input)))
332
+ continue;
333
+ throw new UsageError(`stage "${stage.id}" reads ${input}, which no earlier stage writes`);
334
+ }
335
+ }
336
+ }
337
+ // A shell command cannot reason about a missing file; an agent stage is told instead.
338
+ inputsSkipped(stage, run) {
339
+ const inputs = stage.inputs();
340
+ if (inputs.length === 0)
341
+ return false;
342
+ return inputs.every((input) => {
343
+ const producer = run.stages.find((entry) => entry.produces(input));
344
+ if (!producer)
345
+ return false;
346
+ return run.state.stage(producer.id)?.status === "skipped";
347
+ });
348
+ }
349
+ whyMissing(input, run) {
350
+ const producer = run.stages.find((stage) => stage.produces(input));
351
+ if (!producer)
352
+ return "not found";
353
+ const record = run.state.stage(producer.id);
354
+ if (record?.status === "skipped")
355
+ return `stage ${producer.id} skipped: ${record.reason}`;
356
+ return `stage ${producer.id} did not write it`;
357
+ }
358
+ keptRecord(stage, previous) {
359
+ const record = previous?.stages.find((entry) => entry.id === stage.id);
360
+ if (!record)
361
+ return { id: stage.id, status: "not-run" };
362
+ if (record.status === "pass" || record.status === "fail")
363
+ return record;
364
+ return { id: stage.id, status: record.status, items: record.items };
365
+ }
366
+ /** The summary is an agent, so a pipeline with one needs a model. */
367
+ needsAi(stages) {
368
+ return stages.length > 1 || stages.some((stage) => stage instanceof TaskStage);
369
+ }
370
+ async aiProblem() {
371
+ if (!this.options.checkAi)
372
+ return null;
373
+ try {
374
+ await this.options.checkAi(this.options.model);
375
+ return null;
376
+ }
377
+ catch (err) {
378
+ if (err instanceof UsageError)
379
+ return err.message;
380
+ throw err;
381
+ }
382
+ }
383
+ folder(name, create = !this.options.dryRun) {
384
+ if (this.options.dir)
385
+ return resolve(this.options.dir);
386
+ if (!create)
387
+ return join(tmpdir(), `testeiya-${name}`);
388
+ return mkdtempSync(join(tmpdir(), `testeiya-${name}-`));
389
+ }
390
+ dryRun(stages, gates, results, aiProblem) {
391
+ if (this.needsAi(stages))
392
+ log.aiGate(aiProblem);
393
+ for (const [name, passed] of results)
394
+ log.gate(name, passed, gates.get(name).message);
395
+ log.note("");
396
+ let stopped = false;
397
+ for (const stage of stages) {
398
+ if (stopped) {
399
+ log.plan(stage.id, "not-run", "not run");
400
+ continue;
401
+ }
402
+ const closed = stage.closedGate(results);
403
+ if (closed) {
404
+ log.plan(stage.id, "skipped", `skipped: ${gates.get(closed).message}`);
405
+ stopped = stage.stopsOn("gate");
406
+ continue;
407
+ }
408
+ log.plan(stage.id, "runs", "runs");
409
+ }
410
+ if (stages.length > 1)
411
+ log.plan("summary", "runs", "runs, and reports");
412
+ return 0;
413
+ }
414
+ }
415
+ //# sourceMappingURL=pipeline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../../../src/pipeline/pipeline.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,61 @@
1
+ import { copyFileSync, existsSync, mkdirSync } from "node:fs";
2
+ import { dirname, resolve } from "node:path";
3
+ import { UsageError } from "../model.js";
4
+ import { parseDestinations, preflight } from "../output.js";
5
+ /**
6
+ * Where the pipeline's report goes. Only the reporting stage gets these
7
+ * destinations: the summary, or the one stage of a one-stage pipeline.
8
+ */
9
+ export class Report {
10
+ options;
11
+ passed = [];
12
+ /** Markdown paths: the stage writes its own report, copied there after. */
13
+ copies = [];
14
+ constructor(outputs, options) {
15
+ this.options = options;
16
+ for (const output of outputs) {
17
+ const kind = parseDestinations([output]);
18
+ if (typeof kind !== "string" && kind[0]?.kind === "markdown")
19
+ this.copies.push(output);
20
+ else
21
+ this.passed.push(output);
22
+ }
23
+ }
24
+ /** Checked before the first stage, like any task: a run that cannot post spends nothing. */
25
+ static async prepare(options) {
26
+ const outputs = options.outputs ?? [];
27
+ const parsed = parseDestinations(outputs);
28
+ if (typeof parsed === "string")
29
+ throw new UsageError(parsed);
30
+ const unreachable = await preflight(parsed);
31
+ if (unreachable)
32
+ throw new UsageError(unreachable);
33
+ return new Report(outputs, options);
34
+ }
35
+ /** The `task` options that post the report. */
36
+ args() {
37
+ const { options } = this;
38
+ const args = [];
39
+ for (const output of this.passed)
40
+ args.push("-o", output);
41
+ if (options.thread)
42
+ args.push("--thread", options.thread);
43
+ if (options.header !== undefined)
44
+ args.push("--header", options.header);
45
+ if (options.footer !== undefined)
46
+ args.push("--footer", options.footer);
47
+ if (options.noDefaultFooter)
48
+ args.push("--no-default-footer");
49
+ return args;
50
+ }
51
+ // The stage already writes its own markdown report, and a task takes only one.
52
+ copy(report) {
53
+ if (!existsSync(report))
54
+ return;
55
+ for (const path of this.copies) {
56
+ mkdirSync(dirname(resolve(path)), { recursive: true });
57
+ copyFileSync(report, path);
58
+ }
59
+ }
60
+ }
61
+ //# sourceMappingURL=report.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report.js","sourceRoot":"","sources":["../../../src/pipeline/report.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAE7C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE5D;;;GAGG;AACH,MAAM,OAAO,MAAM;IAOE;IANF,MAAM,GAAa,EAAE,CAAC;IACvC,2EAA2E;IAC1D,MAAM,GAAa,EAAE,CAAC;IAEvC,YACE,OAAiB,EACA,OAAsB;QAAtB,YAAO,GAAP,OAAO,CAAe;QAEvC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,MAAM,IAAI,GAAG,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;YACzC,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,KAAK,UAAU;gBAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;;gBAClF,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;IAED,4FAA4F;IAC5F,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,OAAsB;QACzC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC;QACtC,MAAM,MAAM,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;QAC1C,IAAI,OAAO,MAAM,KAAK,QAAQ;YAAE,MAAM,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC;QAC7D,MAAM,WAAW,GAAG,MAAM,SAAS,CAAC,MAAM,CAAC,CAAC;QAC5C,IAAI,WAAW;YAAE,MAAM,IAAI,UAAU,CAAC,WAAW,CAAC,CAAC;QACnD,OAAO,IAAI,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACtC,CAAC;IAED,+CAA+C;IAC/C,IAAI;QACF,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;QACzB,MAAM,IAAI,GAAa,EAAE,CAAC;QAC1B,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,MAAM;YAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC1D,IAAI,OAAO,CAAC,MAAM;YAAE,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QAC1D,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS;YAAE,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QACxE,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS;YAAE,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QACxE,IAAI,OAAO,CAAC,eAAe;YAAE,IAAI,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;QAC9D,OAAO,IAAI,CAAC;IACd,CAAC;IAED,+EAA+E;IAC/E,IAAI,CAAC,MAAc;QACjB,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;YAAE,OAAO;QAChC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAC/B,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACvD,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spec.js","sourceRoot":"","sources":["../../../src/pipeline/spec.ts"],"names":[],"mappings":""}