@c9up/helix 0.1.3 → 0.1.4

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 (189) hide show
  1. package/dist/cli/coverage/aggregate.d.ts +24 -0
  2. package/dist/cli/coverage/aggregate.d.ts.map +1 -0
  3. package/dist/cli/coverage/aggregate.js +215 -0
  4. package/dist/cli/coverage/aggregate.js.map +1 -0
  5. package/dist/cli/coverage/collect.d.ts +13 -0
  6. package/dist/cli/coverage/collect.d.ts.map +1 -0
  7. package/dist/cli/coverage/collect.js +66 -0
  8. package/dist/cli/coverage/collect.js.map +1 -0
  9. package/dist/cli/coverage/diff/base.d.ts +17 -0
  10. package/dist/cli/coverage/diff/base.d.ts.map +1 -0
  11. package/dist/cli/coverage/diff/base.js +44 -0
  12. package/dist/cli/coverage/diff/base.js.map +1 -0
  13. package/dist/cli/coverage/diff/index.d.ts +25 -0
  14. package/dist/cli/coverage/diff/index.d.ts.map +1 -0
  15. package/dist/cli/coverage/diff/index.js +119 -0
  16. package/dist/cli/coverage/diff/index.js.map +1 -0
  17. package/dist/cli/coverage/diff/overlay.d.ts +19 -0
  18. package/dist/cli/coverage/diff/overlay.d.ts.map +1 -0
  19. package/dist/cli/coverage/diff/overlay.js +58 -0
  20. package/dist/cli/coverage/diff/overlay.js.map +1 -0
  21. package/dist/cli/coverage/diff/parse.d.ts +27 -0
  22. package/dist/cli/coverage/diff/parse.d.ts.map +1 -0
  23. package/dist/cli/coverage/diff/parse.js +105 -0
  24. package/dist/cli/coverage/diff/parse.js.map +1 -0
  25. package/dist/cli/coverage/diff/reporters.d.ts +12 -0
  26. package/dist/cli/coverage/diff/reporters.d.ts.map +1 -0
  27. package/dist/cli/coverage/diff/reporters.js +59 -0
  28. package/dist/cli/coverage/diff/reporters.js.map +1 -0
  29. package/dist/cli/coverage/diff/types.d.ts +46 -0
  30. package/dist/cli/coverage/diff/types.d.ts.map +1 -0
  31. package/dist/cli/coverage/diff/types.js +15 -0
  32. package/dist/cli/coverage/diff/types.js.map +1 -0
  33. package/dist/cli/coverage/filter.d.ts +13 -0
  34. package/dist/cli/coverage/filter.d.ts.map +1 -0
  35. package/dist/cli/coverage/filter.js +60 -0
  36. package/dist/cli/coverage/filter.js.map +1 -0
  37. package/dist/cli/coverage/glob.d.ts +4 -0
  38. package/dist/cli/coverage/glob.d.ts.map +1 -0
  39. package/dist/cli/coverage/glob.js +0 -0
  40. package/dist/cli/coverage/glob.js.map +1 -0
  41. package/dist/cli/coverage/index.d.ts +40 -0
  42. package/dist/cli/coverage/index.d.ts.map +1 -0
  43. package/dist/cli/coverage/index.js +85 -0
  44. package/dist/cli/coverage/index.js.map +1 -0
  45. package/dist/cli/coverage/reporters/json.d.ts +13 -0
  46. package/dist/cli/coverage/reporters/json.d.ts.map +1 -0
  47. package/dist/cli/coverage/reporters/json.js +37 -0
  48. package/dist/cli/coverage/reporters/json.js.map +1 -0
  49. package/dist/cli/coverage/reporters/lcov.d.ts +13 -0
  50. package/dist/cli/coverage/reporters/lcov.d.ts.map +1 -0
  51. package/dist/cli/coverage/reporters/lcov.js +51 -0
  52. package/dist/cli/coverage/reporters/lcov.js.map +1 -0
  53. package/dist/cli/coverage/reporters/text.d.ts +8 -0
  54. package/dist/cli/coverage/reporters/text.d.ts.map +1 -0
  55. package/dist/cli/coverage/reporters/text.js +39 -0
  56. package/dist/cli/coverage/reporters/text.js.map +1 -0
  57. package/dist/cli/coverage/thresholds.d.ts +14 -0
  58. package/dist/cli/coverage/thresholds.d.ts.map +1 -0
  59. package/dist/cli/coverage/thresholds.js +58 -0
  60. package/dist/cli/coverage/thresholds.js.map +1 -0
  61. package/dist/cli/coverage/types.d.ts +118 -0
  62. package/dist/cli/coverage/types.d.ts.map +1 -0
  63. package/dist/cli/coverage/types.js +8 -0
  64. package/dist/cli/coverage/types.js.map +1 -0
  65. package/dist/cli/discover.d.ts +27 -0
  66. package/dist/cli/discover.d.ts.map +1 -0
  67. package/dist/cli/discover.js +142 -0
  68. package/dist/cli/discover.js.map +1 -0
  69. package/dist/cli/native.d.ts +43 -0
  70. package/dist/cli/native.d.ts.map +1 -0
  71. package/dist/cli/native.js +64 -0
  72. package/dist/cli/native.js.map +1 -0
  73. package/dist/cli/pool.d.ts +55 -0
  74. package/dist/cli/pool.d.ts.map +1 -0
  75. package/dist/cli/pool.js +404 -0
  76. package/dist/cli/pool.js.map +1 -0
  77. package/dist/cli/reporter.d.ts +51 -0
  78. package/dist/cli/reporter.d.ts.map +1 -0
  79. package/dist/cli/reporter.js +124 -0
  80. package/dist/cli/reporter.js.map +1 -0
  81. package/dist/cli/run.d.ts +61 -0
  82. package/dist/cli/run.d.ts.map +1 -0
  83. package/dist/cli/run.js +302 -0
  84. package/dist/cli/run.js.map +1 -0
  85. package/dist/cli/summary.d.ts +18 -0
  86. package/dist/cli/summary.d.ts.map +1 -0
  87. package/dist/cli/summary.js +20 -0
  88. package/dist/cli/summary.js.map +1 -0
  89. package/dist/cli/watch/loop.d.ts +26 -0
  90. package/dist/cli/watch/loop.d.ts.map +1 -0
  91. package/dist/cli/watch/loop.js +133 -0
  92. package/dist/cli/watch/loop.js.map +1 -0
  93. package/dist/cli/watch/types.d.ts +22 -0
  94. package/dist/cli/watch/types.d.ts.map +1 -0
  95. package/dist/cli/watch/types.js +6 -0
  96. package/dist/cli/watch/types.js.map +1 -0
  97. package/dist/cli/watch/watcher.d.ts +25 -0
  98. package/dist/cli/watch/watcher.d.ts.map +1 -0
  99. package/dist/cli/watch/watcher.js +122 -0
  100. package/dist/cli/watch/watcher.js.map +1 -0
  101. package/dist/container/index.d.ts +7 -0
  102. package/dist/container/index.d.ts.map +1 -0
  103. package/dist/container/index.js +6 -0
  104. package/dist/container/index.js.map +1 -0
  105. package/dist/container/override.d.ts +46 -0
  106. package/dist/container/override.d.ts.map +1 -0
  107. package/dist/container/override.js +67 -0
  108. package/dist/container/override.js.map +1 -0
  109. package/dist/container/spy.d.ts +21 -0
  110. package/dist/container/spy.d.ts.map +1 -0
  111. package/dist/container/spy.js +23 -0
  112. package/dist/container/spy.js.map +1 -0
  113. package/dist/index.d.ts +20 -0
  114. package/dist/index.d.ts.map +1 -0
  115. package/dist/index.js +19 -0
  116. package/dist/index.js.map +1 -0
  117. package/dist/runtime/assertion-error.d.ts +20 -0
  118. package/dist/runtime/assertion-error.d.ts.map +1 -0
  119. package/dist/runtime/assertion-error.js +23 -0
  120. package/dist/runtime/assertion-error.js.map +1 -0
  121. package/dist/runtime/cli-worker.d.ts +25 -0
  122. package/dist/runtime/cli-worker.d.ts.map +1 -0
  123. package/dist/runtime/cli-worker.js +128 -0
  124. package/dist/runtime/cli-worker.js.map +1 -0
  125. package/dist/runtime/equals.d.ts +25 -0
  126. package/dist/runtime/equals.d.ts.map +1 -0
  127. package/dist/runtime/equals.js +343 -0
  128. package/dist/runtime/equals.js.map +1 -0
  129. package/dist/runtime/expect.d.ts +32 -0
  130. package/dist/runtime/expect.d.ts.map +1 -0
  131. package/dist/runtime/expect.js +121 -0
  132. package/dist/runtime/expect.js.map +1 -0
  133. package/dist/runtime/index.d.ts +28 -0
  134. package/dist/runtime/index.d.ts.map +1 -0
  135. package/dist/runtime/index.js +17 -0
  136. package/dist/runtime/index.js.map +1 -0
  137. package/dist/runtime/lifecycle.d.ts +11 -0
  138. package/dist/runtime/lifecycle.d.ts.map +1 -0
  139. package/dist/runtime/lifecycle.js +10 -0
  140. package/dist/runtime/lifecycle.js.map +1 -0
  141. package/dist/runtime/matchers.d.ts +42 -0
  142. package/dist/runtime/matchers.d.ts.map +1 -0
  143. package/dist/runtime/matchers.js +375 -0
  144. package/dist/runtime/matchers.js.map +1 -0
  145. package/dist/runtime/run.d.ts +55 -0
  146. package/dist/runtime/run.d.ts.map +1 -0
  147. package/dist/runtime/run.js +456 -0
  148. package/dist/runtime/run.js.map +1 -0
  149. package/dist/runtime/suite.d.ts +65 -0
  150. package/dist/runtime/suite.d.ts.map +1 -0
  151. package/dist/runtime/suite.js +203 -0
  152. package/dist/runtime/suite.js.map +1 -0
  153. package/dist/runtime/test-context.d.ts +25 -0
  154. package/dist/runtime/test-context.d.ts.map +1 -0
  155. package/dist/runtime/test-context.js +52 -0
  156. package/dist/runtime/test-context.js.map +1 -0
  157. package/dist/runtime/vi/fake-timers.d.ts +48 -0
  158. package/dist/runtime/vi/fake-timers.d.ts.map +1 -0
  159. package/dist/runtime/vi/fake-timers.js +317 -0
  160. package/dist/runtime/vi/fake-timers.js.map +1 -0
  161. package/dist/runtime/vi/index.d.ts +70 -0
  162. package/dist/runtime/vi/index.d.ts.map +1 -0
  163. package/dist/runtime/vi/index.js +209 -0
  164. package/dist/runtime/vi/index.js.map +1 -0
  165. package/dist/runtime/vi/spy.d.ts +54 -0
  166. package/dist/runtime/vi/spy.d.ts.map +1 -0
  167. package/dist/runtime/vi/spy.js +159 -0
  168. package/dist/runtime/vi/spy.js.map +1 -0
  169. package/dist/runtime/vi/spyOn.d.ts +28 -0
  170. package/dist/runtime/vi/spyOn.d.ts.map +1 -0
  171. package/dist/runtime/vi/spyOn.js +121 -0
  172. package/dist/runtime/vi/spyOn.js.map +1 -0
  173. package/dist/runtime/vi/system-time.d.ts +30 -0
  174. package/dist/runtime/vi/system-time.d.ts.map +1 -0
  175. package/dist/runtime/vi/system-time.js +100 -0
  176. package/dist/runtime/vi/system-time.js.map +1 -0
  177. package/dist/runtime/worker.d.ts +26 -0
  178. package/dist/runtime/worker.d.ts.map +1 -0
  179. package/dist/runtime/worker.js +195 -0
  180. package/dist/runtime/worker.js.map +1 -0
  181. package/dist/time/freeze.d.ts +80 -0
  182. package/dist/time/freeze.d.ts.map +1 -0
  183. package/dist/time/freeze.js +184 -0
  184. package/dist/time/freeze.js.map +1 -0
  185. package/dist/time/index.d.ts +16 -0
  186. package/dist/time/index.d.ts.map +1 -0
  187. package/dist/time/index.js +15 -0
  188. package/dist/time/index.js.map +1 -0
  189. package/package.json +1 -1
