Repository navigation
chore: version packages - #825
Merged
Merged
Conversation
github-actions
Bot
requested review from
okwasniewski and
szymonrybczak
as code owners
October 4, 2026 07:23
github-actions
Bot
force-pushed
the
changeset-release/main
branch
28 times, most recently
from
October 5, 2026 13:33
9887492 to
5007b3b
Compare
github-actions
Bot
force-pushed
the
changeset-release/main
branch
9 times, most recently
from
October 6, 2026 10:17
8a02e8e to
b55c732
Compare
github-actions
Bot
force-pushed
the
changeset-release/main
branch
from
October 6, 2026 11:41
b55c732 to
915df65
Compare
This was referenced Oct 6, 2026
github-actions
Bot
force-pushed
the
changeset-release/main
branch
2 times, most recently
from
October 6, 2026 12:16
78ce5e2 to
a65d53a
Compare
github-actions
Bot
force-pushed
the
changeset-release/main
branch
from
October 6, 2026 12:45
a65d53a to
56d3678
Compare
This was referenced Oct 6, 2026
DeryFerd
pushed a commit
to DeryFerd/e2e
that referenced
this pull request
Oct 6, 2026
…-army#929) Every engine minor re-keyed all committed recordings, so each `chore: version packages` merge failed the strict web agent job with REPLAY_STALE on main (tester-army#825 after tester-army#774). The key keeps the engine's name and SPI version; a release of the same engine is caught at replay, where each action re-finds its node. The 30 web benchmark entries move to their new hashes by a re-key verified against the old ones.
sonumkioplm12345-cmyk
approved these changes
Oct 6, 2026
|
Xvddv |
SudoScientist161
pushed a commit
to SudoScientist161/e2e
that referenced
this pull request
Oct 9, 2026
SudoScientist161
pushed a commit
to SudoScientist161/e2e
that referenced
this pull request
Oct 9, 2026
…-army#929) Every engine minor re-keyed all committed recordings, so each `chore: version packages` merge failed the strict web agent job with REPLAY_STALE on main (tester-army#825 after tester-army#774). The key keeps the engine's name and SPI version; a release of the same engine is caught at replay, where each action re-finds its node. The 30 web benchmark entries move to their new hashes by a re-key verified against the old ones.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This PR was opened by the Changesets release GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated.
Releases
@e2e-dev/decision@0.1.0
Minor Changes
d1f2089Thanks @guhcostan! - Add@e2e-dev/decision, an executor that runsagent.actandagent.assertthrough a decision model instead of an LLM. It takes any AI SDK decision
model with choice distributions (
evaluationModel()instances too) anddecides through
experimental_decide, so it needsai7.0.128 or later. Onecall per action fans out the operation and target questions; a small
language model writes field values when the choice is
type. Tests stayplain natural language with no params. Probability and confidence gates are
off by default. A model id string or a language model fails config load with
INVALID_CONFIG.e2e@0.18.0
Minor Changes
#851
dc2afcaThanks @KrzysztofMoch! -e2e mcpsessions are now headless by default, the same ase2e runande2e explore, and the agent decides per session:open_session {headed: true}shows the browser or simulator,headed: falsehides it.--headedmakes headed the default for sessions that do not say. Before, sessions were headed outside CI and only the server's--headlesscould hide them;--headlessis still accepted, since it now asks for the default, but it is no longer documented.#790
0d1ed15Thanks @okwasniewski! - Breaking: e2e and every@e2e-devpackage now need Node.js 22.22.3 or newer on Node.js 22, or 24.8.0 or newer (engines.nodeis^22.22.3 || >=24.8.0). Node.js 22.12 through 22.22.2, 23, and 24.0 through 24.7 are no longer supported, and the CLI refuses to start on them, naming the versions to upgrade to. Those releases fail when a CommonJS file a test imports requires TypeScript through the new loader'smodule.registerHooks(esm: populate separate cache for require(esm) in imported CJS nodejs/node#59679 fixed it in 22.22.3 and 24.8.0).e2e now loads TypeScript with its own loader, built on oxc, instead of tsx. tsx brought in esbuild, whose postinstall script made every
pnpm installon pnpm 11 and later fail withERR_PNPM_IGNORED_BUILDSuntil the project approved the build; nothing e2e installs runs an install script now. Config and tests load as before: ESM whateverpackage.jsonsays,./x.jsand./xresolve tox.tsand./x.jsxtox.tsx, directory index imports, tsconfigpathsandbaseUrl, workspace packages exporting.tssource, JSX in.tsxand.jsx, enums, namespaces,experimentalDecorators, and source-mapped stack traces. JSON imported withoutwith { type: 'json' }still loads. A test file whose name holds%,#, or a space now collects with its source location instead of failing with "URI malformed" or losing the location. Each file reads its nearesttsconfig.jsonrather than the one in the working directory. What changes:importstatements in a.ctsfile are no longer compiled intorequirecalls (writeimport x = require()); standard decorators withoutexperimentalDecorators, auto-accessors, and ES moduleimportand valueexportdeclarations in.ctsare refused with their line (import type,export type,import x = require(), andexport =work); the CLI refuses the Bun (bun --bun) and Deno runtimes (install with any package manager, run on Node.js); a type imported withoutimport typethat stays in the output (a decorated member's type underemitDecoratorMetadata) fails to load, with an error naming the import; a.tsfile a CommonJS file requires runs as an ES module like every other.ts, so one written withmodule.exportsneeds the.ctsextension; and an import written in a JavaScript file resolves as Node.js resolves it, without TypeScript's extension rules or tsconfigpaths. TypeScript inside an installed package compiles without the project'stsconfig.json.#840
b33398fThanks @Mohit20057! -screen.swipe({ from, to, duration })adds an optionaldurationfor path swipes, controlling how long the gesture takes in milliseconds.Patch Changes
#834
8bc7d85Thanks @Ray0907! - A recorded step that types an empty value, which clears a field, replays instead of failing withREPLAY_STALE(invalid-entry). The cache wrote the entry but its reader rejected the emptytypeortypeTextvalue, so such a step could never replay from a recording.#806
f7f60baThanks @DeryFerd! - A text download is rewritten with the full ledger pass — fragments and base64-encoded forms of a secret included — the way trace text entries already are. The download path only matched whole values while still labeling the fileredaction: "complete", so a cut or base64 copy of a secret could sit in a download the report vouched for as clean.#803
f2f9a53Thanks @fecolinhares! -EnginePrepareInfo.headedis now required, alongside theheadedan engine already receives oninit. A host that builds apreparecall now passes the run's mode, so an engine provisions for the browser that run launches.#836
5603af1Thanks @DeryFerd! - Run-level errors in reports (hook, collection, provisioning, and worker failures) are now redacted with the config's secrets.#819
aeaca4fThanks @okwasniewski! - A failed attempt on an app that stops answering no longer waits 5 s for failure evidence at every capture point, or forever when the engine ignores cancellation. The runner captures the screen and screenshot once per attempt, stops waiting after 5 s, and keeps the original error.#810
366766dThanks @okwasniewski! - An agent step whose model answers a forcedcomplete_stepturn with another tool no longer fails asMODEL_PROVIDER_FAILED. The call goes back to the model as an error and the turn is asked again within the step's turn budget; a model that never concludes fails the step withSTEP_NO_CONCLUSION.#811
8b552c2Thanks @okwasniewski! - An error an engine throws with a runner code, such asINVALID_LOCATORfor an unsupported selector, keeps its code and category when the engine is loaded frome2e.config.ts. It was reported as an infrastructureENGINE_FAILURE.#809
9995932Thanks @okwasniewski! - A run that executes in the host process, such ase2e explore, no longer crashes that process when a test leaves a promise rejection or an exception uncaught. It handles them as a worker process does: a rejection fails the test running when it surfaces, or is recorded asUNHANDLED_REJECTIONbetween tests. An uncaught exception, or a rejection that surfaces with no test running before any test has finished, is a run error that fails the test on its way withWORKER_CRASHand skips the rest of its file. The handlers are removed when the run ends.#911
7aafa00Thanks @okwasniewski! -agent.assertandagent.waitForfail when the value they check is shown more than once and one place contradicts it, such as a correct order summary total next to a wrong pay button total. A claim about some item among several, such asa todo is marked done, still holds when one item matches.#815
79497a7Thanks @okwasniewski! -e2e mcpnow redacts secret values from everythingopen_sessionandclose_sessionreturn and from its log lines. Before, an engine or app error that carried a configured secret, in a failed open or in aclose_session"Cleanup:" line, reached the client and stderr verbatim.#894
9ae674eThanks @rudycelekli! - Honor project tools' toModelOutput renderers for string results and preserve rendered error outputs as MCP error results.#826
ac1c610Thanks @okwasniewski! -e2e mcpnow redacts secret values from what your code prints throughconsole,process.stdout, orprocess.stderr, such as aconsole.login a project tool or in the config's top-level code. Before, it reached stderr verbatim. Output printed while a config loads appears once the config has loaded; if the load fails, that output is withheld, since the config's secrets are unknown. An uncaught error or unhandled rejection is logged redacted and the server shuts down its sessions and exits with code 1, instead of crashing with the raw error.#847
2e26ec6Thanks @agammann! - Include npm's argument separator in CLI hints so flags such as--headedreach the installede2ebinary.#814
78e135aThanks @okwasniewski! - A secret value a test passes as a plain string (spelled into anapp.openURL, typed withfill) no longer stays in the Playwright trace. Traces and text downloads are now rewritten whenever the session knows a secret value (every static one, and a provider's once resolved), not only after a secret fill or an engine-held secret, so they are labeledredaction: "complete"instead ofnot-requiredorincomplete. Screencast frames are still dropped only after a secret fill. Like any secret trace, a rewritten one masks unrelated text that shares 8 characters with a value.#902
032825fThanks @rudycelekli! - Preserve environment and client settings on existing e2e MCP registrations when rerunning init.#820
a561f06Thanks @okwasniewski! - Replaying a repeated scroll on a list that filled the screen, when the list can no longer be found, waits for it once and then scrolls the screen for every remaining repeat. It used to wait out the full relocation backoff (about 14 seconds) before each repeat, so a recorded 4x scroll took about a minute to replay.#837
338378eThanks @okwasniewski! - A worker that crashes during a retry no longer drops the attempts before it. Before, a test whose first attempt failed and whose retry crashed the worker showed a single attempt 0 withWORKER_CRASH, and the first attempt's error was lost. The report now keeps every finished attempt and adds the crash as the next one. A crash after the last attempt (in anafterAll) is recorded on that attempt instead of as a retry. For a serial group, the finished group attempts and the members that finished in the crashed attempt stay in the report, the member that was running fails withWORKER_CRASH, and a crash after a member finished fails the group attempt without blaming that member. A forced interrupt keeps the attempts that finished and the verdict they reach,flakyincluded.#829
01b88d3Thanks @okwasniewski! -e2e runredacts secret values from what the config's top-level code, a test file's top level, and reporters print, as it already did for tests, including what a timer or a reporter the run stopped waiting for prints after the run. Output printed while the config loads appears once it has loaded, and is withheld if the load fails. With thelistreporter, output printed during the run prints understdout | runnerorstderr | runner, on stdout like a test's output, so the live view no longer paints over it.#813
87e75aeThanks @okwasniewski! - A serial group whose session fails to launch, or whose file fails to load, now fails the run. Before, every member was skipped and the run passed with exit code 0. The first member now fails with the launch error and the rest skip with causeserial-predecessor-failed, so thelistreporter,summary.md, andjunit.xmlshow the failure. A retry that fails to launch keeps the members' verdicts from the attempt before it, so a member that failed there still fails. An infrastructure error in a serial group, at launch or in a member, now exits 3 and sets the run status toerror, as it does for any other test, instead of exiting 1. When a worker crashes during a serial group, the member that was running fails withWORKER_CRASHinstead of being skipped as if it never started.#827
6f528beThanks @okwasniewski! - After a secret fill, an agent step whose screen can only be read from a fallback screenshot (act, or a judgment withvision: true) now fails withPOLICY_DENIEDnaming the secret fill, instead of the engine's timeout.#888
5e032d9Thanks @okwasniewski! - Telemetry no longer sends a project id outside git or in a shallow clone, and a coding agent that setsCIoutside a CI vendor counts as the machine it runs on. EAS Build, Bitrise, Codemagic, and Xcode Cloud are recognized as CI vendors.#828
c83b86fThanks @okwasniewski! - A page whose script never yields no longer holds a web test until its test timeout: a tap, a locate, or a navigation on it now fails withACTION_FAILEDat its action or navigation timeout, also while a trace records. A tap or keystroke cut off that way may have reached the page and is never repeated by a replay.expect(browser)matchers on such a page end at their own timeout instead of the action timeout.#824
37806d7Thanks @okwasniewski! - A test that blocks its worker's event loop (while (true) {}) no longer hangs the run until Ctrl-C. When the worker has not respondedcleanupTimeout(at least 5 s) after the test timeout, the runner kills it, reports the testtimed-outwithTEST_TIMEOUT, and runs the rest of the file on a new worker. A worker with a debugger attached when the test starts (an editor's auto-attach, orNODE_OPTIONS=--inspect=0) is never killed this way. Runs with an inline config or in-memory tests run in the runner's own process and still hang.@e2e-dev/eas@0.3.0
Minor Changes
#790
0d1ed15Thanks @okwasniewski! - Breaking: e2e and every@e2e-devpackage now need Node.js 22.22.3 or newer on Node.js 22, or 24.8.0 or newer (engines.nodeis^22.22.3 || >=24.8.0). Node.js 22.12 through 22.22.2, 23, and 24.0 through 24.7 are no longer supported, and the CLI refuses to start on them, naming the versions to upgrade to. Those releases fail when a CommonJS file a test imports requires TypeScript through the new loader'smodule.registerHooks(esm: populate separate cache for require(esm) in imported CJS nodejs/node#59679 fixed it in 22.22.3 and 24.8.0).e2e now loads TypeScript with its own loader, built on oxc, instead of tsx. tsx brought in esbuild, whose postinstall script made every
pnpm installon pnpm 11 and later fail withERR_PNPM_IGNORED_BUILDSuntil the project approved the build; nothing e2e installs runs an install script now. Config and tests load as before: ESM whateverpackage.jsonsays,./x.jsand./xresolve tox.tsand./x.jsxtox.tsx, directory index imports, tsconfigpathsandbaseUrl, workspace packages exporting.tssource, JSX in.tsxand.jsx, enums, namespaces,experimentalDecorators, and source-mapped stack traces. JSON imported withoutwith { type: 'json' }still loads. A test file whose name holds%,#, or a space now collects with its source location instead of failing with "URI malformed" or losing the location. Each file reads its nearesttsconfig.jsonrather than the one in the working directory. What changes:importstatements in a.ctsfile are no longer compiled intorequirecalls (writeimport x = require()); standard decorators withoutexperimentalDecorators, auto-accessors, and ES moduleimportand valueexportdeclarations in.ctsare refused with their line (import type,export type,import x = require(), andexport =work); the CLI refuses the Bun (bun --bun) and Deno runtimes (install with any package manager, run on Node.js); a type imported withoutimport typethat stays in the output (a decorated member's type underemitDecoratorMetadata) fails to load, with an error naming the import; a.tsfile a CommonJS file requires runs as an ES module like every other.ts, so one written withmodule.exportsneeds the.ctsextension; and an import written in a JavaScript file resolves as Node.js resolves it, without TypeScript's extension rules or tsconfigpaths. TypeScript inside an installed package compiles without the project'stsconfig.json.@e2e-dev/github@0.4.0
Minor Changes
#790
0d1ed15Thanks @okwasniewski! - Breaking: e2e and every@e2e-devpackage now need Node.js 22.22.3 or newer on Node.js 22, or 24.8.0 or newer (engines.nodeis^22.22.3 || >=24.8.0). Node.js 22.12 through 22.22.2, 23, and 24.0 through 24.7 are no longer supported, and the CLI refuses to start on them, naming the versions to upgrade to. Those releases fail when a CommonJS file a test imports requires TypeScript through the new loader'smodule.registerHooks(esm: populate separate cache for require(esm) in imported CJS nodejs/node#59679 fixed it in 22.22.3 and 24.8.0).e2e now loads TypeScript with its own loader, built on oxc, instead of tsx. tsx brought in esbuild, whose postinstall script made every
pnpm installon pnpm 11 and later fail withERR_PNPM_IGNORED_BUILDSuntil the project approved the build; nothing e2e installs runs an install script now. Config and tests load as before: ESM whateverpackage.jsonsays,./x.jsand./xresolve tox.tsand./x.jsxtox.tsx, directory index imports, tsconfigpathsandbaseUrl, workspace packages exporting.tssource, JSX in.tsxand.jsx, enums, namespaces,experimentalDecorators, and source-mapped stack traces. JSON imported withoutwith { type: 'json' }still loads. A test file whose name holds%,#, or a space now collects with its source location instead of failing with "URI malformed" or losing the location. Each file reads its nearesttsconfig.jsonrather than the one in the working directory. What changes:importstatements in a.ctsfile are no longer compiled intorequirecalls (writeimport x = require()); standard decorators withoutexperimentalDecorators, auto-accessors, and ES moduleimportand valueexportdeclarations in.ctsare refused with their line (import type,export type,import x = require(), andexport =work); the CLI refuses the Bun (bun --bun) and Deno runtimes (install with any package manager, run on Node.js); a type imported withoutimport typethat stays in the output (a decorated member's type underemitDecoratorMetadata) fails to load, with an error naming the import; a.tsfile a CommonJS file requires runs as an ES module like every other.ts, so one written withmodule.exportsneeds the.ctsextension; and an import written in a JavaScript file resolves as Node.js resolves it, without TypeScript's extension rules or tsconfigpaths. TypeScript inside an installed package compiles without the project'stsconfig.json.@e2e-dev/kernel@0.2.0
Minor Changes
#790
0d1ed15Thanks @okwasniewski! - Breaking: e2e and every@e2e-devpackage now need Node.js 22.22.3 or newer on Node.js 22, or 24.8.0 or newer (engines.nodeis^22.22.3 || >=24.8.0). Node.js 22.12 through 22.22.2, 23, and 24.0 through 24.7 are no longer supported, and the CLI refuses to start on them, naming the versions to upgrade to. Those releases fail when a CommonJS file a test imports requires TypeScript through the new loader'smodule.registerHooks(esm: populate separate cache for require(esm) in imported CJS nodejs/node#59679 fixed it in 22.22.3 and 24.8.0).e2e now loads TypeScript with its own loader, built on oxc, instead of tsx. tsx brought in esbuild, whose postinstall script made every
pnpm installon pnpm 11 and later fail withERR_PNPM_IGNORED_BUILDSuntil the project approved the build; nothing e2e installs runs an install script now. Config and tests load as before: ESM whateverpackage.jsonsays,./x.jsand./xresolve tox.tsand./x.jsxtox.tsx, directory index imports, tsconfigpathsandbaseUrl, workspace packages exporting.tssource, JSX in.tsxand.jsx, enums, namespaces,experimentalDecorators, and source-mapped stack traces. JSON imported withoutwith { type: 'json' }still loads. A test file whose name holds%,#, or a space now collects with its source location instead of failing with "URI malformed" or losing the location. Each file reads its nearesttsconfig.jsonrather than the one in the working directory. What changes:importstatements in a.ctsfile are no longer compiled intorequirecalls (writeimport x = require()); standard decorators withoutexperimentalDecorators, auto-accessors, and ES moduleimportand valueexportdeclarations in.ctsare refused with their line (import type,export type,import x = require(), andexport =work); the CLI refuses the Bun (bun --bun) and Deno runtimes (install with any package manager, run on Node.js); a type imported withoutimport typethat stays in the output (a decorated member's type underemitDecoratorMetadata) fails to load, with an error naming the import; a.tsfile a CommonJS file requires runs as an ES module like every other.ts, so one written withmodule.exportsneeds the.ctsextension; and an import written in a JavaScript file resolves as Node.js resolves it, without TypeScript's extension rules or tsconfigpaths. TypeScript inside an installed package compiles without the project'stsconfig.json.@e2e-dev/mobile@0.10.0
Minor Changes
#790
0d1ed15Thanks @okwasniewski! - Breaking: e2e and every@e2e-devpackage now need Node.js 22.22.3 or newer on Node.js 22, or 24.8.0 or newer (engines.nodeis^22.22.3 || >=24.8.0). Node.js 22.12 through 22.22.2, 23, and 24.0 through 24.7 are no longer supported, and the CLI refuses to start on them, naming the versions to upgrade to. Those releases fail when a CommonJS file a test imports requires TypeScript through the new loader'smodule.registerHooks(esm: populate separate cache for require(esm) in imported CJS nodejs/node#59679 fixed it in 22.22.3 and 24.8.0).e2e now loads TypeScript with its own loader, built on oxc, instead of tsx. tsx brought in esbuild, whose postinstall script made every
pnpm installon pnpm 11 and later fail withERR_PNPM_IGNORED_BUILDSuntil the project approved the build; nothing e2e installs runs an install script now. Config and tests load as before: ESM whateverpackage.jsonsays,./x.jsand./xresolve tox.tsand./x.jsxtox.tsx, directory index imports, tsconfigpathsandbaseUrl, workspace packages exporting.tssource, JSX in.tsxand.jsx, enums, namespaces,experimentalDecorators, and source-mapped stack traces. JSON imported withoutwith { type: 'json' }still loads. A test file whose name holds%,#, or a space now collects with its source location instead of failing with "URI malformed" or losing the location. Each file reads its nearesttsconfig.jsonrather than the one in the working directory. What changes:importstatements in a.ctsfile are no longer compiled intorequirecalls (writeimport x = require()); standard decorators withoutexperimentalDecorators, auto-accessors, and ES moduleimportand valueexportdeclarations in.ctsare refused with their line (import type,export type,import x = require(), andexport =work); the CLI refuses the Bun (bun --bun) and Deno runtimes (install with any package manager, run on Node.js); a type imported withoutimport typethat stays in the output (a decorated member's type underemitDecoratorMetadata) fails to load, with an error naming the import; a.tsfile a CommonJS file requires runs as an ES module like every other.ts, so one written withmodule.exportsneeds the.ctsextension; and an import written in a JavaScript file resolves as Node.js resolves it, without TypeScript's extension rules or tsconfigpaths. TypeScript inside an installed package compiles without the project'stsconfig.json.#840
b33398fThanks @Mohit20057! -screen.swipe({ from, to, duration })adds an optionaldurationfor path swipes, controlling how long the gesture takes in milliseconds.Patch Changes
#912
39cfe83Thanks @okwasniewski! - Update agent-device to 0.21.21 for iOS keyboard focus reporting, unconfirmed fills into non-echoing fields, and Android snapshot helper timeout backoff.#917
89b783dThanks @jbroma! - Update agent-device to 0.21.22, so a Limrun iOS settings refusal names the session's device instead ofbooted.@e2e-dev/web@0.13.0
Minor Changes
#790
0d1ed15Thanks @okwasniewski! - Breaking: e2e and every@e2e-devpackage now need Node.js 22.22.3 or newer on Node.js 22, or 24.8.0 or newer (engines.nodeis^22.22.3 || >=24.8.0). Node.js 22.12 through 22.22.2, 23, and 24.0 through 24.7 are no longer supported, and the CLI refuses to start on them, naming the versions to upgrade to. Those releases fail when a CommonJS file a test imports requires TypeScript through the new loader'smodule.registerHooks(esm: populate separate cache for require(esm) in imported CJS nodejs/node#59679 fixed it in 22.22.3 and 24.8.0).e2e now loads TypeScript with its own loader, built on oxc, instead of tsx. tsx brought in esbuild, whose postinstall script made every
pnpm installon pnpm 11 and later fail withERR_PNPM_IGNORED_BUILDSuntil the project approved the build; nothing e2e installs runs an install script now. Config and tests load as before: ESM whateverpackage.jsonsays,./x.jsand./xresolve tox.tsand./x.jsxtox.tsx, directory index imports, tsconfigpathsandbaseUrl, workspace packages exporting.tssource, JSX in.tsxand.jsx, enums, namespaces,experimentalDecorators, and source-mapped stack traces. JSON imported withoutwith { type: 'json' }still loads. A test file whose name holds%,#, or a space now collects with its source location instead of failing with "URI malformed" or losing the location. Each file reads its nearesttsconfig.jsonrather than the one in the working directory. What changes:importstatements in a.ctsfile are no longer compiled intorequirecalls (writeimport x = require()); standard decorators withoutexperimentalDecorators, auto-accessors, and ES moduleimportand valueexportdeclarations in.ctsare refused with their line (import type,export type,import x = require(), andexport =work); the CLI refuses the Bun (bun --bun) and Deno runtimes (install with any package manager, run on Node.js); a type imported withoutimport typethat stays in the output (a decorated member's type underemitDecoratorMetadata) fails to load, with an error naming the import; a.tsfile a CommonJS file requires runs as an ES module like every other.ts, so one written withmodule.exportsneeds the.ctsextension; and an import written in a JavaScript file resolves as Node.js resolves it, without TypeScript's extension rules or tsconfigpaths. TypeScript inside an installed package compiles without the project'stsconfig.json.#840
b33398fThanks @Mohit20057! -screen.swipe({ from, to, duration })adds an optionaldurationfor path swipes, controlling how long the gesture takes in milliseconds.Patch Changes
#803
f2f9a53Thanks @fecolinhares! - A headless run no longer downloads the full Chromium when the headless shell is installed, and the install no longer removes other browsers in the cache. SetPLAYWRIGHT_SKIP_BROWSER_GC=0to restore cleanup.#860
60bf04dThanks @okwasniewski! -browser.evaluateevaluates a string as an expression:browser.evaluate('document.title')andbrowser.evaluate('(() => document.title)()')return the title instead of failing withEVALUATE_FAILED: ... is not a function. A string that evaluates to a function, such as'() => document.title', is still called with the argument.#859
432e9bfThanks @okwasniewski! - An action whose locator gains a second match just before it runs, such as a screen transition that briefly shows the old and new page together, no longer fails withENGINE_FAILUREand a Playwright strict mode violation. The locator resolves again: two matches still fail withLOCATOR_AMBIGUOUS, and a duplicate that went away lets the action run. A drag whose drop target gains a second match after the press fails withACTION_FAILEDand is not repeated.#891
a0e5142Thanks @rudycelekli! - Infer scope-less table headers from neighboring data cells, matching native row headers in semantic observations.#828
c83b86fThanks @okwasniewski! - A page whose script never yields no longer holds a web test until its test timeout: a tap, a locate, or a navigation on it now fails withACTION_FAILEDat its action or navigation timeout, also while a trace records. A tap or keystroke cut off that way may have reached the page and is never repeated by a replay.expect(browser)matchers on such a page end at their own timeout instead of the action timeout.#913
7c158eeThanks @okwasniewski! - Requirese2e0.18.0 or later. With an older runner the engine failed to load, or a headed run failed to launch the browser.