@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
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export interface WaitOptions {
|
|
2
|
+
/** Total time (ms) to keep probing; 0 probes exactly once */
|
|
3
|
+
timeout: number;
|
|
4
|
+
/** Time (ms) between probes. @default 100 */
|
|
5
|
+
interval?: number;
|
|
6
|
+
}
|
|
7
|
+
export declare class WaitTimeoutError<T> extends Error {
|
|
8
|
+
readonly timeout: number;
|
|
9
|
+
/** Last completed probe result; undefined when no probe completed */
|
|
10
|
+
readonly last: T | undefined;
|
|
11
|
+
constructor(timeout: number, last: T | undefined);
|
|
12
|
+
}
|
|
13
|
+
/** Per-call timeout, else the active run's expect timeout, else config `expect.timeout`, else 5000 */
|
|
14
|
+
export declare function resolveTimeout(perCall?: number): Promise<number>;
|
|
15
|
+
/**
|
|
16
|
+
* Probes until `isDone(current, previous)` is true and resolves with that result.
|
|
17
|
+
* Always probes at least once; with `timeout > 0` every probe races the time left.
|
|
18
|
+
* Probe errors are rethrown immediately. Throws WaitTimeoutError at the deadline.
|
|
19
|
+
*/
|
|
20
|
+
export declare function waitUntil<T>(probe: () => Promise<T>, isDone: (current: T, previous: T | undefined) => boolean, { timeout, interval }: WaitOptions): Promise<T>;
|
|
@@ -0,0 +1,63 @@
|
|
|
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
|
+
const DEFAULT_TIMEOUT = 5000;
|
|
5
|
+
const DEFAULT_INTERVAL = 100;
|
|
6
|
+
export class WaitTimeoutError extends Error {
|
|
7
|
+
constructor(timeout, last) {
|
|
8
|
+
super(`Condition not met within ${timeout}ms`);
|
|
9
|
+
this.name = "WaitTimeoutError";
|
|
10
|
+
this.timeout = timeout;
|
|
11
|
+
this.last = last;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
/** Per-call timeout, else the active run's expect timeout, else config `expect.timeout`, else 5000 */
|
|
15
|
+
export async function resolveTimeout(perCall) {
|
|
16
|
+
if (perCall !== undefined)
|
|
17
|
+
return perCall;
|
|
18
|
+
const run = peekRunSettings();
|
|
19
|
+
if (run)
|
|
20
|
+
return run.expectTimeout;
|
|
21
|
+
return (await readConfig("expect"))?.timeout ?? DEFAULT_TIMEOUT;
|
|
22
|
+
}
|
|
23
|
+
const DEADLINE = Symbol("deadline");
|
|
24
|
+
/**
|
|
25
|
+
* Races `probe()` against the time left. Resolves `{ value }` when the probe wins,
|
|
26
|
+
* DEADLINE when the time runs out first; probe errors reject as-is.
|
|
27
|
+
*/
|
|
28
|
+
function probeBefore(probe, remaining) {
|
|
29
|
+
const probing = probe();
|
|
30
|
+
let timer;
|
|
31
|
+
const expired = new Promise((resolve) => {
|
|
32
|
+
timer = setTimeout(() => resolve(DEADLINE), remaining);
|
|
33
|
+
});
|
|
34
|
+
// A probe that loses the race may still fail later; nobody is waiting for it any more
|
|
35
|
+
probing.catch(() => { });
|
|
36
|
+
return Promise.race([probing.then((value) => ({ value })), expired]).finally(() => clearTimeout(timer));
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Probes until `isDone(current, previous)` is true and resolves with that result.
|
|
40
|
+
* Always probes at least once; with `timeout > 0` every probe races the time left.
|
|
41
|
+
* Probe errors are rethrown immediately. Throws WaitTimeoutError at the deadline.
|
|
42
|
+
*/
|
|
43
|
+
export async function waitUntil(probe, isDone, { timeout, interval = DEFAULT_INTERVAL }) {
|
|
44
|
+
const deadline = Date.now() + timeout;
|
|
45
|
+
let previous;
|
|
46
|
+
for (let first = true;; first = false) {
|
|
47
|
+
const remaining = deadline - Date.now();
|
|
48
|
+
// Only start a probe while time remains; a later one could only lose the race
|
|
49
|
+
if (!first && remaining <= 0)
|
|
50
|
+
throw new WaitTimeoutError(timeout, previous);
|
|
51
|
+
// timeout 0 keeps the single probe un-raced so it always completes
|
|
52
|
+
const result = timeout > 0 ? await probeBefore(probe, remaining) : { value: await probe() };
|
|
53
|
+
if (result === DEADLINE)
|
|
54
|
+
throw new WaitTimeoutError(timeout, previous);
|
|
55
|
+
if (isDone(result.value, previous))
|
|
56
|
+
return result.value;
|
|
57
|
+
previous = result.value;
|
|
58
|
+
const left = deadline - Date.now();
|
|
59
|
+
if (left <= 0)
|
|
60
|
+
throw new WaitTimeoutError(timeout, previous);
|
|
61
|
+
await sleep(Math.min(interval, left));
|
|
62
|
+
}
|
|
63
|
+
}
|
package/package.json
CHANGED
|
@@ -1,16 +1,37 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@itmetsam/samurai-framework",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "",
|
|
5
|
-
"main": "
|
|
5
|
+
"main": "dist/api.js",
|
|
6
6
|
"exports": {
|
|
7
|
-
".":
|
|
7
|
+
".": {
|
|
8
|
+
"types": "./dist/api.d.ts",
|
|
9
|
+
"default": "./dist/api.js"
|
|
10
|
+
},
|
|
11
|
+
"./runner": {
|
|
12
|
+
"types": "./dist/runner/run.d.ts",
|
|
13
|
+
"default": "./dist/runner/run.js"
|
|
14
|
+
},
|
|
15
|
+
"./steps": {
|
|
16
|
+
"types": "./dist/steps/index.d.ts",
|
|
17
|
+
"default": "./dist/steps/index.js"
|
|
18
|
+
},
|
|
19
|
+
"./recorder": {
|
|
20
|
+
"types": "./dist/recorder/index.d.ts",
|
|
21
|
+
"default": "./dist/recorder/index.js"
|
|
22
|
+
},
|
|
23
|
+
"./browser": {
|
|
24
|
+
"types": "./dist/browser/index.d.ts",
|
|
25
|
+
"default": "./dist/browser/index.js"
|
|
26
|
+
},
|
|
27
|
+
"./package.json": "./package.json"
|
|
8
28
|
},
|
|
9
29
|
"scripts": {
|
|
10
30
|
"dev": "tsx src/index.ts",
|
|
11
|
-
"build": "tsc",
|
|
31
|
+
"build": "rm -rf dist && tsc -p tsconfig.build.json && node scripts/copy-types.mjs",
|
|
12
32
|
"test": "tsx --test --test-timeout=10000 \"src/**/*.test.ts\"",
|
|
13
|
-
"test:browser": "tsx --test --test-concurrency=1 \"src/**/*.browser-test.ts\""
|
|
33
|
+
"test:browser": "tsx --test --test-concurrency=1 \"src/**/*.browser-test.ts\"",
|
|
34
|
+
"test:cli": "tsx --test --test-concurrency=1 \"src/**/*.cli-test.ts\""
|
|
14
35
|
},
|
|
15
36
|
"keywords": [],
|
|
16
37
|
"author": "",
|
|
@@ -18,10 +39,26 @@
|
|
|
18
39
|
"type": "module",
|
|
19
40
|
"devDependencies": {
|
|
20
41
|
"@types/node": "^25.6.0",
|
|
21
|
-
"tsx": "^4.21.0"
|
|
22
|
-
"typescript": "^6.0.2"
|
|
42
|
+
"tsx": "^4.21.0"
|
|
23
43
|
},
|
|
24
44
|
"dependencies": {
|
|
45
|
+
"typescript": "^6.0.2",
|
|
25
46
|
"winston": "^3.19.0"
|
|
47
|
+
},
|
|
48
|
+
"types": "dist/api.d.ts",
|
|
49
|
+
"files": [
|
|
50
|
+
"dist",
|
|
51
|
+
"bin"
|
|
52
|
+
],
|
|
53
|
+
"bin": {
|
|
54
|
+
"samurai": "bin/samurai.mjs"
|
|
55
|
+
},
|
|
56
|
+
"peerDependencies": {
|
|
57
|
+
"tsx": "^4.21.0"
|
|
58
|
+
},
|
|
59
|
+
"peerDependenciesMeta": {
|
|
60
|
+
"tsx": {
|
|
61
|
+
"optional": true
|
|
62
|
+
}
|
|
26
63
|
}
|
|
27
64
|
}
|
package/.env.example
DELETED
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
name: Setup
|
|
2
|
-
description: Install bun, Node and the locked dependencies
|
|
3
|
-
|
|
4
|
-
runs:
|
|
5
|
-
using: composite
|
|
6
|
-
steps:
|
|
7
|
-
- uses: oven-sh/setup-bun@v2
|
|
8
|
-
with:
|
|
9
|
-
bun-version: 1.3.0
|
|
10
|
-
# The test scripts run tsx on Node's test runner, which needs Node 22+ (fs/promises glob)
|
|
11
|
-
- uses: actions/setup-node@v4
|
|
12
|
-
with:
|
|
13
|
-
node-version: 26
|
|
14
|
-
- name: Install dependencies
|
|
15
|
-
shell: bash
|
|
16
|
-
run: bun install --frozen-lockfile
|
package/.github/workflows/ci.yml
DELETED
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
name: CI
|
|
2
|
-
|
|
3
|
-
on:
|
|
4
|
-
push:
|
|
5
|
-
branches: [main]
|
|
6
|
-
pull_request:
|
|
7
|
-
|
|
8
|
-
concurrency:
|
|
9
|
-
group: ci-${{ github.ref }}
|
|
10
|
-
cancel-in-progress: ${{ github.event_name == 'pull_request' }}
|
|
11
|
-
|
|
12
|
-
permissions:
|
|
13
|
-
contents: read
|
|
14
|
-
|
|
15
|
-
jobs:
|
|
16
|
-
typecheck:
|
|
17
|
-
name: Typecheck
|
|
18
|
-
runs-on: ubuntu-latest
|
|
19
|
-
timeout-minutes: 5
|
|
20
|
-
steps:
|
|
21
|
-
- uses: actions/checkout@v4
|
|
22
|
-
- uses: ./.github/actions/setup
|
|
23
|
-
- name: Typecheck
|
|
24
|
-
run: bunx tsc --noEmit -p .
|
|
25
|
-
|
|
26
|
-
unit:
|
|
27
|
-
name: Unit tests
|
|
28
|
-
runs-on: ubuntu-latest
|
|
29
|
-
timeout-minutes: 10
|
|
30
|
-
steps:
|
|
31
|
-
- uses: actions/checkout@v4
|
|
32
|
-
- uses: ./.github/actions/setup
|
|
33
|
-
- name: Unit tests
|
|
34
|
-
run: bun run test
|
|
35
|
-
|
|
36
|
-
browser:
|
|
37
|
-
name: Browser tests (Firefox)
|
|
38
|
-
runs-on: ubuntu-latest
|
|
39
|
-
timeout-minutes: 15
|
|
40
|
-
steps:
|
|
41
|
-
- uses: actions/checkout@v4
|
|
42
|
-
- uses: ./.github/actions/setup
|
|
43
|
-
- name: Firefox version
|
|
44
|
-
run: firefox --version
|
|
45
|
-
- name: Browser tests
|
|
46
|
-
timeout-minutes: 12
|
|
47
|
-
run: bun run test:browser
|
|
48
|
-
- name: Upload logs
|
|
49
|
-
if: failure()
|
|
50
|
-
uses: actions/upload-artifact@v4
|
|
51
|
-
with:
|
|
52
|
-
name: browser-test-logs
|
|
53
|
-
path: |
|
|
54
|
-
logs/
|
|
55
|
-
result/
|
|
56
|
-
retention-days: 7
|
|
57
|
-
if-no-files-found: ignore
|
|
58
|
-
|
|
59
|
-
trunk:
|
|
60
|
-
name: Code quality (Trunk)
|
|
61
|
-
runs-on: ubuntu-latest
|
|
62
|
-
timeout-minutes: 15
|
|
63
|
-
permissions:
|
|
64
|
-
contents: read
|
|
65
|
-
checks: write
|
|
66
|
-
steps:
|
|
67
|
-
- uses: actions/checkout@v4
|
|
68
|
-
with:
|
|
69
|
-
fetch-depth: 0
|
|
70
|
-
# Checks only what the PR or push changed; linters come from .trunk/trunk.yaml
|
|
71
|
-
- uses: trunk-io/trunk-action@v1
|
package/.trunk/trunk.yaml
DELETED
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
# This file controls the behavior of Trunk: https://docs.trunk.io/cli
|
|
2
|
-
# To learn more about the format of this file, see https://docs.trunk.io/reference/trunk-yaml
|
|
3
|
-
version: 0.1
|
|
4
|
-
cli:
|
|
5
|
-
version: 1.25.0
|
|
6
|
-
# Trunk provides extensibility via plugins. (https://docs.trunk.io/plugins)
|
|
7
|
-
plugins:
|
|
8
|
-
sources:
|
|
9
|
-
- id: trunk
|
|
10
|
-
ref: v1.11.0
|
|
11
|
-
uri: https://github.com/trunk-io/plugins
|
|
12
|
-
# Many linters and tools depend on runtimes - configure them here. (https://docs.trunk.io/runtimes)
|
|
13
|
-
runtimes:
|
|
14
|
-
enabled:
|
|
15
|
-
- node@22.16.0
|
|
16
|
-
- python@3.14.4
|
|
17
|
-
# This is the section where you manage your linters. (https://docs.trunk.io/check/configuration)
|
|
18
|
-
lint:
|
|
19
|
-
enabled:
|
|
20
|
-
- checkov@3.3.22
|
|
21
|
-
- git-diff-check
|
|
22
|
-
- grype@0.119.0
|
|
23
|
-
- markdownlint@0.49.1
|
|
24
|
-
- osv-scanner@2.6.0
|
|
25
|
-
- prettier@3.9.9
|
|
26
|
-
- svgo@4.1.0
|
|
27
|
-
- trufflehog@3.97.9
|
|
28
|
-
- yamllint@1.38.0
|
|
29
|
-
actions:
|
|
30
|
-
enabled:
|
|
31
|
-
- trunk-announce
|
|
32
|
-
- trunk-check-pre-push
|
|
33
|
-
- trunk-fmt-pre-commit
|
|
34
|
-
- trunk-upgrade-available
|
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
# WebDriver BiDi adoption — roadmap
|
|
2
|
-
|
|
3
|
-
Date: 2026-09-29
|
|
4
|
-
Source: https://www.w3.org/TR/webdriver-bidi/
|
|
5
|
-
Status: all 15 specs (0 to 14) are implemented.
|
|
6
|
-
|
|
7
|
-
Each item links to its spec in `docs/superpowers/specs/`. Order respects dependencies (`←`).
|
|
8
|
-
|
|
9
|
-
## Todo
|
|
10
|
-
|
|
11
|
-
### Phase 0 — prerequisite
|
|
12
|
-
- [x] **0. Foundation** — connector error replies, command typings, refcounted subscriptions, context tree, `newPage` fix — [spec](specs/2026-09-29-bidi-foundation-design.md)
|
|
13
|
-
|
|
14
|
-
### Phase 1 — locator core
|
|
15
|
-
- [x] **1. `script.callFunction` (+ `script.disown`)** ← 0 — [spec](specs/2026-09-29-script-call-function-design.md)
|
|
16
|
-
- [x] **2. `script.addPreloadScript`** ← 0, 1 — [spec](specs/2026-09-29-preload-scripts-design.md)
|
|
17
|
-
- [x] **3. `browsingContext.locateNodes`** ← 1 (2 optional) — [spec](specs/2026-09-29-locate-nodes-design.md)
|
|
18
|
-
- [x] **4. `input.setFiles`** ← 1, 3 — [spec](specs/2026-09-29-set-files-design.md)
|
|
19
|
-
|
|
20
|
-
### Phase 2 — waiting correctness
|
|
21
|
-
- [x] **5. Network tracking + real network idle** ← 0 — [spec](specs/2026-09-29-network-tracking-design.md)
|
|
22
|
-
- [x] **6. Navigation waits (`navigate` wait, load events, reload)** ← 0, 5 — [spec](specs/2026-09-29-navigation-waits-design.md)
|
|
23
|
-
- [x] **7. User prompts (`handleUserPrompt`)** ← 0 — [spec](specs/2026-09-29-user-prompts-design.md)
|
|
24
|
-
- [x] **8. Logs and page errors (`log.entryAdded`)** ← 0, 1 — [spec](specs/2026-09-29-logs-and-errors-design.md)
|
|
25
|
-
|
|
26
|
-
### Phase 3 — features
|
|
27
|
-
- [x] **9. Network interception (mock / block / modify)** ← 0, 5 — [spec](specs/2026-09-29-network-interception-design.md)
|
|
28
|
-
- [x] **10. Network data (cache control, response bodies)** ← 5 — [spec](specs/2026-09-29-network-data-design.md)
|
|
29
|
-
- [x] **11. Page API completeness (viewport, reload, history, close, pdf, screenshot)** ← 0, 1 — [spec](specs/2026-09-29-page-api-design.md)
|
|
30
|
-
- [x] **12. User contexts + storage** ← 0 — [spec](specs/2026-09-29-contexts-and-storage-design.md)
|
|
31
|
-
|
|
32
|
-
### Phase 4 — nice to have
|
|
33
|
-
- [x] **13. Emulation** ← 12 — [spec](specs/2026-09-29-emulation-design.md)
|
|
34
|
-
- [x] **14. Downloads + file dialogs** ← 0, 4 — [spec](specs/2026-09-29-downloads-and-file-dialogs-design.md)
|
|
35
|
-
|
|
36
|
-
## Dependency graph
|
|
37
|
-
|
|
38
|
-
```
|
|
39
|
-
0 ─┬─ 1 ─┬─ 2
|
|
40
|
-
│ ├─ 3 ── 4 ── 14
|
|
41
|
-
│ ├─ 8
|
|
42
|
-
│ └─ 11
|
|
43
|
-
├─ 5 ─┬─ 6
|
|
44
|
-
│ ├─ 9
|
|
45
|
-
│ └─ 10
|
|
46
|
-
├─ 7
|
|
47
|
-
└─ 12 ── 13
|
|
48
|
-
```
|
|
49
|
-
|
|
50
|
-
## Deliberately skipped
|
|
51
|
-
|
|
52
|
-
`webExtension.*`, `session.end`, `script.getRealms`, `script.removePreloadScript` as public API (used internally only), `network.continueWithAuth` (folded into spec 9 as a follow-up).
|
|
53
|
-
|
|
54
|
-
## Cross-cutting rules for every spec
|
|
55
|
-
|
|
56
|
-
- Test-first: each unit test before its implementation, using `src/testing/stub-connector.ts`; browser tests in `*.browser-test.ts` (`npm run test:browser`).
|
|
57
|
-
- Any feature that needs an event subscribes through the refcounted API from spec 0, never a bare `session.subscribe`.
|
|
58
|
-
- Every command a feature sends must be typed in `BiDiCommands` (spec 0 lists the missing ones).
|
|
59
|
-
- Timeouts resolve through `resolveTimeout` (actions/assertions) or the navigation timeout from spec 6 (navigation); no unbounded waits.
|
|
60
|
-
- Browser support is verified against Firefox (the only `SupportedBrowser` today). A command Firefox lacks is documented in its spec and surfaced as `UnsupportedOperationError`, not a hang.
|