@alchemy.run/test 0.0.0 → 2.0.0-beta.85

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 (119) hide show
  1. package/LICENSE +201 -0
  2. package/bin/alchemy-test.ts +2 -0
  3. package/lib/Alchemy.d.ts +78 -0
  4. package/lib/Alchemy.d.ts.map +1 -0
  5. package/lib/Alchemy.js +194 -0
  6. package/lib/Alchemy.js.map +1 -0
  7. package/lib/Api.d.ts +134 -0
  8. package/lib/Api.d.ts.map +1 -0
  9. package/lib/Api.js +245 -0
  10. package/lib/Api.js.map +1 -0
  11. package/lib/Bun.d.ts +67 -0
  12. package/lib/Bun.d.ts.map +1 -0
  13. package/lib/Bun.js +143 -0
  14. package/lib/Bun.js.map +1 -0
  15. package/lib/Capture.d.ts +10 -0
  16. package/lib/Capture.d.ts.map +1 -0
  17. package/lib/Capture.js +68 -0
  18. package/lib/Capture.js.map +1 -0
  19. package/lib/Core.d.ts +287 -0
  20. package/lib/Core.d.ts.map +1 -0
  21. package/lib/Core.js +429 -0
  22. package/lib/Core.js.map +1 -0
  23. package/lib/DevCli.d.ts +47 -0
  24. package/lib/DevCli.d.ts.map +1 -0
  25. package/lib/DevCli.js +181 -0
  26. package/lib/DevCli.js.map +1 -0
  27. package/lib/Expect.d.ts +84 -0
  28. package/lib/Expect.d.ts.map +1 -0
  29. package/lib/Expect.js +518 -0
  30. package/lib/Expect.js.map +1 -0
  31. package/lib/FileLog.d.ts +27 -0
  32. package/lib/FileLog.d.ts.map +1 -0
  33. package/lib/FileLog.js +136 -0
  34. package/lib/FileLog.js.map +1 -0
  35. package/lib/Http.d.ts +109 -0
  36. package/lib/Http.d.ts.map +1 -0
  37. package/lib/Http.js +123 -0
  38. package/lib/Http.js.map +1 -0
  39. package/lib/Model.d.ts +98 -0
  40. package/lib/Model.d.ts.map +1 -0
  41. package/lib/Model.js +59 -0
  42. package/lib/Model.js.map +1 -0
  43. package/lib/PlainReporter.d.ts +19 -0
  44. package/lib/PlainReporter.d.ts.map +1 -0
  45. package/lib/PlainReporter.js +348 -0
  46. package/lib/PlainReporter.js.map +1 -0
  47. package/lib/Plan.d.ts +19 -0
  48. package/lib/Plan.d.ts.map +1 -0
  49. package/lib/Plan.js +32 -0
  50. package/lib/Plan.js.map +1 -0
  51. package/lib/Registry.d.ts +34 -0
  52. package/lib/Registry.d.ts.map +1 -0
  53. package/lib/Registry.js +80 -0
  54. package/lib/Registry.js.map +1 -0
  55. package/lib/Reporter.d.ts +160 -0
  56. package/lib/Reporter.d.ts.map +1 -0
  57. package/lib/Reporter.js +9 -0
  58. package/lib/Reporter.js.map +1 -0
  59. package/lib/Runner.d.ts +51 -0
  60. package/lib/Runner.d.ts.map +1 -0
  61. package/lib/Runner.js +1052 -0
  62. package/lib/Runner.js.map +1 -0
  63. package/lib/StrayOutput.d.ts +8 -0
  64. package/lib/StrayOutput.d.ts.map +1 -0
  65. package/lib/StrayOutput.js +259 -0
  66. package/lib/StrayOutput.js.map +1 -0
  67. package/lib/Tags.d.ts +17 -0
  68. package/lib/Tags.d.ts.map +1 -0
  69. package/lib/Tags.js +84 -0
  70. package/lib/Tags.js.map +1 -0
  71. package/lib/TestState.d.ts +12 -0
  72. package/lib/TestState.d.ts.map +1 -0
  73. package/lib/TestState.js +15 -0
  74. package/lib/TestState.js.map +1 -0
  75. package/lib/Tui.d.ts +4 -0
  76. package/lib/Tui.d.ts.map +1 -0
  77. package/lib/Tui.js +1137 -0
  78. package/lib/Tui.js.map +1 -0
  79. package/lib/Vitest.d.ts +58 -0
  80. package/lib/Vitest.d.ts.map +1 -0
  81. package/lib/Vitest.js +132 -0
  82. package/lib/Vitest.js.map +1 -0
  83. package/lib/WorktreeStage.d.ts +17 -0
  84. package/lib/WorktreeStage.d.ts.map +1 -0
  85. package/lib/WorktreeStage.js +48 -0
  86. package/lib/WorktreeStage.js.map +1 -0
  87. package/lib/cli.d.ts +2 -0
  88. package/lib/cli.d.ts.map +1 -0
  89. package/lib/cli.js +222 -0
  90. package/lib/cli.js.map +1 -0
  91. package/lib/index.d.ts +14 -0
  92. package/lib/index.d.ts.map +1 -0
  93. package/lib/index.js +12 -0
  94. package/lib/index.js.map +1 -0
  95. package/package.json +73 -3
  96. package/src/Alchemy.ts +335 -0
  97. package/src/Api.ts +521 -0
  98. package/src/Bun.ts +256 -0
  99. package/src/Capture.ts +72 -0
  100. package/src/Core.ts +872 -0
  101. package/src/DevCli.ts +229 -0
  102. package/src/Expect.ts +763 -0
  103. package/src/FileLog.ts +158 -0
  104. package/src/Http.ts +201 -0
  105. package/src/Model.ts +160 -0
  106. package/src/PlainReporter.ts +426 -0
  107. package/src/Plan.ts +45 -0
  108. package/src/Registry.ts +101 -0
  109. package/src/Reporter.ts +171 -0
  110. package/src/Runner.ts +1341 -0
  111. package/src/StrayOutput.ts +283 -0
  112. package/src/Tags.ts +100 -0
  113. package/src/TestState.ts +35 -0
  114. package/src/Tui.ts +1272 -0
  115. package/src/Vitest.ts +239 -0
  116. package/src/WorktreeStage.ts +45 -0
  117. package/src/cli.ts +330 -0
  118. package/src/index.ts +57 -0
  119. package/README.md +0 -9
