@glubean/runner 0.1.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.
@@ -0,0 +1,347 @@
1
+ import { spawn } from "node:child_process";
2
+ import { fileURLToPath } from "node:url";
3
+ import { dirname, resolve } from "node:path";
4
+ import { createRequire } from "node:module";
5
+ const DEFAULT_CONCURRENCY = 1;
6
+ const DEFAULT_TIMEOUT_MS = 30000;
7
+ // ── Resolve harness path ────────────────────────────────────────────────────
8
+ const __filename = fileURLToPath(import.meta.url);
9
+ const __dirname = dirname(__filename);
10
+ let _tsxPath;
11
+ function resolveTsxPath() {
12
+ if (_tsxPath)
13
+ return _tsxPath;
14
+ const req = createRequire(import.meta.url);
15
+ _tsxPath = resolve(dirname(req.resolve("tsx/package.json")), "dist/cli.mjs");
16
+ return _tsxPath;
17
+ }
18
+ // ── TestExecutor ────────────────────────────────────────────────────────────
19
+ export class TestExecutor {
20
+ harnessPath;
21
+ options;
22
+ constructor(options = {}) {
23
+ this.harnessPath = resolve(__dirname, "harness.ts");
24
+ this.options = options;
25
+ }
26
+ static fromSharedConfig(shared, overrides) {
27
+ return new TestExecutor({
28
+ emitFullTrace: shared.emitFullTrace,
29
+ ...overrides,
30
+ });
31
+ }
32
+ async *run(testUrl, testId, context, options) {
33
+ const args = [this.harnessPath];
34
+ // V8 flags via NODE_OPTIONS
35
+ const nodeOptions = [];
36
+ if (this.options.maxHeapSizeMb) {
37
+ nodeOptions.push(`--max-old-space-size=${this.options.maxHeapSizeMb}`);
38
+ }
39
+ if (this.options.v8Flags) {
40
+ nodeOptions.push(...this.options.v8Flags);
41
+ }
42
+ // Inspect
43
+ const inspectBrk = this.options.inspectBrk || (() => {
44
+ const envVal = process.env["GLUBEAN_INSPECT_BRK"];
45
+ if (!envVal)
46
+ return false;
47
+ const port = parseInt(envVal, 10);
48
+ return isNaN(port) ? true : port;
49
+ })();
50
+ if (inspectBrk) {
51
+ if (typeof inspectBrk === "number") {
52
+ nodeOptions.push(`--inspect-brk=127.0.0.1:${inspectBrk}`);
53
+ }
54
+ else {
55
+ nodeOptions.push("--inspect-brk");
56
+ }
57
+ }
58
+ // Harness args
59
+ args.push(`--testUrl=${testUrl}`);
60
+ if (options?.testIds) {
61
+ args.push(`--testIds=${options.testIds.join(",")}`);
62
+ }
63
+ else {
64
+ args.push(`--testId=${testId}`);
65
+ }
66
+ if (options?.exportName) {
67
+ args.push(`--exportName=${options.exportName}`);
68
+ }
69
+ if (options?.exportNames && Object.keys(options.exportNames).length > 0) {
70
+ const pairs = Object.entries(options.exportNames)
71
+ .map(([id, name]) => `${id}:${name}`)
72
+ .join(",");
73
+ args.push(`--exportNames=${pairs}`);
74
+ }
75
+ if (this.options.emitFullTrace) {
76
+ args.push("--emitFullTrace");
77
+ }
78
+ // Build env
79
+ const env = { ...process.env };
80
+ if (nodeOptions.length > 0) {
81
+ env["NODE_OPTIONS"] = nodeOptions.join(" ");
82
+ }
83
+ // Spawn tsx subprocess via node
84
+ const child = spawn("node", [resolveTsxPath(), ...args], {
85
+ cwd: this.options.cwd,
86
+ env,
87
+ stdio: ["pipe", "pipe", inspectBrk ? "inherit" : "pipe"],
88
+ });
89
+ // Write context to stdin
90
+ const normalizedContext = {
91
+ ...context,
92
+ test: {
93
+ id: context.test?.id ?? testId,
94
+ tags: context.test?.tags ?? [],
95
+ },
96
+ };
97
+ child.stdin.write(JSON.stringify(normalizedContext));
98
+ child.stdin.end();
99
+ // Setup timeout
100
+ const timeout = inspectBrk ? 0 : options?.timeout ?? DEFAULT_TIMEOUT_MS;
101
+ let timeoutHandle;
102
+ let timedOut = false;
103
+ const armTimeout = (ms) => {
104
+ if (timeoutHandle)
105
+ clearTimeout(timeoutHandle);
106
+ if (ms <= 0)
107
+ return;
108
+ timeoutHandle = setTimeout(() => {
109
+ timedOut = true;
110
+ child.kill("SIGTERM");
111
+ }, ms);
112
+ };
113
+ if (timeout > 0)
114
+ armTimeout(timeout);
115
+ // AbortSignal support
116
+ const abortSignal = options?.signal;
117
+ let aborted = false;
118
+ const onAbort = () => {
119
+ aborted = true;
120
+ child.kill("SIGTERM");
121
+ };
122
+ if (abortSignal) {
123
+ if (abortSignal.aborted) {
124
+ child.kill("SIGTERM");
125
+ aborted = true;
126
+ }
127
+ else {
128
+ abortSignal.addEventListener("abort", onAbort, { once: true });
129
+ }
130
+ }
131
+ // Read stdout line by line
132
+ let stdoutBuffer = "";
133
+ const stderrChunks = [];
134
+ if (child.stderr) {
135
+ child.stderr.on("data", (chunk) => stderrChunks.push(chunk));
136
+ }
137
+ // Use an async iterator pattern to yield events
138
+ const eventQueue = [];
139
+ let resolveWait;
140
+ let done = false;
141
+ child.stdout.on("data", (chunk) => {
142
+ stdoutBuffer += chunk.toString();
143
+ const lines = stdoutBuffer.split("\n");
144
+ stdoutBuffer = lines.pop() || "";
145
+ for (const line of lines) {
146
+ const event = this.parseExecutionLine(line);
147
+ if (event) {
148
+ // Handle timeout_update
149
+ if (event.type === "timeout_update" && !inspectBrk && Number.isFinite(event.timeout) && event.timeout > 0) {
150
+ armTimeout(Math.floor(event.timeout));
151
+ }
152
+ eventQueue.push(event);
153
+ resolveWait?.();
154
+ }
155
+ }
156
+ });
157
+ child.on("close", (code, signal) => {
158
+ // Process remaining buffer
159
+ if (stdoutBuffer.trim()) {
160
+ const event = this.parseExecutionLine(stdoutBuffer);
161
+ if (event)
162
+ eventQueue.push(event);
163
+ }
164
+ if (timeoutHandle)
165
+ clearTimeout(timeoutHandle);
166
+ if (abortSignal)
167
+ abortSignal.removeEventListener("abort", onAbort);
168
+ const stderr = Buffer.concat(stderrChunks).toString();
169
+ if (code !== 0) {
170
+ if (aborted) {
171
+ eventQueue.push({ type: "error", message: "Test execution was cancelled" });
172
+ }
173
+ else if (timedOut) {
174
+ eventQueue.push({ type: "error", message: `Test execution timed out after ${timeout}ms` });
175
+ }
176
+ else if (signal === "SIGKILL" || code === 137) {
177
+ const heapInfo = this.options.maxHeapSizeMb ? ` (limit: ${this.options.maxHeapSizeMb} MB)` : "";
178
+ const detail = stderr.trim() ? `\n${stderr.trim()}` : "";
179
+ eventQueue.push({
180
+ type: "error",
181
+ message: `Out of memory — process killed${heapInfo}.${detail}\nTo fix: process data in smaller batches.`,
182
+ });
183
+ }
184
+ else if (stderr.trim()) {
185
+ eventQueue.push({ type: "error", message: stderr.trim() });
186
+ }
187
+ else {
188
+ eventQueue.push({
189
+ type: "error",
190
+ message: `Process exited with code ${code}${signal ? ` (signal: ${signal})` : ""}`,
191
+ });
192
+ }
193
+ }
194
+ done = true;
195
+ resolveWait?.();
196
+ });
197
+ // Yield events as they arrive
198
+ while (true) {
199
+ while (eventQueue.length > 0) {
200
+ yield eventQueue.shift();
201
+ }
202
+ if (done)
203
+ break;
204
+ await new Promise((r) => { resolveWait = r; });
205
+ }
206
+ }
207
+ parseExecutionLine(line) {
208
+ if (!line.trim())
209
+ return undefined;
210
+ try {
211
+ return JSON.parse(line);
212
+ }
213
+ catch {
214
+ return { type: "log", message: line };
215
+ }
216
+ }
217
+ async execute(testUrl, testId, context, options) {
218
+ const startTime = Date.now();
219
+ const events = [];
220
+ const onEvent = options?.onEvent;
221
+ const includeTestId = options?.includeTestId ?? false;
222
+ let success = false;
223
+ let testName;
224
+ let suiteId;
225
+ let suiteName;
226
+ let error;
227
+ let stack;
228
+ let peakMemoryBytes;
229
+ let peakMemoryMB;
230
+ let retryCount;
231
+ let assertionCount = 0;
232
+ let failedAssertionCount = 0;
233
+ for await (const event of this.run(testUrl, testId, context, { timeout: options?.timeout, signal: options?.signal })) {
234
+ const ts = Date.now() - startTime;
235
+ let timelineEvent;
236
+ switch (event.type) {
237
+ case "start":
238
+ testName = event.name;
239
+ suiteId = event.suiteId;
240
+ suiteName = event.suiteName;
241
+ retryCount = event.retryCount;
242
+ break;
243
+ case "log":
244
+ timelineEvent = { type: "log", ts, ...(includeTestId && { testId }), ...(event.stepIndex !== undefined && { stepIndex: event.stepIndex }), message: event.message, data: event.data };
245
+ break;
246
+ case "assertion":
247
+ assertionCount++;
248
+ if (!event.passed)
249
+ failedAssertionCount++;
250
+ timelineEvent = { type: "assertion", ts, ...(includeTestId && { testId }), ...(event.stepIndex !== undefined && { stepIndex: event.stepIndex }), passed: event.passed, message: event.message, actual: event.actual, expected: event.expected };
251
+ break;
252
+ case "warning":
253
+ timelineEvent = { type: "warning", ts, ...(includeTestId && { testId }), ...(event.stepIndex !== undefined && { stepIndex: event.stepIndex }), condition: event.condition, message: event.message };
254
+ break;
255
+ case "schema_validation":
256
+ timelineEvent = { type: "schema_validation", ts, ...(includeTestId && { testId }), ...(event.stepIndex !== undefined && { stepIndex: event.stepIndex }), label: event.label, success: event.success, severity: event.severity, ...(event.issues && { issues: event.issues }) };
257
+ break;
258
+ case "trace":
259
+ timelineEvent = { type: "trace", ts, ...(includeTestId && { testId }), ...(event.stepIndex !== undefined && { stepIndex: event.stepIndex }), data: event.data };
260
+ break;
261
+ case "action":
262
+ timelineEvent = { type: "action", ts, ...(includeTestId && { testId }), ...(event.stepIndex !== undefined && { stepIndex: event.stepIndex }), data: event.data };
263
+ break;
264
+ case "event":
265
+ timelineEvent = { type: "event", ts, ...(includeTestId && { testId }), ...(event.stepIndex !== undefined && { stepIndex: event.stepIndex }), data: event.data };
266
+ break;
267
+ case "metric":
268
+ timelineEvent = { type: "metric", ts, ...(includeTestId && { testId }), ...(event.stepIndex !== undefined && { stepIndex: event.stepIndex }), name: event.name, value: event.value, unit: event.unit, tags: event.tags };
269
+ break;
270
+ case "summary":
271
+ timelineEvent = { type: "summary", ts, ...(includeTestId && { testId }), data: event.data };
272
+ break;
273
+ case "status":
274
+ success = event.status === "completed" || event.status === "skipped";
275
+ if (event.error)
276
+ error = event.error;
277
+ if (event.stack)
278
+ stack = event.stack;
279
+ if (event.peakMemoryBytes !== undefined)
280
+ peakMemoryBytes = event.peakMemoryBytes;
281
+ if (event.peakMemoryMB !== undefined)
282
+ peakMemoryMB = event.peakMemoryMB;
283
+ break;
284
+ case "error":
285
+ success = false;
286
+ if (!error)
287
+ error = event.message;
288
+ break;
289
+ case "step_start":
290
+ timelineEvent = { type: "step_start", ts, ...(includeTestId && { testId }), index: event.index, name: event.name, total: event.total };
291
+ break;
292
+ case "step_end":
293
+ timelineEvent = { type: "step_end", ts, ...(includeTestId && { testId }), index: event.index, name: event.name, status: event.status, durationMs: event.durationMs, assertions: event.assertions, failedAssertions: event.failedAssertions, error: event.error, attempts: event.attempts, retriesUsed: event.retriesUsed, ...(event.returnState !== undefined && { returnState: event.returnState }) };
294
+ break;
295
+ case "timeout_update":
296
+ break;
297
+ }
298
+ if (timelineEvent) {
299
+ events.push(timelineEvent);
300
+ if (onEvent)
301
+ await onEvent(timelineEvent);
302
+ }
303
+ }
304
+ return {
305
+ success, testId, testName, suiteId, suiteName, events, error, stack,
306
+ duration: Date.now() - startTime, retryCount, assertionCount, failedAssertionCount,
307
+ peakMemoryBytes, peakMemoryMB,
308
+ };
309
+ }
310
+ async executeMany(testUrl, testIds, context, options = {}) {
311
+ const startTime = Date.now();
312
+ const concurrency = Math.max(DEFAULT_CONCURRENCY, Math.min(options.concurrency ?? DEFAULT_CONCURRENCY, testIds.length || DEFAULT_CONCURRENCY));
313
+ const results = new Array(testIds.length);
314
+ const onEvent = options.onEvent;
315
+ let failedCount = 0;
316
+ let nextIndex = 0;
317
+ let stop = false;
318
+ const runNext = async () => {
319
+ while (!stop) {
320
+ if (options.signal?.aborted) {
321
+ stop = true;
322
+ return;
323
+ }
324
+ const index = nextIndex++;
325
+ if (index >= testIds.length)
326
+ return;
327
+ const testId = testIds[index];
328
+ const result = await this.execute(testUrl, testId, context, { onEvent, includeTestId: !!onEvent, signal: options.signal });
329
+ results[index] = result;
330
+ if (!result.success) {
331
+ failedCount += 1;
332
+ const failureLimit = options.failAfter ?? (options.stopOnFailure ? 1 : undefined);
333
+ if (failureLimit !== undefined && failedCount >= failureLimit) {
334
+ stop = true;
335
+ return;
336
+ }
337
+ }
338
+ }
339
+ };
340
+ const workers = Array.from({ length: concurrency }, () => runNext());
341
+ await Promise.all(workers);
342
+ const completedResults = results.filter(Boolean);
343
+ const skippedCount = testIds.length - completedResults.length;
344
+ return { results: completedResults, success: failedCount === 0, failedCount, skippedCount, duration: Date.now() - startTime };
345
+ }
346
+ }
347
+ //# sourceMappingURL=executor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executor.js","sourceRoot":"","sources":["../src/executor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Harness script - runs INSIDE the Node.js subprocess (via tsx).
3
+ * This is the bridge between the Runner and User Code.
4
+ *
5
+ * Usage:
6
+ * tsx harness.ts --testUrl=<url> --testId=<id>
7
+ */
8
+ export {};
9
+ //# sourceMappingURL=harness.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"harness.d.ts","sourceRoot":"","sources":["../src/harness.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}