Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

5.0.0 Release #2905

Merged
merged 64 commits into from
Aug 19, 2020
Merged
Show file tree
Hide file tree
Changes from 18 commits
Commits
Show all changes
64 commits
Select commit Hold shift + click to select a range
ee18eac
Init changelog
jennifer-shehane Jun 23, 2020
90e3379
Merge branch 'develop' into 5.0.0-release
jennifer-shehane Jun 25, 2020
9c092c8
Began writing migration guide for 5.0
jennifer-shehane Jun 25, 2020
e44365a
rename 'blocklistHosts' to newly named 'blockHosts'
jennifer-shehane Jun 26, 2020
f100b9c
Add new linux deps to migration guide
jennifer-shehane Jun 26, 2020
c2f478b
Add migration guide for Cypress.Blob
jennifer-shehane Jun 29, 2020
ec5e615
Add test retry section to migration guide
jennifer-shehane Jun 29, 2020
c76c043
docs: note updated Electron libgbm req (#2931)
flotwig Jun 29, 2020
627cb2a
docs: document experimentalGetCookiesSameSite removal (#2918)
flotwig Jun 29, 2020
b21a2cd
Node.js 10+ for install (#2933)
jennifer-shehane Jun 30, 2020
75916ff
Merge branch 'develop' into 5.0.0-release
jennifer-shehane Jun 30, 2020
de3c20d
Merge branch 'develop' into 5.0.0-release
jennifer-shehane Jun 30, 2020
d9265ee
Alphabetize cookie object return, explain which props only log when s…
jennifer-shehane Jun 30, 2020
cf66d9d
Add section to migration guide for sameSite cookies changes
jennifer-shehane Jun 30, 2020
dca4c4e
Write 5.0 changelog
jennifer-shehane Jun 30, 2020
d607100
Rename uses of whitelist for renamed options. (#2928)
jennifer-shehane Jun 30, 2020
3df2487
Add issues from 4.10.0 to changelog
jennifer-shehane Jun 30, 2020
2a2fe52
Add TypeScript req to migration guide
jennifer-shehane Jun 30, 2020
1005b59
Update source/guides/references/migration-guide.md
jennifer-shehane Jun 30, 2020
6dea7a3
Clarify note about previous min TS version
jennifer-shehane Jun 30, 2020
1eb57b1
Update typescript doc to specify minimum required TS version (#2945)
jennifer-shehane Jul 6, 2020
aef241e
Updates for blob from 5.0 (#2938)
jennifer-shehane Jul 7, 2020
479d674
remove issues released in 4.10.0
jennifer-shehane Jul 7, 2020
0e35b96
Clarify the exact issues that are fixed in Changelog.
jennifer-shehane Jul 7, 2020
b6a77ea
Rename configuration option blacklistHosts to blocklistHosts (#2861)
laiscoolblue Jul 13, 2020
ce1fd91
Merge branch 'develop' into 5.0.0-release
jennifer-shehane Jul 23, 2020
1e291c1
Merge branch 'develop' into 5.0.0-release
jennifer-shehane Aug 4, 2020
be76f63
Remove mention of test retries being on by default in 5.0.
jennifer-shehane Aug 4, 2020
eed06ad
Update 5.0 doc to correctly mention test-retries + breaking changes.
jennifer-shehane Aug 4, 2020
38769de
Add section for Module API results changing to migration guide
jennifer-shehane Aug 5, 2020
b256a7c
Update Module API & migration guide to reflect order + props of new t…
jennifer-shehane Aug 6, 2020
c7665ac
Merge branch 'develop' into 5.0.0-release
jennifer-shehane Aug 6, 2020
096c449
Mention that screenshots are different in test retries of migration g…
jennifer-shehane Aug 10, 2020
8cad0cd
Merge branch 'develop' into 5.0.0-release
jennifer-shehane Aug 10, 2020
370bc23
Add 4.13.0 issues to 5.0 changelog
jennifer-shehane Aug 10, 2020
7c9c5e2
Add runs tab design to changelog
jennifer-shehane Aug 10, 2020
7af7a40
Bump electron version
jennifer-shehane Aug 10, 2020
845161b
Merge branch 'develop' into 5.0.0-release
jennifer-shehane Aug 11, 2020
4568eb4
Add section to migration guide about esModuleInterop change (#3053)
chrisbreiding Aug 11, 2020
355a90b
Update default preprocessor references from browserify to webpack (#3…
chrisbreiding Aug 11, 2020
aab6c9d
Add webpack preprocessor + esModuleInterop updates to changelog.
jennifer-shehane Aug 11, 2020
090a284
Add closed issue from the test-retries branch to 5.0 changelog
jennifer-shehane Aug 11, 2020
60a6719
Add bytes fix to changelog
jennifer-shehane Aug 11, 2020
f5fbe09
docs: 5.0.0 release docs test retries (#2925)
bencodezen Aug 13, 2020
c10e363
Merge branch 'develop' into 5.0.0-release
jennifer-shehane Aug 13, 2020
2586ac4
Add newly closed issues to 5.0.0 changelog
jennifer-shehane Aug 14, 2020
66ec2fb
Move 'experimental' thing to a fix instead of feature
jennifer-shehane Aug 14, 2020
35a487d
Add newly closed fix to 5.0 changelog
jennifer-shehane Aug 17, 2020
d1bc7df
Add more newly closed issues to changelog
jennifer-shehane Aug 17, 2020
776929a
Add doc for click modifiers. (#3062)
sainthkh Aug 17, 2020
9c9a389
Add section to 5.0 migration guide about __dirname / __filename (#3076)
chrisbreiding Aug 17, 2020
7b2a8d1
blocklistHosts -> blacklistHosts
chrisbreiding Aug 17, 2020
a09e0d7
Add note about __dirname/__filename to changelog
chrisbreiding Aug 17, 2020
468f8a6
Fix typo
chrisbreiding Aug 17, 2020
e9d5af1
Merge branch 'develop' into 5.0.0-release
jennifer-shehane Aug 18, 2020
fcb6272
add release date
chrisbreiding Aug 18, 2020
5ec93ae
add note about scrollintoview shadow dom fix
chrisbreiding Aug 18, 2020
a1c0cd0
update release date
chrisbreiding Aug 18, 2020
953c4a2
try increasing --max-old-space-size for build
jennifer-shehane Aug 19, 2020
121c395
try increasing --max-old-space-size to 8192
chrisbreiding Aug 19, 2020
b36d31c
fix mistakenly typed character
chrisbreiding Aug 19, 2020
18563a0
fix another one
chrisbreiding Aug 19, 2020
b1a87d0
don't revision mp4 files
chrisbreiding Aug 19, 2020
de92e52
don't revision .woff, .woff2, or .less files
chrisbreiding Aug 19, 2020
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
58 changes: 58 additions & 0 deletions source/_changelogs/5.0.0.md
@@ -0,0 +1,58 @@
# 5.0.0

*Released X/X/2020*
chrisbreiding marked this conversation as resolved.
Show resolved Hide resolved

**Summary:**

Cypress now includes support for test retries! Similar to how Cypress will retry assertions when they fail, test retries will allow you to automatically retry a failed test prior to marking it as failed. Read our new guide on Test Retries for more details.

**Breaking Changes:**

**{% fa fa-exclamation-triangle red %} Please read our {% url "Migration Guide" migration-guide %} which explains the changes in more detail and how to change your code to migrate to Cypress 5.0.**

- Test retries are on by default when running via {% url "`cypress run`" command-line#cypress-run %}. This means that tests will automatically be re-run up to 2 additional times (for a total of 3 attempts) before potentially being marked as a failed test. Additionally, the {% url "`cypress-plugin-retries`" https://github.com/Bkucera/cypress-plugin-retries %} plugin has been deprecated. Addresses {% issue 1313 %}.
- The {% url "`Cypress.Cookies.defaults()`" cookies %} `whitelist` option has been renamed to `preserve` to more closely reflect its behavior. Addressed in {% issue 7782 %}.
- The `blacklistHosts` configuration has been renamed to {% url "`blockHosts`" configuration#Notes %} to more closely reflect its behavior. Addressed in {% issue 7622 %}.
- The {% url "`cy.server()`" server %} `whitelist` option has been renamed to `ignore` to more closely reflect its behavior. Addresses {% issue 6642 %}.
- `libgbm-dev` is now a requirement to run Cypress on Linux. Addressed in {% PR 7791 %}.
- Values yielded by {% url "`cy.setCookie()`" setcookie %}, {% url "`cy.getCookie()`" getcookie %}, and {% url "`cy.getCookies()`" getcookies %} will now contain the `sameSite` property if specified. Addresses {% issue 6892 %}.
- The `experimentalGetCookiesSameSite` configuration flag has been removed, since this behavior is now the default. Addresses {% issue 6892 %}.
- The return type of the {% url "`Cypress.Blob`" blob %} methods `arrayBufferToBlob`, `base64StringToBlob`, `binaryStringToBlob`, and `dataURLToBlob` have changed from `Promise<Blob>` to `Blob`. Addresses {% issue 6001 %}.
- We removed the default `esModuleInterop: true` option when using TypeScript so that it can now be overridden. Addresses {% issue 7575 %}.
- Cypress now requires TypeScript 3.4+. Addressed in {% issue 7856 %}.
- Installing Cypress on your system now requires Node.js 10+. Addresses {% issue 6574 %}.

chrisbreiding marked this conversation as resolved.
Show resolved Hide resolved
**Features:**

- There's a new `retries` configuration option to configure the number of times to retry a failing test. Addresses {% issue 1313 %}.
- You can now open a spec file directly from the **Tests** tab in the Test Runner by clicking the **Open in IDE** button. Addresses {% issue 7713 %}

**Bugfixes:**

- Cypress will now properly run on Firefox versions >= 75. Addressed in {% PR 7791 %}.
- The Developer Tools menu will now always display in Electron when switching focus from Specs to the Test Runner. Addressed in {% PR 7791 %}.
- We now emit the pass event from Mocha after all hooks have run. Fixes {% issue 7730 %}.
- Debug logs from the `@benmalka/foxdriver` module will no longer appear if any `DEBUG` environment variable was set. Fixed {% issue 7723 %}.

**Documentation Changes:**

- We have a new guide on Test Retries.
- Our {% url "Migration Guide" migration-guide %} has a new section for 5.0 migration.

**Misc:**

- The type for the `Window` object returned from {% url "`cy.window()`" window %} is now correct. Addresses {% issue 7856 %}.
- The type definition for Cypress's `ApplicationWindow` can now be extended. Addresses {% issue 7856 %}.
- We made some minor UI updates to the Test Runner. Addresses {% issue 7732 %}.

**Dependency Updates**

- Upgraded Chrome browser version used during cypress run and when selecting Electron browser in cypress open from `80` to `83`. Addressed in {% PR 7791 %}.
- Upgraded bundled Node.js version from `12.8.1` to `12.14.1`. Addressed in {% PR 7791 %}.
- Upgraded `electron` from `8.3.1` to `9.0.5`. Addressed in {% PR 7791 %}.
- Upgraded `chalk` from `2.4.2` to `4.1.0`. Addressed in {% PR 7650 %}.
- Upgraded `cli-table3` from `0.5.1` to `0.6.0`. Addressed in {% PR 7650 %}.
- Upgraded `execa` from `1.0.0` to `4.0.2`. Addressed in {% PR 7650 %}.
- Upgraded `log-symbols` from `3.0.0` to `4.0.0`. Addressed in {% PR 7650 %}.
- Upgraded `tmp` from `0.1.0` to `0.2.1`. Addressed in {% PR 7650 %}.
- Upgraded `fs-extra` from `8.1.0` to `9.0.1`. Addressed in {% PR 7650 %}.
8 changes: 4 additions & 4 deletions source/_partial/linux_dependencies.md
@@ -1,13 +1,13 @@
#### Ubuntu/Debian

```shell
apt-get install libgtk2.0-0 libgtk-3-0 libnotify-dev libgconf-2-4 libnss3 libxss1
libasound2 libxtst6 xauth xvfb
apt-get install libgtk2.0-0 libgtk-3-0 libgbm-dev libnotify-dev libgconf-2-4
libnss3 libxss1 libasound2 libxtst6 xauth xvfb
```

#### CentOS

```shell
yum install -y xorg-x11-server-Xvfb gtk2-devel gtk3-devel libnotify-devel GConf2
nss libXScrnSaver alsa-lib
yum install -y xorg-x11-server-Xvfb gtk2-devel gtk3-devel libnotify-devel
GConf2 nss libXScrnSaver alsa-lib
```
13 changes: 7 additions & 6 deletions source/api/commands/getcookie.md
Expand Up @@ -38,14 +38,14 @@ Option | Default | Description

`cy.getCookie()` yields a cookie object with the following properties:

- `name`
- `value`
- `path`
- `domain`
- `expiry` *(if specified)*
- `httpOnly`
- `name`
- `path`
- `sameSite` *(if specified)*
- `secure`
- `expiry`
- `sameSite` *(will only be returned if the {% url "`experimentalGetCookiesSameSite`" configuration#Experiments %} configuration value is `true`)*
- `value`

### When a cookie matching the name could not be found:

Expand Down Expand Up @@ -140,7 +140,8 @@ When clicking on `getCookie` within the command log, the console outputs the fol
{% imgTag /img/api/getcookie/inspect-cookie-object-properties-in-console.png "Console Log getcookie" %}

{% history %}
{% url "4.3.0" changelog#4-3-0 %} | Added `sameSite` property when the {% url "`experimentalGetCookiesSameSite`" configuration#Experiments %} configuration value is `true`.
{% url "5.0.0" changelog#5-0-0 %} | Removed `experimentalGetCookiesSameSite` and made `sameSite` property always available.
{% url "4.3.0" changelog#4-3-0 %} | Added `sameSite` property when the `experimentalGetCookiesSameSite` configuration value is `true`.
{% endhistory %}

# See also
Expand Down
11 changes: 6 additions & 5 deletions source/api/commands/getcookies.md
Expand Up @@ -34,14 +34,14 @@ Option | Default | Description

`cy.getCookies()` yields an array of cookie objects. Each cookie object has the following properties:

- `name`
- `value`
- `path`
- `domain`
- `expiry` *(if specified)*
- `httpOnly`
- `name`
- `path`
- `sameSite` *(if specified)*
- `secure`
- `expiry`
- `sameSite` *(will only be returned if the {% url "`experimentalGetCookiesSameSite`" configuration#Experiments %} configuration value is `true`)*
- `value`

# Examples

Expand Down Expand Up @@ -98,6 +98,7 @@ When clicking on `getCookies` within the command log, the console outputs the fo
{% imgTag /img/api/getcookies/test-application-cookies.png "Console Log getcookies" %}

{% history %}
{% url "5.0.0" changelog#5-0-0 %} | Removed `experimentalGetCookiesSameSite` and made `sameSite` property always available.
{% url "4.3.0" changelog#4-3-0 %} | Added `sameSite` property when the {% url "`experimentalGetCookiesSameSite`" configuration#Experiments %} configuration value is `true`.
{% endhistory %}

Expand Down
17 changes: 9 additions & 8 deletions source/api/commands/server.md
Expand Up @@ -57,7 +57,7 @@ Option | Default | Description
`onAnyRequest` | `undefined` | callback function called when any request is sent
`onAnyResponse` | `undefined` | callback function called when any response is returned
`urlMatchingOptions` | `{ matchBase: true }` | The default options passed to `minimatch` when using glob strings to match URLs
`whitelist` | function | Callback function that filters requests from ever being logged or stubbed. By default this matches against asset-like requests such as for `.js`, `.jsx`, `.html`, and `.css` files.
`ignore` | function | Callback function that filters requests from ever being logged or stubbed. By default this matches against asset-like requests such as for `.js`, `.jsx`, `.html`, and `.css` files.

## Yields {% helper_icon yields %}

Expand All @@ -70,7 +70,7 @@ Option | Default | Description
### After starting a server:

- Any request that does **NOT** match a {% url `cy.route()` route %} will {% url 'pass through to the server' network-requests#Don’t-Stub-Responses %}.
- Any request that matches the `options.whitelist` function will **NOT** be logged or stubbed. In other words it is filtered and ignored.
- Any request that matches the `options.ignore` function will **NOT** be logged or stubbed.
- You will see requests named as `(XHR Stub)` or `(XHR)` in the Command Log.

```javascript
Expand Down Expand Up @@ -181,27 +181,27 @@ cy.server({

### Change the default filtering

`cy.server()` comes with a `whitelist` function that by default filters out any requests that are for static assets like `.html`, `.js`, `.jsx`, and `.css`.
`cy.server()` comes with an `ignore` function that by default filters out any requests that are for static assets like `.html`, `.js`, `.jsx`, and `.css`.

Any request that passes the `whitelist` will be ignored - it will not be logged nor will it be stubbed in any way (even if it matches a specific {% url `cy.route()` route %}).
Any request that passes the `ignore` will be ignored - it will not be logged nor will it be stubbed in any way (even if it matches a specific {% url `cy.route()` route %}).

The idea is that we never want to interfere with static assets that are fetched via Ajax.

**The default filter function in Cypress is:**

```javascript
const whitelist = (xhr) => {
const ignore = (xhr) => {
// this function receives the xhr object in question and
// will filter if it's a GET that appears to be a static resource
return xhr.method === 'GET' && /\.(jsx?|html|css)(\?.*)?$/.test(xhr.url)
// will ignore if it's a GET that appears to be a static resource
return xhr.method === 'GET' && /\.(jsx?|coffee|html|less|s?css|svg)(\?.*)?$/.test(xhr.url)
}
```

**You can override this function with your own specific logic:**

```javascript
cy.server({
whitelist: (xhr) => {
ignore: (xhr) => {
// specify your own function that should return
// truthy if you want this xhr to be ignored,
// not logged, and not stubbed.
Expand Down Expand Up @@ -270,6 +270,7 @@ The intention of {% url "`cy.request()`" request %} is to be used for checking e
- `cy.server()` does *not* log in the Command Log

{% history %}
{% url "5.0.0" changelog#5-0-0 %} | Renamed `whitelist` option to `ignore`
{% url "0.13.6" changelog#0-13-6 %} | Added `onAbort` callback option
{% url "0.5.10" changelog#0-5-10 %} | Added `delay` option
{% url "0.3.3" changelog#0-3-3 %} | Added `whitelist` option
Expand Down
13 changes: 7 additions & 6 deletions source/api/commands/setcookie.md
Expand Up @@ -46,16 +46,16 @@ Option | Default | Description

## Yields {% helper_icon yields %}

`cy.setCookie()` yields a cookie object literal with the following properties:
`cy.setCookie()` yields a cookie object with the following properties:

- `name`
- `value`
- `path`
- `domain`
- `expiry` *(if specified)*
- `httpOnly`
- `name`
- `path`
- `sameSite` *(if specified)*
- `secure`
- `expiry`
- `sameSite` *(will only be returned if the {% url "`experimentalGetCookiesSameSite`" configuration#Experiments %} configuration value is `true`)*
- `value`

# Examples

Expand Down Expand Up @@ -100,6 +100,7 @@ When clicking on `setCookie` within the command log, the console outputs the fol
{% imgTag /img/api/setcookie/see-cookie-properties-expiry-domain-and-others-in-test.png "Console Log setcookie" %}

{% history %}
{% url "5.0.0" changelog#5-0-0 %} | Removed `experimentalGetCookiesSameSite` and made `sameSite` property always available.
{% url "4.3.0" changelog#4-3-0 %} | Added `sameSite` property when the {% url "`experimentalGetCookiesSameSite`" configuration#Experiments %} configuration value is `true`.
{% url "0.16.0" changelog#0-16-0 %} | `cy.setCookie()` command added
{% endhistory %}
Expand Down
11 changes: 6 additions & 5 deletions source/api/cypress-api/cookies.md
Expand Up @@ -129,7 +129,7 @@ Any change you make here will take effect immediately for the remainder of every
A great place to put this configuration is in your `cypress/support/index.js` file, since it is loaded before any test files are evaluated.
{% endnote %}

### `whitelist` accepts:
### `preserve` accepts:

- String
- Array
Expand All @@ -142,7 +142,7 @@ A great place to put this configuration is in your `cypress/support/index.js` fi
// now any cookie with the name 'session_id' will
// not be cleared before each test runs
Cypress.Cookies.defaults({
whitelist: 'session_id'
preserve: 'session_id'
})
```

Expand All @@ -152,7 +152,7 @@ Cypress.Cookies.defaults({
// now any cookie with the name 'session_id' or 'remember_token'
// will not be cleared before each test runs
Cypress.Cookies.defaults({
whitelist: ['session_id', 'remember_token']
preserve: ['session_id', 'remember_token']
})
```

Expand All @@ -162,15 +162,15 @@ Cypress.Cookies.defaults({
// now any cookie that matches this RegExp
// will not be cleared before each test runs
Cypress.Cookies.defaults({
whitelist: /session|remember/
preserve: /session|remember/
})
```

### Preserve Function

```javascript
Cypress.Cookies.defaults({
whitelist: (cookie) => {
preserve: (cookie) => {
// implement your own logic here
// if the function returns truthy
// then the cookie will not be cleared
Expand All @@ -180,6 +180,7 @@ Cypress.Cookies.defaults({
```

{% history %}
{% url "5.0.0" changelog#5-0-0 %} | Renamed `whitelist` option to `preserve`
{% url "0.16.1" changelog#0-16-1 %} | `{verbose: false}` option added
{% url "0.16.0" changelog#0-16-0 %} | Removed support for `Cypress.Cookies.get`, `Cypress.Cookies.set` and `Cypress.Cookies.remove`
{% url "0.12.4" changelog#0-12-4 %} | `Cypress.Cookies` API added
Expand Down
2 changes: 1 addition & 1 deletion source/api/cypress-api/cypress-server.md
Expand Up @@ -28,7 +28,7 @@ Pass in an options object to change the default behavior of `Cypress.Server`.
Cypress.Server.defaults({
delay: 500,
force404: false,
whitelist: (xhr) => {
ignore: (xhr) => {
// handle custom logic for filtering XHR requests
}
})
Expand Down
2 changes: 1 addition & 1 deletion source/faq/questions/using-cypress-faq.md
Expand Up @@ -420,7 +420,7 @@ You can preserve specific cookies across tests using the {% url "Cypress.Cookies
// now any cookie with the name 'session_id' will
// not be cleared before each test runs
Cypress.Cookies.defaults({
whitelist: 'session_id'
preserve: 'session_id'
})
```

Expand Down
2 changes: 1 addition & 1 deletion source/guides/getting-started/installing-cypress.md
Expand Up @@ -25,7 +25,7 @@ Cypress is a desktop application that is installed on your computer. The desktop

If you're using `npm` to install Cypress, we support:

- **Node.js** 8 and above
- **Node.js** 10 and above

### Linux

Expand Down
2 changes: 1 addition & 1 deletion source/guides/references/experiments.md
Expand Up @@ -14,7 +14,6 @@ You can pass the {% url "configuration" configuration %} options below to enable

Option | Default | Description
----- | ---- | ----
`experimentalGetCookiesSameSite` | `false` | Adds `sameSite` values to the objects yielded from {% url "`cy.setCookie()`" setcookie %}, {% url "`cy.getCookie()`" getcookie %}, and {% url "`cy.getCookies()`" getcookies %}. This will become the default behavior in a later Cypress version.
`experimentalComponentTesting` | `false` | Enables component testing using framework-specific adaptors. See {% urlHash "Component Testing" Component-Testing %} for more detail.
`experimentalFetchPolyfill` | `false` | Automatically replaces `window.fetch` with a polyfill that Cypress can spy on and stub.
`experimentalSourceRewriting` | `false` | Enables AST-based JS/HTML rewriting. This may fix issues caused by the existing regex-based JS/HTML replacement algorithm. See {% issue 5273 %} for details.
Expand Down Expand Up @@ -126,6 +125,7 @@ cy.get('.container .my-button', { includeShadowDom: true })
In the selector `.container .my-button`, the first part (`.container`) exists in the light DOM and the second part (`.my-button`) exists in the shadow DOM. This will not find the button element. Instead, you can use one of the methods in the above examples.

{% history %}
{% url "5.0.0" changelog#5-0-0 %} | Removed `experimentalGetCookiesSameSite` and made it the default behavior.
{% url "4.9.0" changelog#4-9-0 %} | Added support for `experimentalFetchPolyfill`.
{% url "4.8.0" changelog#4-8-0 %} | Added support for `experimentalShadowDomSupport`.
{% url "4.6.0" changelog#4-6-0 %} | Added support for `experimentalSourceRewriting`.
Expand Down