@@ -0,0 +1,348 @@
1
+ /**
2
+ * Line-oriented reporter for non-interactive terminals and CI.
3
+ *
4
+ * Reports progress through the collection phase (importing a large suite's
5
+ * files takes tens of seconds before any test can run), then logs one line per
6
+ * test as it finishes, prefixed with a `[done/total]` counter (failures include
7
+ * their error and captured output inline); if nothing finishes for 10s it
8
+ * prints the list of currently-running tests; at the end every failure is
9
+ * repeated consolidated.
10
+ */
11
+ import * as Effect from "effect/Effect";
12
+ import * as Layer from "effect/Layer";
13
+ import { formatPlanPreview } from "./Plan.js";
14
+ import { Reporter } from "./Reporter.js";
15
+ import { writeDirect } from "./StrayOutput.js";
16
+ const isTty = process.stdout.isTTY === true;
17
+ const useColor = isTty && process.env.NO_COLOR === undefined;
18
+ const paint = (code) => (text) => useColor ? `\u001B[${code}m${text}\u001B[0m` : text;
19
+ const red = paint("31");
20
+ const green = paint("32");
21
+ const yellow = paint("33");
22
+ const dim = paint("2");
23
+ const bold = paint("1");
24
+ const formatDuration = (ms) => ms >= 1000 ? `${(ms / 1000).toFixed(1)}s` : `${Math.round(ms)}ms`;
25
+ // Through the REAL stream — while a run is active, bare process.stdout is
26
+ // diverted into the run log (see StrayOutput.ts).
27
+ const write = (line) => Effect.sync(() => {
28
+ writeDirect(`${line}\n`);
29
+ });
30
+ // Captured output is replayed verbatim — no timestamp/level prefixes, no
31
+ // indentation. It should read exactly as it would have on a normal terminal.
32
+ const formatLogs = (logs) => logs.map((log) => log.message).join("\n");
33
+ const indent = (text, prefix = " ") => text
34
+ .split("\n")
35
+ .map((line) => `${prefix}${line}`)
36
+ .join("\n");
37
+ /** Redraw cadence of the collection progress line. */
38
+ const COLLECT_RENDER_MS = 100;
39
+ /** Cadence of collection progress LINES when stdout isn't a terminal. */
40
+ const COLLECT_LINE_MS = 5_000;
41
+ const clearCollectLine = (state) => {
42
+ if (!state.collectLinePending)
43
+ return;
44
+ state.collectLinePending = false;
45
+ writeDirect("\r\u001B[2K");
46
+ };
47
+ /**
48
+ * Importing every test file takes tens of seconds on a large suite, and it
49
+ * happens before a single test can be reported — without progress the run is
50
+ * indistinguishable from a deadlock. On a TTY this repaints one line in place;
51
+ * otherwise it prints a line every few seconds. Either way the current file is
52
+ * shown, so a genuinely stuck import is identifiable by name.
53
+ *
54
+ * Also called from the reporter's 1s timer, not just on each imported file, so
55
+ * the elapsed time keeps ticking when an import is what's hanging.
56
+ */
57
+ const renderCollect = (state, force) => {
58
+ const now = Date.now();
59
+ const cadence = isTty ? COLLECT_RENDER_MS : COLLECT_LINE_MS;
60
+ if (!force && now - state.lastCollectRender < cadence)
61
+ return;
62
+ state.lastCollectRender = now;
63
+ const head = `collecting ${state.collectDone}/${state.collectTotal} test files (${formatDuration(now - state.collectStartedAt)})`;
64
+ // A pty that reports 0 columns (e.g. under `script`) is unknown, not narrow.
65
+ const columns = process.stdout.columns || 120;
66
+ const room = columns - head.length - 2;
67
+ const tail = state.collectCurrent !== "" && room > 12 ? ` ${state.collectCurrent.slice(-room)}` : "";
68
+ if (isTty) {
69
+ state.collectLinePending = true;
70
+ writeDirect(`\r\u001B[2K${dim(head + tail)}`);
71
+ }
72
+ else {
73
+ writeDirect(`${dim(head + tail)}\n`);
74
+ }
75
+ };
76
+ /** Settle the progress line on the final count so the total cost stays visible. */
77
+ const finishCollect = (state) => {
78
+ state.collecting = false;
79
+ clearCollectLine(state);
80
+ state.collectCurrent = "";
81
+ renderCollect(state, true);
82
+ if (state.collectLinePending) {
83
+ state.collectLinePending = false;
84
+ writeDirect("\n");
85
+ }
86
+ };
87
+ /**
88
+ * `[ 12/240 ✓10 ✗2]` counter prefixed to every result line: how much of the
89
+ * run is left, and the running pass/fail tally. Every number is right-aligned
90
+ * on the total's width so the columns after it stay aligned, and each tally is
91
+ * only colored once it is non-zero (a red `✗0` reads as a failure at a glance).
92
+ */
93
+ const progress = (state, status) => {
94
+ state.completed += 1;
95
+ if (status === "pass")
96
+ state.passed += 1;
97
+ else if (status === "fail")
98
+ state.failed += 1;
99
+ const total = Math.max(state.total, state.completed);
100
+ const width = String(total).length;
101
+ const pad = (n) => String(n).padStart(width, " ");
102
+ const pass = `✓${pad(state.passed)}`;
103
+ const fail = `✗${pad(state.failed)}`;
104
+ return [
105
+ dim(`[${pad(state.completed)}/${total}`),
106
+ state.passed > 0 ? green(pass) : dim(pass),
107
+ `${state.failed > 0 ? red(fail) : dim(fail)}${dim("]")}`,
108
+ ].join(" ");
109
+ };
110
+ const STALL_AFTER_MS = 10_000;
111
+ const STALL_LIST_MAX = 25;
112
+ /**
113
+ * Print the currently-running tests when nothing has finished for a while.
114
+ * Printed AT MOST ONCE per distinct running set: while the exact same tests
115
+ * stay stuck, nothing is re-printed — the timestamp on the report tells the
116
+ * reader how long ago it was taken.
117
+ */
118
+ const printStalled = (state) => {
119
+ if (state.running.size === 0)
120
+ return;
121
+ if (Date.now() - state.lastEnd < STALL_AFTER_MS)
122
+ return;
123
+ const key = [...state.running.entries()]
124
+ .map(([id, item]) => `${id}${item.queued ? " (queued)" : ""}`)
125
+ .sort()
126
+ .join("\n");
127
+ if (key === state.lastStallKey)
128
+ return;
129
+ state.lastStallKey = key;
130
+ const now = Date.now();
131
+ const timestamp = new Date(now).toTimeString().slice(0, 8);
132
+ const items = [...state.running.values()].sort((a, b) => a.startedAt - b.startedAt);
133
+ const queued = items.filter((item) => item.queued).length;
134
+ const lines = [
135
+ dim(`⧗ [${timestamp}] no tests finished in the last 10s — ${items.length - queued} still running` +
136
+ (queued > 0 ? `, ${queued} queued for an exclusive lock:` : ":")),
137
+ ];
138
+ for (const item of items.slice(0, STALL_LIST_MAX)) {
139
+ const elapsed = formatDuration(now - item.startedAt);
140
+ lines.push(dim(` ${item.label} (${item.queued ? `queued ${elapsed}` : elapsed})`));
141
+ }
142
+ if (items.length > STALL_LIST_MAX) {
143
+ lines.push(dim(` … ${items.length - STALL_LIST_MAX} more`));
144
+ }
145
+ writeDirect(`${lines.join("\n")}\n`);
146
+ };
147
+ const onEvent = (event, state) => {
148
+ switch (event._tag) {
149
+ case "PlanPreview":
150
+ return Effect.sync(() => finishCollect(state)).pipe(Effect.andThen(write(formatPlanPreview(event.phases))));
151
+ case "PlanPhaseStart":
152
+ return write(`\nPlan phase ${event.phase}/${event.phases}: ${event.tests} tests`);
153
+ case "CollectStart":
154
+ state.collectTotal = event.files.length;
155
+ state.collectStartedAt = Date.now();
156
+ state.collecting = true;
157
+ return write(dim(`collecting ${event.files.length} test files...`));
158
+ case "FileCollected":
159
+ return Effect.sync(() => {
160
+ state.collectDone += 1;
161
+ state.collectCurrent = event.file;
162
+ renderCollect(state, false);
163
+ });
164
+ case "RunStart":
165
+ state.total = event.tests.length;
166
+ return Effect.sync(() => finishCollect(state)).pipe(Effect.andThen(write(dim(`running ${event.tests.length} tests from ${event.files} files\n`))));
167
+ case "TestStart":
168
+ return Effect.sync(() => {
169
+ state.running.set(event.test.id, {
170
+ label: `${event.test.file} > ${event.test.titlePath.join(" > ")}`,
171
+ startedAt: Date.now(),
172
+ queued: true,
173
+ });
174
+ });
175
+ case "TestLocked":
176
+ return Effect.sync(() => {
177
+ const item = state.running.get(event.test.id);
178
+ if (item !== undefined) {
179
+ state.running.set(event.test.id, { label: item.label, startedAt: Date.now() });
180
+ }
181
+ });
182
+ case "HookStart":
183
+ return Effect.sync(() => {
184
+ state.running.set(`${event.file} :: ${event.hook}`, {
185
+ label: `${event.file} > [${event.hook} hook]`,
186
+ startedAt: Date.now(),
187
+ });
188
+ });
189
+ case "HookEnd":
190
+ return Effect.sync(() => {
191
+ state.running.delete(`${event.file} :: ${event.hook}`);
192
+ state.lastEnd = Date.now();
193
+ });
194
+ case "TestEnd": {
195
+ state.running.delete(event.test.id);
196
+ state.lastEnd = Date.now();
197
+ const title = `${dim(event.test.file)} ${dim(">")} ${event.test.titlePath.join(` ${dim(">")} `)}`;
198
+ const duration = dim(`(${formatDuration(event.result.durationMs)})`);
199
+ const retries = event.result.retries > 0 ? yellow(` [retried x${event.result.retries}]`) : "";
200
+ const count = progress(state, event.result.status);
201
+ switch (event.result.status) {
202
+ case "pass":
203
+ return write(`${count} ${green("✓")} ${title} ${duration}${retries}`);
204
+ case "fail": {
205
+ state.failedFiles.add(event.test.file);
206
+ // Show the failure's details immediately so it can be inspected
207
+ // while the run continues (passed tests stay silent). The end-of-run
208
+ // Failures section repeats them consolidated, with file hook logs.
209
+ const lines = [`${count} ${red("✗")} ${title} ${duration}${retries}`];
210
+ if (event.result.error !== undefined) {
211
+ lines.push(indent(red(event.result.error)));
212
+ }
213
+ if (event.result.logs.length > 0) {
214
+ lines.push(dim("--- captured output ---"));
215
+ lines.push(formatLogs(event.result.logs));
216
+ lines.push(dim("--- end output ---"));
217
+ }
218
+ return write(lines.join("\n"));
219
+ }
220
+ case "skip":
221
+ return write(`${count} ${yellow("↓")} ${title} ${dim("[skipped]")}`);
222
+ case "todo":
223
+ // Warning-styled: a todo is unimplemented coverage, not a pass —
224
+ // it must not blend in with the dim noise around it.
225
+ return write(`${count} ${yellow(`○ ${event.test.file} > ${event.test.titlePath.join(" > ")} ${bold("[todo]")}`)}`);
226
+ }
227
+ }
228
+ case "FileEnd": {
229
+ if (event.logs.length > 0 &&
230
+ (event.error !== undefined || state.failedFiles.has(event.file))) {
231
+ state.hookLogs.set(event.file, event.logs);
232
+ }
233
+ if (event.error !== undefined) {
234
+ return write(`${red("✗")} ${bold(event.file)} ${red("failed to run")}\n${indent(red(event.error))}` +
235
+ (event.logs.length > 0
236
+ ? `\n${dim("--- file hook output (deploy/destroy) ---")}\n${formatLogs(event.logs)}`
237
+ : ""));
238
+ }
239
+ return Effect.void;
240
+ }
241
+ case "RunEnd":
242
+ return printSummary(event.summary, state.hookLogs);
243
+ default:
244
+ return Effect.void;
245
+ }
246
+ };
247
+ export const printSummary = (summary,
248
+ /** Buffered deploy/destroy output per file, printed once per failing file. */
249
+ hookLogs) => Effect.gen(function* () {
250
+ if (summary.failures.length > 0) {
251
+ yield* write(`\n${bold(red(`Failures (${summary.failures.length})`))}\n`);
252
+ const hookLogsPrinted = new Set();
253
+ for (const { meta, result } of summary.failures) {
254
+ yield* write(`${red("✗")} ${bold(meta.file)} ${dim(">")} ${meta.titlePath.join(` ${dim(">")} `)}`);
255
+ if (result.error !== undefined) {
256
+ yield* write(indent(red(result.error)));
257
+ }
258
+ if (result.logs.length > 0) {
259
+ yield* write(dim("--- captured output ---"));
260
+ yield* write(formatLogs(result.logs));
261
+ yield* write(dim("--- end output ---"));
262
+ }
263
+ const fileHookLogs = hookLogs?.get(meta.file);
264
+ if (fileHookLogs !== undefined &&
265
+ fileHookLogs.length > 0 &&
266
+ !hookLogsPrinted.has(meta.file)) {
267
+ hookLogsPrinted.add(meta.file);
268
+ yield* write(dim("--- file hook output (deploy/destroy) ---"));
269
+ yield* write(formatLogs(fileHookLogs));
270
+ yield* write(dim("--- end output ---"));
271
+ }
272
+ yield* write("");
273
+ }
274
+ }
275
+ // A bare list of what failed, immediately above the counts — the failure
276
+ // details above are long enough that the names scroll out of reach, and
277
+ // each line here is exactly what `-t` matches for a re-run.
278
+ const failedNames = [
279
+ ...summary.failures.map(({ meta }) => `${meta.file} > ${meta.titlePath.join(" > ")}`),
280
+ ...summary.fileFailures.map(({ file }) => `${file} (whole file)`),
281
+ ];
282
+ if (failedNames.length > 0) {
283
+ yield* write(bold(red(`Failed (${failedNames.length})`)));
284
+ for (const name of failedNames) {
285
+ yield* write(` ${red("✗")} ${name}`);
286
+ }
287
+ }
288
+ const parts = [
289
+ summary.failed > 0 ? red(`${summary.failed} failed`) : green("0 failed"),
290
+ ...(summary.dryRun ? [] : [green(`${summary.passed} passed`)]),
291
+ ...(summary.skipped > 0 ? [yellow(`${summary.skipped} skipped`)] : []),
292
+ ...(summary.todo > 0 ? [yellow(`${summary.todo} todo`)] : []),
293
+ ...(summary.plan
294
+ ? [
295
+ `${summary.plan.found} found`,
296
+ `${summary.plan.selected} selected by plan`,
297
+ yellow(`${summary.plan.excluded} excluded by plan`),
298
+ ]
299
+ : []),
300
+ ];
301
+ yield* write(`\n${bold("Tests:")} ${parts.join(dim(" | "))} ${dim(`(${summary.files} files, ${formatDuration(summary.durationMs)})`)}`);
302
+ });
303
+ export const PlainReporterLive = Layer.sync(Reporter)(() => {
304
+ const state = {
305
+ hookLogs: new Map(),
306
+ failedFiles: new Set(),
307
+ running: new Map(),
308
+ total: 0,
309
+ completed: 0,
310
+ passed: 0,
311
+ failed: 0,
312
+ lastEnd: Date.now(),
313
+ lastStallKey: "",
314
+ stallTimer: undefined,
315
+ collectTotal: 0,
316
+ collectDone: 0,
317
+ collectStartedAt: Date.now(),
318
+ collectCurrent: "",
319
+ lastCollectRender: 0,
320
+ collectLinePending: false,
321
+ collecting: false,
322
+ };
323
+ // Ticks through both phases: repaints the collection line while files are
324
+ // importing, reports stalled tests once the run is executing.
325
+ const tick = () => {
326
+ if (state.collecting)
327
+ renderCollect(state, false);
328
+ else
329
+ printStalled(state);
330
+ };
331
+ return {
332
+ emit: (event) => Effect.suspend(() => {
333
+ if ((event._tag === "CollectStart" || event._tag === "RunStart") &&
334
+ state.stallTimer === undefined) {
335
+ state.stallTimer = setInterval(tick, 1000);
336
+ // Don't hold the process open once the run's fibers finish.
337
+ state.stallTimer.unref?.();
338
+ }
339
+ if (event._tag === "RunEnd" && state.stallTimer !== undefined) {
340
+ clearInterval(state.stallTimer);
341
+ state.stallTimer = undefined;
342
+ }
343
+ return onEvent(event, state);
344
+ }),
345
+ waitForExit: () => Effect.void,
346
+ };
347
+ });
348
+ //# sourceMappingURL=PlainReporter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PlainReporter.js","sourceRoot":"","sources":["../src/PlainReporter.ts"],"names":[],"mappings":"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"}
package/lib/Plan.d.ts ADDED
@@ -0,0 +1,19 @@
1
+ import * as Schema from "effect/Schema";
2
+ declare const Plan: Schema.$Array<Schema.Union<readonly [Schema.Struct<{
3
+ /** Tag expressions are ANDed, just like repeated --tags flags. Empty selects all. */
4
+ readonly tags: Schema.$Array<Schema.String>;
5
+ readonly concurrency: Schema.optional<Schema.Union<readonly [Schema.Int, Schema.Literal<"unbounded">]>>;
6
+ }>, Schema.$Array<Schema.Struct<{
7
+ /** Tag expressions are ANDed, just like repeated --tags flags. Empty selects all. */
8
+ readonly tags: Schema.$Array<Schema.String>;
9
+ readonly concurrency: Schema.optional<Schema.Union<readonly [Schema.Int, Schema.Literal<"unbounded">]>>;
10
+ }>>]>>;
11
+ export type TestPlan = typeof Plan.Type;
12
+ /** Parse before collection so an invalid plan cannot trigger test imports. */
13
+ export declare const parsePlan: (json: string) => TestPlan;
14
+ /** Shared plain/TUI/log representation of a dry-run plan. */
15
+ export declare const formatPlanPreview: (phases: Extract<import("./Reporter.ts").TestEvent, {
16
+ _tag: "PlanPreview";
17
+ }>["phases"]) => string;
18
+ export {};
19
+ //# sourceMappingURL=Plan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Plan.d.ts","sourceRoot":"","sources":["../src/Plan.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAUxC,QAAA,MAAM,IAAI;IANR,qFAAqF;;;;IAArF,qFAAqF;;;MAQzD,CAAC;AAE/B,MAAM,MAAM,QAAQ,GAAG,OAAO,IAAI,CAAC,IAAI,CAAC;AAExC,8EAA8E;AAC9E,eAAO,MAAM,SAAS,SAAU,MAAM,KAAG,QAYxC,CAAC;AAEF,6DAA6D;AAC7D,eAAO,MAAM,iBAAiB,WACpB,OAAO,CAAC,OAAO,eAAe,EAAE,SAAS,EAAE;IAAE,IAAI,EAAE,aAAa,CAAA;CAAE,CAAC,CAAC,QAAQ,CAAC,KACpF,MAUW,CAAC"}
package/lib/Plan.js ADDED
@@ -0,0 +1,32 @@
1
+ import * as Schema from "effect/Schema";
2
+ import { compileTagsFilter } from "./Tags.js";
3
+ const Branch = Schema.Struct({
4
+ /** Tag expressions are ANDed, just like repeated --tags flags. Empty selects all. */
5
+ tags: Schema.Array(Schema.String),
6
+ concurrency: Schema.optional(Schema.Union([Schema.Int.check(Schema.isGreaterThan(0)), Schema.Literal("unbounded")])),
7
+ });
8
+ const Plan = Schema.Array(Schema.Union([Branch, Schema.Array(Branch).check(Schema.isMinLength(1))])).check(Schema.isMinLength(1));
9
+ /** Parse before collection so an invalid plan cannot trigger test imports. */
10
+ export const parsePlan = (json) => {
11
+ try {
12
+ const plan = Schema.decodeUnknownSync(Plan, { onExcessProperty: "error" })(JSON.parse(json));
13
+ for (const phase of plan) {
14
+ for (const branch of Array.isArray(phase) ? phase : [phase]) {
15
+ compileTagsFilter(branch.tags);
16
+ }
17
+ }
18
+ return plan;
19
+ }
20
+ catch (cause) {
21
+ throw new Error(`Invalid --plan: ${cause instanceof Error ? cause.message : String(cause)}`);
22
+ }
23
+ };
24
+ /** Shared plain/TUI/log representation of a dry-run plan. */
25
+ export const formatPlanPreview = (phases) => [
26
+ "Dry run — no tests or hooks executed",
27
+ ...phases.flatMap((branches, index) => [
28
+ `Phase ${index + 1}${branches.length > 1 ? " (parallel)" : ""}:`,
29
+ ...branches.map((branch, i) => ` Branch ${i + 1}: tags=${JSON.stringify(branch.tags)}, concurrency=${branch.concurrency} — ${branch.tests} tests in ${branch.files} files${branch.skipped ? ` (${branch.skipped} skipped/todo)` : ""}`),
30
+ ]),
31
+ ].join("\n");
32
+ //# sourceMappingURL=Plan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Plan.js","sourceRoot":"","sources":["../src/Plan.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAE9C,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;IAC3B,qFAAqF;IACrF,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC;IACjC,WAAW,EAAE,MAAM,CAAC,QAAQ,CAC1B,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CACvF;CACF,CAAC,CAAC;AACH,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CACvB,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAC1E,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;AAI/B,8EAA8E;AAC9E,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,IAAY,EAAY,EAAE;IAClD,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,CAAC,iBAAiB,CAAC,IAAI,EAAE,EAAE,gBAAgB,EAAE,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QAC7F,KAAK,MAAM,KAAK,IAAI,IAAI,EAAE,CAAC;YACzB,KAAK,MAAM,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC5D,iBAAiB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACjC,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,mBAAmB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC/F,CAAC;AACH,CAAC,CAAC;AAEF,6DAA6D;AAC7D,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAC/B,MAAqF,EAC7E,EAAE,CACV;IACE,sCAAsC;IACtC,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE,CAAC;QACrC,SAAS,KAAK,GAAG,CAAC,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,GAAG;QAChE,GAAG,QAAQ,CAAC,GAAG,CACb,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CACZ,YAAY,CAAC,GAAG,CAAC,UAAU,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,iBAAiB,MAAM,CAAC,WAAW,MAAM,MAAM,CAAC,KAAK,aAAa,MAAM,CAAC,KAAK,SAAS,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,OAAO,gBAAgB,CAAC,CAAC,CAAC,EAAE,EAAE,CAC3M;KACF,CAAC;CACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Per-file registration state.
3
+ *
4
+ * While a test file's module body is evaluating, `describe`/`test`/hook
5
+ * calls register nodes against that file's collector. The runner may call
6
+ * `collect` for many files at once, but collections run one at a time: each
7
+ * waits its turn on a process-wide queue, sets the collector in a plain slot,
8
+ * imports the file and flushes the microtasks it queued, then clears the slot.
9
+ * Attribution therefore never depends on the runtime carrying async context
10
+ * through `import()` (Bun 1.4 does not), including registrations deferred with
11
+ * `queueMicrotask` and module bodies that use top-level `await`.
12
+ *
13
+ * The state lives on `globalThis` so that a duplicated module instance
14
+ * (e.g. two resolutions of the package) still shares one registry.
15
+ */
16
+ import { type FileSuite, type Suite } from "./Model.ts";
17
+ /**
18
+ * Collect one file: once every earlier collection has finished, run `f` (the
19
+ * file's dynamic import + microtask flush) with `root` (a fresh one by
20
+ * default) as the active collector, and return it.
21
+ */
22
+ export declare const collect: (file: string, f: () => Promise<void>, root?: FileSuite) => Promise<FileSuite>;
23
+ export declare const currentSuite: () => Suite;
24
+ export declare const currentFileSuite: () => FileSuite;
25
+ /**
26
+ * The file currently being collected (path relative to the run root, e.g.
27
+ * `test/Cloudflare/R2/Bucket.test.ts`), or `undefined` when called outside
28
+ * of a collection (e.g. from a non-alchemy-test runner). Adapters use this
29
+ * at registration time to namespace per-test durable state by file.
30
+ */
31
+ export declare const currentFile: () => string | undefined;
32
+ /** Run `f` with `suite` as the current registration target. */
33
+ export declare const withSuite: (suite: Suite, f: () => void) => void;
34
+ //# sourceMappingURL=Registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Registry.d.ts","sourceRoot":"","sources":["../src/Registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAiB,KAAK,SAAS,EAAE,KAAK,KAAK,EAAE,MAAM,YAAY,CAAC;AAqBvE;;;;GAIG;AACH,eAAO,MAAM,OAAO,SACZ,MAAM,KACT,MAAM,OAAO,CAAC,IAAI,CAAC,SAChB,SAAS,KACd,OAAO,CAAC,SAAS,CAYnB,CAAC;AAaF,eAAO,MAAM,YAAY,QAAO,KAAiC,CAAC;AAElE,eAAO,MAAM,gBAAgB,QAAO,SAInC,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,WAAW,QAAO,MAAM,GAAG,SAIvC,CAAC;AAEF,+DAA+D;AAC/D,eAAO,MAAM,SAAS,UAAW,KAAK,KAAK,MAAM,IAAI,KAAG,IASvD,CAAC"}
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Per-file registration state.
3
+ *
4
+ * While a test file's module body is evaluating, `describe`/`test`/hook
5
+ * calls register nodes against that file's collector. The runner may call
6
+ * `collect` for many files at once, but collections run one at a time: each
7
+ * waits its turn on a process-wide queue, sets the collector in a plain slot,
8
+ * imports the file and flushes the microtasks it queued, then clears the slot.
9
+ * Attribution therefore never depends on the runtime carrying async context
10
+ * through `import()` (Bun 1.4 does not), including registrations deferred with
11
+ * `queueMicrotask` and module bodies that use top-level `await`.
12
+ *
13
+ * The state lives on `globalThis` so that a duplicated module instance
14
+ * (e.g. two resolutions of the package) still shares one registry.
15
+ */
16
+ import { makeFileSuite } from "./Model.js";
17
+ const key = Symbol.for("alchemy-test/registry@2");
18
+ const state = (globalThis[key] ??= {
19
+ active: undefined,
20
+ tail: Promise.resolve(),
21
+ });
22
+ /**
23
+ * Collect one file: once every earlier collection has finished, run `f` (the
24
+ * file's dynamic import + microtask flush) with `root` (a fresh one by
25
+ * default) as the active collector, and return it.
26
+ */
27
+ export const collect = (file, f, root = makeFileSuite(file)) => {
28
+ const run = state.tail.then(async () => {
29
+ state.active = { current: root };
30
+ try {
31
+ await f();
32
+ }
33
+ finally {
34
+ state.active = undefined;
35
+ }
36
+ return root;
37
+ });
38
+ state.tail = run.catch(() => undefined);
39
+ return run;
40
+ };
41
+ const currentContext = () => {
42
+ const context = state.active;
43
+ if (context === undefined) {
44
+ throw new Error("alchemy-test: describe/test/hook called outside of a test file collection. " +
45
+ "Run tests with the `alchemy-test` CLI.");
46
+ }
47
+ return context;
48
+ };
49
+ export const currentSuite = () => currentContext().current;
50
+ export const currentFileSuite = () => {
51
+ let suite = currentSuite();
52
+ while (suite.parent !== undefined)
53
+ suite = suite.parent;
54
+ return suite;
55
+ };
56
+ /**
57
+ * The file currently being collected (path relative to the run root, e.g.
58
+ * `test/Cloudflare/R2/Bucket.test.ts`), or `undefined` when called outside
59
+ * of a collection (e.g. from a non-alchemy-test runner). Adapters use this
60
+ * at registration time to namespace per-test durable state by file.
61
+ */
62
+ export const currentFile = () => {
63
+ let suite = state.active?.current;
64
+ while (suite?.parent !== undefined)
65
+ suite = suite.parent;
66
+ return suite !== undefined && "file" in suite ? suite.file : undefined;
67
+ };
68
+ /** Run `f` with `suite` as the current registration target. */
69
+ export const withSuite = (suite, f) => {
70
+ const context = currentContext();
71
+ const previous = context.current;
72
+ context.current = suite;
73
+ try {
74
+ f();
75
+ }
76
+ finally {
77
+ context.current = previous;
78
+ }
79
+ };
80
+ //# sourceMappingURL=Registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Registry.js","sourceRoot":"","sources":["../src/Registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAE,aAAa,EAA8B,MAAM,YAAY,CAAC;AAcvE,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;AAElD,MAAM,KAAK,GAAkB,CAAE,UAAkB,CAAC,GAAG,CAAC,KAAK;IACzD,MAAM,EAAE,SAAS;IACjB,IAAI,EAAE,OAAO,CAAC,OAAO,EAAE;CACA,CAAC,CAAC;AAE3B;;;;GAIG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,CACrB,IAAY,EACZ,CAAsB,EACtB,IAAI,GAAc,aAAa,CAAC,IAAI,CAAC,EACjB,EAAE;IACtB,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE;QACrC,KAAK,CAAC,MAAM,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QACjC,IAAI,CAAC;YACH,MAAM,CAAC,EAAE,CAAC;QACZ,CAAC;gBAAS,CAAC;YACT,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC;QAC3B,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;IACH,KAAK,CAAC,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IACxC,OAAO,GAAG,CAAC;AACb,CAAC,CAAC;AAEF,MAAM,cAAc,GAAG,GAAgB,EAAE;IACvC,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC;IAC7B,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CACb,6EAA6E;YAC3E,wCAAwC,CAC3C,CAAC;IACJ,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAG,GAAU,EAAE,CAAC,cAAc,EAAE,CAAC,OAAO,CAAC;AAElE,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAc,EAAE;IAC9C,IAAI,KAAK,GAAG,YAAY,EAAE,CAAC;IAC3B,OAAO,KAAK,CAAC,MAAM,KAAK,SAAS;QAAE,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC;IACxD,OAAO,KAAkB,CAAC;AAC5B,CAAC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,GAAuB,EAAE;IAClD,IAAI,KAAK,GAAsB,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC;IACrD,OAAO,KAAK,EAAE,MAAM,KAAK,SAAS;QAAE,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC;IACzD,OAAO,KAAK,KAAK,SAAS,IAAI,MAAM,IAAI,KAAK,CAAC,CAAC,CAAE,KAAmB,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;AACxF,CAAC,CAAC;AAEF,+DAA+D;AAC/D,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,KAAY,EAAE,CAAa,EAAQ,EAAE;IAC7D,MAAM,OAAO,GAAG,cAAc,EAAE,CAAC;IACjC,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC;IACjC,OAAO,CAAC,OAAO,GAAG,KAAK,CAAC;IACxB,IAAI,CAAC;QACH,CAAC,EAAE,CAAC;IACN,CAAC;YAAS,CAAC;QACT,OAAO,CAAC,OAAO,GAAG,QAAQ,CAAC;IAC7B,CAAC;AACH,CAAC,CAAC"}