@e2edev/e2e 0.2.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/LICENSE +21 -0
- package/README.md +104 -0
- package/dist/agent/act-validation.d.ts +27 -0
- package/dist/agent/act-validation.d.ts.map +1 -0
- package/dist/agent/act-validation.js +121 -0
- package/dist/agent/act-validation.js.map +1 -0
- package/dist/agent/act.d.ts +27 -0
- package/dist/agent/act.d.ts.map +1 -0
- package/dist/agent/act.js +775 -0
- package/dist/agent/act.js.map +1 -0
- package/dist/agent/actions.d.ts +66 -0
- package/dist/agent/actions.d.ts.map +1 -0
- package/dist/agent/actions.js +82 -0
- package/dist/agent/actions.js.map +1 -0
- package/dist/agent/ai-sdk.d.ts +16 -0
- package/dist/agent/ai-sdk.d.ts.map +1 -0
- package/dist/agent/ai-sdk.js +59 -0
- package/dist/agent/ai-sdk.js.map +1 -0
- package/dist/agent/call-options.d.ts +10 -0
- package/dist/agent/call-options.d.ts.map +1 -0
- package/dist/agent/call-options.js +28 -0
- package/dist/agent/call-options.js.map +1 -0
- package/dist/agent/default-agent.d.ts +22 -0
- package/dist/agent/default-agent.d.ts.map +1 -0
- package/dist/agent/default-agent.js +354 -0
- package/dist/agent/default-agent.js.map +1 -0
- package/dist/agent/error.d.ts +53 -0
- package/dist/agent/error.d.ts.map +1 -0
- package/dist/agent/error.js +94 -0
- package/dist/agent/error.js.map +1 -0
- package/dist/agent/executor.d.ts +238 -0
- package/dist/agent/executor.d.ts.map +1 -0
- package/dist/agent/executor.js +56 -0
- package/dist/agent/executor.js.map +1 -0
- package/dist/agent/index.d.ts +15 -0
- package/dist/agent/index.d.ts.map +1 -0
- package/dist/agent/index.js +304 -0
- package/dist/agent/index.js.map +1 -0
- package/dist/agent/invocation.d.ts +194 -0
- package/dist/agent/invocation.d.ts.map +1 -0
- package/dist/agent/invocation.js +389 -0
- package/dist/agent/invocation.js.map +1 -0
- package/dist/agent/ledger.d.ts +24 -0
- package/dist/agent/ledger.d.ts.map +1 -0
- package/dist/agent/ledger.js +48 -0
- package/dist/agent/ledger.js.map +1 -0
- package/dist/agent/loop-guards.d.ts +35 -0
- package/dist/agent/loop-guards.d.ts.map +1 -0
- package/dist/agent/loop-guards.js +110 -0
- package/dist/agent/loop-guards.js.map +1 -0
- package/dist/agent/model/adapter.d.ts +97 -0
- package/dist/agent/model/adapter.d.ts.map +1 -0
- package/dist/agent/model/adapter.js +40 -0
- package/dist/agent/model/adapter.js.map +1 -0
- package/dist/agent/model/router.d.ts +36 -0
- package/dist/agent/model/router.d.ts.map +1 -0
- package/dist/agent/model/router.js +45 -0
- package/dist/agent/model/router.js.map +1 -0
- package/dist/agent/model/schema.d.ts +16 -0
- package/dist/agent/model/schema.d.ts.map +1 -0
- package/dist/agent/model/schema.js +37 -0
- package/dist/agent/model/schema.js.map +1 -0
- package/dist/agent/model/sdk.d.ts +28 -0
- package/dist/agent/model/sdk.d.ts.map +1 -0
- package/dist/agent/model/sdk.js +258 -0
- package/dist/agent/model/sdk.js.map +1 -0
- package/dist/agent/observation.d.ts +70 -0
- package/dist/agent/observation.d.ts.map +1 -0
- package/dist/agent/observation.js +174 -0
- package/dist/agent/observation.js.map +1 -0
- package/dist/agent/phases.d.ts +71 -0
- package/dist/agent/phases.d.ts.map +1 -0
- package/dist/agent/phases.js +124 -0
- package/dist/agent/phases.js.map +1 -0
- package/dist/agent/prompts.d.ts +40 -0
- package/dist/agent/prompts.d.ts.map +1 -0
- package/dist/agent/prompts.js +104 -0
- package/dist/agent/prompts.js.map +1 -0
- package/dist/agent/protocol.d.ts +31 -0
- package/dist/agent/protocol.d.ts.map +1 -0
- package/dist/agent/protocol.js +67 -0
- package/dist/agent/protocol.js.map +1 -0
- package/dist/agent/public.d.ts +12 -0
- package/dist/agent/public.d.ts.map +1 -0
- package/dist/agent/public.js +12 -0
- package/dist/agent/public.js.map +1 -0
- package/dist/agent/replay.d.ts +61 -0
- package/dist/agent/replay.d.ts.map +1 -0
- package/dist/agent/replay.js +185 -0
- package/dist/agent/replay.js.map +1 -0
- package/dist/agent/secrets.d.ts +22 -0
- package/dist/agent/secrets.d.ts.map +1 -0
- package/dist/agent/secrets.js +63 -0
- package/dist/agent/secrets.js.map +1 -0
- package/dist/agent/step-cache.d.ts +156 -0
- package/dist/agent/step-cache.d.ts.map +1 -0
- package/dist/agent/step-cache.js +301 -0
- package/dist/agent/step-cache.js.map +1 -0
- package/dist/agent/tool-loop.d.ts +51 -0
- package/dist/agent/tool-loop.d.ts.map +1 -0
- package/dist/agent/tool-loop.js +331 -0
- package/dist/agent/tool-loop.js.map +1 -0
- package/dist/agent/tool.d.ts +39 -0
- package/dist/agent/tool.d.ts.map +1 -0
- package/dist/agent/tool.js +52 -0
- package/dist/agent/tool.js.map +1 -0
- package/dist/backend/contract.d.ts +186 -0
- package/dist/backend/contract.d.ts.map +1 -0
- package/dist/backend/contract.js +65 -0
- package/dist/backend/contract.js.map +1 -0
- package/dist/backend/index.d.ts +316 -0
- package/dist/backend/index.d.ts.map +1 -0
- package/dist/backend/index.js +219 -0
- package/dist/backend/index.js.map +1 -0
- package/dist/backend/session.d.ts +23 -0
- package/dist/backend/session.d.ts.map +1 -0
- package/dist/backend/session.js +213 -0
- package/dist/backend/session.js.map +1 -0
- package/dist/backend/surface.d.ts +83 -0
- package/dist/backend/surface.d.ts.map +1 -0
- package/dist/backend/surface.js +11 -0
- package/dist/backend/surface.js.map +1 -0
- package/dist/cache/anchors.d.ts +37 -0
- package/dist/cache/anchors.d.ts.map +1 -0
- package/dist/cache/anchors.js +89 -0
- package/dist/cache/anchors.js.map +1 -0
- package/dist/cache/context.d.ts +74 -0
- package/dist/cache/context.d.ts.map +1 -0
- package/dist/cache/context.js +82 -0
- package/dist/cache/context.js.map +1 -0
- package/dist/cache/decide.d.ts +42 -0
- package/dist/cache/decide.d.ts.map +1 -0
- package/dist/cache/decide.js +47 -0
- package/dist/cache/decide.js.map +1 -0
- package/dist/cache/identity.d.ts +113 -0
- package/dist/cache/identity.d.ts.map +1 -0
- package/dist/cache/identity.js +109 -0
- package/dist/cache/identity.js.map +1 -0
- package/dist/cache/recorder.d.ts +76 -0
- package/dist/cache/recorder.d.ts.map +1 -0
- package/dist/cache/recorder.js +143 -0
- package/dist/cache/recorder.js.map +1 -0
- package/dist/cache/relocate.d.ts +69 -0
- package/dist/cache/relocate.d.ts.map +1 -0
- package/dist/cache/relocate.js +125 -0
- package/dist/cache/relocate.js.map +1 -0
- package/dist/cache/store.d.ts +68 -0
- package/dist/cache/store.d.ts.map +1 -0
- package/dist/cache/store.js +106 -0
- package/dist/cache/store.js.map +1 -0
- package/dist/cache/trace.d.ts +146 -0
- package/dist/cache/trace.d.ts.map +1 -0
- package/dist/cache/trace.js +249 -0
- package/dist/cache/trace.js.map +1 -0
- package/dist/cli/bin.d.ts +3 -0
- package/dist/cli/bin.d.ts.map +1 -0
- package/dist/cli/bin.js +4 -0
- package/dist/cli/bin.js.map +1 -0
- package/dist/cli/index.d.ts +4 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +108 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/init.d.ts +6 -0
- package/dist/cli/init.d.ts.map +1 -0
- package/dist/cli/init.js +101 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/collect/collect.d.ts +44 -0
- package/dist/collect/collect.d.ts.map +1 -0
- package/dist/collect/collect.js +89 -0
- package/dist/collect/collect.js.map +1 -0
- package/dist/collect/registry.d.ts +47 -0
- package/dist/collect/registry.d.ts.map +1 -0
- package/dist/collect/registry.js +262 -0
- package/dist/collect/registry.js.map +1 -0
- package/dist/collect/select.d.ts +54 -0
- package/dist/collect/select.d.ts.map +1 -0
- package/dist/collect/select.js +230 -0
- package/dist/collect/select.js.map +1 -0
- package/dist/config/agent.d.ts +91 -0
- package/dist/config/agent.d.ts.map +1 -0
- package/dist/config/agent.js +232 -0
- package/dist/config/agent.js.map +1 -0
- package/dist/config/load.d.ts +23 -0
- package/dist/config/load.d.ts.map +1 -0
- package/dist/config/load.js +75 -0
- package/dist/config/load.js.map +1 -0
- package/dist/config/resolve.d.ts +94 -0
- package/dist/config/resolve.d.ts.map +1 -0
- package/dist/config/resolve.js +500 -0
- package/dist/config/resolve.js.map +1 -0
- package/dist/config/validate.d.ts +6 -0
- package/dist/config/validate.d.ts.map +1 -0
- package/dist/config/validate.js +21 -0
- package/dist/config/validate.js.map +1 -0
- package/dist/credentials.d.ts +7 -0
- package/dist/credentials.d.ts.map +1 -0
- package/dist/credentials.js +42 -0
- package/dist/credentials.js.map +1 -0
- package/dist/expect/async.d.ts +5 -0
- package/dist/expect/async.d.ts.map +1 -0
- package/dist/expect/async.js +186 -0
- package/dist/expect/async.js.map +1 -0
- package/dist/expect/index.d.ts +7 -0
- package/dist/expect/index.d.ts.map +1 -0
- package/dist/expect/index.js +23 -0
- package/dist/expect/index.js.map +1 -0
- package/dist/expect/values.d.ts +4 -0
- package/dist/expect/values.d.ts.map +1 -0
- package/dist/expect/values.js +108 -0
- package/dist/expect/values.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/internal/ai-trace.d.ts +151 -0
- package/dist/internal/ai-trace.d.ts.map +1 -0
- package/dist/internal/ai-trace.js +360 -0
- package/dist/internal/ai-trace.js.map +1 -0
- package/dist/internal/brands.d.ts +9 -0
- package/dist/internal/brands.d.ts.map +1 -0
- package/dist/internal/brands.js +9 -0
- package/dist/internal/brands.js.map +1 -0
- package/dist/internal/debug.d.ts +43 -0
- package/dist/internal/debug.d.ts.map +1 -0
- package/dist/internal/debug.js +102 -0
- package/dist/internal/debug.js.map +1 -0
- package/dist/internal/errors.d.ts +98 -0
- package/dist/internal/errors.d.ts.map +1 -0
- package/dist/internal/errors.js +212 -0
- package/dist/internal/errors.js.map +1 -0
- package/dist/internal/globs.d.ts +29 -0
- package/dist/internal/globs.d.ts.map +1 -0
- package/dist/internal/globs.js +126 -0
- package/dist/internal/globs.js.map +1 -0
- package/dist/internal/ids.d.ts +32 -0
- package/dist/internal/ids.d.ts.map +1 -0
- package/dist/internal/ids.js +124 -0
- package/dist/internal/ids.js.map +1 -0
- package/dist/internal/json-value.d.ts +15 -0
- package/dist/internal/json-value.d.ts.map +1 -0
- package/dist/internal/json-value.js +61 -0
- package/dist/internal/json-value.js.map +1 -0
- package/dist/internal/package-version.d.ts +6 -0
- package/dist/internal/package-version.d.ts.map +1 -0
- package/dist/internal/package-version.js +14 -0
- package/dist/internal/package-version.js.map +1 -0
- package/dist/internal/realm-slot.d.ts +13 -0
- package/dist/internal/realm-slot.d.ts.map +1 -0
- package/dist/internal/realm-slot.js +23 -0
- package/dist/internal/realm-slot.js.map +1 -0
- package/dist/internal/redact.d.ts +33 -0
- package/dist/internal/redact.d.ts.map +1 -0
- package/dist/internal/redact.js +56 -0
- package/dist/internal/redact.js.map +1 -0
- package/dist/internal/regexp.d.ts +10 -0
- package/dist/internal/regexp.d.ts.map +1 -0
- package/dist/internal/regexp.js +27 -0
- package/dist/internal/regexp.js.map +1 -0
- package/dist/internal/text.d.ts +39 -0
- package/dist/internal/text.d.ts.map +1 -0
- package/dist/internal/text.js +66 -0
- package/dist/internal/text.js.map +1 -0
- package/dist/internal/time.d.ts +37 -0
- package/dist/internal/time.d.ts.map +1 -0
- package/dist/internal/time.js +91 -0
- package/dist/internal/time.js.map +1 -0
- package/dist/internal/trace.d.ts +18 -0
- package/dist/internal/trace.d.ts.map +1 -0
- package/dist/internal/trace.js +46 -0
- package/dist/internal/trace.js.map +1 -0
- package/dist/internal/urls.d.ts +31 -0
- package/dist/internal/urls.d.ts.map +1 -0
- package/dist/internal/urls.js +95 -0
- package/dist/internal/urls.js.map +1 -0
- package/dist/locator/engine.d.ts +65 -0
- package/dist/locator/engine.d.ts.map +1 -0
- package/dist/locator/engine.js +164 -0
- package/dist/locator/engine.js.map +1 -0
- package/dist/locator/expression.d.ts +19 -0
- package/dist/locator/expression.d.ts.map +1 -0
- package/dist/locator/expression.js +85 -0
- package/dist/locator/expression.js.map +1 -0
- package/dist/locator/screen.d.ts +36 -0
- package/dist/locator/screen.d.ts.map +1 -0
- package/dist/locator/screen.js +281 -0
- package/dist/locator/screen.js.map +1 -0
- package/dist/report/build.d.ts +214 -0
- package/dist/report/build.d.ts.map +1 -0
- package/dist/report/build.js +346 -0
- package/dist/report/build.js.map +1 -0
- package/dist/report/code-frame.d.ts +20 -0
- package/dist/report/code-frame.d.ts.map +1 -0
- package/dist/report/code-frame.js +73 -0
- package/dist/report/code-frame.js.map +1 -0
- package/dist/report/debug-steps.d.ts +14 -0
- package/dist/report/debug-steps.d.ts.map +1 -0
- package/dist/report/debug-steps.js +85 -0
- package/dist/report/debug-steps.js.map +1 -0
- package/dist/report/list.d.ts +80 -0
- package/dist/report/list.d.ts.map +1 -0
- package/dist/report/list.js +372 -0
- package/dist/report/list.js.map +1 -0
- package/dist/report/live-status.d.ts +51 -0
- package/dist/report/live-status.d.ts.map +1 -0
- package/dist/report/live-status.js +162 -0
- package/dist/report/live-status.js.map +1 -0
- package/dist/report/write.d.ts +4 -0
- package/dist/report/write.d.ts.map +1 -0
- package/dist/report/write.js +13 -0
- package/dist/report/write.js.map +1 -0
- package/dist/run/app-process.d.ts +18 -0
- package/dist/run/app-process.d.ts.map +1 -0
- package/dist/run/app-process.js +112 -0
- package/dist/run/app-process.js.map +1 -0
- package/dist/run/artifacts.d.ts +51 -0
- package/dist/run/artifacts.d.ts.map +1 -0
- package/dist/run/artifacts.js +114 -0
- package/dist/run/artifacts.js.map +1 -0
- package/dist/run/events.d.ts +100 -0
- package/dist/run/events.d.ts.map +1 -0
- package/dist/run/events.js +59 -0
- package/dist/run/events.js.map +1 -0
- package/dist/run/execute.d.ts +119 -0
- package/dist/run/execute.d.ts.map +1 -0
- package/dist/run/execute.js +555 -0
- package/dist/run/execute.js.map +1 -0
- package/dist/run/fixtures.d.ts +40 -0
- package/dist/run/fixtures.d.ts.map +1 -0
- package/dist/run/fixtures.js +408 -0
- package/dist/run/fixtures.js.map +1 -0
- package/dist/run/in-process.d.ts +24 -0
- package/dist/run/in-process.d.ts.map +1 -0
- package/dist/run/in-process.js +120 -0
- package/dist/run/in-process.js.map +1 -0
- package/dist/run/public.d.ts +19 -0
- package/dist/run/public.d.ts.map +1 -0
- package/dist/run/public.js +11 -0
- package/dist/run/public.js.map +1 -0
- package/dist/run/realm.d.ts +52 -0
- package/dist/run/realm.d.ts.map +1 -0
- package/dist/run/realm.js +101 -0
- package/dist/run/realm.js.map +1 -0
- package/dist/run/records.d.ts +87 -0
- package/dist/run/records.d.ts.map +1 -0
- package/dist/run/records.js +3 -0
- package/dist/run/records.js.map +1 -0
- package/dist/run/retry.d.ts +18 -0
- package/dist/run/retry.d.ts.map +1 -0
- package/dist/run/retry.js +33 -0
- package/dist/run/retry.js.map +1 -0
- package/dist/run/runner.d.ts +49 -0
- package/dist/run/runner.d.ts.map +1 -0
- package/dist/run/runner.js +375 -0
- package/dist/run/runner.js.map +1 -0
- package/dist/run/scheduler.d.ts +45 -0
- package/dist/run/scheduler.d.ts.map +1 -0
- package/dist/run/scheduler.js +512 -0
- package/dist/run/scheduler.js.map +1 -0
- package/dist/run/serial.d.ts +52 -0
- package/dist/run/serial.d.ts.map +1 -0
- package/dist/run/serial.js +247 -0
- package/dist/run/serial.js.map +1 -0
- package/dist/run/sessions.d.ts +54 -0
- package/dist/run/sessions.d.ts.map +1 -0
- package/dist/run/sessions.js +221 -0
- package/dist/run/sessions.js.map +1 -0
- package/dist/run/steps.d.ts +196 -0
- package/dist/run/steps.d.ts.map +1 -0
- package/dist/run/steps.js +151 -0
- package/dist/run/steps.js.map +1 -0
- package/dist/run/unit-runner.d.ts +30 -0
- package/dist/run/unit-runner.d.ts.map +1 -0
- package/dist/run/unit-runner.js +11 -0
- package/dist/run/unit-runner.js.map +1 -0
- package/dist/run/units.d.ts +50 -0
- package/dist/run/units.d.ts.map +1 -0
- package/dist/run/units.js +103 -0
- package/dist/run/units.js.map +1 -0
- package/dist/run/worker/entry.d.ts +8 -0
- package/dist/run/worker/entry.d.ts.map +1 -0
- package/dist/run/worker/entry.js +137 -0
- package/dist/run/worker/entry.js.map +1 -0
- package/dist/run/worker/handle.d.ts +10 -0
- package/dist/run/worker/handle.d.ts.map +1 -0
- package/dist/run/worker/handle.js +74 -0
- package/dist/run/worker/handle.js.map +1 -0
- package/dist/run/worker/protocol.d.ts +129 -0
- package/dist/run/worker/protocol.d.ts.map +1 -0
- package/dist/run/worker/protocol.js +18 -0
- package/dist/run/worker/protocol.js.map +1 -0
- package/dist/run/worker/session.d.ts +69 -0
- package/dist/run/worker/session.d.ts.map +1 -0
- package/dist/run/worker/session.js +123 -0
- package/dist/run/worker/session.js.map +1 -0
- package/dist/types.d.ts +630 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/package.json +91 -0
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/** Collection realm: imports test modules and derives stable identities. */
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { discoverFiles } from '../internal/globs.js';
|
|
4
|
+
import { CollectionError } from '../internal/errors.js';
|
|
5
|
+
import { setupTestId, testId } from '../internal/ids.js';
|
|
6
|
+
import { importModule } from '../config/load.js';
|
|
7
|
+
import { collectModule, groupTitles, outermostSerialGroup, } from './registry.js';
|
|
8
|
+
/** Narrows a collected test to its reportable, serializable identity. */
|
|
9
|
+
export function testIdentity(test) {
|
|
10
|
+
return {
|
|
11
|
+
kind: test.kind,
|
|
12
|
+
title: test.title,
|
|
13
|
+
titlePath: test.titlePath,
|
|
14
|
+
declarationIndex: test.declarationIndex,
|
|
15
|
+
sessions: test.sessions,
|
|
16
|
+
source: test.source,
|
|
17
|
+
file: test.file,
|
|
18
|
+
id: test.id,
|
|
19
|
+
serialId: test.serialId,
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
/** Derives the serial unit source ID per 11-lifecycle.md. */
|
|
23
|
+
function serialSourceId(file, group) {
|
|
24
|
+
return `serial::${testId(file, groupTitles(group))}`;
|
|
25
|
+
}
|
|
26
|
+
function toCollectedTests(file, registration) {
|
|
27
|
+
const seenTitlePaths = new Set();
|
|
28
|
+
return registration.tests.map((registered) => {
|
|
29
|
+
const encoded = testId(file, registered.titlePath);
|
|
30
|
+
if (seenTitlePaths.has(encoded)) {
|
|
31
|
+
throw new CollectionError(`duplicate title path ${registered.titlePath.join(' > ')} in ${file}`);
|
|
32
|
+
}
|
|
33
|
+
seenTitlePaths.add(encoded);
|
|
34
|
+
const serialRoot = outermostSerialGroup(registered.group);
|
|
35
|
+
return {
|
|
36
|
+
...registered,
|
|
37
|
+
file,
|
|
38
|
+
id: registered.kind === 'setup' ? setupTestId(file, registered.titlePath) : encoded,
|
|
39
|
+
serialRoot,
|
|
40
|
+
serialId: serialRoot === undefined ? undefined : serialSourceId(file, serialRoot),
|
|
41
|
+
};
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
/** Normalizes an absolute or relative file path to the project-root-relative wire form. */
|
|
45
|
+
function normalizeRelativePath(projectRoot, filePath) {
|
|
46
|
+
const relative = path.isAbsolute(filePath) ? path.relative(projectRoot, filePath) : filePath;
|
|
47
|
+
const normalized = relative.split(path.sep).join('/');
|
|
48
|
+
if (normalized.startsWith('..')) {
|
|
49
|
+
throw new CollectionError(`test file is outside the project root: ${filePath}`);
|
|
50
|
+
}
|
|
51
|
+
return normalized;
|
|
52
|
+
}
|
|
53
|
+
/** Builds one CollectedFile from an already-produced registration. */
|
|
54
|
+
export function collectFromRegistration(projectRoot, filePath, registration) {
|
|
55
|
+
const file = normalizeRelativePath(projectRoot, filePath);
|
|
56
|
+
return {
|
|
57
|
+
file,
|
|
58
|
+
absolutePath: path.resolve(projectRoot, file),
|
|
59
|
+
registration,
|
|
60
|
+
tests: toCollectedTests(file, registration),
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Runs collection: resolves globs, sorts matched files by code point, and
|
|
65
|
+
* imports each module once in the collection realm.
|
|
66
|
+
*/
|
|
67
|
+
export async function collect(config, fileFilter) {
|
|
68
|
+
let matched = discoverFiles(config.projectRoot, config.tests);
|
|
69
|
+
if (fileFilter !== undefined && fileFilter.length > 0) {
|
|
70
|
+
const normalizedFilters = new Set(fileFilter.map((file) => normalizeRelativePath(config.projectRoot, file)));
|
|
71
|
+
matched = matched.filter((file) => normalizedFilters.has(file));
|
|
72
|
+
}
|
|
73
|
+
const files = [];
|
|
74
|
+
for (const file of matched) {
|
|
75
|
+
const absolutePath = path.join(config.projectRoot, file);
|
|
76
|
+
let registration;
|
|
77
|
+
try {
|
|
78
|
+
registration = await collectModule(() => importModule(absolutePath, 'collect'));
|
|
79
|
+
}
|
|
80
|
+
catch (cause) {
|
|
81
|
+
if (cause instanceof CollectionError)
|
|
82
|
+
throw cause;
|
|
83
|
+
throw new CollectionError(`failed to collect ${file}: ${cause instanceof Error ? cause.message : String(cause)}`, { cause });
|
|
84
|
+
}
|
|
85
|
+
files.push(collectFromRegistration(config.projectRoot, absolutePath, registration));
|
|
86
|
+
}
|
|
87
|
+
return { files, tests: files.flatMap((file) => file.tests) };
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=collect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collect.js","sourceRoot":"","sources":["../../src/collect/collect.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/** Synchronous registration during module evaluation (spec 11-lifecycle.md). */
|
|
2
|
+
import type { DescribeOptions, SetupFn, SuiteHookFn, TestAPI, TestFn, TestHookFn, TestOptions } from '../types.ts';
|
|
3
|
+
export interface SourceLocation {
|
|
4
|
+
readonly file: string;
|
|
5
|
+
readonly line: number;
|
|
6
|
+
readonly column: number;
|
|
7
|
+
}
|
|
8
|
+
export interface GroupNode {
|
|
9
|
+
readonly title: string;
|
|
10
|
+
readonly options: DescribeOptions;
|
|
11
|
+
readonly parent: GroupNode | undefined;
|
|
12
|
+
readonly serial: boolean;
|
|
13
|
+
}
|
|
14
|
+
export type TestMode = 'normal' | 'skip' | 'only';
|
|
15
|
+
export interface RegisteredTest {
|
|
16
|
+
readonly kind: 'test' | 'setup';
|
|
17
|
+
readonly title: string;
|
|
18
|
+
readonly titlePath: readonly string[];
|
|
19
|
+
readonly declarationIndex: number;
|
|
20
|
+
readonly options: TestOptions;
|
|
21
|
+
readonly sessions: readonly string[];
|
|
22
|
+
readonly fn: TestFn | SetupFn;
|
|
23
|
+
readonly group: GroupNode | undefined;
|
|
24
|
+
readonly mode: TestMode;
|
|
25
|
+
readonly source: SourceLocation | undefined;
|
|
26
|
+
}
|
|
27
|
+
export type HookKind = 'beforeEach' | 'afterEach' | 'beforeAll' | 'afterAll';
|
|
28
|
+
export interface RegisteredHook {
|
|
29
|
+
readonly kind: HookKind;
|
|
30
|
+
readonly fn: TestHookFn | SuiteHookFn;
|
|
31
|
+
readonly group: GroupNode | undefined;
|
|
32
|
+
readonly declarationIndex: number;
|
|
33
|
+
}
|
|
34
|
+
export interface ModuleRegistration {
|
|
35
|
+
readonly tests: readonly RegisteredTest[];
|
|
36
|
+
readonly hooks: readonly RegisteredHook[];
|
|
37
|
+
}
|
|
38
|
+
/** Canonical group-tree walk: the enclosing groups of a node, outermost first. */
|
|
39
|
+
export declare function groupChain(group: GroupNode | undefined): GroupNode[];
|
|
40
|
+
/** Group titles along the chain, outermost first. */
|
|
41
|
+
export declare function groupTitles(group: GroupNode | undefined): string[];
|
|
42
|
+
/** Finds the outermost serial group enclosing a node, if any. */
|
|
43
|
+
export declare function outermostSerialGroup(group: GroupNode | undefined): GroupNode | undefined;
|
|
44
|
+
/** Runs `load` with a fresh collector active and returns everything it registered. */
|
|
45
|
+
export declare function collectModule(load: () => Promise<unknown>): Promise<ModuleRegistration>;
|
|
46
|
+
export declare const test: TestAPI;
|
|
47
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/collect/registry.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAQhF,OAAO,KAAK,EACV,eAAe,EACf,OAAO,EAEP,WAAW,EACX,OAAO,EAEP,MAAM,EACN,UAAU,EACV,WAAW,EACZ,MAAM,aAAa,CAAC;AAErB,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAC;IAClC,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,SAAS,CAAC;IACvC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,MAAM,QAAQ,GAAG,QAAQ,GAAG,MAAM,GAAG,MAAM,CAAC;AAElD,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IAChC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;IACtC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC;IAC9B,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC;IAC9B,QAAQ,CAAC,KAAK,EAAE,SAAS,GAAG,SAAS,CAAC;IACtC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,cAAc,GAAG,SAAS,CAAC;CAC7C;AAED,MAAM,MAAM,QAAQ,GAAG,YAAY,GAAG,WAAW,GAAG,WAAW,GAAG,UAAU,CAAC;AAE7E,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,EAAE,EAAE,UAAU,GAAG,WAAW,CAAC;IACtC,QAAQ,CAAC,KAAK,EAAE,SAAS,GAAG,SAAS,CAAC;IACtC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;CACnC;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,KAAK,EAAE,SAAS,cAAc,EAAE,CAAC;IAC1C,QAAQ,CAAC,KAAK,EAAE,SAAS,cAAc,EAAE,CAAC;CAC3C;AAyHD,kFAAkF;AAClF,wBAAgB,UAAU,CAAC,KAAK,EAAE,SAAS,GAAG,SAAS,GAAG,SAAS,EAAE,CAMpE;AAED,qDAAqD;AACrD,wBAAgB,WAAW,CAAC,KAAK,EAAE,SAAS,GAAG,SAAS,GAAG,MAAM,EAAE,CAElE;AAED,iEAAiE;AACjE,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,CAExF;AAqDD,sFAAsF;AACtF,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAY7F;AAkDD,eAAO,MAAM,IAAI,EAAE,OAyCN,CAAC"}
|
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
/** Synchronous registration during module evaluation (spec 11-lifecycle.md). */
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { fileURLToPath } from 'node:url';
|
|
4
|
+
import { testCaseBrand } from '../internal/brands.js';
|
|
5
|
+
import { CollectionError } from '../internal/errors.js';
|
|
6
|
+
import { validateTitle } from '../internal/ids.js';
|
|
7
|
+
import { realmSlot } from '../internal/realm-slot.js';
|
|
8
|
+
const SESSION_NAME_PATTERN = /^[A-Za-z0-9_.-]{1,128}$/;
|
|
9
|
+
class Collector {
|
|
10
|
+
tests = [];
|
|
11
|
+
hooks = [];
|
|
12
|
+
currentGroup = undefined;
|
|
13
|
+
declarationCounter = 0;
|
|
14
|
+
closed = false;
|
|
15
|
+
close() {
|
|
16
|
+
this.closed = true;
|
|
17
|
+
return { tests: this.tests, hooks: this.hooks };
|
|
18
|
+
}
|
|
19
|
+
assertOpen(api) {
|
|
20
|
+
if (this.closed) {
|
|
21
|
+
throw new CollectionError(`${api} was called after module evaluation finished; registration must be synchronous`);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
registerTest(kind, mode, title, options, sessions, fn) {
|
|
25
|
+
this.assertOpen(kind === 'setup' ? 'test.setup()' : 'test()');
|
|
26
|
+
const titleError = validateTitle(title);
|
|
27
|
+
if (titleError !== null)
|
|
28
|
+
throw new CollectionError(titleError);
|
|
29
|
+
const normalizedTitle = title.normalize('NFC');
|
|
30
|
+
if (typeof fn !== 'function')
|
|
31
|
+
throw new CollectionError('test body must be a function');
|
|
32
|
+
if (kind === 'setup') {
|
|
33
|
+
if (this.currentGroup !== undefined) {
|
|
34
|
+
throw new CollectionError('setup tests must be top-level; they cannot appear in describe');
|
|
35
|
+
}
|
|
36
|
+
if (sessions.length === 0) {
|
|
37
|
+
throw new CollectionError('setup tests must declare at least one session');
|
|
38
|
+
}
|
|
39
|
+
for (const name of sessions) {
|
|
40
|
+
if (!SESSION_NAME_PATTERN.test(name)) {
|
|
41
|
+
throw new CollectionError(`invalid session name ${JSON.stringify(name)}: names are 1 through 128 ASCII letters, numbers, "_", "-", or "."`);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
if (new Set(sessions).size !== sessions.length) {
|
|
45
|
+
throw new CollectionError('duplicate session names in one setup declaration');
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
validateTestOptions(options, this.currentGroup);
|
|
49
|
+
const titlePath = [...groupTitles(this.currentGroup), normalizedTitle];
|
|
50
|
+
const registered = {
|
|
51
|
+
kind,
|
|
52
|
+
title: normalizedTitle,
|
|
53
|
+
titlePath,
|
|
54
|
+
declarationIndex: this.declarationCounter,
|
|
55
|
+
options,
|
|
56
|
+
sessions,
|
|
57
|
+
fn,
|
|
58
|
+
group: this.currentGroup,
|
|
59
|
+
mode,
|
|
60
|
+
source: captureSource(),
|
|
61
|
+
};
|
|
62
|
+
this.declarationCounter += 1;
|
|
63
|
+
this.tests.push(registered);
|
|
64
|
+
return Object.freeze({ [testCaseBrand]: true });
|
|
65
|
+
}
|
|
66
|
+
registerDescribe(title, options, body) {
|
|
67
|
+
this.assertOpen('test.describe()');
|
|
68
|
+
const titleError = validateTitle(title);
|
|
69
|
+
if (titleError !== null)
|
|
70
|
+
throw new CollectionError(titleError);
|
|
71
|
+
if (typeof body !== 'function')
|
|
72
|
+
throw new CollectionError('describe body must be a function');
|
|
73
|
+
validateDescribeOptions(options, this.currentGroup);
|
|
74
|
+
const group = {
|
|
75
|
+
title: title.normalize('NFC'),
|
|
76
|
+
options,
|
|
77
|
+
parent: this.currentGroup,
|
|
78
|
+
serial: options.serial === true,
|
|
79
|
+
};
|
|
80
|
+
const previous = this.currentGroup;
|
|
81
|
+
this.currentGroup = group;
|
|
82
|
+
try {
|
|
83
|
+
const result = body();
|
|
84
|
+
if (isPromiseLike(result)) {
|
|
85
|
+
throw new CollectionError(`describe body for ${JSON.stringify(title)} must finish synchronously`);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
finally {
|
|
89
|
+
this.currentGroup = previous;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
registerHook(kind, fn) {
|
|
93
|
+
this.assertOpen(`test.${kind}()`);
|
|
94
|
+
if (typeof fn !== 'function')
|
|
95
|
+
throw new CollectionError(`${kind} hook must be a function`);
|
|
96
|
+
this.hooks.push({
|
|
97
|
+
kind,
|
|
98
|
+
fn,
|
|
99
|
+
group: this.currentGroup,
|
|
100
|
+
declarationIndex: this.declarationCounter,
|
|
101
|
+
});
|
|
102
|
+
this.declarationCounter += 1;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
function isPromiseLike(value) {
|
|
106
|
+
return (typeof value === 'object' &&
|
|
107
|
+
value !== null &&
|
|
108
|
+
typeof value.then === 'function');
|
|
109
|
+
}
|
|
110
|
+
/** Canonical group-tree walk: the enclosing groups of a node, outermost first. */
|
|
111
|
+
export function groupChain(group) {
|
|
112
|
+
const chain = [];
|
|
113
|
+
for (let node = group; node !== undefined; node = node.parent) {
|
|
114
|
+
chain.unshift(node);
|
|
115
|
+
}
|
|
116
|
+
return chain;
|
|
117
|
+
}
|
|
118
|
+
/** Group titles along the chain, outermost first. */
|
|
119
|
+
export function groupTitles(group) {
|
|
120
|
+
return groupChain(group).map((node) => node.title);
|
|
121
|
+
}
|
|
122
|
+
/** Finds the outermost serial group enclosing a node, if any. */
|
|
123
|
+
export function outermostSerialGroup(group) {
|
|
124
|
+
return groupChain(group).find((node) => node.serial);
|
|
125
|
+
}
|
|
126
|
+
function validateCommonOptions(options, label) {
|
|
127
|
+
if (options.timeout !== undefined) {
|
|
128
|
+
if (!Number.isSafeInteger(options.timeout) || options.timeout <= 0) {
|
|
129
|
+
throw new CollectionError(`${label}: timeout must be a positive safe integer`);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
if (options.retries !== undefined) {
|
|
133
|
+
if (!Number.isInteger(options.retries) || options.retries < 0 || options.retries > 10) {
|
|
134
|
+
throw new CollectionError(`${label}: retries must be an integer from 0 through 10`);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
function insideSerial(group) {
|
|
139
|
+
return outermostSerialGroup(group) !== undefined;
|
|
140
|
+
}
|
|
141
|
+
function validateTestOptions(options, group) {
|
|
142
|
+
validateCommonOptions(options, 'test options');
|
|
143
|
+
if (insideSerial(group)) {
|
|
144
|
+
const forbidden = [
|
|
145
|
+
'retries',
|
|
146
|
+
'session',
|
|
147
|
+
'platforms',
|
|
148
|
+
'requires',
|
|
149
|
+
'skip',
|
|
150
|
+
'only',
|
|
151
|
+
];
|
|
152
|
+
for (const key of forbidden) {
|
|
153
|
+
if (options[key] !== undefined) {
|
|
154
|
+
throw new CollectionError(`test option "${key}" cannot be overridden inside a serial group; it belongs to the unit`);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
function validateDescribeOptions(options, parent) {
|
|
160
|
+
validateCommonOptions(options, 'describe options');
|
|
161
|
+
if (options.serial === true && insideSerial(parent)) {
|
|
162
|
+
throw new CollectionError('nested serial groups are collection errors');
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* The active collector lives on globalThis because test modules load in an
|
|
167
|
+
* isolated module realm (tsx) and must reach the runner's collector instance.
|
|
168
|
+
*/
|
|
169
|
+
const collectorSlot = realmSlot('e2e.activeCollector.v1');
|
|
170
|
+
/** Runs `load` with a fresh collector active and returns everything it registered. */
|
|
171
|
+
export async function collectModule(load) {
|
|
172
|
+
if (collectorSlot.get(globalThis) !== undefined) {
|
|
173
|
+
throw new CollectionError('collection is already in progress');
|
|
174
|
+
}
|
|
175
|
+
const collector = new Collector();
|
|
176
|
+
collectorSlot.set(globalThis, collector);
|
|
177
|
+
try {
|
|
178
|
+
await load();
|
|
179
|
+
}
|
|
180
|
+
finally {
|
|
181
|
+
collectorSlot.delete(globalThis);
|
|
182
|
+
}
|
|
183
|
+
return collector.close();
|
|
184
|
+
}
|
|
185
|
+
function requireCollector(api) {
|
|
186
|
+
const collector = collectorSlot.get(globalThis);
|
|
187
|
+
if (collector === undefined) {
|
|
188
|
+
throw new CollectionError(`${api} can only be called while a test module is being collected by the e2e runner`);
|
|
189
|
+
}
|
|
190
|
+
return collector;
|
|
191
|
+
}
|
|
192
|
+
/** The runner's own source root (`src/` or `dist/`), whose frames are never a test's location. */
|
|
193
|
+
const RUNNER_ROOT = `${path.dirname(path.dirname(fileURLToPath(import.meta.url)))}${path.sep}`;
|
|
194
|
+
function captureSource() {
|
|
195
|
+
const stack = new Error().stack;
|
|
196
|
+
if (stack === undefined)
|
|
197
|
+
return undefined;
|
|
198
|
+
const lines = stack.split('\n').slice(1);
|
|
199
|
+
for (const line of lines) {
|
|
200
|
+
const match = /\(?(?:file:\/\/)?([^()\s]+?):(\d+):(\d+)\)?$/.exec(line.trim());
|
|
201
|
+
if (match === null)
|
|
202
|
+
continue;
|
|
203
|
+
const file = decodeURIComponent(match[1]);
|
|
204
|
+
if (file.startsWith(RUNNER_ROOT) || file.startsWith('node:'))
|
|
205
|
+
continue;
|
|
206
|
+
return { file, line: Number(match[2]), column: Number(match[3]) };
|
|
207
|
+
}
|
|
208
|
+
return undefined;
|
|
209
|
+
}
|
|
210
|
+
function normalizeArgs(optionsOrFn, maybeFn) {
|
|
211
|
+
if (typeof optionsOrFn === 'function') {
|
|
212
|
+
return { options: {}, fn: optionsOrFn };
|
|
213
|
+
}
|
|
214
|
+
if (maybeFn === undefined)
|
|
215
|
+
throw new CollectionError('test body function is required');
|
|
216
|
+
return { options: optionsOrFn, fn: maybeFn };
|
|
217
|
+
}
|
|
218
|
+
const testFunction = (title, optionsOrFn, maybeFn) => {
|
|
219
|
+
const { options, fn } = normalizeArgs(optionsOrFn, maybeFn);
|
|
220
|
+
const mode = options.only === true ? 'only' : options.skip !== undefined && options.skip !== false ? 'skip' : 'normal';
|
|
221
|
+
return requireCollector('test()').registerTest('test', mode, title, options, [], fn);
|
|
222
|
+
};
|
|
223
|
+
export const test = Object.assign(testFunction, {
|
|
224
|
+
skip(title, fn) {
|
|
225
|
+
return requireCollector('test.skip()').registerTest('test', 'skip', title, { skip: true }, [], fn);
|
|
226
|
+
},
|
|
227
|
+
only(title, fn) {
|
|
228
|
+
return requireCollector('test.only()').registerTest('test', 'only', title, { only: true }, [], fn);
|
|
229
|
+
},
|
|
230
|
+
setup(title, options, fn) {
|
|
231
|
+
if (options === undefined || !Array.isArray(options.sessions)) {
|
|
232
|
+
throw new CollectionError('test.setup() requires a static sessions list');
|
|
233
|
+
}
|
|
234
|
+
const { sessions, ...rest } = options;
|
|
235
|
+
return requireCollector('test.setup()').registerTest('setup', 'normal', title, rest, sessions, fn);
|
|
236
|
+
},
|
|
237
|
+
describe(title, optionsOrBody, maybeBody) {
|
|
238
|
+
const options = typeof optionsOrBody === 'function' ? {} : optionsOrBody;
|
|
239
|
+
const body = typeof optionsOrBody === 'function' ? optionsOrBody : maybeBody;
|
|
240
|
+
if (body === undefined)
|
|
241
|
+
throw new CollectionError('describe body function is required');
|
|
242
|
+
requireCollector('test.describe()').registerDescribe(title, options, body);
|
|
243
|
+
},
|
|
244
|
+
beforeEach(fn) {
|
|
245
|
+
requireCollector('test.beforeEach()').registerHook('beforeEach', fn);
|
|
246
|
+
},
|
|
247
|
+
afterEach(fn) {
|
|
248
|
+
requireCollector('test.afterEach()').registerHook('afterEach', fn);
|
|
249
|
+
},
|
|
250
|
+
beforeAll(fn) {
|
|
251
|
+
requireCollector('test.beforeAll()').registerHook('beforeAll', fn);
|
|
252
|
+
},
|
|
253
|
+
afterAll(fn) {
|
|
254
|
+
requireCollector('test.afterAll()').registerHook('afterAll', fn);
|
|
255
|
+
},
|
|
256
|
+
// Type-only refinement: contributed fixtures are resolved from the backend
|
|
257
|
+
// at runtime, so the same test object serves every fixture shape.
|
|
258
|
+
extend() {
|
|
259
|
+
return test;
|
|
260
|
+
},
|
|
261
|
+
});
|
|
262
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/collect/registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/** Option resolution and test-target selection (spec 11-lifecycle.md). */
|
|
2
|
+
import type { ResolvedConfig, ResolvedTarget } from '../config/resolve.ts';
|
|
3
|
+
import type { Capability, Platform } from '../types.ts';
|
|
4
|
+
import type { Collection, CollectedTest } from './collect.ts';
|
|
5
|
+
export interface ResolvedTestOptions {
|
|
6
|
+
readonly timeout: number;
|
|
7
|
+
readonly retries: number;
|
|
8
|
+
readonly tags: readonly string[];
|
|
9
|
+
readonly platforms: readonly Platform[] | undefined;
|
|
10
|
+
readonly requires: readonly Capability[];
|
|
11
|
+
readonly session: string | undefined;
|
|
12
|
+
readonly agentContext: string | undefined;
|
|
13
|
+
readonly skipReason: string | undefined;
|
|
14
|
+
readonly serial: boolean;
|
|
15
|
+
}
|
|
16
|
+
export interface SkipInfo {
|
|
17
|
+
readonly cause: 'explicit' | 'filtered' | 'platform-unavailable' | 'capability-unavailable' | 'setup-failed' | 'serial-predecessor-failed' | 'hook-failed' | 'infrastructure-unavailable';
|
|
18
|
+
readonly reason: string;
|
|
19
|
+
readonly relatedId?: string;
|
|
20
|
+
}
|
|
21
|
+
export interface TestTargetPair {
|
|
22
|
+
readonly test: CollectedTest;
|
|
23
|
+
readonly target: ResolvedTarget;
|
|
24
|
+
readonly options: ResolvedTestOptions;
|
|
25
|
+
/** run: execute; skip: report skipped; filtered: report as unselected. */
|
|
26
|
+
readonly disposition: 'run' | 'skip' | 'filtered';
|
|
27
|
+
readonly skip: SkipInfo | undefined;
|
|
28
|
+
}
|
|
29
|
+
/** All pairs for one selected target, in report order. */
|
|
30
|
+
export interface TargetSelection {
|
|
31
|
+
readonly target: ResolvedTarget;
|
|
32
|
+
readonly pairs: readonly TestTargetPair[];
|
|
33
|
+
}
|
|
34
|
+
export interface Selection {
|
|
35
|
+
/** Every pair across all selected targets, in report order. */
|
|
36
|
+
readonly pairs: readonly TestTargetPair[];
|
|
37
|
+
/** Selected targets with their pairs, in config order. */
|
|
38
|
+
readonly perTarget: readonly TargetSelection[];
|
|
39
|
+
}
|
|
40
|
+
export interface SelectionFilters {
|
|
41
|
+
readonly tags?: readonly string[];
|
|
42
|
+
readonly tagMode?: 'any' | 'all';
|
|
43
|
+
readonly targetIds?: readonly string[];
|
|
44
|
+
}
|
|
45
|
+
/** Resolves effective options: test > nearest group > outer groups > config > default. */
|
|
46
|
+
export declare function resolveOptions(test: CollectedTest, config: ResolvedConfig): ResolvedTestOptions;
|
|
47
|
+
/**
|
|
48
|
+
* Expands the collection into test-target pairs and applies focus, tag,
|
|
49
|
+
* platform, capability, session, and serial-closure rules.
|
|
50
|
+
*/
|
|
51
|
+
export declare function select(collection: Collection, config: ResolvedConfig, filters?: SelectionFilters, flags?: {
|
|
52
|
+
passWithNoTests?: boolean;
|
|
53
|
+
}): Selection;
|
|
54
|
+
//# sourceMappingURL=select.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"select.d.ts","sourceRoot":"","sources":["../../src/collect/select.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAG1E,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3E,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAG9D,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,QAAQ,CAAC,SAAS,EAAE,SAAS,QAAQ,EAAE,GAAG,SAAS,CAAC;IACpD,QAAQ,CAAC,QAAQ,EAAE,SAAS,UAAU,EAAE,CAAC;IACzC,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1C,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;IACxC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,KAAK,EACV,UAAU,GACV,UAAU,GACV,sBAAsB,GACtB,wBAAwB,GACxB,cAAc,GACd,2BAA2B,GAC3B,aAAa,GACb,4BAA4B,CAAC;IACjC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAChC,QAAQ,CAAC,OAAO,EAAE,mBAAmB,CAAC;IACtC,0EAA0E;IAC1E,QAAQ,CAAC,WAAW,EAAE,KAAK,GAAG,MAAM,GAAG,UAAU,CAAC;IAClD,QAAQ,CAAC,IAAI,EAAE,QAAQ,GAAG,SAAS,CAAC;CACrC;AAED,0DAA0D;AAC1D,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAChC,QAAQ,CAAC,KAAK,EAAE,SAAS,cAAc,EAAE,CAAC;CAC3C;AAED,MAAM,WAAW,SAAS;IACxB,+DAA+D;IAC/D,QAAQ,CAAC,KAAK,EAAE,SAAS,cAAc,EAAE,CAAC;IAC1C,0DAA0D;IAC1D,QAAQ,CAAC,SAAS,EAAE,SAAS,eAAe,EAAE,CAAC;CAChD;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,OAAO,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC;IACjC,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACxC;AAED,0FAA0F;AAC1F,wBAAgB,cAAc,CAAC,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,cAAc,GAAG,mBAAmB,CA+C/F;AAYD;;;GAGG;AACH,wBAAgB,MAAM,CACpB,UAAU,EAAE,UAAU,EACtB,MAAM,EAAE,cAAc,EACtB,OAAO,GAAE,gBAAqB,EAC9B,KAAK,GAAE;IAAE,eAAe,CAAC,EAAE,OAAO,CAAA;CAAO,GACxC,SAAS,CAyDX"}
|