@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,500 @@
|
|
|
1
|
+
/** Config validation, defaults, and resolution (spec 05-config.md). */
|
|
2
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
3
|
+
import os from 'node:os';
|
|
4
|
+
import path from 'node:path';
|
|
5
|
+
import { ConfigurationError } from '../internal/errors.js';
|
|
6
|
+
import { canonicalDigest, sha256Hex } from '../internal/ids.js';
|
|
7
|
+
import { isImplicitTestHost, normalizeBaseUrl } from '../internal/urls.js';
|
|
8
|
+
import { isStepExecutor } from '../agent/executor.js';
|
|
9
|
+
import { boundedInt, positiveInt } from './validate.js';
|
|
10
|
+
import { isBackendHandle } from '../backend/index.js';
|
|
11
|
+
import { isModelInstance, resolveAgentConfig, resolveLimits, } from './agent.js';
|
|
12
|
+
const TARGET_NAME_PATTERN = /^[A-Za-z0-9_.-]+$/;
|
|
13
|
+
const TARGET_KEYS = new Set(['name', 'platform', 'backend']);
|
|
14
|
+
const TOP_LEVEL_KEYS = new Set([
|
|
15
|
+
'specVersion',
|
|
16
|
+
'projectId',
|
|
17
|
+
'app',
|
|
18
|
+
'targets',
|
|
19
|
+
'tests',
|
|
20
|
+
'timeout',
|
|
21
|
+
'launchTimeout',
|
|
22
|
+
'actionTimeout',
|
|
23
|
+
'assertionTimeout',
|
|
24
|
+
'cleanupTimeout',
|
|
25
|
+
'retries',
|
|
26
|
+
'workers',
|
|
27
|
+
'artifacts',
|
|
28
|
+
'reporters',
|
|
29
|
+
'screen',
|
|
30
|
+
'agent',
|
|
31
|
+
'cache',
|
|
32
|
+
'limits',
|
|
33
|
+
'credentials',
|
|
34
|
+
]);
|
|
35
|
+
const CACHE_KEYS = new Set(['mode', 'store', 'dir']);
|
|
36
|
+
const CACHE_MODES = new Set(['off', 'read-only', 'read-write']);
|
|
37
|
+
const APP_KEYS = new Set([
|
|
38
|
+
'url',
|
|
39
|
+
'command',
|
|
40
|
+
'readyUrl',
|
|
41
|
+
'allowedOrigins',
|
|
42
|
+
'environment',
|
|
43
|
+
'allowProduction',
|
|
44
|
+
'identity',
|
|
45
|
+
]);
|
|
46
|
+
/** True when CI mode is active per 05-config.md. */
|
|
47
|
+
export function isCiMode(env = process.env) {
|
|
48
|
+
const raw = env['CI'];
|
|
49
|
+
if (raw === undefined)
|
|
50
|
+
return false;
|
|
51
|
+
const value = raw.trim().toLowerCase();
|
|
52
|
+
return value !== '' && value !== '0' && value !== 'false';
|
|
53
|
+
}
|
|
54
|
+
/** Resolves a raw config object plus environment into an immutable resolved config. */
|
|
55
|
+
export function resolveConfig(raw, options) {
|
|
56
|
+
const env = options.env ?? process.env;
|
|
57
|
+
const cli = options.cli ?? {};
|
|
58
|
+
const ci = isCiMode(env);
|
|
59
|
+
if (typeof raw !== 'object' || raw === null || Array.isArray(raw)) {
|
|
60
|
+
throw new ConfigurationError('INVALID_CONFIG', 'config must be an object');
|
|
61
|
+
}
|
|
62
|
+
for (const key of Object.keys(raw)) {
|
|
63
|
+
if (!TOP_LEVEL_KEYS.has(key)) {
|
|
64
|
+
throw new ConfigurationError('INVALID_CONFIG', `unknown config key "${key}"`);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
if (raw.specVersion !== undefined && raw.specVersion !== '0.1') {
|
|
68
|
+
throw new ConfigurationError('INVALID_CONFIG', `unsupported specVersion ${JSON.stringify(raw.specVersion)}; this runner implements 0.1`);
|
|
69
|
+
}
|
|
70
|
+
const targets = resolveTargets(raw);
|
|
71
|
+
const app = resolveApp(raw, env);
|
|
72
|
+
const tests = normalizeTests(raw.tests);
|
|
73
|
+
const timeout = positiveInt(raw.timeout, 'timeout') ?? 120_000;
|
|
74
|
+
const launchTimeout = positiveInt(raw.launchTimeout, 'launchTimeout') ?? 60_000;
|
|
75
|
+
const actionTimeout = positiveInt(raw.actionTimeout, 'actionTimeout') ?? 30_000;
|
|
76
|
+
const assertionTimeout = positiveInt(raw.assertionTimeout, 'assertionTimeout') ?? 5_000;
|
|
77
|
+
const cleanupTimeout = positiveInt(raw.cleanupTimeout, 'cleanupTimeout') ?? 30_000;
|
|
78
|
+
// CLI overrides obey the same bounds as the config keys they replace: a
|
|
79
|
+
// `--workers 0` would otherwise plan work no worker can ever take.
|
|
80
|
+
const retries = boundedInt(cli.retries, '--retries', 0, 10) ??
|
|
81
|
+
boundedInt(raw.retries, 'retries', 0, 10) ??
|
|
82
|
+
(ci ? 1 : 0);
|
|
83
|
+
const workers = boundedInt(cli.workers, '--workers', 1, 1024) ??
|
|
84
|
+
boundedInt(raw.workers, 'workers', 1, 1024) ??
|
|
85
|
+
(ci ? 1 : Math.max(1, Math.floor(os.availableParallelism() / 2)));
|
|
86
|
+
const { artifacts, artifactsExplicit, artifactStore } = resolveArtifactsConfig(raw);
|
|
87
|
+
const reporters = cli.reporters ?? raw.reporters ?? ['list'];
|
|
88
|
+
if (!Array.isArray(reporters)) {
|
|
89
|
+
throw new ConfigurationError('INVALID_CONFIG', 'reporters must be an array of reporter ids');
|
|
90
|
+
}
|
|
91
|
+
for (const reporter of reporters) {
|
|
92
|
+
if (!['list', 'json'].includes(reporter)) {
|
|
93
|
+
throw new ConfigurationError('INVALID_CONFIG', `unknown reporter "${reporter}"`);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
if (reporters.includes('json') && reporters.includes('list')) {
|
|
97
|
+
throw new ConfigurationError('INVALID_CONFIG', 'the json renderer cannot be combined with list');
|
|
98
|
+
}
|
|
99
|
+
const testIdAttribute = raw.screen?.testIdAttribute ?? 'data-testid';
|
|
100
|
+
const projectId = resolveProjectId(raw.projectId, options.projectRoot);
|
|
101
|
+
const credentials = resolveCredentials(raw, env);
|
|
102
|
+
// Limits first: the agent context budget is a limits key, and the resolved
|
|
103
|
+
// observation budget is agent-owned, so the dependency runs one way.
|
|
104
|
+
const baseLimits = resolveLimits(raw);
|
|
105
|
+
const agent = resolveAgentConfig(raw, env, ci, baseLimits);
|
|
106
|
+
const limits = { ...baseLimits, maxObservationBytes: agent.maxObservationBytes };
|
|
107
|
+
const cache = resolveCacheConfig(raw, ci, options.projectRoot, cli.cache);
|
|
108
|
+
const resolved = {
|
|
109
|
+
specVersion: '0.1',
|
|
110
|
+
projectId,
|
|
111
|
+
projectRoot: options.projectRoot,
|
|
112
|
+
configPath: options.configPath,
|
|
113
|
+
ci,
|
|
114
|
+
app,
|
|
115
|
+
targets,
|
|
116
|
+
tests,
|
|
117
|
+
timeout,
|
|
118
|
+
launchTimeout,
|
|
119
|
+
actionTimeout,
|
|
120
|
+
assertionTimeout,
|
|
121
|
+
cleanupTimeout,
|
|
122
|
+
retries,
|
|
123
|
+
workers,
|
|
124
|
+
artifacts,
|
|
125
|
+
artifactsExplicit,
|
|
126
|
+
artifactStore,
|
|
127
|
+
reporters,
|
|
128
|
+
testIdAttribute,
|
|
129
|
+
agent,
|
|
130
|
+
cache,
|
|
131
|
+
limits,
|
|
132
|
+
credentials,
|
|
133
|
+
configDigest: computeConfigDigest(raw, projectId),
|
|
134
|
+
};
|
|
135
|
+
return resolved;
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Resolves the `cache` key. The cache is opt-out: an unset key means
|
|
139
|
+
* `read-write`, so a project earns replay speed without asking for it, and
|
|
140
|
+
* `cache: 'off'` or `--no-cache` (which wins over the config) turns it off.
|
|
141
|
+
* CI forces the default file store from `read-write` down to `read-only`:
|
|
142
|
+
* committed caches are untrusted input, and a CI run never publishes what it
|
|
143
|
+
* learned (spec 10-determinism.md). A host-supplied `cache.store` is exempt —
|
|
144
|
+
* it is not a committed file cache, and the host states its own trust through
|
|
145
|
+
* the store's `writable` flag.
|
|
146
|
+
*/
|
|
147
|
+
function resolveCacheConfig(raw, ci, projectRoot, cliMode) {
|
|
148
|
+
const value = raw.cache;
|
|
149
|
+
let mode = 'read-write';
|
|
150
|
+
let store;
|
|
151
|
+
let dir;
|
|
152
|
+
if (typeof value === 'string') {
|
|
153
|
+
mode = value;
|
|
154
|
+
}
|
|
155
|
+
else if (value !== undefined) {
|
|
156
|
+
if (typeof value !== 'object' || value === null || Array.isArray(value)) {
|
|
157
|
+
throw new ConfigurationError('INVALID_CONFIG', "cache must be 'off', 'read-only', 'read-write', or an options object");
|
|
158
|
+
}
|
|
159
|
+
for (const key of Object.keys(value)) {
|
|
160
|
+
if (!CACHE_KEYS.has(key)) {
|
|
161
|
+
throw new ConfigurationError('INVALID_CONFIG', `unknown cache config key "${key}"`);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
mode = value.mode ?? 'read-write';
|
|
165
|
+
store = value.store;
|
|
166
|
+
if (store !== undefined && !isTraceCacheStore(store)) {
|
|
167
|
+
throw new ConfigurationError('INVALID_CONFIG', 'cache.store must implement TraceCacheStore: { writable, read(keyHash), write(keyHash, payload) }');
|
|
168
|
+
}
|
|
169
|
+
if (value.dir !== undefined) {
|
|
170
|
+
if (typeof value.dir !== 'string' || value.dir.trim() === '') {
|
|
171
|
+
throw new ConfigurationError('INVALID_CONFIG', 'cache.dir must be a non-empty path');
|
|
172
|
+
}
|
|
173
|
+
dir = value.dir;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
if (!CACHE_MODES.has(mode)) {
|
|
177
|
+
throw new ConfigurationError('INVALID_CONFIG', `cache mode must be 'off', 'read-only', or 'read-write', got ${JSON.stringify(mode)}`);
|
|
178
|
+
}
|
|
179
|
+
if (cliMode !== undefined)
|
|
180
|
+
mode = cliMode;
|
|
181
|
+
if (ci && mode === 'read-write' && store === undefined)
|
|
182
|
+
mode = 'read-only';
|
|
183
|
+
return {
|
|
184
|
+
mode,
|
|
185
|
+
store,
|
|
186
|
+
dir: path.resolve(projectRoot, dir ?? path.join('.e2e', 'cache')),
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
const ARTIFACT_KINDS = ['screenshot', 'trace'];
|
|
190
|
+
const ARTIFACTS_KEYS = new Set(['kinds', 'store']);
|
|
191
|
+
/**
|
|
192
|
+
* Resolves the `artifacts` key: a bare array of kinds, or `{ kinds, store }`
|
|
193
|
+
* where `store` is the host seam every produced artifact is handed to
|
|
194
|
+
* (spec 13-reporting.md). Kinds default to screenshot and trace; a store is a
|
|
195
|
+
* live value validated structurally, like `cache.store`.
|
|
196
|
+
*/
|
|
197
|
+
function resolveArtifactsConfig(raw) {
|
|
198
|
+
const value = raw.artifacts;
|
|
199
|
+
let kinds = value;
|
|
200
|
+
let store;
|
|
201
|
+
if (value !== undefined && !Array.isArray(value)) {
|
|
202
|
+
if (!isArtifactsObject(value)) {
|
|
203
|
+
throw new ConfigurationError('INVALID_CONFIG', 'artifacts must be an array of artifact kinds or { kinds, store }');
|
|
204
|
+
}
|
|
205
|
+
for (const key of Object.keys(value)) {
|
|
206
|
+
if (!ARTIFACTS_KEYS.has(key)) {
|
|
207
|
+
throw new ConfigurationError('INVALID_CONFIG', `unknown artifacts config key "${key}"`);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
kinds = value.kinds;
|
|
211
|
+
store = value.store;
|
|
212
|
+
if (store !== undefined && !isArtifactStore(store)) {
|
|
213
|
+
throw new ConfigurationError('INVALID_CONFIG', 'artifacts.store must implement ArtifactStore: { put(artifact) }');
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
const explicit = kinds !== undefined;
|
|
217
|
+
const resolved = (kinds ?? ARTIFACT_KINDS);
|
|
218
|
+
if (!Array.isArray(resolved)) {
|
|
219
|
+
throw new ConfigurationError('INVALID_CONFIG', 'artifacts kinds must be an array of artifact kinds');
|
|
220
|
+
}
|
|
221
|
+
for (const artifact of resolved) {
|
|
222
|
+
if (!ARTIFACT_KINDS.includes(artifact)) {
|
|
223
|
+
throw new ConfigurationError('INVALID_CONFIG', `unknown artifact kind "${String(artifact)}"`);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
return {
|
|
227
|
+
artifacts: resolved,
|
|
228
|
+
artifactsExplicit: explicit,
|
|
229
|
+
artifactStore: store,
|
|
230
|
+
};
|
|
231
|
+
}
|
|
232
|
+
/** The `{ kinds, store }` form, as opposed to the bare kinds array. */
|
|
233
|
+
function isArtifactsObject(value) {
|
|
234
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
235
|
+
}
|
|
236
|
+
function isArtifactStore(value) {
|
|
237
|
+
return (typeof value === 'object' &&
|
|
238
|
+
value !== null &&
|
|
239
|
+
typeof value.put === 'function');
|
|
240
|
+
}
|
|
241
|
+
/** Structural store check, mirroring how executors and models are detected. */
|
|
242
|
+
function isTraceCacheStore(value) {
|
|
243
|
+
if (typeof value !== 'object' || value === null)
|
|
244
|
+
return false;
|
|
245
|
+
const candidate = value;
|
|
246
|
+
return (typeof candidate['writable'] === 'boolean' &&
|
|
247
|
+
typeof candidate['read'] === 'function' &&
|
|
248
|
+
typeof candidate['write'] === 'function');
|
|
249
|
+
}
|
|
250
|
+
function resolveApp(raw, env) {
|
|
251
|
+
if (raw.app !== undefined) {
|
|
252
|
+
for (const key of Object.keys(raw.app)) {
|
|
253
|
+
if (!APP_KEYS.has(key)) {
|
|
254
|
+
throw new ConfigurationError('INVALID_CONFIG', `unknown app config key "${key}"`);
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
const rawUrl = raw.app?.url ?? env['APP_URL'];
|
|
259
|
+
if (rawUrl === undefined || rawUrl === '') {
|
|
260
|
+
// Not every surface has an app URL to point at (a device, a desktop
|
|
261
|
+
// shell): a synthetic loopback base keeps navigation resolution and
|
|
262
|
+
// identity digests defined, and `app.open()` fails loud with
|
|
263
|
+
// APP_URL_REQUIRED the moment a test actually needs one. A configured
|
|
264
|
+
// app command without a URL is still a mistake worth failing early on.
|
|
265
|
+
const orphaned = Object.keys(raw.app ?? {}).filter((key) => key !== 'command' && key !== 'url');
|
|
266
|
+
if (orphaned.length > 0) {
|
|
267
|
+
throw new ConfigurationError('INVALID_CONFIG', `app.${orphaned[0]} requires app.url: set app.url in e2e.config.ts or the APP_URL environment variable`);
|
|
268
|
+
}
|
|
269
|
+
if (raw.app?.command === undefined) {
|
|
270
|
+
return {
|
|
271
|
+
configured: false,
|
|
272
|
+
base: normalizeBaseUrl('http://127.0.0.1:1'),
|
|
273
|
+
readyUrl: 'http://127.0.0.1:1/',
|
|
274
|
+
allowedOrigins: [],
|
|
275
|
+
environment: 'test',
|
|
276
|
+
allowProduction: false,
|
|
277
|
+
command: undefined,
|
|
278
|
+
identity: undefined,
|
|
279
|
+
};
|
|
280
|
+
}
|
|
281
|
+
throw new ConfigurationError('APP_URL_REQUIRED', 'an app URL is required alongside app.command: set app.url in e2e.config.ts or the APP_URL environment variable');
|
|
282
|
+
}
|
|
283
|
+
const base = normalizeBaseUrl(rawUrl);
|
|
284
|
+
const baseHost = new URL(base.href).hostname;
|
|
285
|
+
let environment = raw.app?.environment;
|
|
286
|
+
if (environment === undefined) {
|
|
287
|
+
if (!isImplicitTestHost(baseHost)) {
|
|
288
|
+
throw new ConfigurationError('ENVIRONMENT_REQUIRED', `host ${baseHost} requires an explicit app.environment of "test", "staging", or "production"`);
|
|
289
|
+
}
|
|
290
|
+
environment = 'test';
|
|
291
|
+
}
|
|
292
|
+
if (!['test', 'staging', 'production'].includes(environment)) {
|
|
293
|
+
throw new ConfigurationError('INVALID_CONFIG', `invalid app.environment "${environment}"`);
|
|
294
|
+
}
|
|
295
|
+
const allowProduction = raw.app?.allowProduction ?? false;
|
|
296
|
+
if (environment === 'production' && !allowProduction) {
|
|
297
|
+
throw new ConfigurationError('PRODUCTION_NOT_ALLOWED', 'a production target is rejected unless allowProduction: true');
|
|
298
|
+
}
|
|
299
|
+
const allowedOrigins = raw.app?.allowedOrigins ?? [base.origin];
|
|
300
|
+
for (const origin of allowedOrigins) {
|
|
301
|
+
let parsed;
|
|
302
|
+
try {
|
|
303
|
+
parsed = new URL(origin);
|
|
304
|
+
}
|
|
305
|
+
catch {
|
|
306
|
+
throw new ConfigurationError('INVALID_CONFIG', `invalid allowed origin: ${origin}`);
|
|
307
|
+
}
|
|
308
|
+
if (parsed.origin !== origin) {
|
|
309
|
+
throw new ConfigurationError('INVALID_CONFIG', `allowed origin must be a serialized origin, got ${origin} (expected ${parsed.origin})`);
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
const command = raw.app?.command;
|
|
313
|
+
if (command !== undefined) {
|
|
314
|
+
if (typeof command.executable !== 'string' || command.executable.length === 0) {
|
|
315
|
+
throw new ConfigurationError('INVALID_CONFIG', 'app.command.executable is required');
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
const identity = raw.app?.identity;
|
|
319
|
+
if (identity !== undefined && (typeof identity !== 'string' || identity.trim() === '')) {
|
|
320
|
+
throw new ConfigurationError('INVALID_CONFIG', 'app.identity must be a non-empty string');
|
|
321
|
+
}
|
|
322
|
+
return {
|
|
323
|
+
configured: true,
|
|
324
|
+
base,
|
|
325
|
+
readyUrl: raw.app?.readyUrl ?? base.href,
|
|
326
|
+
allowedOrigins,
|
|
327
|
+
environment,
|
|
328
|
+
allowProduction,
|
|
329
|
+
command,
|
|
330
|
+
identity,
|
|
331
|
+
};
|
|
332
|
+
}
|
|
333
|
+
function resolveTargets(raw) {
|
|
334
|
+
if (raw.targets === undefined) {
|
|
335
|
+
throw new ConfigurationError('INVALID_CONFIG', 'targets is required: declare at least one target and the backend that drives it, ' +
|
|
336
|
+
'e.g. targets: [{ name, platform, backend }]');
|
|
337
|
+
}
|
|
338
|
+
if (!Array.isArray(raw.targets) || raw.targets.length === 0) {
|
|
339
|
+
throw new ConfigurationError('INVALID_CONFIG', 'targets must be a non-empty array');
|
|
340
|
+
}
|
|
341
|
+
const seen = new Set();
|
|
342
|
+
return raw.targets.map((target, index) => {
|
|
343
|
+
if (typeof target.name !== 'string' || !TARGET_NAME_PATTERN.test(target.name)) {
|
|
344
|
+
throw new ConfigurationError('INVALID_CONFIG', `target names are required and limited to ASCII letters, numbers, "_", "-", and "."`);
|
|
345
|
+
}
|
|
346
|
+
if (seen.has(target.name)) {
|
|
347
|
+
throw new ConfigurationError('INVALID_CONFIG', `duplicate target name "${target.name}"`);
|
|
348
|
+
}
|
|
349
|
+
seen.add(target.name);
|
|
350
|
+
for (const key of Object.keys(target)) {
|
|
351
|
+
if (!TARGET_KEYS.has(key)) {
|
|
352
|
+
throw new ConfigurationError('INVALID_CONFIG', `target "${target.name}" has unknown key "${key}"; a target is { name, platform, backend? }`);
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
if (typeof target.platform !== 'string' || target.platform.trim() === '') {
|
|
356
|
+
throw new ConfigurationError('INVALID_CONFIG', `target "${target.name}" requires a non-empty platform`);
|
|
357
|
+
}
|
|
358
|
+
if (target.backend !== undefined && !isBackendHandle(target.backend)) {
|
|
359
|
+
throw new ConfigurationError('INVALID_CONFIG', `target "${target.name}" backend must be a defineBackend(...) handle`);
|
|
360
|
+
}
|
|
361
|
+
return {
|
|
362
|
+
name: target.name,
|
|
363
|
+
index,
|
|
364
|
+
platform: target.platform,
|
|
365
|
+
backend: target.backend,
|
|
366
|
+
};
|
|
367
|
+
});
|
|
368
|
+
}
|
|
369
|
+
function normalizeTests(tests) {
|
|
370
|
+
const list = tests === undefined ? ['tests/**/*.e2e.ts'] : typeof tests === 'string' ? [tests] : tests;
|
|
371
|
+
if (list.length === 0) {
|
|
372
|
+
throw new ConfigurationError('INVALID_CONFIG', 'tests must not be empty');
|
|
373
|
+
}
|
|
374
|
+
return [...new Set(list)];
|
|
375
|
+
}
|
|
376
|
+
function resolveProjectId(explicit, projectRoot) {
|
|
377
|
+
if (explicit !== undefined) {
|
|
378
|
+
if (explicit.length === 0 || explicit.length > 256) {
|
|
379
|
+
throw new ConfigurationError('INVALID_CONFIG', 'projectId must be 1 through 256 characters');
|
|
380
|
+
}
|
|
381
|
+
return explicit;
|
|
382
|
+
}
|
|
383
|
+
const packageJsonPath = path.join(projectRoot, 'package.json');
|
|
384
|
+
if (existsSync(packageJsonPath)) {
|
|
385
|
+
try {
|
|
386
|
+
const parsed = JSON.parse(readFileSync(packageJsonPath, 'utf8'));
|
|
387
|
+
if (typeof parsed.name === 'string' && parsed.name.length > 0)
|
|
388
|
+
return parsed.name;
|
|
389
|
+
}
|
|
390
|
+
catch {
|
|
391
|
+
// fall through to hashed identity
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
return `unportable-${sha256Hex(projectRoot).slice(0, 32)}`;
|
|
395
|
+
}
|
|
396
|
+
function resolveCredentials(raw, env) {
|
|
397
|
+
const resolved = new Map();
|
|
398
|
+
for (const [name, credential] of Object.entries(raw.credentials ?? {})) {
|
|
399
|
+
const envPrefix = `E2E_USER_${name.toUpperCase().replaceAll(/[^A-Z0-9]/g, '_')}`;
|
|
400
|
+
const username = env[`${envPrefix}_USERNAME`] ?? credential.username;
|
|
401
|
+
// An env override always wins, including over a provider: the operator
|
|
402
|
+
// rotating a credential must not need to know how it was configured.
|
|
403
|
+
const password = env[`${envPrefix}_PASSWORD`] ?? credential.password;
|
|
404
|
+
if ((typeof password !== 'string' && typeof password !== 'function') || password === '') {
|
|
405
|
+
throw new ConfigurationError('INVALID_CONFIG', `credential "${name}" password must be a non-empty string or a provider function`);
|
|
406
|
+
}
|
|
407
|
+
resolved.set(name, {
|
|
408
|
+
name,
|
|
409
|
+
username,
|
|
410
|
+
password,
|
|
411
|
+
allowedOrigins: credential.allowedOrigins,
|
|
412
|
+
});
|
|
413
|
+
}
|
|
414
|
+
return resolved;
|
|
415
|
+
}
|
|
416
|
+
/**
|
|
417
|
+
* SHA-256/JCS digest of resolved config after replacing credential material
|
|
418
|
+
* with `{ secretName }` and env values with `{ envName }` (13-reporting.md).
|
|
419
|
+
* Live objects (backend handles, model instances) are replaced by their stable
|
|
420
|
+
* identity before the JSON clone, so they never enter the digest and cannot
|
|
421
|
+
* make it nondeterministic across processes.
|
|
422
|
+
*/
|
|
423
|
+
/** The digest-stable identity of a live model instance. */
|
|
424
|
+
function modelIdentity(model) {
|
|
425
|
+
return {
|
|
426
|
+
provider: model.provider,
|
|
427
|
+
modelId: model.modelId,
|
|
428
|
+
specificationVersion: model.specificationVersion,
|
|
429
|
+
};
|
|
430
|
+
}
|
|
431
|
+
function computeConfigDigest(raw, projectId) {
|
|
432
|
+
// `agent` may be the executor itself; its digest identity is name/version,
|
|
433
|
+
// which is exactly what survives the function-stripping JSON clone below.
|
|
434
|
+
// Every model slot is reduced to its identity: a live instance carries
|
|
435
|
+
// provider settings (and possibly credentials) that must never be digested.
|
|
436
|
+
const rawAgent = raw.agent;
|
|
437
|
+
const forClone = rawAgent === undefined || isStepExecutor(rawAgent)
|
|
438
|
+
? raw
|
|
439
|
+
: {
|
|
440
|
+
...raw,
|
|
441
|
+
agent: {
|
|
442
|
+
...rawAgent,
|
|
443
|
+
...(isModelInstance(rawAgent.model) ? { model: modelIdentity(rawAgent.model) } : {}),
|
|
444
|
+
...(isModelInstance(rawAgent.visionModel)
|
|
445
|
+
? { visionModel: modelIdentity(rawAgent.visionModel) }
|
|
446
|
+
: {}),
|
|
447
|
+
},
|
|
448
|
+
};
|
|
449
|
+
const sanitized = {
|
|
450
|
+
...structuredCloneJsonSafe(forClone),
|
|
451
|
+
projectId,
|
|
452
|
+
};
|
|
453
|
+
// An artifact store is a live value: only the kinds are configuration, so
|
|
454
|
+
// the array and object forms digest identically and a host store never
|
|
455
|
+
// enters the digest.
|
|
456
|
+
if (isArtifactsObject(raw.artifacts)) {
|
|
457
|
+
sanitized['artifacts'] = raw.artifacts.kinds ?? [...ARTIFACT_KINDS];
|
|
458
|
+
}
|
|
459
|
+
if (raw.credentials !== undefined) {
|
|
460
|
+
sanitized['credentials'] = Object.fromEntries(Object.entries(raw.credentials).map(([name, credential]) => [
|
|
461
|
+
name,
|
|
462
|
+
{
|
|
463
|
+
username: credential.username,
|
|
464
|
+
password: { secretName: name },
|
|
465
|
+
...(credential.allowedOrigins !== undefined
|
|
466
|
+
? { allowedOrigins: credential.allowedOrigins }
|
|
467
|
+
: {}),
|
|
468
|
+
},
|
|
469
|
+
]));
|
|
470
|
+
}
|
|
471
|
+
if (raw.app?.command?.env !== undefined) {
|
|
472
|
+
const app = sanitized['app'];
|
|
473
|
+
app.command.env = Object.fromEntries(Object.keys(raw.app.command.env).map((key) => [key, { envName: key }]));
|
|
474
|
+
}
|
|
475
|
+
if (raw.targets !== undefined) {
|
|
476
|
+
sanitized['targets'] = raw.targets.map((target) => {
|
|
477
|
+
// A backend handle holds live functions; its digest identity is the
|
|
478
|
+
// declaration - name, version, contract version, and capability set.
|
|
479
|
+
if (isBackendHandle(target.backend)) {
|
|
480
|
+
const { backend, ...rest } = target;
|
|
481
|
+
return {
|
|
482
|
+
...rest,
|
|
483
|
+
backend: {
|
|
484
|
+
name: backend.name,
|
|
485
|
+
...(backend.version === undefined ? {} : { version: backend.version }),
|
|
486
|
+
spiVersion: backend.spiVersion,
|
|
487
|
+
capabilities: [...backend.capabilities].toSorted(),
|
|
488
|
+
},
|
|
489
|
+
};
|
|
490
|
+
}
|
|
491
|
+
return target;
|
|
492
|
+
});
|
|
493
|
+
}
|
|
494
|
+
return canonicalDigest(sanitized);
|
|
495
|
+
}
|
|
496
|
+
function structuredCloneJsonSafe(value) {
|
|
497
|
+
return JSON.parse(JSON.stringify(value, (_key, item) => (typeof item === 'function' ? undefined : item)) ??
|
|
498
|
+
'null');
|
|
499
|
+
}
|
|
500
|
+
//# sourceMappingURL=resolve.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve.js","sourceRoot":"","sources":["../../src/config/resolve.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/** Integer validators shared by the config resolvers; one message per rule. */
|
|
2
|
+
/** A positive safe integer, or undefined when the value is absent. */
|
|
3
|
+
export declare function positiveInt(value: number | undefined, label: string): number | undefined;
|
|
4
|
+
/** A safe integer within [min, max], or undefined when the value is absent. */
|
|
5
|
+
export declare function boundedInt(value: number | undefined, label: string, min: number, max: number): number | undefined;
|
|
6
|
+
//# sourceMappingURL=validate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/config/validate.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAI/E,sEAAsE;AACtE,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAMxF;AAED,+EAA+E;AAC/E,wBAAgB,UAAU,CACxB,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,MAAM,GACV,MAAM,GAAG,SAAS,CASpB"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/** Integer validators shared by the config resolvers; one message per rule. */
|
|
2
|
+
import { ConfigurationError } from '../internal/errors.js';
|
|
3
|
+
/** A positive safe integer, or undefined when the value is absent. */
|
|
4
|
+
export function positiveInt(value, label) {
|
|
5
|
+
if (value === undefined)
|
|
6
|
+
return undefined;
|
|
7
|
+
if (!Number.isSafeInteger(value) || value <= 0) {
|
|
8
|
+
throw new ConfigurationError('INVALID_CONFIG', `${label} must be a positive safe integer`);
|
|
9
|
+
}
|
|
10
|
+
return value;
|
|
11
|
+
}
|
|
12
|
+
/** A safe integer within [min, max], or undefined when the value is absent. */
|
|
13
|
+
export function boundedInt(value, label, min, max) {
|
|
14
|
+
if (value === undefined)
|
|
15
|
+
return undefined;
|
|
16
|
+
if (!Number.isSafeInteger(value) || value < min || value > max) {
|
|
17
|
+
throw new ConfigurationError('INVALID_CONFIG', `${label} must be an integer from ${min} through ${max}`);
|
|
18
|
+
}
|
|
19
|
+
return value;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=validate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/config/validate.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAE/E,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAE3D,sEAAsE;AACtE,MAAM,UAAU,WAAW,CAAC,KAAyB,EAAE,KAAa;IAClE,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC1C,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;QAC/C,MAAM,IAAI,kBAAkB,CAAC,gBAAgB,EAAE,GAAG,KAAK,kCAAkC,CAAC,CAAC;IAC7F,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,UAAU,CACxB,KAAyB,EACzB,KAAa,EACb,GAAW,EACX,GAAW;IAEX,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC1C,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,GAAG,IAAI,KAAK,GAAG,GAAG,EAAE,CAAC;QAC/D,MAAM,IAAI,kBAAkB,CAC1B,gBAAgB,EAChB,GAAG,KAAK,4BAA4B,GAAG,YAAY,GAAG,EAAE,CACzD,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/** Opaque credential handles (spec 02-test-api.md, 14-security.md). */
|
|
2
|
+
import type { ResolvedCredential } from './config/resolve.ts';
|
|
3
|
+
import type { Credentials } from './types.ts';
|
|
4
|
+
/** Installed by the runner once config resolution completes. */
|
|
5
|
+
export declare function setCredentialRegistry(map: ReadonlyMap<string, ResolvedCredential> | undefined): void;
|
|
6
|
+
export declare const credentials: Credentials;
|
|
7
|
+
//# sourceMappingURL=credentials.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../src/credentials.ts"],"names":[],"mappings":"AAAA,uEAAuE;AAKvE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,KAAK,EAAc,WAAW,EAAU,MAAM,YAAY,CAAC;AAKlE,gEAAgE;AAChE,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,WAAW,CAAC,MAAM,EAAE,kBAAkB,CAAC,GAAG,SAAS,GAAG,IAAI,CAGpG;AAcD,eAAO,MAAM,WAAW,EAAE,WAuBzB,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/** Opaque credential handles (spec 02-test-api.md, 14-security.md). */
|
|
2
|
+
import { credentialBrand, secretBrand } from './internal/brands.js';
|
|
3
|
+
import { ConfigurationError } from './internal/errors.js';
|
|
4
|
+
import { realmSlot } from './internal/realm-slot.js';
|
|
5
|
+
/** Global slot so test modules in an isolated realm reach the runner's registry. */
|
|
6
|
+
const credentialsSlot = realmSlot('e2e.credentials.v1');
|
|
7
|
+
/** Installed by the runner once config resolution completes. */
|
|
8
|
+
export function setCredentialRegistry(map) {
|
|
9
|
+
if (map === undefined)
|
|
10
|
+
credentialsSlot.delete(globalThis);
|
|
11
|
+
else
|
|
12
|
+
credentialsSlot.set(globalThis, map);
|
|
13
|
+
}
|
|
14
|
+
function getRegistry() {
|
|
15
|
+
return credentialsSlot.get(globalThis);
|
|
16
|
+
}
|
|
17
|
+
function makeSecret(name) {
|
|
18
|
+
return Object.freeze({
|
|
19
|
+
name,
|
|
20
|
+
purpose: 'password',
|
|
21
|
+
[secretBrand]: true,
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
export const credentials = {
|
|
25
|
+
user(name) {
|
|
26
|
+
const registry = getRegistry();
|
|
27
|
+
if (registry === undefined) {
|
|
28
|
+
throw new ConfigurationError('AUTH_CREDENTIAL_UNAVAILABLE', 'credentials.user() is only available while the e2e runner is active');
|
|
29
|
+
}
|
|
30
|
+
const resolved = registry.get(name);
|
|
31
|
+
if (resolved === undefined) {
|
|
32
|
+
throw new ConfigurationError('AUTH_CREDENTIAL_UNAVAILABLE', `credential "${name}" is not configured; add it to config.credentials or E2E_USER_* variables`);
|
|
33
|
+
}
|
|
34
|
+
return Object.freeze({
|
|
35
|
+
name,
|
|
36
|
+
username: resolved.username,
|
|
37
|
+
password: makeSecret(name),
|
|
38
|
+
[credentialBrand]: true,
|
|
39
|
+
});
|
|
40
|
+
},
|
|
41
|
+
};
|
|
42
|
+
//# sourceMappingURL=credentials.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credentials.js","sourceRoot":"","sources":["../src/credentials.ts"],"names":[],"mappings":"AAAA,uEAAuE;AAEvE,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACpE,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAIrD,oFAAoF;AACpF,MAAM,eAAe,GAAG,SAAS,CAA0C,oBAAoB,CAAC,CAAC;AAEjG,gEAAgE;AAChE,MAAM,UAAU,qBAAqB,CAAC,GAAwD;IAC5F,IAAI,GAAG,KAAK,SAAS;QAAE,eAAe,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;;QACrD,eAAe,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;AAC5C,CAAC;AAED,SAAS,WAAW;IAClB,OAAO,eAAe,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;AACzC,CAAC;AAED,SAAS,UAAU,CAAC,IAAY;IAC9B,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,IAAI;QACJ,OAAO,EAAE,UAAmB;QAC5B,CAAC,WAAW,CAAC,EAAE,IAAa;KAC7B,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,MAAM,WAAW,GAAgB;IACtC,IAAI,CAAC,IAAY;QACf,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;QAC/B,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,MAAM,IAAI,kBAAkB,CAC1B,6BAA6B,EAC7B,qEAAqE,CACtE,CAAC;QACJ,CAAC;QACD,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACpC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,MAAM,IAAI,kBAAkB,CAC1B,6BAA6B,EAC7B,eAAe,IAAI,2EAA2E,CAC/F,CAAC;QACJ,CAAC;QACD,OAAO,MAAM,CAAC,MAAM,CAAC;YACnB,IAAI;YACJ,QAAQ,EAAE,QAAQ,CAAC,QAAQ;YAC3B,QAAQ,EAAE,UAAU,CAAC,IAAI,CAAC;YAC1B,CAAC,eAAe,CAAC,EAAE,IAAa;SACjC,CAAC,CAAC;IACL,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/** Runner-owned polling locator assertions (spec 03-assertions.md). */
|
|
2
|
+
import type { LocatorInternals } from '../locator/screen.ts';
|
|
3
|
+
import type { AsyncExpectation } from '../types.ts';
|
|
4
|
+
export declare function createAsyncExpectation(internals: LocatorInternals): AsyncExpectation;
|
|
5
|
+
//# sourceMappingURL=async.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"async.d.ts","sourceRoot":"","sources":["../../src/expect/async.ts"],"names":[],"mappings":"AAAA,uEAAuE;AAQvE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,KAAK,EAAE,gBAAgB,EAAa,MAAM,aAAa,CAAC;AA2P/D,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,gBAAgB,GAAG,gBAAgB,CAEpF"}
|