@itmetsam/samurai-framework 0.1.0 → 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/README.md +129 -0
- package/bin/samurai.mjs +31 -0
- package/dist/api.js +3 -0
- package/dist/assert/assertion-error.d.ts +23 -0
- package/dist/assert/assertion-error.js +45 -0
- package/dist/assert/expect.d.ts +55 -0
- package/dist/assert/expect.js +188 -0
- package/dist/browser/browser-context.d.ts +91 -0
- package/dist/browser/browser-context.js +146 -0
- package/dist/browser/browser-finder.d.ts +2 -0
- package/dist/browser/browser-finder.js +95 -0
- package/dist/browser/browser.d.ts +95 -0
- package/dist/browser/browser.js +372 -0
- package/dist/browser/context-tree.d.ts +23 -0
- package/dist/browser/context-tree.js +60 -0
- package/dist/browser/dialog.d.ts +37 -0
- package/dist/browser/dialog.js +61 -0
- package/dist/browser/download.d.ts +71 -0
- package/dist/browser/download.js +137 -0
- package/dist/browser/downloads-dir.d.ts +8 -0
- package/dist/browser/downloads-dir.js +38 -0
- package/dist/browser/emulation.d.ts +61 -0
- package/dist/browser/emulation.js +144 -0
- package/dist/browser/file-chooser.d.ts +39 -0
- package/dist/browser/file-chooser.js +86 -0
- package/dist/browser/file-paths.d.ts +4 -0
- package/dist/browser/file-paths.js +18 -0
- package/dist/browser/index.d.ts +4 -0
- package/dist/browser/index.js +4 -0
- package/dist/browser/navigation-error.d.ts +13 -0
- package/dist/browser/navigation-error.js +19 -0
- package/dist/browser/page-logs.d.ts +86 -0
- package/dist/browser/page-logs.js +149 -0
- package/dist/browser/page-wait.d.ts +9 -0
- package/dist/browser/page-wait.js +17 -0
- package/dist/browser/page.d.ts +370 -0
- package/dist/browser/page.js +1038 -0
- package/dist/browser/pdf.d.ts +72 -0
- package/dist/browser/pdf.js +37 -0
- package/dist/browser/screenshot.d.ts +29 -0
- package/dist/browser/screenshot.js +42 -0
- package/dist/cli/args.d.ts +35 -0
- package/dist/cli/args.js +69 -0
- package/dist/cli/cli.cli-test.d.ts +1 -0
- package/dist/cli/cli.cli-test.js +170 -0
- package/dist/cli/console-reporter.d.ts +15 -0
- package/dist/cli/console-reporter.js +52 -0
- package/dist/cli/init.d.ts +7 -0
- package/dist/cli/init.js +61 -0
- package/dist/cli/main.d.ts +12 -0
- package/dist/cli/main.js +156 -0
- package/dist/config/config.d.ts +24 -0
- package/dist/config/config.js +42 -0
- package/dist/config/default.d.ts +2 -0
- package/dist/config/default.js +3 -0
- package/dist/config/mask.d.ts +11 -0
- package/dist/config/mask.js +85 -0
- package/dist/config/run-settings.d.ts +28 -0
- package/dist/config/run-settings.js +61 -0
- package/dist/config/secrets.d.ts +10 -0
- package/dist/config/secrets.js +67 -0
- package/dist/config/variables.d.ts +11 -0
- package/dist/config/variables.js +26 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +15 -0
- package/dist/locator/action-timeout-error.d.ts +25 -0
- package/dist/locator/action-timeout-error.js +35 -0
- package/dist/locator/element-state.d.ts +44 -0
- package/dist/locator/element-state.js +109 -0
- package/dist/locator/label-locator.d.ts +13 -0
- package/dist/locator/label-locator.js +49 -0
- package/dist/locator/locator.d.ts +168 -0
- package/dist/locator/locator.js +591 -0
- package/dist/locator/selector-errors.d.ts +9 -0
- package/dist/locator/selector-errors.js +15 -0
- package/dist/locator/selector.d.ts +60 -0
- package/dist/locator/selector.js +113 -0
- package/dist/locator/text-locator.d.ts +13 -0
- package/dist/logger/index.d.ts +2 -0
- package/dist/logger/index.js +30 -0
- package/dist/network/data-collector.d.ts +26 -0
- package/dist/network/data-collector.js +77 -0
- package/dist/network/network-tracker.d.ts +94 -0
- package/dist/network/network-tracker.js +198 -0
- package/dist/network/network-wait.d.ts +16 -0
- package/dist/network/network-wait.js +24 -0
- package/dist/network/response.d.ts +22 -0
- package/dist/network/response.js +42 -0
- package/dist/network/router.d.ts +120 -0
- package/dist/network/router.js +343 -0
- package/dist/network/url-match.d.ts +8 -0
- package/dist/network/url-match.js +38 -0
- package/dist/recorder/apply.d.ts +3 -0
- package/dist/recorder/apply.js +10 -0
- package/dist/recorder/capture.d.ts +18 -0
- package/dist/recorder/capture.js +198 -0
- package/dist/recorder/index.d.ts +3 -0
- package/dist/recorder/index.js +3 -0
- package/dist/recorder/normalise.d.ts +68 -0
- package/dist/recorder/normalise.js +104 -0
- package/dist/recorder/ranking.d.ts +9 -0
- package/dist/recorder/ranking.js +21 -0
- package/dist/recorder/recorder.d.ts +52 -0
- package/dist/recorder/recorder.js +143 -0
- package/dist/recorder/session.d.ts +49 -0
- package/dist/recorder/session.js +113 -0
- package/dist/runner/module-type.d.ts +6 -0
- package/dist/runner/module-type.js +29 -0
- package/dist/runner/page-logs-report.d.ts +40 -0
- package/dist/runner/page-logs-report.js +44 -0
- package/dist/runner/prepare-run.d.ts +14 -0
- package/dist/runner/prepare-run.js +20 -0
- package/dist/runner/project.d.ts +17 -0
- package/dist/runner/project.js +33 -0
- package/dist/runner/registry.d.ts +7 -0
- package/dist/runner/registry.js +40 -0
- package/dist/runner/reporter.d.ts +43 -0
- package/dist/runner/reporter.js +83 -0
- package/dist/runner/run.d.ts +27 -0
- package/dist/runner/run.js +34 -0
- package/dist/runner/test-error.d.ts +3 -0
- package/dist/runner/test-error.js +18 -0
- package/dist/runner/test-runner.d.ts +44 -0
- package/dist/runner/test-runner.js +205 -0
- package/dist/script/call-function.d.ts +34 -0
- package/dist/script/call-function.js +71 -0
- package/dist/script/element-handle.d.ts +10 -0
- package/{src/script/element-handle.ts → dist/script/element-handle.js} +4 -4
- package/dist/script/helpers.d.ts +28 -0
- package/dist/script/helpers.js +50 -0
- package/dist/script/preload.d.ts +31 -0
- package/dist/script/preload.js +71 -0
- package/dist/script/serialize.d.ts +29 -0
- package/dist/script/serialize.js +207 -0
- package/dist/steps/build.d.ts +5 -0
- package/dist/steps/build.js +38 -0
- package/dist/steps/edit.d.ts +30 -0
- package/dist/steps/edit.js +80 -0
- package/dist/steps/emit.d.ts +6 -0
- package/dist/steps/emit.js +73 -0
- package/dist/steps/index.d.ts +5 -0
- package/dist/steps/index.js +4 -0
- package/dist/steps/model.d.ts +103 -0
- package/dist/steps/model.js +1 -0
- package/dist/steps/parse.d.ts +3 -0
- package/dist/steps/parse.js +272 -0
- package/dist/transport/bidi-connection.d.ts +46 -0
- package/dist/transport/bidi-connection.js +176 -0
- package/dist/transport/bidi-error.d.ts +10 -0
- package/dist/transport/bidi-error.js +10 -0
- package/dist/transport/subscriptions.d.ts +36 -0
- package/dist/transport/subscriptions.js +81 -0
- package/{src → dist}/types/test.d.ts +10 -4
- package/dist/wait/wait-until.d.ts +20 -0
- package/dist/wait/wait-until.js +63 -0
- package/package.json +44 -7
- package/.claude/settings.local.json +0 -7
- package/.env.example +0 -3
- package/.github/actions/setup/action.yml +0 -16
- package/.github/workflows/ci.yml +0 -71
- package/.trunk/configs/.markdownlint.yaml +0 -2
- package/.trunk/configs/.yamllint.yaml +0 -7
- package/.trunk/configs/svgo.config.mjs +0 -14
- package/.trunk/trunk.yaml +0 -34
- package/docs/superpowers/bidi-roadmap.md +0 -60
- package/docs/superpowers/plans/2026-09-29-auto-wait.md +0 -1827
- package/docs/superpowers/plans/2026-09-29-expect.md +0 -1350
- package/docs/superpowers/plans/2026-10-01-ci.md +0 -350
- package/docs/superpowers/plans/2026-10-01-test-api-alignment.md +0 -1821
- package/docs/superpowers/recorder-roadmap.md +0 -52
- package/docs/superpowers/specs/2026-09-29-auto-wait-design.md +0 -185
- package/docs/superpowers/specs/2026-09-29-bidi-foundation-design.md +0 -130
- package/docs/superpowers/specs/2026-09-29-contexts-and-storage-design.md +0 -88
- package/docs/superpowers/specs/2026-09-29-downloads-and-file-dialogs-design.md +0 -94
- package/docs/superpowers/specs/2026-09-29-emulation-design.md +0 -88
- package/docs/superpowers/specs/2026-09-29-expect-design.md +0 -130
- package/docs/superpowers/specs/2026-09-29-locate-nodes-design.md +0 -90
- package/docs/superpowers/specs/2026-09-29-logs-and-errors-design.md +0 -87
- package/docs/superpowers/specs/2026-09-29-navigation-waits-design.md +0 -83
- package/docs/superpowers/specs/2026-09-29-network-data-design.md +0 -78
- package/docs/superpowers/specs/2026-09-29-network-interception-design.md +0 -91
- package/docs/superpowers/specs/2026-09-29-network-tracking-design.md +0 -86
- package/docs/superpowers/specs/2026-09-29-page-api-design.md +0 -90
- package/docs/superpowers/specs/2026-09-29-preload-scripts-design.md +0 -82
- package/docs/superpowers/specs/2026-09-29-script-call-function-design.md +0 -107
- package/docs/superpowers/specs/2026-09-29-set-files-design.md +0 -62
- package/docs/superpowers/specs/2026-09-29-user-prompts-design.md +0 -75
- package/docs/superpowers/specs/2026-10-01-ci-design.md +0 -106
- package/docs/superpowers/specs/2026-10-01-test-api-alignment-design.md +0 -241
- package/public/logo-dark.svg +0 -236
- package/public/logo-light.svg +0 -262
- package/samurai.config.ts +0 -7
- package/src/assert/assertion-error.test.ts +0 -55
- package/src/assert/assertion-error.ts +0 -62
- package/src/assert/expect-locator.test.ts +0 -217
- package/src/assert/expect.test.ts +0 -73
- package/src/assert/expect.ts +0 -299
- package/src/browser/browser-context.browser-test.ts +0 -201
- package/src/browser/browser-context.test.ts +0 -407
- package/src/browser/browser-context.ts +0 -208
- package/src/browser/browser-finder.ts +0 -110
- package/src/browser/browser.test.ts +0 -88
- package/src/browser/browser.ts +0 -515
- package/src/browser/context-tree.test.ts +0 -86
- package/src/browser/context-tree.ts +0 -70
- package/src/browser/dialog.browser-test.ts +0 -144
- package/src/browser/dialog.test.ts +0 -322
- package/src/browser/dialog.ts +0 -83
- package/src/browser/download.test.ts +0 -161
- package/src/browser/download.ts +0 -172
- package/src/browser/downloads-dir.test.ts +0 -75
- package/src/browser/downloads-dir.ts +0 -39
- package/src/browser/emulation.browser-test.ts +0 -186
- package/src/browser/emulation.test.ts +0 -200
- package/src/browser/emulation.ts +0 -204
- package/src/browser/file-chooser.test.ts +0 -142
- package/src/browser/file-chooser.ts +0 -99
- package/src/browser/file-paths.ts +0 -18
- package/src/browser/goto.browser-test.ts +0 -44
- package/src/browser/navigation-error.ts +0 -26
- package/src/browser/navigation.browser-test.ts +0 -172
- package/src/browser/page-api.browser-test.ts +0 -228
- package/src/browser/page-logs.browser-test.ts +0 -119
- package/src/browser/page-logs.test.ts +0 -212
- package/src/browser/page-logs.ts +0 -208
- package/src/browser/page-wait.ts +0 -19
- package/src/browser/page.test.ts +0 -1567
- package/src/browser/page.ts +0 -1176
- package/src/browser/pdf.ts +0 -62
- package/src/browser/screenshot.ts +0 -65
- package/src/browser/transfers.browser-test.ts +0 -180
- package/src/config/config.ts +0 -33
- package/src/config/default.ts +0 -5
- package/src/config/fixtures.test.ts +0 -137
- package/src/config/mask.test.ts +0 -143
- package/src/config/mask.ts +0 -87
- package/src/config/run-settings.test.ts +0 -163
- package/src/config/run-settings.ts +0 -114
- package/src/config/secrets.ts +0 -70
- package/src/config/variables.ts +0 -31
- package/src/index.ts +0 -10
- package/src/locator/action-timeout-error.test.ts +0 -83
- package/src/locator/action-timeout-error.ts +0 -72
- package/src/locator/element-state.test.ts +0 -181
- package/src/locator/element-state.ts +0 -159
- package/src/locator/locate-nodes.browser-test.ts +0 -169
- package/src/locator/locator-actions.test.ts +0 -355
- package/src/locator/locator-chain.test.ts +0 -292
- package/src/locator/locator.browser-test.ts +0 -137
- package/src/locator/locator.test.ts +0 -179
- package/src/locator/locator.ts +0 -656
- package/src/locator/selector-errors.ts +0 -18
- package/src/locator/selector.test.ts +0 -124
- package/src/locator/selector.ts +0 -107
- package/src/locator/set-files.browser-test.ts +0 -141
- package/src/locator/set-files.test.ts +0 -191
- package/src/locator/text-locator.test.ts +0 -118
- package/src/logger/index.test.ts +0 -28
- package/src/logger/index.ts +0 -40
- package/src/network/data-collector.test.ts +0 -111
- package/src/network/data-collector.ts +0 -92
- package/src/network/network-data.browser-test.ts +0 -192
- package/src/network/network-tracker.browser-test.ts +0 -151
- package/src/network/network-tracker.test.ts +0 -307
- package/src/network/network-tracker.ts +0 -286
- package/src/network/network-wait.ts +0 -28
- package/src/network/response.test.ts +0 -93
- package/src/network/response.ts +0 -58
- package/src/network/router.browser-test.ts +0 -260
- package/src/network/router.test.ts +0 -528
- package/src/network/router.ts +0 -420
- package/src/network/url-match.test.ts +0 -69
- package/src/network/url-match.ts +0 -41
- package/src/runner/page-logs-report.test.ts +0 -144
- package/src/runner/page-logs-report.ts +0 -82
- package/src/runner/prepare-run.test.ts +0 -33
- package/src/runner/prepare-run.ts +0 -36
- package/src/runner/registry.test.ts +0 -59
- package/src/runner/registry.ts +0 -46
- package/src/runner/reporter.test.ts +0 -73
- package/src/runner/reporter.ts +0 -109
- package/src/runner/test-error.test.ts +0 -39
- package/src/runner/test-error.ts +0 -20
- package/src/runner/test-runner.ts +0 -184
- package/src/script/call-function.browser-test.ts +0 -112
- package/src/script/call-function.test.ts +0 -174
- package/src/script/call-function.ts +0 -113
- package/src/script/helpers.test.ts +0 -116
- package/src/script/helpers.ts +0 -68
- package/src/script/preload.browser-test.ts +0 -144
- package/src/script/preload.test.ts +0 -180
- package/src/script/preload.ts +0 -102
- package/src/script/serialize.test.ts +0 -182
- package/src/script/serialize.ts +0 -203
- package/src/testing/browser-fixture.ts +0 -18
- package/src/testing/fake-websocket.ts +0 -72
- package/src/testing/stub-connector.ts +0 -154
- package/src/tests/index.spec.ts +0 -30
- package/src/transport/bidi-connection.test.ts +0 -155
- package/src/transport/bidi-connection.ts +0 -256
- package/src/transport/bidi-error.ts +0 -23
- package/src/transport/foundation.browser-test.ts +0 -73
- package/src/transport/subscriptions.test.ts +0 -140
- package/src/transport/subscriptions.ts +0 -110
- package/src/types/bidi-commands.test-d.ts +0 -55
- package/src/wait/wait-until.test.ts +0 -117
- package/src/wait/wait-until.ts +0 -86
- package/tsconfig.json +0 -44
- /package/{src/api.ts → dist/api.d.ts} +0 -0
- /package/{src/locator/text-locator.ts → dist/locator/text-locator.js} +0 -0
- /package/{src → dist}/types/bidi-modules/browser.d.ts +0 -0
- /package/{src → dist}/types/bidi-modules/browsing-context.d.ts +0 -0
- /package/{src → dist}/types/bidi-modules/emulation.d.ts +0 -0
- /package/{src → dist}/types/bidi-modules/input.d.ts +0 -0
- /package/{src → dist}/types/bidi-modules/log.d.ts +0 -0
- /package/{src → dist}/types/bidi-modules/network.d.ts +0 -0
- /package/{src → dist}/types/bidi-modules/permissions.d.ts +0 -0
- /package/{src → dist}/types/bidi-modules/script.d.ts +0 -0
- /package/{src → dist}/types/bidi-modules/session.d.ts +0 -0
- /package/{src → dist}/types/bidi-modules/storage.d.ts +0 -0
- /package/{src → dist}/types/bidi-modules/web-extensions.d.ts +0 -0
- /package/{src → dist}/types/bidi-protocols/command.d.ts +0 -0
- /package/{src → dist}/types/bidi-protocols/error.d.ts +0 -0
- /package/{src → dist}/types/bidi-protocols/event.d.ts +0 -0
- /package/{src → dist}/types/bidi.d.ts +0 -0
- /package/{src → dist}/types/browser.d.ts +0 -0
- /package/{src → dist}/types/config.d.ts +0 -0
- /package/{src → dist}/types/env.d.ts +0 -0
|
@@ -1,117 +0,0 @@
|
|
|
1
|
-
import { test } from "node:test";
|
|
2
|
-
import assert from "node:assert/strict";
|
|
3
|
-
import { resolveTimeout, waitUntil, WaitTimeoutError } from "./wait-until.js";
|
|
4
|
-
import { resolveRunSettings, setRunSettings } from "../config/run-settings.js";
|
|
5
|
-
|
|
6
|
-
/** Probe returning the given values in order; the last one repeats */
|
|
7
|
-
function sequence<T>(...values: T[]) {
|
|
8
|
-
let calls = 0;
|
|
9
|
-
const probe = async () => values[Math.min(calls++, values.length - 1)]!;
|
|
10
|
-
return { probe, calls: () => calls };
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
test("probes until isDone and resolves with that value", async () => {
|
|
14
|
-
const { probe, calls } = sequence(1, 2, 3);
|
|
15
|
-
assert.equal(await waitUntil(probe, (value) => value === 3, { timeout: 2000 }), 3);
|
|
16
|
-
assert.equal(calls(), 3);
|
|
17
|
-
});
|
|
18
|
-
|
|
19
|
-
test("passes the previous value to isDone", async () => {
|
|
20
|
-
const { probe } = sequence(1, 2, 2);
|
|
21
|
-
const seen: Array<[number, number | undefined]> = [];
|
|
22
|
-
await waitUntil(
|
|
23
|
-
probe,
|
|
24
|
-
(current, previous) => {
|
|
25
|
-
seen.push([current, previous]);
|
|
26
|
-
return current === previous;
|
|
27
|
-
},
|
|
28
|
-
{ timeout: 2000 },
|
|
29
|
-
);
|
|
30
|
-
assert.deepEqual(seen, [
|
|
31
|
-
[1, undefined],
|
|
32
|
-
[2, 1],
|
|
33
|
-
[2, 2],
|
|
34
|
-
]);
|
|
35
|
-
});
|
|
36
|
-
|
|
37
|
-
test("times out with the last value, ending at the deadline", async () => {
|
|
38
|
-
const { probe, calls } = sequence("a", "b");
|
|
39
|
-
const start = Date.now();
|
|
40
|
-
await assert.rejects(waitUntil(probe, () => false, { timeout: 250 }), (err) => {
|
|
41
|
-
assert.ok(err instanceof WaitTimeoutError);
|
|
42
|
-
assert.equal(err.name, "WaitTimeoutError");
|
|
43
|
-
assert.equal(err.timeout, 250);
|
|
44
|
-
assert.equal(err.last, "b");
|
|
45
|
-
return true;
|
|
46
|
-
});
|
|
47
|
-
const elapsed = Date.now() - start;
|
|
48
|
-
// probes at ~0, ~100, ~200; the final sleep is clamped to the ~50ms left, and no probe starts after the deadline
|
|
49
|
-
assert.ok(elapsed >= 245 && elapsed < 295, `elapsed ${elapsed}ms`);
|
|
50
|
-
assert.equal(calls(), 3);
|
|
51
|
-
});
|
|
52
|
-
|
|
53
|
-
test("timeout 0 probes exactly once", async () => {
|
|
54
|
-
const { probe, calls } = sequence(false);
|
|
55
|
-
await assert.rejects(waitUntil(probe, (value) => value, { timeout: 0 }), WaitTimeoutError);
|
|
56
|
-
assert.equal(calls(), 1);
|
|
57
|
-
});
|
|
58
|
-
|
|
59
|
-
test("timeout 0 resolves when the single probe is done", async () => {
|
|
60
|
-
const { probe } = sequence(true);
|
|
61
|
-
assert.equal(await waitUntil(probe, (value) => value, { timeout: 0 }), true);
|
|
62
|
-
});
|
|
63
|
-
|
|
64
|
-
test("probe errors are rethrown without retrying", async () => {
|
|
65
|
-
let calls = 0;
|
|
66
|
-
const probe = async () => {
|
|
67
|
-
calls++;
|
|
68
|
-
throw new Error("boom");
|
|
69
|
-
};
|
|
70
|
-
await assert.rejects(waitUntil(probe, () => true, { timeout: 2000 }), /boom/);
|
|
71
|
-
assert.equal(calls, 1);
|
|
72
|
-
});
|
|
73
|
-
|
|
74
|
-
test("a probe that never settles stops at the deadline", async () => {
|
|
75
|
-
const start = Date.now();
|
|
76
|
-
await assert.rejects(
|
|
77
|
-
waitUntil(() => new Promise<never>(() => {}), () => true, { timeout: 200 }),
|
|
78
|
-
(err) => {
|
|
79
|
-
assert.ok(err instanceof WaitTimeoutError);
|
|
80
|
-
assert.equal(err.last, undefined);
|
|
81
|
-
return true;
|
|
82
|
-
},
|
|
83
|
-
);
|
|
84
|
-
assert.ok(Date.now() - start < 400);
|
|
85
|
-
});
|
|
86
|
-
|
|
87
|
-
test("a probe that hangs after earlier results reports the last completed value", async () => {
|
|
88
|
-
let calls = 0;
|
|
89
|
-
const probe = () => (calls++ === 0 ? Promise.resolve("first") : new Promise<string>(() => {}));
|
|
90
|
-
await assert.rejects(waitUntil(probe, () => false, { timeout: 200 }), (err) => {
|
|
91
|
-
assert.ok(err instanceof WaitTimeoutError);
|
|
92
|
-
assert.equal(err.last, "first");
|
|
93
|
-
return true;
|
|
94
|
-
});
|
|
95
|
-
});
|
|
96
|
-
|
|
97
|
-
test("no timer outlives a resolved wait", async () => {
|
|
98
|
-
const timers = () => process.getActiveResourcesInfo().filter((name) => name === "Timeout").length;
|
|
99
|
-
const before = timers();
|
|
100
|
-
await waitUntil(async () => true, (value) => value, { timeout: 10000 });
|
|
101
|
-
assert.equal(timers(), before);
|
|
102
|
-
});
|
|
103
|
-
|
|
104
|
-
test("resolveTimeout prefers the per-call value", async () => {
|
|
105
|
-
assert.equal(await resolveTimeout(1234), 1234);
|
|
106
|
-
assert.equal(await resolveTimeout(0), 0);
|
|
107
|
-
});
|
|
108
|
-
|
|
109
|
-
test("resolveTimeout uses the active run's expect timeout", async () => {
|
|
110
|
-
setRunSettings(resolveRunSettings({}, { expectTimeout: 1234 }));
|
|
111
|
-
try {
|
|
112
|
-
assert.equal(await resolveTimeout(), 1234);
|
|
113
|
-
assert.equal(await resolveTimeout(10), 10);
|
|
114
|
-
} finally {
|
|
115
|
-
setRunSettings(undefined);
|
|
116
|
-
}
|
|
117
|
-
});
|
package/src/wait/wait-until.ts
DELETED
|
@@ -1,86 +0,0 @@
|
|
|
1
|
-
import { setTimeout as sleep } from "node:timers/promises";
|
|
2
|
-
import { readConfig } from "../config/config.js";
|
|
3
|
-
import { peekRunSettings } from "../config/run-settings.js";
|
|
4
|
-
|
|
5
|
-
const DEFAULT_TIMEOUT = 5000;
|
|
6
|
-
const DEFAULT_INTERVAL = 100;
|
|
7
|
-
|
|
8
|
-
export interface WaitOptions {
|
|
9
|
-
/** Total time (ms) to keep probing; 0 probes exactly once */
|
|
10
|
-
timeout: number;
|
|
11
|
-
/** Time (ms) between probes. @default 100 */
|
|
12
|
-
interval?: number;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
export class WaitTimeoutError<T> extends Error {
|
|
16
|
-
public readonly timeout: number;
|
|
17
|
-
/** Last completed probe result; undefined when no probe completed */
|
|
18
|
-
public readonly last: T | undefined;
|
|
19
|
-
|
|
20
|
-
constructor(timeout: number, last: T | undefined) {
|
|
21
|
-
super(`Condition not met within ${timeout}ms`);
|
|
22
|
-
this.name = "WaitTimeoutError";
|
|
23
|
-
this.timeout = timeout;
|
|
24
|
-
this.last = last;
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
/** Per-call timeout, else the active run's expect timeout, else config `expect.timeout`, else 5000 */
|
|
29
|
-
export async function resolveTimeout(perCall?: number): Promise<number> {
|
|
30
|
-
if (perCall !== undefined) return perCall;
|
|
31
|
-
const run = peekRunSettings();
|
|
32
|
-
if (run) return run.expectTimeout;
|
|
33
|
-
return (await readConfig("expect"))?.timeout ?? DEFAULT_TIMEOUT;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
const DEADLINE = Symbol("deadline");
|
|
37
|
-
|
|
38
|
-
/**
|
|
39
|
-
* Races `probe()` against the time left. Resolves `{ value }` when the probe wins,
|
|
40
|
-
* DEADLINE when the time runs out first; probe errors reject as-is.
|
|
41
|
-
*/
|
|
42
|
-
function probeBefore<T>(
|
|
43
|
-
probe: () => Promise<T>,
|
|
44
|
-
remaining: number,
|
|
45
|
-
): Promise<{ value: T } | typeof DEADLINE> {
|
|
46
|
-
const probing = probe();
|
|
47
|
-
let timer: ReturnType<typeof setTimeout> | undefined;
|
|
48
|
-
const expired = new Promise<typeof DEADLINE>((resolve) => {
|
|
49
|
-
timer = setTimeout(() => resolve(DEADLINE), remaining);
|
|
50
|
-
});
|
|
51
|
-
// A probe that loses the race may still fail later; nobody is waiting for it any more
|
|
52
|
-
probing.catch(() => {});
|
|
53
|
-
return Promise.race([probing.then((value) => ({ value })), expired]).finally(() =>
|
|
54
|
-
clearTimeout(timer),
|
|
55
|
-
);
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
/**
|
|
59
|
-
* Probes until `isDone(current, previous)` is true and resolves with that result.
|
|
60
|
-
* Always probes at least once; with `timeout > 0` every probe races the time left.
|
|
61
|
-
* Probe errors are rethrown immediately. Throws WaitTimeoutError at the deadline.
|
|
62
|
-
*/
|
|
63
|
-
export async function waitUntil<T>(
|
|
64
|
-
probe: () => Promise<T>,
|
|
65
|
-
isDone: (current: T, previous: T | undefined) => boolean,
|
|
66
|
-
{ timeout, interval = DEFAULT_INTERVAL }: WaitOptions,
|
|
67
|
-
): Promise<T> {
|
|
68
|
-
const deadline = Date.now() + timeout;
|
|
69
|
-
let previous: T | undefined;
|
|
70
|
-
|
|
71
|
-
for (let first = true; ; first = false) {
|
|
72
|
-
const remaining = deadline - Date.now();
|
|
73
|
-
// Only start a probe while time remains; a later one could only lose the race
|
|
74
|
-
if (!first && remaining <= 0) throw new WaitTimeoutError(timeout, previous);
|
|
75
|
-
|
|
76
|
-
// timeout 0 keeps the single probe un-raced so it always completes
|
|
77
|
-
const result = timeout > 0 ? await probeBefore(probe, remaining) : { value: await probe() };
|
|
78
|
-
if (result === DEADLINE) throw new WaitTimeoutError(timeout, previous);
|
|
79
|
-
if (isDone(result.value, previous)) return result.value;
|
|
80
|
-
previous = result.value;
|
|
81
|
-
|
|
82
|
-
const left = deadline - Date.now();
|
|
83
|
-
if (left <= 0) throw new WaitTimeoutError(timeout, previous);
|
|
84
|
-
await sleep(Math.min(interval, left));
|
|
85
|
-
}
|
|
86
|
-
}
|
package/tsconfig.json
DELETED
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
// Visit https://aka.ms/tsconfig to read more about this file
|
|
3
|
-
"compilerOptions": {
|
|
4
|
-
// File Layout
|
|
5
|
-
"rootDir": "./src",
|
|
6
|
-
"outDir": "./dist",
|
|
7
|
-
"paths": {
|
|
8
|
-
"browsers/*": ["./browsers"]
|
|
9
|
-
},
|
|
10
|
-
|
|
11
|
-
// Environment Settings
|
|
12
|
-
// See also https://aka.ms/tsconfig/module
|
|
13
|
-
"module": "nodenext",
|
|
14
|
-
"target": "es2021",
|
|
15
|
-
"types": ["node"],
|
|
16
|
-
// For nodejs:
|
|
17
|
-
// "lib": ["esnext"],
|
|
18
|
-
|
|
19
|
-
// Other Outputs
|
|
20
|
-
"sourceMap": false,
|
|
21
|
-
"declaration": true,
|
|
22
|
-
"declarationMap": false,
|
|
23
|
-
|
|
24
|
-
// Stricter Typechecking Options
|
|
25
|
-
"noUncheckedIndexedAccess": true,
|
|
26
|
-
|
|
27
|
-
// Style Optiong
|
|
28
|
-
// "noImplicitReturns": true,
|
|
29
|
-
// "noImplicitOverride": true,
|
|
30
|
-
// "noUnusedLocals": true,
|
|
31
|
-
// "noUnusedParameters": true,
|
|
32
|
-
// "noFallthroughCasesInSwitch": true,
|
|
33
|
-
// "noPropertyAccessFromIndexSignature": true,
|
|
34
|
-
|
|
35
|
-
// Recommended Options
|
|
36
|
-
"strict": true,
|
|
37
|
-
"verbatimModuleSyntax": true,
|
|
38
|
-
"isolatedModules": true,
|
|
39
|
-
"noUncheckedSideEffectImports": true,
|
|
40
|
-
"moduleDetection": "force",
|
|
41
|
-
"skipLibCheck": true
|
|
42
|
-
},
|
|
43
|
-
"include": ["src"]
|
|
44
|
-
}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|