@glubean/runner 0.2.5 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/executor.d.ts +43 -1
- package/dist/executor.d.ts.map +1 -1
- package/dist/executor.js +340 -9
- package/dist/executor.js.map +1 -1
- package/dist/harness.js +141 -5
- package/dist/harness.js.map +1 -1
- package/dist/project-runner.d.ts.map +1 -1
- package/dist/project-runner.js +13 -0
- package/dist/project-runner.js.map +1 -1
- package/dist/run-case.d.ts +2 -4
- package/dist/run-case.d.ts.map +1 -1
- package/dist/run-case.js +32 -54
- package/dist/run-case.js.map +1 -1
- package/package.json +5 -3
package/dist/run-case.js
CHANGED
|
@@ -12,14 +12,13 @@
|
|
|
12
12
|
* - Cookbook examples illustrating attachment-model §5.1 / §8 flows.
|
|
13
13
|
*
|
|
14
14
|
* Implementation strategy: serialize the per-test inputs into the same
|
|
15
|
-
* env vars the harness reads (`GLUBEAN_RUNNER_*`),
|
|
16
|
-
*
|
|
17
|
-
* to their prior values in `finally`, so concurrent callers in the
|
|
18
|
-
* same process don't leak state.
|
|
15
|
+
* env vars the harness reads (`GLUBEAN_RUNNER_*`), but attach them to
|
|
16
|
+
* this run's executor env instead of mutating process-wide state.
|
|
19
17
|
*/
|
|
20
18
|
import { dirname, resolve } from "node:path";
|
|
21
19
|
import { existsSync, readFileSync } from "node:fs";
|
|
22
20
|
import { ProjectRunner } from "./project-runner.js";
|
|
21
|
+
import { TestExecutor } from "./executor.js";
|
|
23
22
|
import { applyEnvTemplating } from "./runner-input-templating.js";
|
|
24
23
|
import { loadProjectEnv } from "./env.js";
|
|
25
24
|
/**
|
|
@@ -125,11 +124,11 @@ export async function runCase(opts) {
|
|
|
125
124
|
}
|
|
126
125
|
const effectiveVars = { ...loadedVars, ...(opts.vars ?? {}) };
|
|
127
126
|
const effectiveSecrets = { ...loadedSecrets, ...(opts.secrets ?? {}) };
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
127
|
+
const runnerEnv = {
|
|
128
|
+
GLUBEAN_RUNNER_EXPLICIT_INPUT_MAP: undefined,
|
|
129
|
+
GLUBEAN_RUNNER_BOOTSTRAP_INPUT_MAP: undefined,
|
|
130
|
+
GLUBEAN_RUNNER_FORCE_STANDALONE_IDS: undefined,
|
|
131
|
+
};
|
|
133
132
|
// §8 templating env — caller override, else built from
|
|
134
133
|
// `{ ...vars, ...secrets, ...process.env }` matching CLI / MCP
|
|
135
134
|
// precedence (process.env wins, secrets win over vars). Substitution
|
|
@@ -142,41 +141,21 @@ export async function runCase(opts) {
|
|
|
142
141
|
};
|
|
143
142
|
if (opts.input !== undefined) {
|
|
144
143
|
const templated = applyEnvTemplating(opts.input, templatingEnv);
|
|
145
|
-
|
|
144
|
+
runnerEnv["GLUBEAN_RUNNER_EXPLICIT_INPUT_MAP"] = JSON.stringify({
|
|
146
145
|
[opts.testId]: templated,
|
|
147
146
|
});
|
|
148
147
|
}
|
|
149
148
|
if (opts.bootstrapInput !== undefined) {
|
|
150
149
|
const templated = applyEnvTemplating(opts.bootstrapInput, templatingEnv);
|
|
151
|
-
|
|
150
|
+
runnerEnv["GLUBEAN_RUNNER_BOOTSTRAP_INPUT_MAP"] = JSON.stringify({
|
|
152
151
|
[opts.testId]: templated,
|
|
153
152
|
});
|
|
154
153
|
}
|
|
155
154
|
if (opts.forceStandalone === true) {
|
|
156
|
-
|
|
155
|
+
runnerEnv["GLUBEAN_RUNNER_FORCE_STANDALONE_IDS"] = JSON.stringify([
|
|
157
156
|
opts.testId,
|
|
158
157
|
]);
|
|
159
158
|
}
|
|
160
|
-
const restoreEnv = () => {
|
|
161
|
-
if (savedExplicit === undefined) {
|
|
162
|
-
delete process.env["GLUBEAN_RUNNER_EXPLICIT_INPUT_MAP"];
|
|
163
|
-
}
|
|
164
|
-
else {
|
|
165
|
-
process.env["GLUBEAN_RUNNER_EXPLICIT_INPUT_MAP"] = savedExplicit;
|
|
166
|
-
}
|
|
167
|
-
if (savedBootstrap === undefined) {
|
|
168
|
-
delete process.env["GLUBEAN_RUNNER_BOOTSTRAP_INPUT_MAP"];
|
|
169
|
-
}
|
|
170
|
-
else {
|
|
171
|
-
process.env["GLUBEAN_RUNNER_BOOTSTRAP_INPUT_MAP"] = savedBootstrap;
|
|
172
|
-
}
|
|
173
|
-
if (savedForce === undefined) {
|
|
174
|
-
delete process.env["GLUBEAN_RUNNER_FORCE_STANDALONE_IDS"];
|
|
175
|
-
}
|
|
176
|
-
else {
|
|
177
|
-
process.env["GLUBEAN_RUNNER_FORCE_STANDALONE_IDS"] = savedForce;
|
|
178
|
-
}
|
|
179
|
-
};
|
|
180
159
|
const test = {
|
|
181
160
|
filePath,
|
|
182
161
|
exportName: opts.exportName ?? "",
|
|
@@ -192,36 +171,35 @@ export async function runCase(opts) {
|
|
|
192
171
|
secrets: effectiveSecrets,
|
|
193
172
|
tests: [test],
|
|
194
173
|
noSession: opts.noSession ?? false,
|
|
174
|
+
executor: TestExecutor.fromSharedConfig(opts.sharedConfig, {
|
|
175
|
+
cwd: rootDir,
|
|
176
|
+
env: runnerEnv,
|
|
177
|
+
}),
|
|
195
178
|
});
|
|
196
179
|
const events = [];
|
|
197
180
|
let success = false;
|
|
198
181
|
let orchestrationError;
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
orchestrationError = `Run failed (${evt.reason})${evt.error ? `: ${evt.error}` : ""}`;
|
|
211
|
-
}
|
|
182
|
+
for await (const evt of runner.run()) {
|
|
183
|
+
events.push(evt);
|
|
184
|
+
if (evt.type === "bootstrap:failed") {
|
|
185
|
+
orchestrationError = `Bootstrap failed: ${evt.error.message}`;
|
|
186
|
+
}
|
|
187
|
+
else if (evt.type === "session:setup:failed") {
|
|
188
|
+
orchestrationError = `Session setup failed${evt.error ? `: ${evt.error}` : ""}`;
|
|
189
|
+
}
|
|
190
|
+
else if (evt.type === "run:failed") {
|
|
191
|
+
if (!orchestrationError) {
|
|
192
|
+
orchestrationError = `Run failed (${evt.reason})${evt.error ? `: ${evt.error}` : ""}`;
|
|
212
193
|
}
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
194
|
+
}
|
|
195
|
+
else if (evt.type === "file:event") {
|
|
196
|
+
// ExecutionEvent's `status` event encodes the final per-test
|
|
197
|
+
// outcome: "completed" = pass, "failed" = fail, "skipped" = neither.
|
|
198
|
+
if (evt.event.type === "status" && evt.event.id === opts.testId) {
|
|
199
|
+
success = evt.event.status === "completed";
|
|
219
200
|
}
|
|
220
201
|
}
|
|
221
202
|
}
|
|
222
|
-
finally {
|
|
223
|
-
restoreEnv();
|
|
224
|
-
}
|
|
225
203
|
return {
|
|
226
204
|
success,
|
|
227
205
|
testId: opts.testId,
|
package/dist/run-case.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run-case.js","sourceRoot":"","sources":["../src/run-case.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"run-case.js","sourceRoot":"","sources":["../src/run-case.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@glubean/runner",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"type": "module",
|
|
5
|
+
"glubeanRunnerProtocol": "1",
|
|
6
|
+
"glubeanRunnerProtocolMinimum": "1",
|
|
5
7
|
"exports": {
|
|
6
8
|
".": {
|
|
7
9
|
"types": "./dist/index.d.ts",
|
|
@@ -20,8 +22,8 @@
|
|
|
20
22
|
"ky": "^1.14.0",
|
|
21
23
|
"p-queue": "^9.1.0",
|
|
22
24
|
"tsx": "^4.19.0",
|
|
23
|
-
"@glubean/sdk": "0.
|
|
24
|
-
"@glubean/scanner": "0.
|
|
25
|
+
"@glubean/sdk": "0.3.0",
|
|
26
|
+
"@glubean/scanner": "0.3.0"
|
|
25
27
|
},
|
|
26
28
|
"devDependencies": {
|
|
27
29
|
"@types/node": "^22.0.0",
|