@midscene/test 1.15.2-beta-20261012100626.0 → 1.15.2
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/es/cli/index.mjs +235 -125
- package/dist/es/cli/index.mjs.map +1 -1
- package/dist/es/index.mjs +72 -102
- package/dist/es/index.mjs.map +1 -1
- package/dist/es/midscene/index.mjs +54 -30
- package/dist/es/midscene/index.mjs.map +1 -1
- package/dist/es/test-cli.mjs +237 -126
- package/dist/es/test-cli.mjs.map +1 -1
- package/dist/lib/cli/index.js +233 -123
- package/dist/lib/cli/index.js.map +1 -1
- package/dist/lib/index.js +70 -106
- package/dist/lib/index.js.map +1 -1
- package/dist/lib/midscene/index.js +53 -29
- package/dist/lib/midscene/index.js.map +1 -1
- package/dist/lib/test-cli.js +236 -125
- package/dist/lib/test-cli.js.map +1 -1
- package/dist/types/cli/index.d.ts +10 -6
- package/dist/types/index.d.ts +1 -85
- package/dist/types/midscene/index.d.ts +3 -1
- package/package.json +13 -13
package/dist/lib/index.js
CHANGED
|
@@ -31,12 +31,11 @@ __webpack_require__.d(__webpack_exports__, {
|
|
|
31
31
|
FatalDeviceError: ()=>test_runner_namespaceObject.FatalDeviceError,
|
|
32
32
|
runWorkflowDocument: ()=>runWorkflowDocument,
|
|
33
33
|
defineNode: ()=>defineNode,
|
|
34
|
-
|
|
34
|
+
z: ()=>v4_namespaceObject.z,
|
|
35
35
|
createProjectRuntime: ()=>test_runner_namespaceObject.createProjectRuntime,
|
|
36
36
|
sanitizeReportValue: ()=>test_runner_namespaceObject.sanitizeReportValue,
|
|
37
37
|
buildTestRunReportDump: ()=>test_runner_namespaceObject.buildTestRunReportDump,
|
|
38
38
|
sanitizeReportError: ()=>test_runner_namespaceObject.sanitizeReportError,
|
|
39
|
-
z: ()=>v4_namespaceObject.z,
|
|
40
39
|
createWorkflowDocumentId: ()=>createWorkflowDocumentId,
|
|
41
40
|
NativeWorkflowFormatError: ()=>NativeWorkflowFormatError,
|
|
42
41
|
NodeDefinitionError: ()=>test_runner_namespaceObject.NodeDefinitionError,
|
|
@@ -58,7 +57,6 @@ __webpack_require__.d(__webpack_exports__, {
|
|
|
58
57
|
ProjectTeardownError: ()=>test_runner_namespaceObject.ProjectTeardownError,
|
|
59
58
|
collectTestRunReportSources: ()=>test_runner_namespaceObject.collectTestRunReportSources,
|
|
60
59
|
normalizeStep: ()=>normalizeStep,
|
|
61
|
-
renderTestResultMarkdown: ()=>renderTestResultMarkdown,
|
|
62
60
|
resolveWorkflowVariables: ()=>resolveWorkflowVariables,
|
|
63
61
|
createCaseId: ()=>createCaseId,
|
|
64
62
|
createDocumentRuntime: ()=>createDocumentRuntime,
|
|
@@ -73,7 +71,6 @@ const runWorkflowDocument = test_runner_namespaceObject.runWorkflowDocument;
|
|
|
73
71
|
const defineNode = test_runner_namespaceObject.defineNode;
|
|
74
72
|
const external_node_fs_namespaceObject = require("node:fs");
|
|
75
73
|
const external_node_path_namespaceObject = require("node:path");
|
|
76
|
-
const external_js_yaml_namespaceObject = require("js-yaml");
|
|
77
74
|
const external_node_crypto_namespaceObject = require("node:crypto");
|
|
78
75
|
const createCaseInvocationId = (projectId, sourcePath, caseIndex, invocationIndex = 0)=>(0, external_node_crypto_namespaceObject.createHash)('sha256').update(JSON.stringify([
|
|
79
76
|
projectId,
|
|
@@ -92,6 +89,70 @@ const createDocumentInvocationId = (projectId, sourcePath, invocationIndex = 0)=
|
|
|
92
89
|
])).digest('hex');
|
|
93
90
|
const normalizeStep = test_runner_namespaceObject.normalizeStep;
|
|
94
91
|
const normalizeSteps = test_runner_namespaceObject.normalizeSteps;
|
|
92
|
+
const external_js_yaml_namespaceObject = require("js-yaml");
|
|
93
|
+
function parseWorkflowSource(source) {
|
|
94
|
+
const stack = [];
|
|
95
|
+
const nodes = [];
|
|
96
|
+
const sensitiveNodes = new Set();
|
|
97
|
+
const sensitiveValues = new Set();
|
|
98
|
+
const redactedPaths = new Set();
|
|
99
|
+
const sourceOffset = 0xfeff === source.charCodeAt(0) ? 1 : 0;
|
|
100
|
+
const parsed = (0, external_js_yaml_namespaceObject.load)(source, {
|
|
101
|
+
schema: external_js_yaml_namespaceObject.JSON_SCHEMA,
|
|
102
|
+
listener (event, state) {
|
|
103
|
+
if ('open' === event) return void stack.push({
|
|
104
|
+
start: state.position + sourceOffset,
|
|
105
|
+
end: 0,
|
|
106
|
+
value: null,
|
|
107
|
+
children: []
|
|
108
|
+
});
|
|
109
|
+
const node = stack.pop();
|
|
110
|
+
node.end = state.position + sourceOffset;
|
|
111
|
+
node.value = state.result;
|
|
112
|
+
stack.at(-1)?.children.push(node);
|
|
113
|
+
nodes.push(node);
|
|
114
|
+
if ('mapping' !== state.kind) return;
|
|
115
|
+
for(let index = 0; index < node.children.length; index += 2){
|
|
116
|
+
const key = node.children[index].value;
|
|
117
|
+
const value = node.children[index + 1];
|
|
118
|
+
if ('string' == typeof key && (0, test_runner_namespaceObject.isReportSecretKey)(key) && value) {
|
|
119
|
+
sensitiveNodes.add(value);
|
|
120
|
+
if (null !== value.value) sensitiveValues.add(value.value);
|
|
121
|
+
redactedPaths.add(`$..[${JSON.stringify(key)}]`);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
});
|
|
126
|
+
const ranges = nodes.filter((node)=>sensitiveNodes.has(node) || sensitiveValues.has(node.value)).sort((left, right)=>left.start - right.start || right.end - left.end);
|
|
127
|
+
let offset = 0;
|
|
128
|
+
let redacted = '';
|
|
129
|
+
for (const range of ranges){
|
|
130
|
+
if (range.start < offset) continue;
|
|
131
|
+
const text = source.slice(range.start, range.end);
|
|
132
|
+
const leading = text.match(/^\s*/)?.[0] ?? '';
|
|
133
|
+
const trailing = text.slice(leading.length).match(/\s*$/)?.[0] ?? '';
|
|
134
|
+
redacted += `${source.slice(offset, range.start)}${leading}"[REDACTED]"${trailing}`;
|
|
135
|
+
offset = range.end;
|
|
136
|
+
}
|
|
137
|
+
redacted += source.slice(offset);
|
|
138
|
+
const value = (0, test_runner_namespaceObject.sanitizeReportText)(redacted, 65536);
|
|
139
|
+
return {
|
|
140
|
+
parsed,
|
|
141
|
+
sourceYaml: {
|
|
142
|
+
value,
|
|
143
|
+
...redactedPaths.size ? {
|
|
144
|
+
redactedPaths: [
|
|
145
|
+
...redactedPaths
|
|
146
|
+
]
|
|
147
|
+
} : {},
|
|
148
|
+
...value !== redacted ? {
|
|
149
|
+
truncatedPaths: [
|
|
150
|
+
'$'
|
|
151
|
+
]
|
|
152
|
+
} : {}
|
|
153
|
+
}
|
|
154
|
+
};
|
|
155
|
+
}
|
|
95
156
|
const interpolationExpression = /\$\{\{([A-Za-z_][A-Za-z0-9_]*)\}\}|\$\{([^{}]+)\}/g;
|
|
96
157
|
const exactEnvExpression = /^\$\{\{([A-Za-z_][A-Za-z0-9_]*)\}\}$/;
|
|
97
158
|
const exactProjectExpression = /^\$\{([^{}]+)\}$/;
|
|
@@ -166,16 +227,15 @@ const rejectUnknownKeys = (value, allowed, label)=>{
|
|
|
166
227
|
const createCaseId = (projectId, sourcePath, caseIndex)=>createCaseInvocationId(projectId, sourcePath, caseIndex);
|
|
167
228
|
const createWorkflowDocumentId = (projectId, sourcePath)=>createDocumentInvocationId(projectId, sourcePath);
|
|
168
229
|
function collectWorkflowDocument(source, options) {
|
|
169
|
-
let
|
|
230
|
+
let snapshot;
|
|
170
231
|
try {
|
|
171
|
-
|
|
172
|
-
schema: external_js_yaml_namespaceObject.JSON_SCHEMA
|
|
173
|
-
});
|
|
232
|
+
snapshot = parseWorkflowSource((0, external_node_fs_namespaceObject.readFileSync)(source.absolutePath, 'utf8'));
|
|
174
233
|
} catch (error) {
|
|
175
234
|
throw new test_runner_namespaceObject.WorkflowParseError(`Failed to parse workflow document "${source.sourcePath}".`, {
|
|
176
235
|
sourcePath: source.sourcePath
|
|
177
236
|
}, error);
|
|
178
237
|
}
|
|
238
|
+
const { parsed, sourceYaml } = snapshot;
|
|
179
239
|
if (!isMapping(parsed)) throw new test_runner_namespaceObject.WorkflowParseError('Workflow document must be a mapping.');
|
|
180
240
|
const format = (0, test_runner_namespaceObject.classifyWorkflowDocumentFormat)(parsed);
|
|
181
241
|
if ('legacy' === format || 'legacy-batch' === format || 'mixed' === format) throw new NativeWorkflowFormatError(format, source.sourcePath);
|
|
@@ -190,6 +250,7 @@ function collectWorkflowDocument(source, options) {
|
|
|
190
250
|
const sourcePath = source.sourcePath.split(external_node_path_namespaceObject.sep).join('/');
|
|
191
251
|
const resolveStepVariables = (step, phase, stepIndex, caseIndex)=>({
|
|
192
252
|
...step,
|
|
253
|
+
templateInput: step.input,
|
|
193
254
|
input: resolveWorkflowVariables(step.input, {
|
|
194
255
|
variables: options.variables,
|
|
195
256
|
env: options.env ?? process.env,
|
|
@@ -275,104 +336,11 @@ function collectWorkflowDocument(source, options) {
|
|
|
275
336
|
documentId: createWorkflowDocumentId(source.projectId, sourcePath),
|
|
276
337
|
projectId: source.projectId,
|
|
277
338
|
sourcePath,
|
|
339
|
+
sourceYaml,
|
|
278
340
|
lifecycle,
|
|
279
341
|
cases
|
|
280
342
|
};
|
|
281
343
|
}
|
|
282
|
-
const promises_namespaceObject = require("node:fs/promises");
|
|
283
|
-
const result_markdown_text = (value)=>value.replaceAll('&', '&').replaceAll('<', '<').replaceAll('>', '>').replaceAll('"', '"').replaceAll('|', '|').replaceAll('[', '[').replaceAll(']', ']').replaceAll('*', '*').replaceAll('_', '_').replaceAll('`', '`').replaceAll('\\', '\').replace(/[\r\n]+/g, ' ');
|
|
284
|
-
const duration = (ms)=>`${(ms / 1000).toFixed(1)}s`;
|
|
285
|
-
const href = (from, target)=>(0, external_node_path_namespaceObject.relative)((0, external_node_path_namespaceObject.dirname)(from), target).split(external_node_path_namespaceObject.sep).map(encodeURIComponent).join('/');
|
|
286
|
-
function renderTestResultMarkdown(dump, options = {}) {
|
|
287
|
-
const { summary } = dump;
|
|
288
|
-
const lines = [
|
|
289
|
-
`## Midscene Test · ${'success' === dump.status ? 'passed' : 'failed'}`,
|
|
290
|
-
'',
|
|
291
|
-
`**Cases:** ${summary.total} total · ${summary.passed} passed · ${summary.failed} failed · ${summary.notRun} not run`,
|
|
292
|
-
'',
|
|
293
|
-
`**Duration:** ${duration(dump.durationMs)} · **Filtered:** ${summary.filtered}`,
|
|
294
|
-
'',
|
|
295
|
-
`**Infrastructure:** ${summary.collectionErrors} collection errors · ${summary.documentFailures} document failures · ${summary.projectFailures} project failures`,
|
|
296
|
-
'',
|
|
297
|
-
...options.reportHref ? [
|
|
298
|
-
`[Open the Midscene Test report](<${options.reportHref}>)`,
|
|
299
|
-
''
|
|
300
|
-
] : []
|
|
301
|
-
];
|
|
302
|
-
const rows = [];
|
|
303
|
-
const errors = [];
|
|
304
|
-
const recordSteps = (label, steps)=>{
|
|
305
|
-
for (const step of steps)if ('failed' === step.status) errors.push(`${label} / ${step.node}: ${step.error?.message ?? 'Step failed'}`);
|
|
306
|
-
};
|
|
307
|
-
for (const project of dump.projects){
|
|
308
|
-
if (project.lifecycle?.setupError) errors.push(`${project.name}: ${project.lifecycle.setupError.message}`);
|
|
309
|
-
for (const error of project.lifecycle?.teardownErrors ?? [])errors.push(`${project.name}: ${error.message}`);
|
|
310
|
-
for (const error of project.collectionErrors)errors.push(`${project.name} / ${error.sourcePath}: ${error.error.message}`);
|
|
311
|
-
for (const document of project.documents){
|
|
312
|
-
recordSteps(`${project.name} / ${document.sourcePath}`, [
|
|
313
|
-
...document.beforeAll,
|
|
314
|
-
...document.afterAll
|
|
315
|
-
]);
|
|
316
|
-
for (const error of document.teardownErrors ?? [])errors.push(`${document.sourcePath}: ${error.message}`);
|
|
317
|
-
for (const failure of document.hostErrors ?? [])errors.push(`${document.sourcePath} / ${failure.phase}: ${failure.error.message}`);
|
|
318
|
-
for (const testCase of document.cases){
|
|
319
|
-
const attempt = testCase.attempts.at(-1);
|
|
320
|
-
const steps = attempt ? [
|
|
321
|
-
...attempt.beforeEach,
|
|
322
|
-
...attempt.steps,
|
|
323
|
-
...attempt.afterEach
|
|
324
|
-
] : [];
|
|
325
|
-
const failedSteps = steps.filter((step)=>'failed' === step.status);
|
|
326
|
-
const step = failedSteps.at(-1) ?? [
|
|
327
|
-
...steps
|
|
328
|
-
].reverse().find((item)=>item.agentDetails?.length) ?? steps.at(-1);
|
|
329
|
-
const route = new URLSearchParams({
|
|
330
|
-
'runner-page': 'case',
|
|
331
|
-
'runner-project': project.projectId,
|
|
332
|
-
'runner-case': testCase.caseId,
|
|
333
|
-
...step ? {
|
|
334
|
-
'runner-step': step.id
|
|
335
|
-
} : {}
|
|
336
|
-
});
|
|
337
|
-
const target = options.reportHref ? `${options.reportHref}#${route}` : void 0;
|
|
338
|
-
const name = target ? `[${result_markdown_text(testCase.name)}](<${target}>)` : result_markdown_text(testCase.name);
|
|
339
|
-
rows.push({
|
|
340
|
-
failed: 'success' !== testCase.status,
|
|
341
|
-
row: `- ${name} — ${testCase.status}`
|
|
342
|
-
});
|
|
343
|
-
}
|
|
344
|
-
}
|
|
345
|
-
}
|
|
346
|
-
for (const diagnostic of dump.diagnostics ?? [])if ('error' === diagnostic.level) errors.push(diagnostic.message);
|
|
347
|
-
if (errors.length) lines.push('### Execution errors', '', ...errors.map((error)=>`- ${result_markdown_text(error)}`), '');
|
|
348
|
-
lines.push('### Cases', '');
|
|
349
|
-
lines.push(...rows.filter((row)=>row.failed).map((row)=>row.row));
|
|
350
|
-
const passed = rows.filter((row)=>!row.failed);
|
|
351
|
-
if (passed.length) lines.push(...passed.map((row)=>row.row));
|
|
352
|
-
if (!rows.length) lines.push('', 'No cases were reported.');
|
|
353
|
-
return `${lines.join('\n')}\n`;
|
|
354
|
-
}
|
|
355
|
-
const emptyIndex = ()=>({
|
|
356
|
-
sources: [],
|
|
357
|
-
metrics: {
|
|
358
|
-
modelCallCount: 0,
|
|
359
|
-
modelTimeMs: 0,
|
|
360
|
-
promptTokens: 0,
|
|
361
|
-
cachedInputTokens: 0,
|
|
362
|
-
completionTokens: 0,
|
|
363
|
-
totalTokens: 0
|
|
364
|
-
}
|
|
365
|
-
});
|
|
366
|
-
async function writeTestResultMarkdown(result, index = emptyIndex()) {
|
|
367
|
-
const output = (0, external_node_path_namespaceObject.join)((0, external_node_path_namespaceObject.dirname)(result.summaryPath), 'result.md');
|
|
368
|
-
const dump = (0, test_runner_namespaceObject.buildTestRunReportDump)(result, index);
|
|
369
|
-
await (0, promises_namespaceObject.writeFile)(output, renderTestResultMarkdown(dump, {
|
|
370
|
-
...result.reportPath ? {
|
|
371
|
-
reportHref: href(output, result.reportPath)
|
|
372
|
-
} : {}
|
|
373
|
-
}));
|
|
374
|
-
return output;
|
|
375
|
-
}
|
|
376
344
|
const v4_namespaceObject = require("zod/v4");
|
|
377
345
|
exports.CaseExecutionError = __webpack_exports__.CaseExecutionError;
|
|
378
346
|
exports.CaseRunner = __webpack_exports__.CaseRunner;
|
|
@@ -405,13 +373,11 @@ exports.isFatalDeviceError = __webpack_exports__.isFatalDeviceError;
|
|
|
405
373
|
exports.normalizeNodeExecutionError = __webpack_exports__.normalizeNodeExecutionError;
|
|
406
374
|
exports.normalizeStep = __webpack_exports__.normalizeStep;
|
|
407
375
|
exports.normalizeSteps = __webpack_exports__.normalizeSteps;
|
|
408
|
-
exports.renderTestResultMarkdown = __webpack_exports__.renderTestResultMarkdown;
|
|
409
376
|
exports.resolveWorkflowVariables = __webpack_exports__.resolveWorkflowVariables;
|
|
410
377
|
exports.runWorkflowDocument = __webpack_exports__.runWorkflowDocument;
|
|
411
378
|
exports.sanitizeReportError = __webpack_exports__.sanitizeReportError;
|
|
412
379
|
exports.sanitizeReportText = __webpack_exports__.sanitizeReportText;
|
|
413
380
|
exports.sanitizeReportValue = __webpack_exports__.sanitizeReportValue;
|
|
414
|
-
exports.writeTestResultMarkdown = __webpack_exports__.writeTestResultMarkdown;
|
|
415
381
|
exports.z = __webpack_exports__.z;
|
|
416
382
|
for(var __rspack_i in __webpack_exports__)if (-1 === [
|
|
417
383
|
"CaseExecutionError",
|
|
@@ -445,13 +411,11 @@ for(var __rspack_i in __webpack_exports__)if (-1 === [
|
|
|
445
411
|
"normalizeNodeExecutionError",
|
|
446
412
|
"normalizeStep",
|
|
447
413
|
"normalizeSteps",
|
|
448
|
-
"renderTestResultMarkdown",
|
|
449
414
|
"resolveWorkflowVariables",
|
|
450
415
|
"runWorkflowDocument",
|
|
451
416
|
"sanitizeReportError",
|
|
452
417
|
"sanitizeReportText",
|
|
453
418
|
"sanitizeReportValue",
|
|
454
|
-
"writeTestResultMarkdown",
|
|
455
419
|
"z"
|
|
456
420
|
].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
|
|
457
421
|
Object.defineProperty(exports, '__esModule', {
|
package/dist/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["webpack/runtime/define_property_getters","webpack/runtime/has_own_property","webpack/runtime/make_namespace_object","../../src/engine/case-runner.ts","../../src/engine/document-runtime.ts","../../src/engine/registry.ts","../../src/engine/run-workflow-document.ts","../../src/node/define-node.ts","../../src/parser/identifiers.ts","../../src/parser/normalize.ts","../../src/parser/variables.ts","../../src/parser/collect.ts","../../src/report/result-markdown.ts"],"sourcesContent":["__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n }\n }\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import {\n CaseRunner as CoreCaseRunner,\n createCaseRunner as coreCreateCaseRunner,\n} from '@midscene/core/internal/test-runner';\nimport type { NodeDefinition } from '../node/types';\nimport type { CaseInput } from '../parser/types';\nimport type { NodeRegistry } from './registry';\nimport type { CaseRunResult, CaseRunnerOptions } from './types';\n\nexport type CaseRunner<TContext = undefined> = Omit<\n CoreCaseRunner<TContext>,\n 'run' | 'register' | 'registry'\n> & {\n readonly registry: NodeRegistry;\n register<TInput, TData>(\n node: NodeDefinition<TInput, TData, TContext>,\n ): CaseRunner<TContext>;\n run(input: CaseInput): Promise<CaseRunResult>;\n};\nexport const CaseRunner: {\n new <TContext = undefined>(\n options?: CaseRunnerOptions<TContext>,\n ): CaseRunner<TContext>;\n} = CoreCaseRunner;\nexport const createCaseRunner: <TContext = undefined>(\n options?: CaseRunnerOptions<TContext>,\n) => CaseRunner<TContext> = coreCreateCaseRunner;\n","import { createDocumentRuntime as coreCreateDocumentRuntime } from '@midscene/core/internal/test-runner';\nimport type { CollectedWorkflowDocument } from '../parser/types';\nimport type {\n CreateDocumentRuntimeOptions,\n WorkflowDocumentRuntime,\n} from './types';\n\nexport const createDocumentRuntime: <TContext = undefined>(\n document: CollectedWorkflowDocument,\n options: CreateDocumentRuntimeOptions<TContext>,\n) => WorkflowDocumentRuntime<TContext> = coreCreateDocumentRuntime;\n","import { NodeRegistry as CoreNodeRegistry } from '@midscene/core/internal/test-runner';\nimport type { NodeDefinition } from '../node/types';\n\nexport type NodeRegistry = Omit<\n CoreNodeRegistry,\n 'get' | 'require' | 'register' | 'definitions'\n> & {\n get(name: string): NodeDefinition<any, any> | undefined;\n require(name: string): NodeDefinition<any, any>;\n register<TInput, TData>(node: NodeDefinition<TInput, TData>): NodeRegistry;\n definitions(): readonly NodeDefinition<any, any, any>[];\n};\nexport const NodeRegistry: {\n new (nodes?: readonly NodeDefinition<any, any>[]): NodeRegistry;\n} = CoreNodeRegistry;\n","import { runWorkflowDocument as coreRunWorkflowDocument } from '@midscene/core/internal/test-runner';\nimport type { CollectedWorkflowDocument } from '../parser/types';\nimport type {\n RunWorkflowDocumentOptions,\n WorkflowDocumentExecutionResult,\n} from './types';\n\nexport const runWorkflowDocument: <TContext = undefined>(\n document: CollectedWorkflowDocument,\n options: RunWorkflowDocumentOptions<TContext>,\n) => Promise<WorkflowDocumentExecutionResult> = coreRunWorkflowDocument;\n","import { defineNode as coreDefineNode } from '@midscene/core/internal/test-runner';\nimport type {\n DefineNodeOptions,\n DefineNodeWithSchemaOptions,\n NodeDefinition,\n NodeDefinitionWithSchema,\n NodeInputSchema,\n} from './types';\n\n// A type-only facade: validation and execution still belong to the shared kernel.\ninterface DefineNativeNode {\n <TSchema extends NodeInputSchema, TData = unknown, TContext = unknown>(\n options: DefineNodeWithSchemaOptions<TSchema, TData, TContext>,\n ): NodeDefinitionWithSchema<TSchema, TData, TContext>;\n <TInput = unknown, TData = unknown, TContext = unknown>(\n options: DefineNodeOptions<TInput, TData, TContext>,\n ): NodeDefinition<TInput, TData, TContext>;\n}\nexport const defineNode: DefineNativeNode = coreDefineNode;\n","import { createHash } from 'node:crypto';\n\n/** Internal invocation identity keeps repeated legacy files distinct. */\nexport const createCaseInvocationId = (\n projectId: string,\n sourcePath: string,\n caseIndex: number,\n invocationIndex = 0,\n): string =>\n createHash('sha256')\n .update(\n JSON.stringify([\n projectId,\n sourcePath,\n caseIndex,\n ...(invocationIndex ? [invocationIndex] : []),\n ]),\n )\n .digest('hex');\n\nexport const createDocumentInvocationId = (\n projectId: string,\n sourcePath: string,\n invocationIndex = 0,\n): string =>\n createHash('sha256')\n .update(\n JSON.stringify([\n projectId,\n sourcePath,\n ...(invocationIndex ? [invocationIndex] : []),\n ]),\n )\n .digest('hex');\n","import {\n type ResolveNodeForNormalization,\n normalizeStep as coreNormalizeStep,\n normalizeSteps as coreNormalizeSteps,\n} from '@midscene/core/internal/test-runner';\nimport type { NormalizedStep } from './types';\nexport type { ResolveNodeForNormalization } from '@midscene/core/internal/test-runner';\n\nexport const normalizeStep: (\n value: unknown,\n index?: number,\n resolveNode?: ResolveNodeForNormalization,\n) => NormalizedStep = coreNormalizeStep;\nexport const normalizeSteps: (\n values: unknown,\n resolveNode?: ResolveNodeForNormalization,\n) => NormalizedStep[] = coreNormalizeSteps;\n","import type { JsonValue } from '../cli/test-project';\nimport { WorkflowParseError } from '../errors';\n\nexport interface VariableResolutionLocation {\n projectName: string;\n sourcePath: string;\n phase: 'beforeAll' | 'beforeEach' | 'steps' | 'afterEach' | 'afterAll';\n stepIndex: number;\n caseIndex?: number;\n}\n\nexport interface ResolveWorkflowVariablesOptions {\n variables?: Readonly<Record<string, JsonValue>>;\n env?: Readonly<NodeJS.ProcessEnv>;\n location: VariableResolutionLocation;\n}\n\nconst interpolationExpression =\n /\\$\\{\\{([A-Za-z_][A-Za-z0-9_]*)\\}\\}|\\$\\{([^{}]+)\\}/g;\nconst exactEnvExpression = /^\\$\\{\\{([A-Za-z_][A-Za-z0-9_]*)\\}\\}$/;\nconst exactProjectExpression = /^\\$\\{([^{}]+)\\}$/;\n\nconst missingVariable = (\n kind: 'environment' | 'project',\n name: string,\n options: ResolveWorkflowVariablesOptions,\n): never => {\n throw new WorkflowParseError(\n `Undefined ${kind} variable \"${name}\" in ${options.location.sourcePath}.`,\n { ...options.location, variable: name, variableKind: kind },\n );\n};\n\nconst projectVariable = (\n name: string,\n options: ResolveWorkflowVariablesOptions,\n): JsonValue => {\n if (!Object.hasOwn(options.variables ?? {}, name)) {\n return missingVariable('project', name, options);\n }\n return options.variables![name];\n};\n\nconst environmentVariable = (\n name: string,\n options: ResolveWorkflowVariablesOptions,\n): string => {\n const value = options.env?.[name];\n if (value === undefined) return missingVariable('environment', name, options);\n return value;\n};\n\nconst interpolationValue = (\n name: string,\n value: JsonValue,\n options: ResolveWorkflowVariablesOptions,\n): string => {\n if (typeof value === 'object' && value !== null) {\n throw new WorkflowParseError(\n `Project variable \"${name}\" must be a primitive when embedded in a string.`,\n {\n ...options.location,\n variable: name,\n variableKind: 'project',\n },\n );\n }\n return String(value);\n};\n\nconst resolveString = (\n value: string,\n options: ResolveWorkflowVariablesOptions,\n): JsonValue => {\n const exactEnv = exactEnvExpression.exec(value);\n if (exactEnv) return environmentVariable(exactEnv[1], options);\n const exactProject = exactProjectExpression.exec(value);\n if (exactProject) return projectVariable(exactProject[1], options);\n\n return value.replace(\n interpolationExpression,\n (_match, environmentName: string | undefined, projectName: string) =>\n environmentName\n ? environmentVariable(environmentName, options)\n : interpolationValue(\n projectName,\n projectVariable(projectName, options),\n options,\n ),\n );\n};\n\nexport const resolveWorkflowVariables = (\n value: unknown,\n options: ResolveWorkflowVariablesOptions,\n): unknown => {\n if (typeof value === 'string') return resolveString(value, options);\n if (Array.isArray(value)) {\n return value.map((child) => resolveWorkflowVariables(child, options));\n }\n if (typeof value === 'object' && value !== null) {\n return Object.fromEntries(\n Object.entries(value).map(([key, child]) => [\n key,\n resolveWorkflowVariables(child, options),\n ]),\n );\n }\n return value;\n};\n","import { readFileSync } from 'node:fs';\nimport { sep } from 'node:path';\nimport { classifyWorkflowDocumentFormat } from '@midscene/core/internal/test-runner';\nimport { JSON_SCHEMA, load as loadYaml } from 'js-yaml';\nimport type { JsonValue } from '../cli/test-project';\nimport { WorkflowParseError } from '../errors';\nimport type { NodeDefinition } from '../node/types';\nimport {\n createCaseInvocationId,\n createDocumentInvocationId,\n} from './identifiers';\nimport { normalizeSteps } from './normalize';\nimport type {\n CollectedCase,\n CollectedWorkflowDocument,\n WorkflowDocumentSource,\n} from './types';\nimport { resolveWorkflowVariables } from './variables';\n\nexport interface CollectWorkflowDocumentOptions {\n resolveNode(name: string): NodeDefinition<any, any> | undefined;\n variables?: Readonly<Record<string, JsonValue>>;\n env?: Readonly<NodeJS.ProcessEnv>;\n}\n\nconst isMapping = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value);\n\nexport class NativeWorkflowFormatError extends WorkflowParseError {\n readonly actualFormat: 'legacy' | 'legacy-batch' | 'mixed';\n\n constructor(\n actualFormat: 'legacy' | 'legacy-batch' | 'mixed',\n sourcePath: string,\n ) {\n super(\n actualFormat === 'legacy'\n ? `Legacy tasks/flow YAML is not supported by midscene-test: ${sourcePath}. Run it with \\`midscene ${sourcePath}\\`, or migrate the file to cases/steps.`\n : actualFormat === 'legacy-batch'\n ? `Legacy YAML batch configuration is not a midscene-test workflow document: ${sourcePath}. Run it with \\`midscene --config ${sourcePath}\\`, or migrate it to a native project config.`\n : `A workflow file cannot mix legacy tasks/flow with native cases/steps or lifecycle hooks: ${sourcePath}. Keep the formats in separate files and run each file with its matching command.`,\n { sourcePath, actualFormat, expectedFormat: 'native' },\n );\n this.actualFormat = actualFormat;\n }\n}\n\nconst rejectUnknownKeys = (\n value: Record<string, unknown>,\n allowed: readonly string[],\n label: string,\n) => {\n const allowedSet = new Set(allowed);\n const unknown = Object.keys(value).filter((key) => !allowedSet.has(key));\n if (unknown.length) {\n throw new WorkflowParseError(\n `${label} has unsupported field \"${unknown[0]}\".`,\n { field: unknown[0] },\n );\n }\n};\n\nexport const createCaseId = (\n projectId: string,\n sourcePath: string,\n caseIndex: number,\n): string => createCaseInvocationId(projectId, sourcePath, caseIndex);\n\nexport const createWorkflowDocumentId = (\n projectId: string,\n sourcePath: string,\n): string => createDocumentInvocationId(projectId, sourcePath);\n\nexport function collectWorkflowDocument(\n source: WorkflowDocumentSource,\n options: CollectWorkflowDocumentOptions,\n): CollectedWorkflowDocument {\n let parsed: unknown;\n try {\n parsed = loadYaml(readFileSync(source.absolutePath, 'utf8'), {\n schema: JSON_SCHEMA,\n });\n } catch (error) {\n throw new WorkflowParseError(\n `Failed to parse workflow document \"${source.sourcePath}\".`,\n { sourcePath: source.sourcePath },\n error,\n );\n }\n\n if (!isMapping(parsed)) {\n throw new WorkflowParseError('Workflow document must be a mapping.');\n }\n const format = classifyWorkflowDocumentFormat(parsed);\n if (format === 'legacy' || format === 'legacy-batch' || format === 'mixed') {\n throw new NativeWorkflowFormatError(format, source.sourcePath);\n }\n rejectUnknownKeys(\n parsed,\n ['beforeAll', 'beforeEach', 'cases', 'afterEach', 'afterAll'],\n 'Workflow document',\n );\n if (!Array.isArray(parsed.cases) || parsed.cases.length === 0) {\n throw new WorkflowParseError(\n 'Workflow document must contain a non-empty cases array.',\n );\n }\n\n const sourcePath = source.sourcePath.split(sep).join('/');\n const resolveStepVariables = (\n step: ReturnType<typeof normalizeSteps>[number],\n phase: 'beforeAll' | 'beforeEach' | 'steps' | 'afterEach' | 'afterAll',\n stepIndex: number,\n caseIndex?: number,\n ) => ({\n ...step,\n input: resolveWorkflowVariables(step.input, {\n variables: options.variables,\n env: options.env ?? process.env,\n location: {\n projectName: source.projectName ?? source.projectId,\n sourcePath,\n phase,\n stepIndex,\n ...(caseIndex === undefined ? {} : { caseIndex }),\n },\n }) as typeof step.input,\n });\n const normalizeLifecycle = (\n phase: 'beforeAll' | 'beforeEach' | 'afterEach' | 'afterAll',\n ) => {\n const value = parsed[phase];\n if (value === undefined) return [];\n if (!Array.isArray(value)) {\n throw new WorkflowParseError(\n `Workflow document ${phase} must be an array.`,\n { phase },\n );\n }\n return normalizeSteps(value, options.resolveNode).map(\n (normalized, stepIndex) => {\n const resolved = options.resolveNode(normalized.node);\n if (!resolved) {\n throw new WorkflowParseError(\n `Workflow document ${phase} step ${stepIndex + 1} references unknown node \"${normalized.node}\".`,\n { phase, stepIndex, node: normalized.node },\n );\n }\n return resolveStepVariables(normalized, phase, stepIndex);\n },\n );\n };\n const lifecycle = {\n beforeAll: normalizeLifecycle('beforeAll'),\n beforeEach: normalizeLifecycle('beforeEach'),\n afterEach: normalizeLifecycle('afterEach'),\n afterAll: normalizeLifecycle('afterAll'),\n };\n const ids = new Set<string>();\n const cases: CollectedCase[] = parsed.cases.map((definition, caseIndex) => {\n if (!isMapping(definition)) {\n throw new WorkflowParseError(`Case ${caseIndex + 1} must be a mapping.`, {\n caseIndex,\n });\n }\n rejectUnknownKeys(\n definition,\n ['name', 'tags', 'steps'],\n `Case ${caseIndex + 1}`,\n );\n if (\n typeof definition.name !== 'string' ||\n definition.name.trim().length === 0\n ) {\n throw new WorkflowParseError(\n `Case ${caseIndex + 1} name must be a non-empty string.`,\n { caseIndex },\n );\n }\n if (!Array.isArray(definition.steps) || definition.steps.length === 0) {\n throw new WorkflowParseError(\n `Case ${caseIndex + 1} steps must be a non-empty array.`,\n { caseIndex },\n );\n }\n const tags = definition.tags ?? [];\n if (\n !Array.isArray(tags) ||\n tags.some((tag) => typeof tag !== 'string' || tag.trim().length === 0)\n ) {\n throw new WorkflowParseError(\n `Case ${caseIndex + 1} tags must be an array of non-empty strings.`,\n { caseIndex },\n );\n }\n\n const steps = normalizeSteps(definition.steps, options.resolveNode).map(\n (normalized, stepIndex) => {\n if (!options.resolveNode(normalized.node)) {\n throw new WorkflowParseError(\n `Case ${caseIndex + 1} step ${stepIndex + 1} references unknown node \"${normalized.node}\".`,\n { caseIndex, stepIndex, node: normalized.node },\n );\n }\n return resolveStepVariables(normalized, 'steps', stepIndex, caseIndex);\n },\n );\n const caseId = createCaseId(source.projectId, sourcePath, caseIndex);\n if (ids.has(caseId)) {\n throw new WorkflowParseError(`Case id collision: ${caseId}.`, {\n caseId,\n });\n }\n ids.add(caseId);\n\n return {\n caseId,\n projectId: source.projectId,\n sourcePath,\n caseIndex,\n definition: {\n name: definition.name,\n tags: tags as string[],\n steps,\n },\n };\n });\n\n return {\n documentId: createWorkflowDocumentId(source.projectId, sourcePath),\n projectId: source.projectId,\n sourcePath,\n lifecycle,\n cases,\n } satisfies CollectedWorkflowDocument;\n}\n","import { writeFile } from 'node:fs/promises';\nimport { dirname, join, relative, sep } from 'node:path';\nimport type {\n TestRunReportDump,\n TestRunReportSourceIndex,\n TestRunReportStep,\n} from '@midscene/core';\nimport type { TestProjectRunResult } from '../cli/types';\nimport { buildTestRunReportDump } from './test-run-report';\n\nconst text = (value: string): string =>\n value\n .replaceAll('&', '&')\n .replaceAll('<', '<')\n .replaceAll('>', '>')\n .replaceAll('\"', '"')\n .replaceAll('|', '|')\n .replaceAll('[', '[')\n .replaceAll(']', ']')\n .replaceAll('*', '*')\n .replaceAll('_', '_')\n .replaceAll('`', '`')\n .replaceAll('\\\\', '\')\n .replace(/[\\r\\n]+/g, ' ');\n\nconst duration = (ms: number): string => `${(ms / 1000).toFixed(1)}s`;\nconst href = (from: string, target: string): string =>\n relative(dirname(from), target).split(sep).map(encodeURIComponent).join('/');\n\nexport interface TestResultMarkdownOptions {\n /** Relative or hosted URL of the HTML report. */\n reportHref?: string;\n}\n\n/** Render the same sanitized execution facts used by the HTML report. */\nexport function renderTestResultMarkdown(\n dump: TestRunReportDump,\n options: TestResultMarkdownOptions = {},\n): string {\n const { summary } = dump;\n const lines = [\n `## Midscene Test · ${dump.status === 'success' ? 'passed' : 'failed'}`,\n '',\n `**Cases:** ${summary.total} total · ${summary.passed} passed · ${summary.failed} failed · ${summary.notRun} not run`,\n '',\n `**Duration:** ${duration(dump.durationMs)} · **Filtered:** ${summary.filtered}`,\n '',\n `**Infrastructure:** ${summary.collectionErrors} collection errors · ${summary.documentFailures} document failures · ${summary.projectFailures} project failures`,\n '',\n ...(options.reportHref\n ? [`[Open the Midscene Test report](<${options.reportHref}>)`, '']\n : []),\n ];\n const rows: { failed: boolean; row: string }[] = [];\n const errors: string[] = [];\n const recordSteps = (label: string, steps: readonly TestRunReportStep[]) => {\n for (const step of steps) {\n if (step.status === 'failed')\n errors.push(\n `${label} / ${step.node}: ${step.error?.message ?? 'Step failed'}`,\n );\n }\n };\n for (const project of dump.projects) {\n if (project.lifecycle?.setupError)\n errors.push(`${project.name}: ${project.lifecycle.setupError.message}`);\n for (const error of project.lifecycle?.teardownErrors ?? [])\n errors.push(`${project.name}: ${error.message}`);\n for (const error of project.collectionErrors)\n errors.push(\n `${project.name} / ${error.sourcePath}: ${error.error.message}`,\n );\n for (const document of project.documents) {\n recordSteps(`${project.name} / ${document.sourcePath}`, [\n ...document.beforeAll,\n ...document.afterAll,\n ]);\n for (const error of document.teardownErrors ?? [])\n errors.push(`${document.sourcePath}: ${error.message}`);\n for (const failure of document.hostErrors ?? [])\n errors.push(\n `${document.sourcePath} / ${failure.phase}: ${failure.error.message}`,\n );\n for (const testCase of document.cases) {\n const attempt = testCase.attempts.at(-1);\n const steps = attempt\n ? [...attempt.beforeEach, ...attempt.steps, ...attempt.afterEach]\n : [];\n const failedSteps = steps.filter((step) => step.status === 'failed');\n const step =\n failedSteps.at(-1) ??\n [...steps].reverse().find((item) => item.agentDetails?.length) ??\n steps.at(-1);\n const route = new URLSearchParams({\n 'runner-page': 'case',\n 'runner-project': project.projectId,\n 'runner-case': testCase.caseId,\n ...(step ? { 'runner-step': step.id } : {}),\n });\n const target = options.reportHref\n ? `${options.reportHref}#${route}`\n : undefined;\n const name = target\n ? `[${text(testCase.name)}](<${target}>)`\n : text(testCase.name);\n rows.push({\n failed: testCase.status !== 'success',\n row: `- ${name} — ${testCase.status}`,\n });\n }\n }\n }\n for (const diagnostic of dump.diagnostics ?? []) {\n if (diagnostic.level === 'error') errors.push(diagnostic.message);\n }\n if (errors.length)\n lines.push(\n '### Execution errors',\n '',\n ...errors.map((error) => `- ${text(error)}`),\n '',\n );\n lines.push('### Cases', '');\n lines.push(...rows.filter((row) => row.failed).map((row) => row.row));\n const passed = rows.filter((row) => !row.failed);\n if (passed.length) lines.push(...passed.map((row) => row.row));\n if (!rows.length) lines.push('', 'No cases were reported.');\n return `${lines.join('\\n')}\\n`;\n}\n\nconst emptyIndex = (): TestRunReportSourceIndex => ({\n sources: [],\n metrics: {\n modelCallCount: 0,\n modelTimeMs: 0,\n promptTokens: 0,\n cachedInputTokens: 0,\n completionTokens: 0,\n totalTokens: 0,\n },\n});\n\n/** Write a per-run Markdown artifact even when HTML publication fails or is disabled. */\nexport async function writeTestResultMarkdown(\n result: TestProjectRunResult,\n index: TestRunReportSourceIndex = emptyIndex(),\n): Promise<string> {\n const output = join(dirname(result.summaryPath), 'result.md');\n const dump = buildTestRunReportDump(result, index);\n await writeFile(\n output,\n renderTestResultMarkdown(dump, {\n ...(result.reportPath\n ? { reportHref: href(output, result.reportPath) }\n : {}),\n }),\n );\n return output;\n}\n"],"names":["__webpack_require__","definition","key","Object","obj","prop","Symbol","CaseRunner","CoreCaseRunner","createCaseRunner","coreCreateCaseRunner","createDocumentRuntime","coreCreateDocumentRuntime","NodeRegistry","CoreNodeRegistry","runWorkflowDocument","coreRunWorkflowDocument","defineNode","coreDefineNode","createCaseInvocationId","projectId","sourcePath","caseIndex","invocationIndex","createHash","JSON","createDocumentInvocationId","normalizeStep","coreNormalizeStep","normalizeSteps","coreNormalizeSteps","interpolationExpression","exactEnvExpression","exactProjectExpression","missingVariable","kind","name","options","WorkflowParseError","projectVariable","environmentVariable","value","undefined","interpolationValue","String","resolveString","exactEnv","exactProject","_match","environmentName","projectName","resolveWorkflowVariables","Array","child","isMapping","NativeWorkflowFormatError","actualFormat","rejectUnknownKeys","allowed","label","allowedSet","Set","unknown","createCaseId","createWorkflowDocumentId","collectWorkflowDocument","source","parsed","loadYaml","readFileSync","JSON_SCHEMA","error","format","classifyWorkflowDocumentFormat","sep","resolveStepVariables","step","phase","stepIndex","process","normalizeLifecycle","normalized","resolved","lifecycle","ids","cases","tags","tag","steps","caseId","text","duration","ms","href","from","target","relative","dirname","encodeURIComponent","renderTestResultMarkdown","dump","summary","lines","rows","errors","recordSteps","project","document","failure","testCase","attempt","failedSteps","item","route","URLSearchParams","diagnostic","row","passed","emptyIndex","writeTestResultMarkdown","result","index","output","join","buildTestRunReportDump","writeFile"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["webpack/runtime/define_property_getters","webpack/runtime/has_own_property","webpack/runtime/make_namespace_object","../../src/engine/case-runner.ts","../../src/engine/document-runtime.ts","../../src/engine/registry.ts","../../src/engine/run-workflow-document.ts","../../src/node/define-node.ts","../../src/parser/identifiers.ts","../../src/parser/normalize.ts","../../src/parser/source.ts","../../src/parser/variables.ts","../../src/parser/collect.ts"],"sourcesContent":["__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n }\n }\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import {\n CaseRunner as CoreCaseRunner,\n createCaseRunner as coreCreateCaseRunner,\n} from '@midscene/core/internal/test-runner';\nimport type { NodeDefinition } from '../node/types';\nimport type { CaseInput } from '../parser/types';\nimport type { NodeRegistry } from './registry';\nimport type { CaseRunResult, CaseRunnerOptions } from './types';\n\nexport type CaseRunner<TContext = undefined> = Omit<\n CoreCaseRunner<TContext>,\n 'run' | 'register' | 'registry'\n> & {\n readonly registry: NodeRegistry;\n register<TInput, TData>(\n node: NodeDefinition<TInput, TData, TContext>,\n ): CaseRunner<TContext>;\n run(input: CaseInput): Promise<CaseRunResult>;\n};\nexport const CaseRunner: {\n new <TContext = undefined>(\n options?: CaseRunnerOptions<TContext>,\n ): CaseRunner<TContext>;\n} = CoreCaseRunner;\nexport const createCaseRunner: <TContext = undefined>(\n options?: CaseRunnerOptions<TContext>,\n) => CaseRunner<TContext> = coreCreateCaseRunner;\n","import { createDocumentRuntime as coreCreateDocumentRuntime } from '@midscene/core/internal/test-runner';\nimport type { CollectedWorkflowDocument } from '../parser/types';\nimport type {\n CreateDocumentRuntimeOptions,\n WorkflowDocumentRuntime,\n} from './types';\n\nexport const createDocumentRuntime: <TContext = undefined>(\n document: CollectedWorkflowDocument,\n options: CreateDocumentRuntimeOptions<TContext>,\n) => WorkflowDocumentRuntime<TContext> = coreCreateDocumentRuntime;\n","import { NodeRegistry as CoreNodeRegistry } from '@midscene/core/internal/test-runner';\nimport type { NodeDefinition } from '../node/types';\n\nexport type NodeRegistry = Omit<\n CoreNodeRegistry,\n 'get' | 'require' | 'register' | 'definitions'\n> & {\n get(name: string): NodeDefinition<any, any> | undefined;\n require(name: string): NodeDefinition<any, any>;\n register<TInput, TData>(node: NodeDefinition<TInput, TData>): NodeRegistry;\n definitions(): readonly NodeDefinition<any, any, any>[];\n};\nexport const NodeRegistry: {\n new (nodes?: readonly NodeDefinition<any, any>[]): NodeRegistry;\n} = CoreNodeRegistry;\n","import { runWorkflowDocument as coreRunWorkflowDocument } from '@midscene/core/internal/test-runner';\nimport type { CollectedWorkflowDocument } from '../parser/types';\nimport type {\n RunWorkflowDocumentOptions,\n WorkflowDocumentExecutionResult,\n} from './types';\n\nexport const runWorkflowDocument: <TContext = undefined>(\n document: CollectedWorkflowDocument,\n options: RunWorkflowDocumentOptions<TContext>,\n) => Promise<WorkflowDocumentExecutionResult> = coreRunWorkflowDocument;\n","import { defineNode as coreDefineNode } from '@midscene/core/internal/test-runner';\nimport type {\n DefineNodeOptions,\n DefineNodeWithSchemaOptions,\n NodeDefinition,\n NodeDefinitionWithSchema,\n NodeInputSchema,\n} from './types';\n\n// A type-only facade: validation and execution still belong to the shared kernel.\ninterface DefineNativeNode {\n <TSchema extends NodeInputSchema, TData = unknown, TContext = unknown>(\n options: DefineNodeWithSchemaOptions<TSchema, TData, TContext>,\n ): NodeDefinitionWithSchema<TSchema, TData, TContext>;\n <TInput = unknown, TData = unknown, TContext = unknown>(\n options: DefineNodeOptions<TInput, TData, TContext>,\n ): NodeDefinition<TInput, TData, TContext>;\n}\nexport const defineNode: DefineNativeNode = coreDefineNode;\n","import { createHash } from 'node:crypto';\n\n/** Internal invocation identity keeps repeated legacy files distinct. */\nexport const createCaseInvocationId = (\n projectId: string,\n sourcePath: string,\n caseIndex: number,\n invocationIndex = 0,\n): string =>\n createHash('sha256')\n .update(\n JSON.stringify([\n projectId,\n sourcePath,\n caseIndex,\n ...(invocationIndex ? [invocationIndex] : []),\n ]),\n )\n .digest('hex');\n\nexport const createDocumentInvocationId = (\n projectId: string,\n sourcePath: string,\n invocationIndex = 0,\n): string =>\n createHash('sha256')\n .update(\n JSON.stringify([\n projectId,\n sourcePath,\n ...(invocationIndex ? [invocationIndex] : []),\n ]),\n )\n .digest('hex');\n","import {\n type ResolveNodeForNormalization,\n normalizeStep as coreNormalizeStep,\n normalizeSteps as coreNormalizeSteps,\n} from '@midscene/core/internal/test-runner';\nimport type { NormalizedStep } from './types';\nexport type { ResolveNodeForNormalization } from '@midscene/core/internal/test-runner';\n\nexport const normalizeStep: (\n value: unknown,\n index?: number,\n resolveNode?: ResolveNodeForNormalization,\n) => NormalizedStep = coreNormalizeStep;\nexport const normalizeSteps: (\n values: unknown,\n resolveNode?: ResolveNodeForNormalization,\n) => NormalizedStep[] = coreNormalizeSteps;\n","import type { TestRunReportValue } from '@midscene/core';\nimport {\n isReportSecretKey,\n sanitizeReportText,\n} from '@midscene/core/internal/test-runner';\nimport { JSON_SCHEMA, load } from 'js-yaml';\n\ninterface SourceNode {\n start: number;\n end: number;\n value: unknown;\n children: SourceNode[];\n}\n\n/** Keep author formatting while redacting values by parsed YAML keys, including aliases. */\nexport function parseWorkflowSource(source: string): {\n parsed: unknown;\n sourceYaml: TestRunReportValue;\n} {\n const stack: SourceNode[] = [];\n const nodes: SourceNode[] = [];\n const sensitiveNodes = new Set<SourceNode>();\n const sensitiveValues = new Set<unknown>();\n const redactedPaths = new Set<string>();\n // js-yaml removes the BOM before reporting source positions.\n const sourceOffset = source.charCodeAt(0) === 0xfeff ? 1 : 0;\n const parsed = load(source, {\n schema: JSON_SCHEMA,\n listener(event, state) {\n if (event === 'open') {\n stack.push({\n start: state.position + sourceOffset,\n end: 0,\n value: null,\n children: [],\n });\n return;\n }\n const node = stack.pop()!;\n node.end = state.position + sourceOffset;\n node.value = state.result;\n stack.at(-1)?.children.push(node);\n nodes.push(node);\n if (state.kind !== 'mapping') return;\n for (let index = 0; index < node.children.length; index += 2) {\n const key = node.children[index].value;\n const value = node.children[index + 1];\n if (typeof key !== 'string' || !isReportSecretKey(key) || !value)\n continue;\n sensitiveNodes.add(value);\n if (value.value !== null) sensitiveValues.add(value.value);\n redactedPaths.add(`$..[${JSON.stringify(key)}]`);\n }\n },\n });\n // Redact the definition as well when a secret value refers to a YAML anchor.\n const ranges = nodes\n .filter(\n (node) => sensitiveNodes.has(node) || sensitiveValues.has(node.value),\n )\n .sort((left, right) => left.start - right.start || right.end - left.end);\n let offset = 0;\n let redacted = '';\n for (const range of ranges) {\n if (range.start < offset) continue;\n const text = source.slice(range.start, range.end);\n const leading = text.match(/^\\s*/)?.[0] ?? '';\n const trailing = text.slice(leading.length).match(/\\s*$/)?.[0] ?? '';\n redacted += `${source.slice(offset, range.start)}${leading}\"[REDACTED]\"${trailing}`;\n offset = range.end;\n }\n redacted += source.slice(offset);\n const value = sanitizeReportText(redacted, 64 * 1024);\n return {\n parsed,\n sourceYaml: {\n value,\n ...(redactedPaths.size ? { redactedPaths: [...redactedPaths] } : {}),\n ...(value !== redacted ? { truncatedPaths: ['$'] } : {}),\n },\n };\n}\n","import type { JsonValue } from '../cli/test-project';\nimport { WorkflowParseError } from '../errors';\n\nexport interface VariableResolutionLocation {\n projectName: string;\n sourcePath: string;\n phase: 'beforeAll' | 'beforeEach' | 'steps' | 'afterEach' | 'afterAll';\n stepIndex: number;\n caseIndex?: number;\n}\n\nexport interface ResolveWorkflowVariablesOptions {\n variables?: Readonly<Record<string, JsonValue>>;\n env?: Readonly<NodeJS.ProcessEnv>;\n location: VariableResolutionLocation;\n}\n\nconst interpolationExpression =\n /\\$\\{\\{([A-Za-z_][A-Za-z0-9_]*)\\}\\}|\\$\\{([^{}]+)\\}/g;\nconst exactEnvExpression = /^\\$\\{\\{([A-Za-z_][A-Za-z0-9_]*)\\}\\}$/;\nconst exactProjectExpression = /^\\$\\{([^{}]+)\\}$/;\n\nconst missingVariable = (\n kind: 'environment' | 'project',\n name: string,\n options: ResolveWorkflowVariablesOptions,\n): never => {\n throw new WorkflowParseError(\n `Undefined ${kind} variable \"${name}\" in ${options.location.sourcePath}.`,\n { ...options.location, variable: name, variableKind: kind },\n );\n};\n\nconst projectVariable = (\n name: string,\n options: ResolveWorkflowVariablesOptions,\n): JsonValue => {\n if (!Object.hasOwn(options.variables ?? {}, name)) {\n return missingVariable('project', name, options);\n }\n return options.variables![name];\n};\n\nconst environmentVariable = (\n name: string,\n options: ResolveWorkflowVariablesOptions,\n): string => {\n const value = options.env?.[name];\n if (value === undefined) return missingVariable('environment', name, options);\n return value;\n};\n\nconst interpolationValue = (\n name: string,\n value: JsonValue,\n options: ResolveWorkflowVariablesOptions,\n): string => {\n if (typeof value === 'object' && value !== null) {\n throw new WorkflowParseError(\n `Project variable \"${name}\" must be a primitive when embedded in a string.`,\n {\n ...options.location,\n variable: name,\n variableKind: 'project',\n },\n );\n }\n return String(value);\n};\n\nconst resolveString = (\n value: string,\n options: ResolveWorkflowVariablesOptions,\n): JsonValue => {\n const exactEnv = exactEnvExpression.exec(value);\n if (exactEnv) return environmentVariable(exactEnv[1], options);\n const exactProject = exactProjectExpression.exec(value);\n if (exactProject) return projectVariable(exactProject[1], options);\n\n return value.replace(\n interpolationExpression,\n (_match, environmentName: string | undefined, projectName: string) =>\n environmentName\n ? environmentVariable(environmentName, options)\n : interpolationValue(\n projectName,\n projectVariable(projectName, options),\n options,\n ),\n );\n};\n\nexport const resolveWorkflowVariables = (\n value: unknown,\n options: ResolveWorkflowVariablesOptions,\n): unknown => {\n if (typeof value === 'string') return resolveString(value, options);\n if (Array.isArray(value)) {\n return value.map((child) => resolveWorkflowVariables(child, options));\n }\n if (typeof value === 'object' && value !== null) {\n return Object.fromEntries(\n Object.entries(value).map(([key, child]) => [\n key,\n resolveWorkflowVariables(child, options),\n ]),\n );\n }\n return value;\n};\n","import { readFileSync } from 'node:fs';\nimport { sep } from 'node:path';\nimport { classifyWorkflowDocumentFormat } from '@midscene/core/internal/test-runner';\nimport type { JsonValue } from '../cli/test-project';\nimport { WorkflowParseError } from '../errors';\nimport type { NodeDefinition } from '../node/types';\nimport {\n createCaseInvocationId,\n createDocumentInvocationId,\n} from './identifiers';\nimport { normalizeSteps } from './normalize';\nimport { parseWorkflowSource } from './source';\nimport type {\n CollectedCase,\n CollectedWorkflowDocument,\n WorkflowDocumentSource,\n} from './types';\nimport { resolveWorkflowVariables } from './variables';\n\nexport interface CollectWorkflowDocumentOptions {\n resolveNode(name: string): NodeDefinition<any, any> | undefined;\n variables?: Readonly<Record<string, JsonValue>>;\n env?: Readonly<NodeJS.ProcessEnv>;\n}\n\nconst isMapping = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value);\n\nexport class NativeWorkflowFormatError extends WorkflowParseError {\n readonly actualFormat: 'legacy' | 'legacy-batch' | 'mixed';\n\n constructor(\n actualFormat: 'legacy' | 'legacy-batch' | 'mixed',\n sourcePath: string,\n ) {\n super(\n actualFormat === 'legacy'\n ? `Legacy tasks/flow YAML is not supported by midscene-test: ${sourcePath}. Run it with \\`midscene ${sourcePath}\\`, or migrate the file to cases/steps.`\n : actualFormat === 'legacy-batch'\n ? `Legacy YAML batch configuration is not a midscene-test workflow document: ${sourcePath}. Run it with \\`midscene --config ${sourcePath}\\`, or migrate it to a native project config.`\n : `A workflow file cannot mix legacy tasks/flow with native cases/steps or lifecycle hooks: ${sourcePath}. Keep the formats in separate files and run each file with its matching command.`,\n { sourcePath, actualFormat, expectedFormat: 'native' },\n );\n this.actualFormat = actualFormat;\n }\n}\n\nconst rejectUnknownKeys = (\n value: Record<string, unknown>,\n allowed: readonly string[],\n label: string,\n) => {\n const allowedSet = new Set(allowed);\n const unknown = Object.keys(value).filter((key) => !allowedSet.has(key));\n if (unknown.length) {\n throw new WorkflowParseError(\n `${label} has unsupported field \"${unknown[0]}\".`,\n { field: unknown[0] },\n );\n }\n};\n\nexport const createCaseId = (\n projectId: string,\n sourcePath: string,\n caseIndex: number,\n): string => createCaseInvocationId(projectId, sourcePath, caseIndex);\n\nexport const createWorkflowDocumentId = (\n projectId: string,\n sourcePath: string,\n): string => createDocumentInvocationId(projectId, sourcePath);\n\nexport function collectWorkflowDocument(\n source: WorkflowDocumentSource,\n options: CollectWorkflowDocumentOptions,\n): CollectedWorkflowDocument {\n let snapshot: ReturnType<typeof parseWorkflowSource>;\n try {\n snapshot = parseWorkflowSource(readFileSync(source.absolutePath, 'utf8'));\n } catch (error) {\n throw new WorkflowParseError(\n `Failed to parse workflow document \"${source.sourcePath}\".`,\n { sourcePath: source.sourcePath },\n error,\n );\n }\n const { parsed, sourceYaml } = snapshot;\n\n if (!isMapping(parsed)) {\n throw new WorkflowParseError('Workflow document must be a mapping.');\n }\n const format = classifyWorkflowDocumentFormat(parsed);\n if (format === 'legacy' || format === 'legacy-batch' || format === 'mixed') {\n throw new NativeWorkflowFormatError(format, source.sourcePath);\n }\n rejectUnknownKeys(\n parsed,\n ['beforeAll', 'beforeEach', 'cases', 'afterEach', 'afterAll'],\n 'Workflow document',\n );\n if (!Array.isArray(parsed.cases) || parsed.cases.length === 0) {\n throw new WorkflowParseError(\n 'Workflow document must contain a non-empty cases array.',\n );\n }\n\n const sourcePath = source.sourcePath.split(sep).join('/');\n const resolveStepVariables = (\n step: ReturnType<typeof normalizeSteps>[number],\n phase: 'beforeAll' | 'beforeEach' | 'steps' | 'afterEach' | 'afterAll',\n stepIndex: number,\n caseIndex?: number,\n ) => ({\n ...step,\n templateInput: step.input,\n input: resolveWorkflowVariables(step.input, {\n variables: options.variables,\n env: options.env ?? process.env,\n location: {\n projectName: source.projectName ?? source.projectId,\n sourcePath,\n phase,\n stepIndex,\n ...(caseIndex === undefined ? {} : { caseIndex }),\n },\n }) as typeof step.input,\n });\n const normalizeLifecycle = (\n phase: 'beforeAll' | 'beforeEach' | 'afterEach' | 'afterAll',\n ) => {\n const value = parsed[phase];\n if (value === undefined) return [];\n if (!Array.isArray(value)) {\n throw new WorkflowParseError(\n `Workflow document ${phase} must be an array.`,\n { phase },\n );\n }\n return normalizeSteps(value, options.resolveNode).map(\n (normalized, stepIndex) => {\n const resolved = options.resolveNode(normalized.node);\n if (!resolved) {\n throw new WorkflowParseError(\n `Workflow document ${phase} step ${stepIndex + 1} references unknown node \"${normalized.node}\".`,\n { phase, stepIndex, node: normalized.node },\n );\n }\n return resolveStepVariables(normalized, phase, stepIndex);\n },\n );\n };\n const lifecycle = {\n beforeAll: normalizeLifecycle('beforeAll'),\n beforeEach: normalizeLifecycle('beforeEach'),\n afterEach: normalizeLifecycle('afterEach'),\n afterAll: normalizeLifecycle('afterAll'),\n };\n const ids = new Set<string>();\n const cases: CollectedCase[] = parsed.cases.map((definition, caseIndex) => {\n if (!isMapping(definition)) {\n throw new WorkflowParseError(`Case ${caseIndex + 1} must be a mapping.`, {\n caseIndex,\n });\n }\n rejectUnknownKeys(\n definition,\n ['name', 'tags', 'steps'],\n `Case ${caseIndex + 1}`,\n );\n if (\n typeof definition.name !== 'string' ||\n definition.name.trim().length === 0\n ) {\n throw new WorkflowParseError(\n `Case ${caseIndex + 1} name must be a non-empty string.`,\n { caseIndex },\n );\n }\n if (!Array.isArray(definition.steps) || definition.steps.length === 0) {\n throw new WorkflowParseError(\n `Case ${caseIndex + 1} steps must be a non-empty array.`,\n { caseIndex },\n );\n }\n const tags = definition.tags ?? [];\n if (\n !Array.isArray(tags) ||\n tags.some((tag) => typeof tag !== 'string' || tag.trim().length === 0)\n ) {\n throw new WorkflowParseError(\n `Case ${caseIndex + 1} tags must be an array of non-empty strings.`,\n { caseIndex },\n );\n }\n\n const steps = normalizeSteps(definition.steps, options.resolveNode).map(\n (normalized, stepIndex) => {\n if (!options.resolveNode(normalized.node)) {\n throw new WorkflowParseError(\n `Case ${caseIndex + 1} step ${stepIndex + 1} references unknown node \"${normalized.node}\".`,\n { caseIndex, stepIndex, node: normalized.node },\n );\n }\n return resolveStepVariables(normalized, 'steps', stepIndex, caseIndex);\n },\n );\n const caseId = createCaseId(source.projectId, sourcePath, caseIndex);\n if (ids.has(caseId)) {\n throw new WorkflowParseError(`Case id collision: ${caseId}.`, {\n caseId,\n });\n }\n ids.add(caseId);\n\n return {\n caseId,\n projectId: source.projectId,\n sourcePath,\n caseIndex,\n definition: {\n name: definition.name,\n tags: tags as string[],\n steps,\n },\n };\n });\n\n return {\n documentId: createWorkflowDocumentId(source.projectId, sourcePath),\n projectId: source.projectId,\n sourcePath,\n sourceYaml,\n lifecycle,\n cases,\n } satisfies CollectedWorkflowDocument;\n}\n"],"names":["__webpack_require__","definition","key","Object","obj","prop","Symbol","CaseRunner","CoreCaseRunner","createCaseRunner","coreCreateCaseRunner","createDocumentRuntime","coreCreateDocumentRuntime","NodeRegistry","CoreNodeRegistry","runWorkflowDocument","coreRunWorkflowDocument","defineNode","coreDefineNode","createCaseInvocationId","projectId","sourcePath","caseIndex","invocationIndex","createHash","JSON","createDocumentInvocationId","normalizeStep","coreNormalizeStep","normalizeSteps","coreNormalizeSteps","parseWorkflowSource","source","stack","nodes","sensitiveNodes","Set","sensitiveValues","redactedPaths","sourceOffset","parsed","load","JSON_SCHEMA","event","state","node","index","value","isReportSecretKey","ranges","left","right","offset","redacted","range","text","leading","trailing","sanitizeReportText","interpolationExpression","exactEnvExpression","exactProjectExpression","missingVariable","kind","name","options","WorkflowParseError","projectVariable","environmentVariable","undefined","interpolationValue","String","resolveString","exactEnv","exactProject","_match","environmentName","projectName","resolveWorkflowVariables","Array","child","isMapping","NativeWorkflowFormatError","actualFormat","rejectUnknownKeys","allowed","label","allowedSet","unknown","createCaseId","createWorkflowDocumentId","collectWorkflowDocument","snapshot","readFileSync","error","sourceYaml","format","classifyWorkflowDocumentFormat","sep","resolveStepVariables","step","phase","stepIndex","process","normalizeLifecycle","normalized","resolved","lifecycle","ids","cases","tags","tag","steps","caseId"],"mappings":"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"}
|
|
@@ -87,7 +87,38 @@ const waitFor = async (durationMs, signal)=>{
|
|
|
87
87
|
const createAgentTestRunnerNodes = (definitions, getAgent)=>{
|
|
88
88
|
const runAgentCall = async (node, ctx, agent, call, captureExecutions = true)=>(0, yaml_runtime_namespaceObject.runInYamlExecutionContext)(async ()=>{
|
|
89
89
|
const scopeId = 'case' === ctx.scope ? ctx.case.runId : ctx.document.documentRunId;
|
|
90
|
-
const isCleanupOwner = (0, test_runner_namespaceObject.
|
|
90
|
+
const isCleanupOwner = (0, test_runner_namespaceObject.admitResourceOperation)(agent, ctx.signal);
|
|
91
|
+
if (captureExecutions) ctx.report.onSnapshot(async (signal, traces)=>{
|
|
92
|
+
signal.throwIfAborted();
|
|
93
|
+
const partial = (0, test_runner_namespaceObject.hasPendingResourceOperation)(agent);
|
|
94
|
+
const capturedAt = new Date().toISOString();
|
|
95
|
+
let source = await agent._createReportSource?.(scopeId, traces.map((trace)=>trace.executionId));
|
|
96
|
+
if (!source) {
|
|
97
|
+
const path = await agent.flushReport?.();
|
|
98
|
+
if (path) source = {
|
|
99
|
+
sourcePath: path,
|
|
100
|
+
collection: {
|
|
101
|
+
status: 'partial',
|
|
102
|
+
capturedAt,
|
|
103
|
+
reason: 'This provider exposes live HTML without immutable snapshot support.'
|
|
104
|
+
}
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
signal.throwIfAborted();
|
|
108
|
+
if (!source) throw new Error('Agent did not return a report snapshot.');
|
|
109
|
+
return {
|
|
110
|
+
...source,
|
|
111
|
+
collection: {
|
|
112
|
+
status: partial || source.collection?.status === 'partial' ? 'partial' : 'complete',
|
|
113
|
+
capturedAt: source.collection?.capturedAt ?? capturedAt,
|
|
114
|
+
...source.collection?.reason ? {
|
|
115
|
+
reason: source.collection.reason
|
|
116
|
+
} : partial ? {
|
|
117
|
+
reason: 'An Agent operation was still running at the snapshot cutoff.'
|
|
118
|
+
} : {}
|
|
119
|
+
}
|
|
120
|
+
};
|
|
121
|
+
});
|
|
91
122
|
const yamlBoundary = (0, yaml_runtime_namespaceObject.enterYamlExecution)(agent, {
|
|
92
123
|
allowIndependentOverlap: isCleanupOwner
|
|
93
124
|
});
|
|
@@ -110,7 +141,19 @@ const createAgentTestRunnerNodes = (definitions, getAgent)=>{
|
|
|
110
141
|
}
|
|
111
142
|
ctx.report.addTrace({
|
|
112
143
|
type: 'midscene-execution',
|
|
113
|
-
executionId: execution.id
|
|
144
|
+
executionId: execution.id,
|
|
145
|
+
...execution.tasks ? {
|
|
146
|
+
metrics: (0, test_runner_namespaceObject.collectTestRunReportMetrics)({
|
|
147
|
+
executions: [
|
|
148
|
+
{
|
|
149
|
+
id: execution.id,
|
|
150
|
+
name: node,
|
|
151
|
+
logTime: 0,
|
|
152
|
+
tasks: execution.tasks
|
|
153
|
+
}
|
|
154
|
+
]
|
|
155
|
+
})
|
|
156
|
+
} : {}
|
|
114
157
|
});
|
|
115
158
|
});
|
|
116
159
|
if (ctx.signal.aborted) stopListening();
|
|
@@ -164,34 +207,14 @@ function createMidsceneNodes(options) {
|
|
|
164
207
|
if (!agents) {
|
|
165
208
|
agents = new Set();
|
|
166
209
|
agentsByScope.set(runId, agents);
|
|
167
|
-
const ownedScope = agents;
|
|
168
210
|
ctx.onTeardown(async ()=>{
|
|
169
|
-
const errors = [];
|
|
170
|
-
const reportPaths = [];
|
|
171
|
-
const reportSources = [];
|
|
172
211
|
try {
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
}
|
|
179
|
-
errors.push(error);
|
|
180
|
-
}
|
|
181
|
-
try {
|
|
182
|
-
const released = await options.agentProvider?.releaseAgent?.(runId);
|
|
183
|
-
if (released?.reportPath && !reportPaths.includes(released.reportPath)) reportPaths.push(released.reportPath);
|
|
184
|
-
} catch (error) {
|
|
185
|
-
errors.push(error);
|
|
186
|
-
}
|
|
187
|
-
if (1 === errors.length) throw errors[0];
|
|
188
|
-
if (errors.length) throw new AggregateError(errors, 'Agent report publication and release failed');
|
|
189
|
-
return {
|
|
190
|
-
reportPaths,
|
|
191
|
-
...reportSources.length ? {
|
|
192
|
-
reportSources
|
|
193
|
-
} : {}
|
|
194
|
-
};
|
|
212
|
+
const released = await options.agentProvider?.releaseAgent?.(runId);
|
|
213
|
+
return released?.reportPath ? {
|
|
214
|
+
reportPaths: [
|
|
215
|
+
released.reportPath
|
|
216
|
+
]
|
|
217
|
+
} : void 0;
|
|
195
218
|
} finally{
|
|
196
219
|
agentsByScope.delete(runId);
|
|
197
220
|
}
|
|
@@ -200,10 +223,11 @@ function createMidsceneNodes(options) {
|
|
|
200
223
|
const scopeAgents = agents;
|
|
201
224
|
return (0, test_runner_namespaceObject.trackResourceOperation)({}, Promise.resolve().then(async ()=>{
|
|
202
225
|
const agent = options.agentProvider ? await options.agentProvider.getAgent(runId, ctx) : await options.getAgent(ctx);
|
|
226
|
+
(0, test_runner_namespaceObject.retainResourceForScope)(agent, ctx.signal);
|
|
203
227
|
agent._prepareForTestRunner?.();
|
|
204
228
|
scopeAgents.add(agent);
|
|
205
229
|
return agent;
|
|
206
|
-
}), ctx.signal);
|
|
230
|
+
}), ctx.signal, 'acquisition');
|
|
207
231
|
};
|
|
208
232
|
const agentDefinitions = options.agentClass.getTestRunnerNodeDefinitions();
|
|
209
233
|
return [
|