@e2edev/e2e 0.5.0 → 0.6.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/README.md +64 -25
- package/dist/agent/act.d.ts +2 -2
- package/dist/agent/act.js +14 -37
- package/dist/agent/act.js.map +1 -1
- package/dist/agent/actions.d.ts +2 -2
- package/dist/agent/actions.d.ts.map +1 -1
- package/dist/agent/actions.js +1 -1
- package/dist/agent/ai-sdk.d.ts +1 -2
- package/dist/agent/ai-sdk.d.ts.map +1 -1
- package/dist/agent/ai-sdk.js +1 -2
- package/dist/agent/ai-sdk.js.map +1 -1
- package/dist/agent/default-agent.d.ts +10 -32
- package/dist/agent/default-agent.d.ts.map +1 -1
- package/dist/agent/default-agent.js +6 -13
- package/dist/agent/default-agent.js.map +1 -1
- package/dist/agent/derived.d.ts +1 -1
- package/dist/agent/derived.js +1 -1
- package/dist/agent/error.d.ts +2 -4
- package/dist/agent/error.d.ts.map +1 -1
- package/dist/agent/error.js +3 -5
- package/dist/agent/error.js.map +1 -1
- package/dist/agent/executor.d.ts +23 -52
- package/dist/agent/executor.d.ts.map +1 -1
- package/dist/agent/executor.js +1 -2
- package/dist/agent/executor.js.map +1 -1
- package/dist/agent/index.d.ts +1 -1
- package/dist/agent/index.d.ts.map +1 -1
- package/dist/agent/index.js +10 -7
- package/dist/agent/index.js.map +1 -1
- package/dist/agent/invocation.d.ts +8 -6
- package/dist/agent/invocation.d.ts.map +1 -1
- package/dist/agent/invocation.js +9 -4
- package/dist/agent/invocation.js.map +1 -1
- package/dist/agent/ledger.d.ts +17 -12
- package/dist/agent/ledger.d.ts.map +1 -1
- package/dist/agent/ledger.js +6 -9
- package/dist/agent/ledger.js.map +1 -1
- package/dist/agent/model/adapter.d.ts +7 -4
- package/dist/agent/model/adapter.d.ts.map +1 -1
- package/dist/agent/model/adapter.js +2 -2
- package/dist/agent/model/adapter.js.map +1 -1
- package/dist/agent/model/router.d.ts +1 -1
- package/dist/agent/model/router.d.ts.map +1 -1
- package/dist/agent/model/router.js +1 -1
- package/dist/agent/model/router.js.map +1 -1
- package/dist/agent/model/sdk.d.ts +11 -1
- package/dist/agent/model/sdk.d.ts.map +1 -1
- package/dist/agent/model/sdk.js +54 -10
- package/dist/agent/model/sdk.js.map +1 -1
- package/dist/agent/observation.d.ts +7 -7
- package/dist/agent/observation.d.ts.map +1 -1
- package/dist/agent/observation.js +7 -7
- package/dist/agent/observation.js.map +1 -1
- package/dist/agent/phases.d.ts +3 -3
- package/dist/agent/phases.d.ts.map +1 -1
- package/dist/agent/phases.js +4 -4
- package/dist/agent/phases.js.map +1 -1
- package/dist/agent/primitives.d.ts +4 -25
- package/dist/agent/primitives.d.ts.map +1 -1
- package/dist/agent/primitives.js +3 -36
- package/dist/agent/primitives.js.map +1 -1
- package/dist/agent/prompts.d.ts +1 -1
- package/dist/agent/prompts.js +1 -1
- package/dist/agent/protocol.d.ts +2 -3
- package/dist/agent/protocol.d.ts.map +1 -1
- package/dist/agent/protocol.js +2 -3
- package/dist/agent/protocol.js.map +1 -1
- package/dist/agent/public.d.ts +8 -10
- package/dist/agent/public.d.ts.map +1 -1
- package/dist/agent/public.js +7 -8
- package/dist/agent/public.js.map +1 -1
- package/dist/agent/replay.d.ts +2 -2
- package/dist/agent/replay.d.ts.map +1 -1
- package/dist/agent/replay.js +1 -1
- package/dist/agent/secrets.d.ts +3 -3
- package/dist/agent/secrets.d.ts.map +1 -1
- package/dist/agent/secrets.js +4 -4
- package/dist/agent/secrets.js.map +1 -1
- package/dist/agent/step-cache.d.ts +1 -1
- package/dist/agent/step-cache.d.ts.map +1 -1
- package/dist/agent/step-cache.js +7 -1
- package/dist/agent/step-cache.js.map +1 -1
- package/dist/agent/tool-loop.d.ts +9 -33
- package/dist/agent/tool-loop.d.ts.map +1 -1
- package/dist/agent/tool-loop.js +15 -38
- package/dist/agent/tool-loop.js.map +1 -1
- package/dist/agent/tool.d.ts +4 -5
- package/dist/agent/tool.d.ts.map +1 -1
- package/dist/agent/tool.js +2 -7
- package/dist/agent/tool.js.map +1 -1
- package/dist/cache/anchors.d.ts +2 -2
- package/dist/cache/anchors.d.ts.map +1 -1
- package/dist/cache/anchors.js +1 -1
- package/dist/cache/context.d.ts +6 -1
- package/dist/cache/context.d.ts.map +1 -1
- package/dist/cache/context.js +2 -1
- package/dist/cache/context.js.map +1 -1
- package/dist/cache/decide.d.ts +1 -1
- package/dist/cache/decide.js +1 -1
- package/dist/cache/identity.d.ts +9 -9
- package/dist/cache/identity.d.ts.map +1 -1
- package/dist/cache/identity.js +6 -6
- package/dist/cache/identity.js.map +1 -1
- package/dist/cache/recorder.d.ts +4 -2
- package/dist/cache/recorder.d.ts.map +1 -1
- package/dist/cache/recorder.js +10 -1
- package/dist/cache/recorder.js.map +1 -1
- package/dist/cache/relocate.d.ts +2 -2
- package/dist/cache/relocate.d.ts.map +1 -1
- package/dist/cache/relocate.js +1 -1
- package/dist/cache/store.d.ts +1 -1
- package/dist/cache/store.js +1 -1
- package/dist/cache/trace.d.ts +16 -1
- package/dist/cache/trace.d.ts.map +1 -1
- package/dist/cache/trace.js +22 -1
- package/dist/cache/trace.js.map +1 -1
- package/dist/cli/bin.js +9 -1
- package/dist/cli/bin.js.map +1 -1
- package/dist/cli/cache.d.ts +25 -0
- package/dist/cli/cache.d.ts.map +1 -0
- package/dist/cli/cache.js +249 -0
- package/dist/cli/cache.js.map +1 -0
- package/dist/cli/docs-url.d.ts +3 -0
- package/dist/cli/docs-url.d.ts.map +1 -0
- package/dist/cli/docs-url.js +3 -0
- package/dist/cli/docs-url.js.map +1 -0
- package/dist/cli/guide.d.ts +4 -0
- package/dist/cli/guide.d.ts.map +1 -0
- package/dist/cli/guide.js +16 -0
- package/dist/cli/guide.js.map +1 -0
- package/dist/cli/index.d.ts +1 -1
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +211 -42
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/init/agent-skill.d.ts +34 -0
- package/dist/cli/init/agent-skill.d.ts.map +1 -0
- package/dist/cli/init/agent-skill.js +44 -0
- package/dist/cli/init/agent-skill.js.map +1 -0
- package/dist/cli/init/{backends.d.ts → engines.d.ts} +39 -32
- package/dist/cli/init/engines.d.ts.map +1 -0
- package/dist/cli/init/{backends.js → engines.js} +43 -34
- package/dist/cli/init/engines.js.map +1 -0
- package/dist/cli/init/package.d.ts +19 -3
- package/dist/cli/init/package.d.ts.map +1 -1
- package/dist/cli/init/package.js +20 -20
- package/dist/cli/init/package.js.map +1 -1
- package/dist/cli/init/scaffold.d.ts +3 -3
- package/dist/cli/init/scaffold.d.ts.map +1 -1
- package/dist/cli/init/scaffold.js +13 -12
- package/dist/cli/init/scaffold.js.map +1 -1
- package/dist/cli/init.d.ts +14 -2
- package/dist/cli/init.d.ts.map +1 -1
- package/dist/cli/init.js +104 -25
- package/dist/cli/init.js.map +1 -1
- package/dist/cli/signals.d.ts +5 -2
- package/dist/cli/signals.d.ts.map +1 -1
- package/dist/cli/signals.js +9 -3
- package/dist/cli/signals.js.map +1 -1
- package/dist/cli/skill.d.ts +16 -0
- package/dist/cli/skill.d.ts.map +1 -0
- package/dist/cli/skill.js +57 -0
- package/dist/cli/skill.js.map +1 -0
- package/dist/collect/collect.d.ts +40 -3
- package/dist/collect/collect.d.ts.map +1 -1
- package/dist/collect/collect.js +142 -19
- package/dist/collect/collect.js.map +1 -1
- package/dist/collect/registry.d.ts +1 -1
- package/dist/collect/registry.d.ts.map +1 -1
- package/dist/collect/registry.js +2 -2
- package/dist/collect/registry.js.map +1 -1
- package/dist/collect/select.d.ts +1 -1
- package/dist/collect/select.d.ts.map +1 -1
- package/dist/collect/select.js +81 -8
- package/dist/collect/select.js.map +1 -1
- package/dist/config/agent.d.ts +14 -2
- package/dist/config/agent.d.ts.map +1 -1
- package/dist/config/agent.js +36 -11
- package/dist/config/agent.js.map +1 -1
- package/dist/config/app.d.ts +76 -19
- package/dist/config/app.d.ts.map +1 -1
- package/dist/config/app.js +159 -104
- package/dist/config/app.js.map +1 -1
- package/dist/config/diagnose.d.ts +15 -0
- package/dist/config/diagnose.d.ts.map +1 -0
- package/dist/config/diagnose.js +122 -0
- package/dist/config/diagnose.js.map +1 -0
- package/dist/config/load.d.ts +9 -1
- package/dist/config/load.d.ts.map +1 -1
- package/dist/config/load.js +35 -3
- package/dist/config/load.js.map +1 -1
- package/dist/config/resolve.d.ts +8 -7
- package/dist/config/resolve.d.ts.map +1 -1
- package/dist/config/resolve.js +73 -40
- package/dist/config/resolve.js.map +1 -1
- package/dist/config/validate.d.ts +6 -2
- package/dist/config/validate.d.ts.map +1 -1
- package/dist/config/validate.js +20 -3
- package/dist/config/validate.js.map +1 -1
- package/dist/credentials.d.ts +1 -1
- package/dist/credentials.d.ts.map +1 -1
- package/dist/credentials.js +1 -1
- package/dist/credentials.js.map +1 -1
- package/dist/{backend → engine}/contract.d.ts +27 -19
- package/dist/engine/contract.d.ts.map +1 -0
- package/dist/{backend → engine}/contract.js +18 -18
- package/dist/engine/contract.js.map +1 -0
- package/dist/{backend → engine}/index.d.ts +141 -79
- package/dist/engine/index.d.ts.map +1 -0
- package/dist/{backend → engine}/index.js +62 -37
- package/dist/engine/index.js.map +1 -0
- package/dist/engine/session.d.ts +23 -0
- package/dist/engine/session.d.ts.map +1 -0
- package/dist/{backend → engine}/session.js +58 -51
- package/dist/engine/session.js.map +1 -0
- package/dist/{backend → engine}/surface.d.ts +11 -11
- package/dist/engine/surface.d.ts.map +1 -0
- package/dist/{backend → engine}/surface.js +2 -2
- package/dist/engine/surface.js.map +1 -0
- package/dist/engine/timing.d.ts.map +1 -0
- package/dist/engine/timing.js +8 -0
- package/dist/engine/timing.js.map +1 -0
- package/dist/expect/async.d.ts +1 -1
- package/dist/expect/async.d.ts.map +1 -1
- package/dist/expect/async.js +37 -1
- package/dist/expect/async.js.map +1 -1
- package/dist/expect/index.js +1 -1
- package/dist/expect/values.d.ts +1 -1
- package/dist/expect/values.d.ts.map +1 -1
- package/dist/expect/values.js +1 -1
- package/dist/expect/values.js.map +1 -1
- package/dist/index.d.ts +3 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -5
- package/dist/index.js.map +1 -1
- package/dist/internal/brands.d.ts +1 -1
- package/dist/internal/brands.d.ts.map +1 -1
- package/dist/internal/brands.js +1 -1
- package/dist/internal/brands.js.map +1 -1
- package/dist/internal/errors.d.ts +37 -19
- package/dist/internal/errors.d.ts.map +1 -1
- package/dist/internal/errors.js +94 -44
- package/dist/internal/errors.js.map +1 -1
- package/dist/internal/globs.d.ts +2 -2
- package/dist/internal/globs.d.ts.map +1 -1
- package/dist/internal/globs.js +2 -2
- package/dist/internal/globs.js.map +1 -1
- package/dist/internal/ids.d.ts +3 -3
- package/dist/internal/ids.d.ts.map +1 -1
- package/dist/internal/ids.js +3 -3
- package/dist/internal/ids.js.map +1 -1
- package/dist/internal/node-version.d.ts +10 -0
- package/dist/internal/node-version.d.ts.map +1 -0
- package/dist/internal/node-version.js +28 -0
- package/dist/internal/node-version.js.map +1 -0
- package/dist/internal/objects.d.ts +21 -0
- package/dist/internal/objects.d.ts.map +1 -0
- package/dist/internal/objects.js +14 -0
- package/dist/internal/objects.js.map +1 -0
- package/dist/internal/package-manager.d.ts +10 -0
- package/dist/internal/package-manager.d.ts.map +1 -0
- package/dist/internal/package-manager.js +43 -0
- package/dist/internal/package-manager.js.map +1 -0
- package/dist/internal/redact.d.ts +1 -1
- package/dist/internal/redact.d.ts.map +1 -1
- package/dist/internal/redact.js +1 -1
- package/dist/internal/redact.js.map +1 -1
- package/dist/internal/suggest.d.ts +16 -0
- package/dist/internal/suggest.d.ts.map +1 -0
- package/dist/internal/suggest.js +61 -0
- package/dist/internal/suggest.js.map +1 -0
- package/dist/internal/text.d.ts +1 -1
- package/dist/internal/text.d.ts.map +1 -1
- package/dist/internal/text.js +1 -1
- package/dist/internal/text.js.map +1 -1
- package/dist/internal/urls.d.ts +3 -3
- package/dist/internal/urls.d.ts.map +1 -1
- package/dist/internal/urls.js +8 -3
- package/dist/internal/urls.js.map +1 -1
- package/dist/locator/engine.d.ts +7 -7
- package/dist/locator/engine.d.ts.map +1 -1
- package/dist/locator/engine.js +14 -14
- package/dist/locator/engine.js.map +1 -1
- package/dist/locator/expression.d.ts +5 -3
- package/dist/locator/expression.d.ts.map +1 -1
- package/dist/locator/expression.js +25 -5
- package/dist/locator/expression.js.map +1 -1
- package/dist/locator/screen.d.ts +1 -1
- package/dist/locator/screen.d.ts.map +1 -1
- package/dist/locator/screen.js +3 -3
- package/dist/locator/screen.js.map +1 -1
- package/dist/report/build.d.ts +10 -9
- package/dist/report/build.d.ts.map +1 -1
- package/dist/report/build.js +25 -22
- package/dist/report/build.js.map +1 -1
- package/dist/report/code-frame.d.ts +8 -4
- package/dist/report/code-frame.d.ts.map +1 -1
- package/dist/report/code-frame.js +23 -18
- package/dist/report/code-frame.js.map +1 -1
- package/dist/report/debug-steps.js +1 -1
- package/dist/report/debug-steps.js.map +1 -1
- package/dist/report/format.d.ts +73 -0
- package/dist/report/format.d.ts.map +1 -0
- package/dist/report/format.js +147 -0
- package/dist/report/format.js.map +1 -0
- package/dist/report/junit.d.ts +1 -1
- package/dist/report/junit.d.ts.map +1 -1
- package/dist/report/junit.js +1 -1
- package/dist/report/junit.js.map +1 -1
- package/dist/report/list.d.ts +96 -47
- package/dist/report/list.d.ts.map +1 -1
- package/dist/report/list.js +489 -244
- package/dist/report/list.js.map +1 -1
- package/dist/report/live-window.d.ts +28 -0
- package/dist/report/live-window.d.ts.map +1 -0
- package/dist/report/live-window.js +102 -0
- package/dist/report/live-window.js.map +1 -0
- package/dist/report/write.d.ts +1 -1
- package/dist/report/write.d.ts.map +1 -1
- package/dist/report/write.js +1 -1
- package/dist/report/write.js.map +1 -1
- package/dist/run/budget.d.ts +2 -2
- package/dist/run/budget.js +2 -2
- package/dist/run/declared-processes.d.ts +30 -0
- package/dist/run/declared-processes.d.ts.map +1 -0
- package/dist/run/declared-processes.js +61 -0
- package/dist/run/declared-processes.js.map +1 -0
- package/dist/run/events.d.ts +30 -2
- package/dist/run/events.d.ts.map +1 -1
- package/dist/run/events.js.map +1 -1
- package/dist/run/execute.d.ts +19 -16
- package/dist/run/execute.d.ts.map +1 -1
- package/dist/run/execute.js +65 -67
- package/dist/run/execute.js.map +1 -1
- package/dist/run/fixture-recording.d.ts +10 -4
- package/dist/run/fixture-recording.d.ts.map +1 -1
- package/dist/run/fixture-recording.js +19 -6
- package/dist/run/fixture-recording.js.map +1 -1
- package/dist/run/fixtures.d.ts +2 -2
- package/dist/run/fixtures.d.ts.map +1 -1
- package/dist/run/fixtures.js +72 -44
- package/dist/run/fixtures.js.map +1 -1
- package/dist/run/in-process.d.ts +1 -1
- package/dist/run/in-process.js +1 -1
- package/dist/run/managed-process.d.ts +46 -9
- package/dist/run/managed-process.d.ts.map +1 -1
- package/dist/run/managed-process.js +136 -50
- package/dist/run/managed-process.js.map +1 -1
- package/dist/run/realm.d.ts +2 -2
- package/dist/run/realm.js +2 -2
- package/dist/run/runner.d.ts +23 -1
- package/dist/run/runner.d.ts.map +1 -1
- package/dist/run/runner.js +111 -40
- package/dist/run/runner.js.map +1 -1
- package/dist/run/scheduler.d.ts +5 -5
- package/dist/run/scheduler.d.ts.map +1 -1
- package/dist/run/scheduler.js +7 -7
- package/dist/run/scheduler.js.map +1 -1
- package/dist/run/serial.d.ts +10 -2
- package/dist/run/serial.d.ts.map +1 -1
- package/dist/run/serial.js +5 -3
- package/dist/run/serial.js.map +1 -1
- package/dist/run/sessions.d.ts +10 -10
- package/dist/run/sessions.d.ts.map +1 -1
- package/dist/run/sessions.js +11 -11
- package/dist/run/sessions.js.map +1 -1
- package/dist/run/steps.d.ts +3 -3
- package/dist/run/steps.d.ts.map +1 -1
- package/dist/run/steps.js +1 -1
- package/dist/run/steps.js.map +1 -1
- package/dist/run/units.d.ts +1 -1
- package/dist/run/units.js +1 -1
- package/dist/run/worker/entry.d.ts +1 -1
- package/dist/run/worker/entry.js +2 -2
- package/dist/run/worker/entry.js.map +1 -1
- package/dist/run/worker/protocol.d.ts +18 -6
- package/dist/run/worker/protocol.d.ts.map +1 -1
- package/dist/run/worker/protocol.js +1 -1
- package/dist/run/worker/protocol.js.map +1 -1
- package/dist/run/worker/session.d.ts +2 -2
- package/dist/run/worker/session.d.ts.map +1 -1
- package/dist/run/worker/session.js +5 -3
- package/dist/run/worker/session.js.map +1 -1
- package/dist/types.d.ts +58 -41
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +2 -2
- package/package.json +13 -12
- package/skills/e2e/SKILL.md +110 -0
- package/skills/e2e/references/agent.md +210 -0
- package/skills/e2e/references/debugging.md +81 -0
- package/skills/e2e/references/running.md +153 -0
- package/skills/e2e/references/setup.md +238 -0
- package/skills/e2e/references/writing-tests.md +289 -0
- package/dist/backend/contract.d.ts.map +0 -1
- package/dist/backend/contract.js.map +0 -1
- package/dist/backend/index.d.ts.map +0 -1
- package/dist/backend/index.js.map +0 -1
- package/dist/backend/session.d.ts +0 -23
- package/dist/backend/session.d.ts.map +0 -1
- package/dist/backend/session.js.map +0 -1
- package/dist/backend/surface.d.ts.map +0 -1
- package/dist/backend/surface.js.map +0 -1
- package/dist/backend/timing.d.ts.map +0 -1
- package/dist/backend/timing.js +0 -8
- package/dist/backend/timing.js.map +0 -1
- package/dist/cli/init/backends.d.ts.map +0 -1
- package/dist/cli/init/backends.js.map +0 -1
- package/dist/report/live-status.d.ts +0 -51
- package/dist/report/live-status.d.ts.map +0 -1
- package/dist/report/live-status.js +0 -163
- package/dist/report/live-status.js.map +0 -1
- package/dist/run/fixture-legacy.d.ts +0 -36
- package/dist/run/fixture-legacy.d.ts.map +0 -1
- package/dist/run/fixture-legacy.js +0 -143
- package/dist/run/fixture-legacy.js.map +0 -1
- /package/dist/{backend → engine}/timing.d.ts +0 -0
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
/** Spawned-process management for
|
|
1
|
+
/** Spawned-process management for the commands and services engines declare, and their teardowns. */
|
|
2
2
|
import { spawn } from 'node:child_process';
|
|
3
|
+
import fs from 'node:fs';
|
|
3
4
|
import path from 'node:path';
|
|
4
5
|
import { InfrastructureError } from '../internal/errors.js';
|
|
5
6
|
import { sleep } from '../internal/time.js';
|
|
@@ -9,37 +10,114 @@ const READY_POLL_MIN_MS = 25;
|
|
|
9
10
|
const READY_POLL_MAX_MS = 250;
|
|
10
11
|
/** One readiness probe never outlives this, so a half-open server cannot stall the deadline check. */
|
|
11
12
|
const READY_PROBE_TIMEOUT_MS = 2_000;
|
|
13
|
+
/** Every spawned process group still running, for the forced exit that cannot wait on `stop`. */
|
|
14
|
+
const live = new Set();
|
|
15
|
+
/**
|
|
16
|
+
* Sends `signal` to the whole process group behind `child` (the child alone
|
|
17
|
+
* on Windows, which has no process groups); a group already gone is fine.
|
|
18
|
+
*/
|
|
19
|
+
function signalProcessGroup(child, signal) {
|
|
20
|
+
const pid = child.pid;
|
|
21
|
+
if (pid === undefined)
|
|
22
|
+
return;
|
|
23
|
+
try {
|
|
24
|
+
if (process.platform !== 'win32')
|
|
25
|
+
process.kill(-pid, signal);
|
|
26
|
+
else
|
|
27
|
+
child.kill(signal);
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
// process already gone
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Kills every process group this module spawned and has not yet seen exit,
|
|
35
|
+
* synchronously and without waiting: the last resort before the process
|
|
36
|
+
* exits on the spot, so nothing it started outlives it. A reused process was
|
|
37
|
+
* never spawned here and is left alone.
|
|
38
|
+
*/
|
|
39
|
+
export function killManagedProcessGroups() {
|
|
40
|
+
for (const child of live)
|
|
41
|
+
signalProcessGroup(child, 'SIGKILL');
|
|
42
|
+
}
|
|
12
43
|
function describeExit(exit) {
|
|
13
44
|
return exit.code === null ? `was terminated by ${exit.signal}` : `exited with code ${exit.code}`;
|
|
14
45
|
}
|
|
46
|
+
/** One readiness probe: true when `url` answers 200 through 499 within `timeoutMs`. */
|
|
47
|
+
async function answers(url, timeoutMs) {
|
|
48
|
+
try {
|
|
49
|
+
const response = await fetch(url, { redirect: 'manual', signal: AbortSignal.timeout(timeoutMs) });
|
|
50
|
+
return response.status >= 200 && response.status <= 499;
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
return false;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
15
56
|
/**
|
|
16
57
|
* One command the runner owns: spawned as a process group, waited on until
|
|
17
58
|
* its readiness contract holds, and terminated signal-then-force. `label`
|
|
18
|
-
* names it in every error (`
|
|
59
|
+
* names it in every error (`target "web" command`, `service "postgres"`).
|
|
19
60
|
*/
|
|
20
61
|
export class ManagedProcess {
|
|
21
62
|
label;
|
|
22
63
|
command;
|
|
23
64
|
projectRoot;
|
|
24
65
|
readiness;
|
|
66
|
+
hooks;
|
|
25
67
|
child = null;
|
|
26
|
-
|
|
68
|
+
reusedExisting = false;
|
|
69
|
+
constructor(label, command, projectRoot, readiness, hooks = {}) {
|
|
27
70
|
this.label = label;
|
|
28
71
|
this.command = command;
|
|
29
72
|
this.projectRoot = projectRoot;
|
|
30
73
|
this.readiness = readiness;
|
|
74
|
+
this.hooks = hooks;
|
|
75
|
+
}
|
|
76
|
+
/** True once `start` found the readiness URL already answering and attached to it instead of spawning. */
|
|
77
|
+
get reused() {
|
|
78
|
+
return this.reusedExisting;
|
|
31
79
|
}
|
|
32
80
|
/**
|
|
33
81
|
* Spawns the process group and waits for readiness. An already aborted
|
|
34
82
|
* `signal` spawns nothing; one that aborts during the wait ends it early and
|
|
35
83
|
* takes the process down with it. The caller reads the signal to learn the
|
|
36
84
|
* run was interrupted.
|
|
85
|
+
*
|
|
86
|
+
* A readiness URL that already answers before the spawn belongs to a
|
|
87
|
+
* process this run did not start, and HTTP readiness cannot tell which
|
|
88
|
+
* process answered later. So the preflight probe decides up front: with
|
|
89
|
+
* `reuseExisting` (outside CI) nothing is spawned and `stop` leaves the
|
|
90
|
+
* process alone; otherwise the launch fails with `APP_ALREADY_RUNNING`
|
|
91
|
+
* rather than letting the old server pass as the new command's readiness.
|
|
92
|
+
* The probe spends from the same `startupTimeout` budget as the wait.
|
|
37
93
|
*/
|
|
38
94
|
async start(signal) {
|
|
39
95
|
// A function, not a narrowed local: the signal flips while the loop awaits.
|
|
40
96
|
const aborted = () => signal?.aborted === true;
|
|
41
97
|
if (aborted())
|
|
42
98
|
return;
|
|
99
|
+
// Without a URL to probe, the process exiting 0 is the readiness event.
|
|
100
|
+
const readyUrl = 'readyUrl' in this.readiness ? this.readiness.readyUrl : undefined;
|
|
101
|
+
const startupTimeout = this.command.startupTimeout ?? 60_000;
|
|
102
|
+
const deadline = Date.now() + startupTimeout;
|
|
103
|
+
if (readyUrl !== undefined) {
|
|
104
|
+
const reuse = this.command.reuseExisting === true && this.hooks.ci !== true;
|
|
105
|
+
if (this.command.reuseExisting === true && !reuse) {
|
|
106
|
+
this.hooks.notice?.(`${this.label}: reuseExisting is ignored in CI, starting the command`);
|
|
107
|
+
}
|
|
108
|
+
if (await answers(readyUrl, Math.min(READY_PROBE_TIMEOUT_MS, startupTimeout))) {
|
|
109
|
+
if (reuse) {
|
|
110
|
+
this.reusedExisting = true;
|
|
111
|
+
this.hooks.notice?.(`${this.label}: reusing the process already serving ${readyUrl}`);
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
throw new InfrastructureError('APP_ALREADY_RUNNING', `${readyUrl} already answered before ${this.label} started; ${this.hooks.ci === true
|
|
115
|
+
? 'stop that process (reuseExisting is ignored in CI)'
|
|
116
|
+
: 'stop that process or set reuseExisting: true'}`);
|
|
117
|
+
}
|
|
118
|
+
if (aborted())
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
43
121
|
const env = {};
|
|
44
122
|
for (const key of INHERITED_ENV) {
|
|
45
123
|
const value = process.env[key];
|
|
@@ -47,13 +125,25 @@ export class ManagedProcess {
|
|
|
47
125
|
env[key] = value;
|
|
48
126
|
}
|
|
49
127
|
Object.assign(env, this.command.env ?? {});
|
|
50
|
-
const
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
128
|
+
const logFd = this.openLog();
|
|
129
|
+
let child;
|
|
130
|
+
try {
|
|
131
|
+
child = spawn(this.command.executable, [...(this.command.args ?? [])], {
|
|
132
|
+
cwd: path.resolve(this.projectRoot, this.command.cwd ?? '.'),
|
|
133
|
+
env,
|
|
134
|
+
detached: process.platform !== 'win32',
|
|
135
|
+
stdio: logFd === undefined ? 'ignore' : ['ignore', logFd, logFd],
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
finally {
|
|
139
|
+
// The child holds its own copy of the descriptor once spawn returns
|
|
140
|
+
// (a spawn failure surfaces as the 'error' event, not here), so the
|
|
141
|
+
// parent's copy would only be a leak for the life of the run.
|
|
142
|
+
if (logFd !== undefined)
|
|
143
|
+
fs.closeSync(logFd);
|
|
144
|
+
}
|
|
56
145
|
this.child = child;
|
|
146
|
+
live.add(child);
|
|
57
147
|
let spawnError;
|
|
58
148
|
child.on('error', (error) => {
|
|
59
149
|
spawnError = error;
|
|
@@ -61,14 +151,11 @@ export class ManagedProcess {
|
|
|
61
151
|
let exit;
|
|
62
152
|
const exited = new Promise((resolve) => {
|
|
63
153
|
child.once('exit', (code, exitSignal) => {
|
|
154
|
+
live.delete(child);
|
|
64
155
|
exit = { code, signal: exitSignal };
|
|
65
156
|
resolve();
|
|
66
157
|
});
|
|
67
158
|
});
|
|
68
|
-
// Without a URL to probe, the process exiting 0 is the readiness event.
|
|
69
|
-
const readyUrl = 'readyUrl' in this.readiness ? this.readiness.readyUrl : undefined;
|
|
70
|
-
const startupTimeout = this.command.startupTimeout ?? 60_000;
|
|
71
|
-
const deadline = Date.now() + startupTimeout;
|
|
72
159
|
let pollMs = READY_POLL_MIN_MS;
|
|
73
160
|
for (;;) {
|
|
74
161
|
if (aborted()) {
|
|
@@ -90,18 +177,8 @@ export class ManagedProcess {
|
|
|
90
177
|
? `${this.label} did not exit within ${startupTimeout} ms`
|
|
91
178
|
: `${this.label} was not reachable at ${readyUrl} within ${startupTimeout} ms`);
|
|
92
179
|
}
|
|
93
|
-
if (readyUrl !== undefined) {
|
|
94
|
-
|
|
95
|
-
const response = await fetch(readyUrl, {
|
|
96
|
-
redirect: 'manual',
|
|
97
|
-
signal: AbortSignal.timeout(Math.min(READY_PROBE_TIMEOUT_MS, remaining)),
|
|
98
|
-
});
|
|
99
|
-
if (response.status >= 200 && response.status <= 499)
|
|
100
|
-
return;
|
|
101
|
-
}
|
|
102
|
-
catch {
|
|
103
|
-
// not ready yet
|
|
104
|
-
}
|
|
180
|
+
if (readyUrl !== undefined && (await answers(readyUrl, Math.min(READY_PROBE_TIMEOUT_MS, remaining)))) {
|
|
181
|
+
return;
|
|
105
182
|
}
|
|
106
183
|
// The exit event wakes the wait early so an exit is seen at once, not on the next poll.
|
|
107
184
|
await Promise.race([
|
|
@@ -111,51 +188,59 @@ export class ManagedProcess {
|
|
|
111
188
|
pollMs = Math.min(pollMs * 2, READY_POLL_MAX_MS);
|
|
112
189
|
}
|
|
113
190
|
}
|
|
114
|
-
/**
|
|
191
|
+
/**
|
|
192
|
+
* Opens `command.log` for appending, creating its directory, and returns
|
|
193
|
+
* the descriptor the child writes stdout and stderr to. No `log` means the
|
|
194
|
+
* output is discarded as before. The same file across services and runs
|
|
195
|
+
* accumulates, which is what a developer reading a failed boot wants.
|
|
196
|
+
*/
|
|
197
|
+
openLog() {
|
|
198
|
+
if (this.command.log === undefined)
|
|
199
|
+
return undefined;
|
|
200
|
+
const logPath = path.resolve(this.projectRoot, this.command.log);
|
|
201
|
+
try {
|
|
202
|
+
fs.mkdirSync(path.dirname(logPath), { recursive: true });
|
|
203
|
+
return fs.openSync(logPath, 'a');
|
|
204
|
+
}
|
|
205
|
+
catch (cause) {
|
|
206
|
+
throw new InfrastructureError('APP_UNREACHABLE', `${this.label} could not open its log file ${logPath}: ${cause instanceof Error ? cause.message : String(cause)}`, { cause });
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
/** Gracefully terminates the whole process group, then force-kills. A reused process was never ours to stop. */
|
|
115
210
|
async stop() {
|
|
211
|
+
if (this.reusedExisting)
|
|
212
|
+
return;
|
|
116
213
|
const child = this.child;
|
|
117
214
|
this.child = null;
|
|
118
215
|
if (child === null || child.exitCode !== null || child.signalCode !== null)
|
|
119
216
|
return;
|
|
120
217
|
const shutdownTimeout = this.command.shutdownTimeout ?? 10_000;
|
|
121
|
-
|
|
122
|
-
const signalGroup = (signal) => {
|
|
123
|
-
if (pid === undefined)
|
|
124
|
-
return;
|
|
125
|
-
try {
|
|
126
|
-
if (process.platform !== 'win32')
|
|
127
|
-
process.kill(-pid, signal);
|
|
128
|
-
else
|
|
129
|
-
child.kill(signal);
|
|
130
|
-
}
|
|
131
|
-
catch {
|
|
132
|
-
// process already gone
|
|
133
|
-
}
|
|
134
|
-
};
|
|
135
|
-
signalGroup('SIGTERM');
|
|
218
|
+
signalProcessGroup(child, 'SIGTERM');
|
|
136
219
|
const exited = new Promise((resolve) => {
|
|
137
220
|
child.once('exit', () => resolve());
|
|
138
221
|
});
|
|
139
222
|
const timer = sleep(shutdownTimeout).then(() => 'timeout');
|
|
140
223
|
const winner = await Promise.race([exited.then(() => 'exited'), timer]);
|
|
141
224
|
if (winner === 'timeout') {
|
|
142
|
-
|
|
225
|
+
signalProcessGroup(child, 'SIGKILL');
|
|
143
226
|
await exited.catch(() => undefined);
|
|
144
227
|
}
|
|
145
228
|
}
|
|
146
229
|
}
|
|
147
230
|
/**
|
|
148
|
-
* The dependency processes
|
|
149
|
-
* declaration order, each ready before the next starts, and
|
|
150
|
-
* reverse.
|
|
231
|
+
* The dependency processes the engines declared as `services`: started
|
|
232
|
+
* sequentially in declaration order, each ready before the next starts, and
|
|
233
|
+
* torn down in reverse.
|
|
151
234
|
*/
|
|
152
235
|
export class ServiceStack {
|
|
153
236
|
services;
|
|
154
237
|
projectRoot;
|
|
238
|
+
hooks;
|
|
155
239
|
started = [];
|
|
156
|
-
constructor(services, projectRoot) {
|
|
240
|
+
constructor(services, projectRoot, hooks = {}) {
|
|
157
241
|
this.services = services;
|
|
158
242
|
this.projectRoot = projectRoot;
|
|
243
|
+
this.hooks = hooks;
|
|
159
244
|
}
|
|
160
245
|
/**
|
|
161
246
|
* Starts every service in order. Stops early once `signal` aborts; the
|
|
@@ -165,7 +250,7 @@ export class ServiceStack {
|
|
|
165
250
|
for (const { label, command, readiness, teardown } of this.services) {
|
|
166
251
|
if (signal?.aborted === true)
|
|
167
252
|
return;
|
|
168
|
-
const service = new ManagedProcess(label, command, this.projectRoot, readiness);
|
|
253
|
+
const service = new ManagedProcess(label, command, this.projectRoot, readiness, this.hooks);
|
|
169
254
|
this.started.push({
|
|
170
255
|
service,
|
|
171
256
|
teardown: teardown === undefined
|
|
@@ -181,14 +266,15 @@ export class ServiceStack {
|
|
|
181
266
|
* Stops the started services in reverse order, then runs each of their
|
|
182
267
|
* teardown commands in reverse order and waits for it to exit. A failing
|
|
183
268
|
* teardown is reported through `onFailure` and never skips the rest, so one
|
|
184
|
-
* failing `docker compose down` cannot leave the others running.
|
|
269
|
+
* failing `docker compose down` cannot leave the others running. A reused
|
|
270
|
+
* service was not started by this run, so its teardown does not run either.
|
|
185
271
|
*/
|
|
186
272
|
async stop(onFailure) {
|
|
187
273
|
const started = this.started.splice(0).toReversed();
|
|
188
274
|
for (const { service } of started)
|
|
189
275
|
await service.stop();
|
|
190
|
-
for (const { teardown } of started) {
|
|
191
|
-
if (teardown === undefined)
|
|
276
|
+
for (const { service, teardown } of started) {
|
|
277
|
+
if (teardown === undefined || service.reused)
|
|
192
278
|
continue;
|
|
193
279
|
try {
|
|
194
280
|
await teardown.start();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"managed-process.js","sourceRoot":"","sources":["../../src/run/managed-process.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"managed-process.js","sourceRoot":"","sources":["../../src/run/managed-process.ts"],"names":[],"mappings":"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"}
|
package/dist/run/realm.d.ts
CHANGED
|
@@ -56,7 +56,7 @@ export declare class RealmManager {
|
|
|
56
56
|
*/
|
|
57
57
|
adopt(registration: ModuleRegistration): Realm;
|
|
58
58
|
/**
|
|
59
|
-
* A test's hooks of one kind in execution order
|
|
59
|
+
* A test's hooks of one kind in execution order.
|
|
60
60
|
* `beforeEach` runs outer scope to inner, each scope's hooks in declaration
|
|
61
61
|
* order, wherever in the file a scope's hooks were declared relative to the
|
|
62
62
|
* test or to nested groups. `afterEach` mirrors it: inner scope to outer,
|
|
@@ -69,7 +69,7 @@ export declare class RealmManager {
|
|
|
69
69
|
* Closes every entered scope that none of `remaining` (the pairs still to
|
|
70
70
|
* run in this realm) belongs to, innermost first, running its afterAll
|
|
71
71
|
* hooks in reverse declaration order. A scope's afterAll therefore runs
|
|
72
|
-
* when its last runnable member leaves it
|
|
72
|
+
* when its last runnable member leaves it, not when
|
|
73
73
|
* the file ends: one describe's teardown never runs after a sibling's tests.
|
|
74
74
|
*
|
|
75
75
|
* Returns the first afterAll failure. Every failure is a run error, and the
|
package/dist/run/realm.js
CHANGED
|
@@ -46,7 +46,7 @@ export class RealmManager {
|
|
|
46
46
|
return { registration, testsByKey, entered: new Map() };
|
|
47
47
|
}
|
|
48
48
|
/**
|
|
49
|
-
* A test's hooks of one kind in execution order
|
|
49
|
+
* A test's hooks of one kind in execution order.
|
|
50
50
|
* `beforeEach` runs outer scope to inner, each scope's hooks in declaration
|
|
51
51
|
* order, wherever in the file a scope's hooks were declared relative to the
|
|
52
52
|
* test or to nested groups. `afterEach` mirrors it: inner scope to outer,
|
|
@@ -87,7 +87,7 @@ export class RealmManager {
|
|
|
87
87
|
* Closes every entered scope that none of `remaining` (the pairs still to
|
|
88
88
|
* run in this realm) belongs to, innermost first, running its afterAll
|
|
89
89
|
* hooks in reverse declaration order. A scope's afterAll therefore runs
|
|
90
|
-
* when its last runnable member leaves it
|
|
90
|
+
* when its last runnable member leaves it, not when
|
|
91
91
|
* the file ends: one describe's teardown never runs after a sibling's tests.
|
|
92
92
|
*
|
|
93
93
|
* Returns the first afterAll failure. Every failure is a run error, and the
|
package/dist/run/runner.d.ts
CHANGED
|
@@ -34,7 +34,7 @@ export interface RunOptions {
|
|
|
34
34
|
/** Cancellation: the running test ends, its teardown runs, the run finishes as `interrupted`. */
|
|
35
35
|
interruptSignal?: AbortSignal | undefined;
|
|
36
36
|
/**
|
|
37
|
-
* Forced cancellation: every worker disposes its
|
|
37
|
+
* Forced cancellation: every worker disposes its engine at once instead
|
|
38
38
|
* of finishing its test, and is killed after the cleanup budget. Counts as
|
|
39
39
|
* an interrupt on its own. The runner never handles process signals itself;
|
|
40
40
|
* the CLI's Ctrl-C ladder (`cli/signals.ts`) feeds these two.
|
|
@@ -43,6 +43,28 @@ export interface RunOptions {
|
|
|
43
43
|
/** Structured, JSON-serializable run events for embedding hosts. */
|
|
44
44
|
onEvent?: RunEventSink | undefined;
|
|
45
45
|
}
|
|
46
|
+
/** The selection flags of `run`, without anything that would start a process. */
|
|
47
|
+
export type ListOptions = Pick<RunOptions, 'cwd' | 'configPath' | 'files' | 'tags' | 'tagMode' | 'targetIds' | 'passWithNoTests' | 'rawConfig' | 'env'>;
|
|
48
|
+
/** One test-target pair the runner would report, as `e2e list` prints it. */
|
|
49
|
+
export interface ListedPair {
|
|
50
|
+
readonly file: string;
|
|
51
|
+
readonly title: string;
|
|
52
|
+
readonly titlePath: readonly string[];
|
|
53
|
+
readonly kind: 'test' | 'setup';
|
|
54
|
+
readonly target: string;
|
|
55
|
+
readonly disposition: 'run' | 'skip';
|
|
56
|
+
readonly skipReason?: string;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Collects and selects like `run` and stops there: no app process, no engine
|
|
60
|
+
* prepare, no worker. The pairs are the ones `run` would report, in report
|
|
61
|
+
* order; pairs the selection filtered out are left out, as the list reporter
|
|
62
|
+
* leaves them out. Config, collection, and selection failures throw the same
|
|
63
|
+
* classified error `run` would record.
|
|
64
|
+
*/
|
|
65
|
+
export declare function list(options?: ListOptions): Promise<{
|
|
66
|
+
pairs: ListedPair[];
|
|
67
|
+
}>;
|
|
46
68
|
export interface RunOutcome {
|
|
47
69
|
exitCode: RunExitCode;
|
|
48
70
|
status: 'passed' | 'failed' | 'error' | 'interrupted';
|
package/dist/run/runner.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/run/runner.ts"],"names":[],"mappings":"AAAA,8EAA8E;AA4B9E,OAAO,EAA+B,KAAK,eAAe,EAAyB,MAAM,oBAAoB,CAAC;AAM9G,OAAO,EAAwC,KAAK,YAAY,EAAE,KAAK,WAAW,EAAE,MAAM,aAAa,CAAC;AAExG,OAAO,KAAK,EAAE,YAAY,EAA+B,MAAM,cAAc,CAAC;AAK9E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/run/runner.ts"],"names":[],"mappings":"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"}
|