@@ -0,0 +1,124 @@
1
+ /**
2
+ * Reporters — receive lifecycle callbacks as each file completes, write
3
+ * incremental output to the given sink. Three built-ins matching the
4
+ * Rust-side reporter trait:
5
+ * - Dot: one char per test
6
+ * - Spec: nested tree with colours + diff lines on failure
7
+ * - Json: NDJSON to stdout, machine-readable
8
+ */
9
+ export function stdoutSink() {
10
+ return {
11
+ write(chunk) {
12
+ process.stdout.write(chunk);
13
+ },
14
+ writeLine(chunk) {
15
+ process.stdout.write(`${chunk}\n`);
16
+ },
17
+ };
18
+ }
19
+ const ANSI = {
20
+ dim: (s, on) => (on ? `\x1b[90m${s}\x1b[0m` : s),
21
+ red: (s, on) => (on ? `\x1b[31m${s}\x1b[0m` : s),
22
+ green: (s, on) => (on ? `\x1b[32m${s}\x1b[0m` : s),
23
+ yellow: (s, on) => (on ? `\x1b[33m${s}\x1b[0m` : s),
24
+ };
25
+ export class DotReporter {
26
+ sink;
27
+ constructor(sink = stdoutSink()) {
28
+ this.sink = sink;
29
+ }
30
+ onFileStart(_file) { }
31
+ onFileResult(result) {
32
+ for (const t of result.tests) {
33
+ const c = t.status === "pass"
34
+ ? "."
35
+ : t.status === "fail"
36
+ ? "F"
37
+ : t.status === "skip"
38
+ ? "-"
39
+ : "*";
40
+ this.sink.write(c);
41
+ }
42
+ }
43
+ onFileError(_error) {
44
+ this.sink.write("E");
45
+ }
46
+ onSummary(summary) {
47
+ this.sink.writeLine("");
48
+ printSummary(this.sink, summary);
49
+ }
50
+ }
51
+ export class SpecReporter {
52
+ sink;
53
+ useColors;
54
+ constructor(sink = stdoutSink(), useColors = true) {
55
+ this.sink = sink;
56
+ this.useColors = useColors;
57
+ }
58
+ onFileStart(file) {
59
+ this.sink.writeLine(`${ANSI.dim("▶", this.useColors)} ${ANSI.dim(file, this.useColors)}`);
60
+ }
61
+ onFileResult(result) {
62
+ for (const t of result.tests) {
63
+ const marker = t.status === "pass"
64
+ ? ANSI.green("✔", this.useColors)
65
+ : t.status === "fail"
66
+ ? ANSI.red("✘", this.useColors)
67
+ : t.status === "skip"
68
+ ? ANSI.yellow("○", this.useColors)
69
+ : ANSI.dim("☐", this.useColors);
70
+ this.sink.writeLine(` ${marker} ${t.fullName}`);
71
+ if (t.error) {
72
+ this.sink.writeLine(` ${ANSI.red(t.error.message, this.useColors)}`);
73
+ if (t.error.actual !== undefined && t.error.expected !== undefined) {
74
+ this.sink.writeLine(` ${ANSI.dim("actual: ", this.useColors)} ${JSON.stringify(t.error.actual)}`);
75
+ this.sink.writeLine(` ${ANSI.dim("expected:", this.useColors)} ${JSON.stringify(t.error.expected)}`);
76
+ }
77
+ }
78
+ }
79
+ }
80
+ onFileError(error) {
81
+ const file = error.file ?? "<unknown>";
82
+ this.sink.writeLine(`${ANSI.red("✘", this.useColors)} ${file}: ${error.message}`);
83
+ }
84
+ onSummary(summary) {
85
+ this.sink.writeLine("");
86
+ printSummary(this.sink, summary);
87
+ }
88
+ }
89
+ export class JsonReporter {
90
+ sink;
91
+ constructor(sink = stdoutSink()) {
92
+ this.sink = sink;
93
+ }
94
+ onFileStart(file) {
95
+ this.sink.writeLine(JSON.stringify({ event: "file:start", file }));
96
+ }
97
+ onFileResult(result) {
98
+ this.sink.writeLine(JSON.stringify({ event: "file:end", result }));
99
+ }
100
+ onFileError(error) {
101
+ this.sink.writeLine(JSON.stringify({ event: "file:error", error }));
102
+ }
103
+ onSummary(summary) {
104
+ this.sink.writeLine(JSON.stringify({ event: "summary", summary }));
105
+ }
106
+ }
107
+ function printSummary(sink, summary) {
108
+ const t = summary.totals;
109
+ sink.writeLine("──────────────────────────────────────");
110
+ sink.writeLine(` ${t.pass} passed | ${t.fail} failed | ${t.skip} skipped | ${t.todo} todo | ${t.fileErrors} file errors`);
111
+ sink.writeLine(` ${summary.durationMs} ms`);
112
+ }
113
+ /** Factory from a CLI-style name. */
114
+ export function makeReporter(name, useColors) {
115
+ switch ((name ?? "spec").toLowerCase()) {
116
+ case "dot":
117
+ return new DotReporter();
118
+ case "json":
119
+ return new JsonReporter();
120
+ default:
121
+ return new SpecReporter(stdoutSink(), useColors);
122
+ }
123
+ }
124
+ //# sourceMappingURL=reporter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reporter.js","sourceRoot":"","sources":["../../src/cli/reporter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Orchestrator entry point — the TS equivalent of `ream-test-napi::run`.
3
+ *
4
+ * Discovers test files (or uses the explicit list), spawns the worker
5
+ * pool, collects framed results, aggregates into a `Summary`, and invokes
6
+ * the reporter at each milestone. When coverage is enabled, also threads
7
+ * the V8 coverage lifecycle (open session → forward `NODE_V8_COVERAGE`
8
+ * env to workers → aggregate after pool drain → write reports → enforce
9
+ * thresholds).
10
+ *
11
+ * Designed so the future NAPI binding can be plugged in as a drop-in
12
+ * replacement: both sides accept the same `RunConfig` shape and return
13
+ * the same `Summary`.
14
+ */
15
+ import { type DiffOptions, type DiffSummary } from "./coverage/diff/index.js";
16
+ import { type CoverageOptions, type CoverageSummary, type ThresholdViolation } from "./coverage/index.js";
17
+ import { type DiscoveryOptions } from "./discover.js";
18
+ import { type Reporter } from "./reporter.js";
19
+ import { type Summary } from "./summary.js";
20
+ import type { WatchOptions } from "./watch/types.js";
21
+ export type { WatchOptions } from "./watch/types.js";
22
+ export interface RunConfig {
23
+ /** Absolute root directory to discover from. */
24
+ root: string;
25
+ /** Explicit files to run. When non-empty, discovery is skipped. */
26
+ files?: string[];
27
+ /** Discovery options (suffixes, excludes). */
28
+ discovery?: DiscoveryOptions;
29
+ /** Number of concurrent workers. Default: os.cpus().length. */
30
+ threads?: number;
31
+ /** Per-file timeout (ms). Default 60 000. */
32
+ timeoutMs?: number;
33
+ /** Reporter name: `"dot" | "spec" | "json"`. Default `"spec"`. */
34
+ reporter?: string;
35
+ /** Enable ANSI colours. Default: stdout is TTY. */
36
+ useColors?: boolean;
37
+ /** Pluggable reporter instance (overrides `reporter` when provided). */
38
+ reporterInstance?: Reporter;
39
+ /** Override the node binary. Default: `process.execPath`. */
40
+ nodeBin?: string;
41
+ /** Extra args for node (before the worker entry). */
42
+ nodeArgs?: string[];
43
+ /** Override the worker entry path (defaults to bundled `cli-worker.ts`). */
44
+ workerEntry?: string;
45
+ /** Coverage collection + reporting. Defaults to `{ enabled: false }`. */
46
+ coverage?: CoverageOptions;
47
+ /** Diff coverage vs a base ref. Requires `coverage.enabled === true`. */
48
+ diffCoverage?: DiffOptions;
49
+ /** Watch mode: re-run on file changes. */
50
+ watch?: WatchOptions;
51
+ }
52
+ export interface RunOutcome {
53
+ summary: Summary;
54
+ coverage?: CoverageSummary;
55
+ coverageViolations?: ThresholdViolation[];
56
+ diffCoverage?: DiffSummary;
57
+ diffCoverageViolations?: ThresholdViolation[];
58
+ exitCode: number;
59
+ }
60
+ export declare function run(config: RunConfig): Promise<RunOutcome>;
61
+ //# sourceMappingURL=run.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/cli/run.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAOH,OAAO,EACN,KAAK,WAAW,EAChB,KAAK,WAAW,EAGhB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACN,KAAK,eAAe,EAEpB,KAAK,eAAe,EAGpB,KAAK,kBAAkB,EAEvB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,KAAK,gBAAgB,EAAY,MAAM,eAAe,CAAC;AAGhE,OAAO,EAAgB,KAAK,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC5D,OAAO,EAGN,KAAK,OAAO,EAEZ,MAAM,cAAc,CAAC;AAEtB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAErD,YAAY,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAoBrD,MAAM,WAAW,SAAS;IACzB,gDAAgD;IAChD,IAAI,EAAE,MAAM,CAAC;IACb,mEAAmE;IACnE,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,8CAA8C;IAC9C,SAAS,CAAC,EAAE,gBAAgB,CAAC;IAC7B,+DAA+D;IAC/D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,6CAA6C;IAC7C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kEAAkE;IAClE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mDAAmD;IACnD,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,wEAAwE;IACxE,gBAAgB,CAAC,EAAE,QAAQ,CAAC;IAC5B,6DAA6D;IAC7D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,qDAAqD;IACrD,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,4EAA4E;IAC5E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,yEAAyE;IACzE,QAAQ,CAAC,EAAE,eAAe,CAAC;IAC3B,yEAAyE;IACzE,YAAY,CAAC,EAAE,WAAW,CAAC;IAC3B,0CAA0C;IAC1C,KAAK,CAAC,EAAE,YAAY,CAAC;CACrB;AAED,MAAM,WAAW,UAAU;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,eAAe,CAAC;IAC3B,kBAAkB,CAAC,EAAE,kBAAkB,EAAE,CAAC;IAC1C,YAAY,CAAC,EAAE,WAAW,CAAC;IAC3B,sBAAsB,CAAC,EAAE,kBAAkB,EAAE,CAAC;IAC9C,QAAQ,EAAE,MAAM,CAAC;CACjB;AAwDD,wBAAsB,GAAG,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CA4BhE"}
@@ -0,0 +1,302 @@
1
+ /**
2
+ * Orchestrator entry point — the TS equivalent of `ream-test-napi::run`.
3
+ *
4
+ * Discovers test files (or uses the explicit list), spawns the worker
5
+ * pool, collects framed results, aggregates into a `Summary`, and invokes
6
+ * the reporter at each milestone. When coverage is enabled, also threads
7
+ * the V8 coverage lifecycle (open session → forward `NODE_V8_COVERAGE`
8
+ * env to workers → aggregate after pool drain → write reports → enforce
9
+ * thresholds).
10
+ *
11
+ * Designed so the future NAPI binding can be plugged in as a drop-in
12
+ * replacement: both sides accept the same `RunConfig` shape and return
13
+ * the same `Summary`.
14
+ */
15
+ import { existsSync } from "node:fs";
16
+ import { rm } from "node:fs/promises";
17
+ import os from "node:os";
18
+ import path from "node:path";
19
+ import { fileURLToPath } from "node:url";
20
+ import { diffViolationSummary, finaliseDiff, } from "./coverage/diff/index.js";
21
+ import { finalise as finaliseCoverage, openSession, violationSummary, } from "./coverage/index.js";
22
+ import { discover } from "./discover.js";
23
+ import { getNative } from "./native.js";
24
+ import { runPool } from "./pool.js";
25
+ import { makeReporter } from "./reporter.js";
26
+ import { buildSummary, exitCode, } from "./summary.js";
27
+ import { runWatch } from "./watch/loop.js";
28
+ const DEFAULT_WATCH_DEBOUNCE_MS = 200;
29
+ const DEFAULT_WATCH_INCLUDE = [
30
+ "src/**/*.{ts,tsx,js,mjs,cjs}",
31
+ "tests/**/*.{ts,tsx,js,mjs,cjs}",
32
+ "test/**/*.{ts,tsx,js,mjs,cjs}",
33
+ ];
34
+ const DEFAULT_WATCH_EXCLUDE = [
35
+ "node_modules/**",
36
+ "dist/**",
37
+ "build/**",
38
+ "coverage/**",
39
+ ".helix-coverage/**",
40
+ ".git/**",
41
+ ".wolf/**",
42
+ "target/**",
43
+ ".next/**",
44
+ ];
45
+ function defaultWorkerEntry() {
46
+ // Resolve relative to THIS module's directory so it works whether we run
47
+ // from `src/cli/run.ts` (dev: src sibling is `.ts`) or from the compiled
48
+ // `dist/cli/run.js` (publish: sibling is `.js`). Hardcoding `.ts` made
49
+ // the spawned worker open a non-existent `dist/runtime/cli-worker.ts`
50
+ // when consumed via the dist tarball, dying silently before the pool's
51
+ // frame handler could observe anything.
52
+ const here = path.dirname(fileURLToPath(import.meta.url));
53
+ const compiled = path.resolve(here, "../runtime/cli-worker.js");
54
+ if (existsSync(compiled))
55
+ return compiled;
56
+ return path.resolve(here, "../runtime/cli-worker.ts");
57
+ }
58
+ /**
59
+ * Plain-path execution via the native `ream-test-napi` engine: it discovers
60
+ * (skipped here — we pass the resolved `files`), spawns the worker pool, drives
61
+ * the reporter, and returns aggregated totals. Per-file detail is carried in
62
+ * `payload.json` (same shape as `Summary`) for callers that need it; the CLI
63
+ * only consumes `exitCode`, and the Rust reporter already streamed per-file
64
+ * output, so the reconstructed `Summary` keeps the detail arrays empty.
65
+ */
66
+ async function runNative(config, root, files) {
67
+ const { run: nativeRun } = getNative();
68
+ const payload = await nativeRun({
69
+ root,
70
+ files,
71
+ threads: config.threads,
72
+ timeoutMs: config.timeoutMs,
73
+ reporter: config.reporter,
74
+ workerEntry: config.workerEntry ?? defaultWorkerEntry(),
75
+ nodeBin: config.nodeBin ?? process.execPath,
76
+ nodeArgs: config.nodeArgs,
77
+ useColors: config.useColors ?? process.stdout.isTTY === true,
78
+ });
79
+ const totals = {
80
+ pass: payload.pass,
81
+ fail: payload.fail,
82
+ skip: payload.skip,
83
+ todo: payload.todo,
84
+ fileErrors: payload.fileErrors,
85
+ };
86
+ const summary = {
87
+ totals,
88
+ files: [],
89
+ fileErrors: [],
90
+ durationMs: payload.durationMs,
91
+ };
92
+ return { summary, exitCode: payload.exitCode };
93
+ }
94
+ export async function run(config) {
95
+ if (!config.watch?.enabled)
96
+ return runOnce(config);
97
+ const root = path.isAbsolute(config.root)
98
+ ? config.root
99
+ : path.resolve(config.root);
100
+ const debounceMs = config.watch.debounceMs ?? DEFAULT_WATCH_DEBOUNCE_MS;
101
+ // When the user has configured custom coverage globs, mirror them in
102
+ // the watcher so the two surfaces agree on "files I care about".
103
+ // Otherwise fall back to the watch defaults (which intentionally
104
+ // include `tests/**` even though coverage doesn't, so editing a test
105
+ // triggers a re-run).
106
+ const include = config.watch.include ?? config.coverage?.include ?? DEFAULT_WATCH_INCLUDE;
107
+ const exclude = [
108
+ ...(config.watch.exclude ??
109
+ config.coverage?.exclude ??
110
+ DEFAULT_WATCH_EXCLUDE),
111
+ ];
112
+ return runWatch({
113
+ root,
114
+ include,
115
+ exclude,
116
+ debounceMs,
117
+ signal: config.watch.signal,
118
+ }, () => runOnce(config));
119
+ }
120
+ /** Resolve the explicit file list, or discover, warning when nothing matches. */
121
+ async function resolveRunFiles(config, root) {
122
+ const files = config.files && config.files.length > 0
123
+ ? config.files.map((f) => (path.isAbsolute(f) ? f : path.resolve(f)))
124
+ : await discover(root, config.discovery);
125
+ if (files.length === 0) {
126
+ process.stderr.write(`helix: no test files found under ${root} — check your include/exclude patterns.\n`);
127
+ }
128
+ return files;
129
+ }
130
+ /**
131
+ * Refuse mis-configured diff coverage up front (before spawning workers) so the
132
+ * user fixes the config rather than getting a silent no-op or 0% diff coverage.
133
+ */
134
+ function assertDiffCoverageConfig(config, root) {
135
+ if (!config.diffCoverage?.enabled)
136
+ return;
137
+ // Diff-cov requires the full-tree coverage to be enabled — it has nothing
138
+ // to overlay otherwise.
139
+ if (config.coverage?.enabled !== true) {
140
+ throw new Error("diffCoverage.enabled requires coverage.enabled — diff-cov has nothing to overlay otherwise.");
141
+ }
142
+ // Diff-cov spawns git in `diffCoverage.cwd` (defaulting to `coverage.root`).
143
+ // The two paths must share a common ancestry — either coverage.root is
144
+ // under diffCoverage.cwd (common monorepo case: `cwd` = git root,
145
+ // `root` = a sub-package), or diffCoverage.cwd is under coverage.root
146
+ // (legacy single-repo case). When they're fully disjoint, every diff
147
+ // entry resolves to a path the coverage summary never indexes →
148
+ // silent 0% diff coverage. Refuse only that case.
149
+ if (!config.diffCoverage.cwd)
150
+ return;
151
+ const covRoot = path.resolve(config.coverage?.root ?? root);
152
+ const diffCwd = path.resolve(config.diffCoverage.cwd);
153
+ const covUnderDiff = path.relative(diffCwd, covRoot);
154
+ const diffUnderCov = path.relative(covRoot, diffCwd);
155
+ const covDescendantOfDiff = covUnderDiff !== "" &&
156
+ !covUnderDiff.startsWith("..") &&
157
+ !path.isAbsolute(covUnderDiff);
158
+ const diffDescendantOfCov = diffUnderCov !== "" &&
159
+ !diffUnderCov.startsWith("..") &&
160
+ !path.isAbsolute(diffUnderCov);
161
+ const equal = covUnderDiff === "";
162
+ if (!equal && !covDescendantOfDiff && !diffDescendantOfCov) {
163
+ throw new Error(`diffCoverage.cwd (${diffCwd}) and coverage.root (${covRoot}) are disjoint paths; diff entries would never overlay coverage.`);
164
+ }
165
+ }
166
+ /**
167
+ * Finalise full-tree coverage, then overlay diff coverage on top. Each stage is
168
+ * isolated: a failed coverage finalise (disk full, permissions) or a thrown
169
+ * diff-cov is surfaced to stderr without crashing the run, but a diff-cov
170
+ * failure still flips `diffCoverageFailed` so the CI gate stays red.
171
+ */
172
+ async function finaliseCoverageOutcome(config, root, session) {
173
+ const out = { diffCoverageFailed: false };
174
+ try {
175
+ const finalised = await finaliseCoverage({
176
+ root: config.coverage.root ?? root,
177
+ session,
178
+ enabled: true,
179
+ include: config.coverage.include,
180
+ exclude: config.coverage.exclude,
181
+ reporters: config.coverage.reporters,
182
+ outputDir: config.coverage.outputDir,
183
+ thresholds: config.coverage.thresholds,
184
+ });
185
+ out.coverage = finalised.summary;
186
+ out.coverageViolations = finalised.violations;
187
+ if (finalised.textReport)
188
+ process.stdout.write(finalised.textReport);
189
+ if (finalised.violations.length > 0) {
190
+ process.stderr.write(`${violationSummary(finalised.violations)}\n`);
191
+ }
192
+ // Diff coverage runs AFTER full-tree finalise, using its summary.
193
+ if (config.diffCoverage?.enabled && out.coverage) {
194
+ await overlayDiffCoverage(config, root, out.coverage, out);
195
+ }
196
+ }
197
+ catch (err) {
198
+ // Coverage finalisation failed (disk full, permission, etc.) — the test
199
+ // summary already printed; surface the failure but don't crash the whole
200
+ // run with a stack trace.
201
+ process.stderr.write(`helix-coverage: ${err instanceof Error ? err.message : String(err)}\n`);
202
+ out.coverageViolations = [];
203
+ }
204
+ return out;
205
+ }
206
+ /** Overlay diff coverage onto an already-finalised full-tree summary. */
207
+ async function overlayDiffCoverage(config, root, coverage, out) {
208
+ if (!config.diffCoverage?.enabled)
209
+ return;
210
+ try {
211
+ const diff = await finaliseDiff({
212
+ enabled: true,
213
+ root: config.coverage.root ?? root,
214
+ coverage,
215
+ base: config.diffCoverage.base,
216
+ thresholds: config.diffCoverage.thresholds,
217
+ outputDir: config.diffCoverage.outputDir ?? config.coverage.outputDir,
218
+ cwd: config.diffCoverage.cwd,
219
+ });
220
+ if (diff.warning) {
221
+ process.stderr.write(`${diff.warning}\n`);
222
+ return;
223
+ }
224
+ out.diffCoverage = diff.summary;
225
+ out.diffCoverageViolations = diff.violations;
226
+ if (diff.textReport)
227
+ process.stdout.write(diff.textReport);
228
+ if (diff.violations.length > 0) {
229
+ process.stderr.write(`${diffViolationSummary(diff.violations)}\n`);
230
+ }
231
+ }
232
+ catch (err) {
233
+ process.stderr.write(`helix-diff-cov: ${err instanceof Error ? err.message : String(err)}\n`);
234
+ // Don't let a thrown finaliseDiff masquerade as a clean run — the user
235
+ // explicitly opted into diff-cov and a CI gate around it must still fail.
236
+ out.diffCoverageFailed = true;
237
+ }
238
+ }
239
+ async function runOnce(config) {
240
+ const started = Date.now();
241
+ const root = path.isAbsolute(config.root)
242
+ ? config.root
243
+ : path.resolve(config.root);
244
+ const files = await resolveRunFiles(config, root);
245
+ // Cutover: the Rust NAPI engine owns the plain discovery + worker-pool +
246
+ // reporter + summary path (42-N-orchestrator). Delegate unless a TS-only
247
+ // layer is active — a pluggable reporter instance, coverage, or diff-cov,
248
+ // none of which the Rust `run` exposes yet. Watch is already unwrapped by
249
+ // `run()` above, so it never reaches here.
250
+ if (!config.reporterInstance &&
251
+ config.coverage?.enabled !== true &&
252
+ config.diffCoverage?.enabled !== true) {
253
+ return runNative(config, root, files);
254
+ }
255
+ const reporter = config.reporterInstance ??
256
+ makeReporter(config.reporter, config.useColors ?? process.stdout.isTTY === true);
257
+ const threads = config.threads ?? os.cpus().length;
258
+ assertDiffCoverageConfig(config, root);
259
+ // Open a coverage session BEFORE spawning workers so `NODE_V8_COVERAGE`
260
+ // is set in their env. The pool forwards `extraEnv` to every spawn.
261
+ const coverageEnabled = config.coverage?.enabled === true;
262
+ const session = coverageEnabled ? await openSession() : undefined;
263
+ try {
264
+ const { results, errors } = await runPool(files, {
265
+ workerEntry: config.workerEntry ?? defaultWorkerEntry(),
266
+ nodeBin: config.nodeBin,
267
+ nodeArgs: config.nodeArgs,
268
+ threads,
269
+ timeoutMs: config.timeoutMs,
270
+ extraEnv: session?.env,
271
+ }, reporter);
272
+ const summary = buildSummary(results, errors, Date.now() - started);
273
+ reporter.onSummary(summary);
274
+ const cov = session && config.coverage
275
+ ? await finaliseCoverageOutcome({ ...config, coverage: config.coverage }, root, session)
276
+ : { diffCoverageFailed: false };
277
+ const baseExit = exitCode(summary);
278
+ const coverageExit = cov.coverageViolations && cov.coverageViolations.length > 0 ? 1 : 0;
279
+ const diffCoverageExit = (cov.diffCoverageViolations && cov.diffCoverageViolations.length > 0) ||
280
+ cov.diffCoverageFailed
281
+ ? 1
282
+ : 0;
283
+ return {
284
+ summary,
285
+ coverage: cov.coverage,
286
+ coverageViolations: cov.coverageViolations,
287
+ diffCoverage: cov.diffCoverage,
288
+ diffCoverageViolations: cov.diffCoverageViolations,
289
+ exitCode: Math.max(baseExit, coverageExit, diffCoverageExit),
290
+ };
291
+ }
292
+ finally {
293
+ // Belt-and-braces: if `runPool` itself rejected before
294
+ // `finaliseCoverage` ran (which normally cleans the temp dir), we
295
+ // still remove the session dir here so failed runs don't leak under
296
+ // `.helix-coverage/`.
297
+ if (session) {
298
+ await rm(session.envDir, { recursive: true, force: true }).catch(() => { });
299
+ }
300
+ }
301
+ }
302
+ //# sourceMappingURL=run.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/cli/run.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { FileResult } from "../runtime/run.js";
2
+ import type { WorkerErrorMessage } from "./pool.js";
3
+ export interface Totals {
4
+ pass: number;
5
+ fail: number;
6
+ skip: number;
7
+ todo: number;
8
+ fileErrors: number;
9
+ }
10
+ export interface Summary {
11
+ totals: Totals;
12
+ files: FileResult[];
13
+ fileErrors: WorkerErrorMessage[];
14
+ durationMs: number;
15
+ }
16
+ export declare function buildSummary(files: FileResult[], fileErrors: WorkerErrorMessage[], durationMs: number): Summary;
17
+ export declare function exitCode(summary: Summary): number;
18
+ //# sourceMappingURL=summary.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"summary.d.ts","sourceRoot":"","sources":["../../src/cli/summary.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAEpD,MAAM,WAAW,MAAM;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,OAAO;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,UAAU,EAAE,kBAAkB,EAAE,CAAC;IACjC,UAAU,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,YAAY,CAC3B,KAAK,EAAE,UAAU,EAAE,EACnB,UAAU,EAAE,kBAAkB,EAAE,EAChC,UAAU,EAAE,MAAM,GAChB,OAAO,CAeT;AAED,wBAAgB,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAEjD"}
@@ -0,0 +1,20 @@
1
+ export function buildSummary(files, fileErrors, durationMs) {
2
+ const totals = {
3
+ pass: 0,
4
+ fail: 0,
5
+ skip: 0,
6
+ todo: 0,
7
+ fileErrors: fileErrors.length,
8
+ };
9
+ for (const f of files) {
10
+ totals.pass += f.totals.pass;
11
+ totals.fail += f.totals.fail;
12
+ totals.skip += f.totals.skip;
13
+ totals.todo += f.totals.todo;
14
+ }
15
+ return { totals, files, fileErrors, durationMs };
16
+ }
17
+ export function exitCode(summary) {
18
+ return summary.totals.fail > 0 || summary.totals.fileErrors > 0 ? 1 : 0;
19
+ }
20
+ //# sourceMappingURL=summary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"summary.js","sourceRoot":"","sources":["../../src/cli/summary.ts"],"names":[],"mappings":"AAkBA,MAAM,UAAU,YAAY,CAC3B,KAAmB,EACnB,UAAgC,EAChC,UAAkB;IAElB,MAAM,MAAM,GAAW;QACtB,IAAI,EAAE,CAAC;QACP,IAAI,EAAE,CAAC;QACP,IAAI,EAAE,CAAC;QACP,IAAI,EAAE,CAAC;QACP,UAAU,EAAE,UAAU,CAAC,MAAM;KAC7B,CAAC;IACF,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACvB,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC;QAC7B,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC;QAC7B,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC;QAC7B,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC;IAC9B,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,OAAgB;IACxC,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACzE,CAAC"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Watch-mode run loop: runs `runOnce` once on startup, installs the
3
+ * watcher, and re-invokes `runOnce` whenever a coalesced change burst
4
+ * fires. Re-runs are serialised — at most one queued follow-up while a
5
+ * run is in flight; further bursts during that window are dropped (the
6
+ * queued run will pick up the latest disk state).
7
+ *
8
+ * On SIGINT (or an aborted external `AbortSignal`), the loop closes
9
+ * the watcher, waits for any in-flight run, and resolves with the
10
+ * LAST `RunOutcome` (with `exitCode: 0`, since a failing run during
11
+ * interactive watch should not poison the exit status — failures
12
+ * already surface as test output).
13
+ */
14
+ import type { RunOutcome } from "../run.js";
15
+ export interface RunWatchOptions {
16
+ root: string;
17
+ include: string[];
18
+ exclude: string[];
19
+ debounceMs: number;
20
+ /** Optional external abort. When triggered, behaves like SIGINT.
21
+ * Lets tests drive shutdown without `process.emit("SIGINT")` (which
22
+ * collides with vitest's own signal handlers). */
23
+ signal?: AbortSignal;
24
+ }
25
+ export declare function runWatch(opts: RunWatchOptions, runOnce: () => Promise<RunOutcome>): Promise<RunOutcome>;
26
+ //# sourceMappingURL=loop.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loop.d.ts","sourceRoot":"","sources":["../../../src/cli/watch/loop.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAG5C,MAAM,WAAW,eAAe;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB;;uDAEmD;IACnD,MAAM,CAAC,EAAE,WAAW,CAAC;CACrB;AAiBD,wBAAsB,QAAQ,CAC7B,IAAI,EAAE,eAAe,EACrB,OAAO,EAAE,MAAM,OAAO,CAAC,UAAU,CAAC,GAChC,OAAO,CAAC,UAAU,CAAC,CAgHrB"}