From dddc4176b1c35509e69eccec06f76da2ef608cda Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Thu, 12 Feb 2026 18:50:16 +0000
Subject: [PATCH 1/8] Initial plan
From d84eea2acfdd3e7a70ec49c506446d38fb576c24 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Thu, 12 Feb 2026 18:55:29 +0000
Subject: [PATCH 2/8] Add jsxRuntime and other missing Sucrase options support
Co-authored-by: vinny-silveira <13592890+vinny-silveira@users.noreply.github.com>
---
packages/sucrase/README.md | 5 +++++
packages/sucrase/src/index.js | 4 ++++
.../test/fixtures/jsx-runtime/example.jsx | 1 +
.../sucrase/test/fixtures/jsx-runtime/main.js | 4 ++++
packages/sucrase/test/test.js | 18 ++++++++++++++++++
packages/sucrase/test/types.ts | 4 ++++
packages/sucrase/types/index.d.ts | 4 ++++
7 files changed, 40 insertions(+)
create mode 100644 packages/sucrase/test/fixtures/jsx-runtime/example.jsx
create mode 100644 packages/sucrase/test/fixtures/jsx-runtime/main.js
diff --git a/packages/sucrase/README.md b/packages/sucrase/README.md
index 680e5a7b2..b639c11c8 100644
--- a/packages/sucrase/README.md
+++ b/packages/sucrase/README.md
@@ -55,10 +55,15 @@ Then call `rollup` either via the [CLI](https://www.rollupjs.org/guide/en/#comma
The following [Sucrase options](https://github.com/alangpierce/sucrase#transforms) may be passed as options for this plugin:
+- `disableESTransforms`
- `enableLegacyBabel5ModuleInterop`
- `enableLegacyTypeScriptModuleInterop`
+- `injectCreateRequireForImportRequire`
- `jsxFragmentPragma`
+- `jsxImportSource`
- `jsxPragma`
+- `jsxRuntime`
+- `preserveDynamicImport`
- `production`
- `transforms`
diff --git a/packages/sucrase/src/index.js b/packages/sucrase/src/index.js
index dfeb9a765..1f3bd9476 100644
--- a/packages/sucrase/src/index.js
+++ b/packages/sucrase/src/index.js
@@ -42,8 +42,12 @@ export default function sucrase(opts = {}) {
const result = transform(code, {
transforms: opts.transforms,
+ jsxRuntime: opts.jsxRuntime,
+ jsxImportSource: opts.jsxImportSource,
jsxPragma: opts.jsxPragma,
jsxFragmentPragma: opts.jsxFragmentPragma,
+ preserveDynamicImport: opts.preserveDynamicImport,
+ injectCreateRequireForImportRequire: opts.injectCreateRequireForImportRequire,
enableLegacyTypeScriptModuleInterop: opts.enableLegacyTypeScriptModuleInterop,
enableLegacyBabel5ModuleInterop: opts.enableLegacyBabel5ModuleInterop,
production: opts.production,
diff --git a/packages/sucrase/test/fixtures/jsx-runtime/example.jsx b/packages/sucrase/test/fixtures/jsx-runtime/example.jsx
new file mode 100644
index 000000000..87153ec31
--- /dev/null
+++ b/packages/sucrase/test/fixtures/jsx-runtime/example.jsx
@@ -0,0 +1 @@
+export default () =>
hello world
diff --git a/packages/sucrase/test/fixtures/jsx-runtime/main.js b/packages/sucrase/test/fixtures/jsx-runtime/main.js
new file mode 100644
index 000000000..9d03081dd
--- /dev/null
+++ b/packages/sucrase/test/fixtures/jsx-runtime/main.js
@@ -0,0 +1,4 @@
+/* eslint-disable import/extensions */
+import example from './example.jsx';
+
+t.snapshot(example.toString());
diff --git a/packages/sucrase/test/test.js b/packages/sucrase/test/test.js
index 3d3e77ef0..5d6860efc 100644
--- a/packages/sucrase/test/test.js
+++ b/packages/sucrase/test/test.js
@@ -41,6 +41,24 @@ test('converts jsx with custom jsxPragma', async (t) => {
return testBundle(t, bundle);
});
+test('converts jsx with jsxRuntime automatic', async (t) => {
+ const bundle = await rollup({
+ input: 'fixtures/jsx-runtime/main.js',
+ external: ['react/jsx-dev-runtime'],
+ plugins: [
+ sucrase({
+ transforms: ['jsx'],
+ jsxRuntime: 'automatic'
+ })
+ ]
+ });
+ const { output } = await bundle.generate({ format: 'cjs', exports: 'auto' });
+ const [{ code }] = output;
+ // Check that the code uses the automatic runtime instead of React.createElement
+ t.regex(code, /require\(['"]react\/jsx-dev-runtime['"]\)/);
+ t.notRegex(code, /React\.createElement/);
+});
+
test('converts typescript', async (t) => {
const bundle = await rollup({
input: 'fixtures/typescript/main.js',
diff --git a/packages/sucrase/test/types.ts b/packages/sucrase/test/types.ts
index e4e7f2c66..336a141b0 100644
--- a/packages/sucrase/test/types.ts
+++ b/packages/sucrase/test/types.ts
@@ -16,6 +16,10 @@ const config: RollupOptions = {
enableLegacyTypeScriptModuleInterop: true,
jsxFragmentPragma: 'React.fragment',
jsxPragma: 'React',
+ jsxRuntime: 'automatic',
+ jsxImportSource: 'preact',
+ preserveDynamicImport: true,
+ injectCreateRequireForImportRequire: true,
production: true,
disableESTransforms: true,
transforms: ['jsx']
diff --git a/packages/sucrase/types/index.d.ts b/packages/sucrase/types/index.d.ts
index 3b2147b1a..8f7143cd7 100644
--- a/packages/sucrase/types/index.d.ts
+++ b/packages/sucrase/types/index.d.ts
@@ -6,8 +6,12 @@ interface RollupSucraseOptions
extends Pick<
SucraseOptions,
| 'transforms'
+ | 'jsxRuntime'
+ | 'jsxImportSource'
| 'jsxPragma'
| 'jsxFragmentPragma'
+ | 'preserveDynamicImport'
+ | 'injectCreateRequireForImportRequire'
| 'enableLegacyTypeScriptModuleInterop'
| 'enableLegacyBabel5ModuleInterop'
| 'production'
From 40553dd8fcafe6457dc3f5f06dfcdbe28dd7f197 Mon Sep 17 00:00:00 2001
From: vinny-silveira
Date: Fri, 13 Feb 2026 09:55:07 -0300
Subject: [PATCH 3/8] refactor: simplify resolveId and extract getBundle helper
in tests
Remove redundant ternary in resolveId (importer is always truthy), extract common rollup setup into getBundle helper function and add tests for plugin initialization and exclude filter
---
packages/sucrase/src/index.js | 2 +-
packages/sucrase/test/snapshots/test.js.md | 14 +--
packages/sucrase/test/snapshots/test.js.snap | Bin 459 -> 454 bytes
packages/sucrase/test/test.js | 86 ++++++++-----------
4 files changed, 43 insertions(+), 59 deletions(-)
diff --git a/packages/sucrase/src/index.js b/packages/sucrase/src/index.js
index 1f3bd9476..cefe1cf4c 100644
--- a/packages/sucrase/src/index.js
+++ b/packages/sucrase/src/index.js
@@ -13,7 +13,7 @@ export default function sucrase(opts = {}) {
// eslint-disable-next-line consistent-return
resolveId(importee, importer) {
if (importer && /^[./]/.test(importee)) {
- const resolved = path.resolve(importer ? path.dirname(importer) : process.cwd(), importee);
+ const resolved = path.resolve(path.dirname(importer), importee);
// resolve in the same order that TypeScript resolves modules
const resolvedFilenames = [
`${resolved}.ts`,
diff --git a/packages/sucrase/test/snapshots/test.js.md b/packages/sucrase/test/snapshots/test.js.md
index cabbf6a3d..7ca1a8db1 100644
--- a/packages/sucrase/test/snapshots/test.js.md
+++ b/packages/sucrase/test/snapshots/test.js.md
@@ -8,13 +8,13 @@ Generated by [AVA](https://avajs.dev).
> Snapshot 1
- '() => React.createElement(\'div\', { id: "foo", __self: undefined, __source: {fileName: _jsxFileName, lineNumber: 1}}, "hello world" )'
+ '() => React.createElement(\'div\', { id: "foo", __self: this, __source: {fileName: _jsxFileName, lineNumber: 1}}, "hello world" )'
## converts jsx with custom jsxPragma
> Snapshot 1
- '() => FakeReactCreateElement(\'div\', { id: "foo", __self: undefined, __source: {fileName: _jsxFileName, lineNumber: 1}}, "hello world" )'
+ '() => FakeReactCreateElement(\'div\', { id: "foo", __self: this, __source: {fileName: _jsxFileName, lineNumber: 1}}, "hello world" )'
## converts typescript
@@ -54,20 +54,20 @@ Generated by [AVA](https://avajs.dev).
> Snapshot 1
- '() => React.createElement(\'div\', { id: "foo", __self: undefined, __source: {fileName: _jsxFileName$4, lineNumber: 1}}, "hello world" )'
+ '() => React.createElement(\'div\', { id: "foo", __self: this, __source: {fileName: _jsxFileName$4, lineNumber: 1}}, "hello world" )'
> Snapshot 2
- '() => React.createElement(\'div\', { id: "example-b", __self: undefined, __source: {fileName: _jsxFileName$3, lineNumber: 1}}, "hello world (a second time)" )'
+ '() => React.createElement(\'div\', { id: "example-b", __self: this, __source: {fileName: _jsxFileName$3, lineNumber: 1}}, "hello world (a second time)" )'
> Snapshot 3
- '() => React.createElement(\'div\', { id: "foo", __self: undefined, __source: {fileName: _jsxFileName$2, lineNumber: 1}}, "hello world" )'
+ '() => React.createElement(\'div\', { id: "foo", __self: this, __source: {fileName: _jsxFileName$2, lineNumber: 1}}, "hello world" )'
> Snapshot 4
- '() => React.createElement(\'div\', { id: "foo", __self: undefined, __source: {fileName: _jsxFileName$1, lineNumber: 1}}, "hello world" )'
+ '() => React.createElement(\'div\', { id: "foo", __self: this, __source: {fileName: _jsxFileName$1, lineNumber: 1}}, "hello world" )'
> Snapshot 5
- '() => React.createElement(\'div\', { id: "foo", __self: undefined, __source: {fileName: _jsxFileName, lineNumber: 1}}, "hello world" )'
+ '() => React.createElement(\'div\', { id: "foo", __self: this, __source: {fileName: _jsxFileName, lineNumber: 1}}, "hello world" )'
diff --git a/packages/sucrase/test/snapshots/test.js.snap b/packages/sucrase/test/snapshots/test.js.snap
index 4ab40afddea6142d4041f37a84f285ecf6eee259..d3be49ecc410ae0f332e7609af2eb41bd8f0ba98 100644
GIT binary patch
literal 454
zcmV;%0XhCbRzVXxb1R!Xoqewg-Vz0N7kc=M&}pbXnPaD+ngnsg`__Y5YOaUF@npQHh3TsjG%f-`F;_FV04NHjU+}F!TQxz2!0)nv2bpkQ9hIl
z=G-5IhI7qzkPTv+bmBuNP7?81c)F_*%xQn_1XP19qQTeMTR7u&bW_%Ti`DY
zO=2z(A;et+0TqZRob)jW_yYZX9>QorNT0_rUg2ejWK9!?3M=hUvUL}rlgv6EsDASk
zHyMKJCP}D(`aoFx%B{0+fzOot<^JV&Mcv1t4QqM7`dXH@MlV>w^*Y4$JT@2RBFPM{
w#^0dZ96<+x077X~1*{V+`vA}bo@^sG#%|00000000Bcl+8-RKoEdiMLdcRAPzxkB2lP%3g|`bv4|&cWwSf6Yd6`j
zyXg<52c^~r5WPx$0H4vcrnaSp76t2`GGUnczL`z>fiEPj>E1gUZUhP{qdF?1;Z8TX
zj!3Ml(&+m>W5ke~=k?rXZgBD&x$U)X&UWDJ9Ila2b3_#qgO>tBjEr4iyk2mj4V-yk
z1yWirR4N)p;6V~G40wcW_(~>IxVD0Q(~C;hEtT5%dF9-Fa4
zH*?sTbjWYn#07t-LEr%VKTaBL1LmNAErke9H0s%1ELV76p_ZbKQ-v8OkK0yAAC1^r;Be{2KO-q_qH?~
zHc1!@JoJBxc(MQyYyuk7VKXp1M8|^kIIA1!@zNt*0bFruxc~SQ{{*_hSZ9a^004?x
B(4znV
diff --git a/packages/sucrase/test/test.js b/packages/sucrase/test/test.js
index 5d6860efc..c1afae6e0 100644
--- a/packages/sucrase/test/test.js
+++ b/packages/sucrase/test/test.js
@@ -14,44 +14,47 @@ require('source-map-support').install();
process.chdir(__dirname);
-test('converts jsx', async (t) => {
- const bundle = await rollup({
- input: 'fixtures/jsx/main.js',
- plugins: [
- sucrase({
- transforms: ['jsx']
- })
- ]
+function getBundle(input, sucraseOptions, rollupOptions) {
+ return rollup({
+ input,
+ context: 'this',
+ plugins: [sucrase(sucraseOptions)],
+ ...rollupOptions
});
+}
+
+test('calls without options', async (t) => {
+ const plugin = sucrase();
+ t.is(plugin.name, 'sucrase');
+});
+
+test('does not transform files excluded by filter', async (t) => {
+ const plugin = sucrase({ exclude: '**/*.ts', transforms: ['typescript'] });
+ const result = plugin.transform('const x: number = 1;', 'foo.ts');
+ t.is(result, null);
+});
+
+test('converts jsx', async (t) => {
+ const bundle = await getBundle('fixtures/jsx/main.js', { transforms: ['jsx'] });
t.plan(1);
return testBundle(t, bundle);
});
test('converts jsx with custom jsxPragma', async (t) => {
- const bundle = await rollup({
- input: 'fixtures/jsx/main.js',
- plugins: [
- sucrase({
- transforms: ['jsx'],
- jsxPragma: 'FakeReactCreateElement'
- })
- ]
+ const bundle = await getBundle('fixtures/jsx/main.js', {
+ transforms: ['jsx'],
+ jsxPragma: 'FakeReactCreateElement'
});
t.plan(1);
return testBundle(t, bundle);
});
test('converts jsx with jsxRuntime automatic', async (t) => {
- const bundle = await rollup({
- input: 'fixtures/jsx-runtime/main.js',
- external: ['react/jsx-dev-runtime'],
- plugins: [
- sucrase({
- transforms: ['jsx'],
- jsxRuntime: 'automatic'
- })
- ]
- });
+ const bundle = await getBundle(
+ 'fixtures/jsx-runtime/main.js',
+ { transforms: ['jsx'], jsxRuntime: 'automatic' },
+ { external: ['react/jsx-dev-runtime'] }
+ );
const { output } = await bundle.generate({ format: 'cjs', exports: 'auto' });
const [{ code }] = output;
// Check that the code uses the automatic runtime instead of React.createElement
@@ -60,14 +63,7 @@ test('converts jsx with jsxRuntime automatic', async (t) => {
});
test('converts typescript', async (t) => {
- const bundle = await rollup({
- input: 'fixtures/typescript/main.js',
- plugins: [
- sucrase({
- transforms: ['typescript']
- })
- ]
- });
+ const bundle = await getBundle('fixtures/typescript/main.js', { transforms: ['typescript'] });
t.plan(4);
return testBundle(t, bundle);
});
@@ -78,9 +74,7 @@ if (process.platform !== 'win32') {
const bundle = await rollup({
input: 'fixtures/typescript-with-aliases/main.js',
plugins: [
- sucrase({
- transforms: ['typescript']
- }),
+ sucrase({ transforms: ['typescript'] }),
alias({
entries: [
{
@@ -98,13 +92,8 @@ if (process.platform !== 'win32') {
}
test('resolves typescript directory imports', async (t) => {
- const bundle = await rollup({
- input: 'fixtures/typescript-resolve-directory/main.js',
- plugins: [
- sucrase({
- transforms: ['typescript']
- })
- ]
+ const bundle = await getBundle('fixtures/typescript-resolve-directory/main.js', {
+ transforms: ['typescript']
});
t.plan(2);
@@ -112,13 +101,8 @@ test('resolves typescript directory imports', async (t) => {
});
test('converts typescript jsx ("tsx")', async (t) => {
- const bundle = await rollup({
- input: 'fixtures/typescript-with-tsx/main.js',
- plugins: [
- sucrase({
- transforms: ['typescript', 'jsx']
- })
- ]
+ const bundle = await getBundle('fixtures/typescript-with-tsx/main.js', {
+ transforms: ['typescript', 'jsx']
});
t.plan(5);
From 1486a8b54fd07462fe9d4ace225757f0dc1f1910 Mon Sep 17 00:00:00 2001
From: vinny-silveira
Date: Mon, 16 Feb 2026 09:25:35 -0300
Subject: [PATCH 4/8] test: add jsxImportSource assertion for automatic JSX
runtime
---
.../test/fixtures/jsx-import-source/example.jsx | 1 +
.../sucrase/test/fixtures/jsx-import-source/main.js | 4 ++++
packages/sucrase/test/test.js | 12 ++++++++++++
3 files changed, 17 insertions(+)
create mode 100644 packages/sucrase/test/fixtures/jsx-import-source/example.jsx
create mode 100644 packages/sucrase/test/fixtures/jsx-import-source/main.js
diff --git a/packages/sucrase/test/fixtures/jsx-import-source/example.jsx b/packages/sucrase/test/fixtures/jsx-import-source/example.jsx
new file mode 100644
index 000000000..87153ec31
--- /dev/null
+++ b/packages/sucrase/test/fixtures/jsx-import-source/example.jsx
@@ -0,0 +1 @@
+export default () => hello world
diff --git a/packages/sucrase/test/fixtures/jsx-import-source/main.js b/packages/sucrase/test/fixtures/jsx-import-source/main.js
new file mode 100644
index 000000000..9d03081dd
--- /dev/null
+++ b/packages/sucrase/test/fixtures/jsx-import-source/main.js
@@ -0,0 +1,4 @@
+/* eslint-disable import/extensions */
+import example from './example.jsx';
+
+t.snapshot(example.toString());
diff --git a/packages/sucrase/test/test.js b/packages/sucrase/test/test.js
index c1afae6e0..75eef611a 100644
--- a/packages/sucrase/test/test.js
+++ b/packages/sucrase/test/test.js
@@ -108,3 +108,15 @@ test('converts typescript jsx ("tsx")', async (t) => {
return testBundle(t, bundle);
});
+
+test('converts jsx with jsxImportSource', async (t) => {
+ const bundle = await getBundle(
+ 'fixtures/jsx-import-source/main.js',
+ { transforms: ['jsx'], jsxRuntime: 'automatic', jsxImportSource: 'preact' },
+ { external: ['preact/jsx-dev-runtime'] }
+ );
+ const { output } = await bundle.generate({ format: 'cjs', exports: 'auto' });
+ const [{ code }] = output;
+ t.regex(code, /require\(['"]preact\/jsx-dev-runtime['"]\)/);
+ t.notRegex(code, /['"]react\/jsx-dev-runtime['"]/);
+});
From 4bcbe6e8f09919156c2a0c62159827348ea95d36 Mon Sep 17 00:00:00 2001
From: vinny-silveira
Date: Mon, 16 Feb 2026 09:26:00 -0300
Subject: [PATCH 5/8] test: add coverage for preserveDynamicImport and
injectCreateRequireForImportRequire
---
.../fixtures/inject-create-require/main.ts | 3 +++
.../fixtures/preserve-dynamic-import/main.js | 3 +++
packages/sucrase/test/test.js | 24 +++++++++++++++++++
3 files changed, 30 insertions(+)
create mode 100644 packages/sucrase/test/fixtures/inject-create-require/main.ts
create mode 100644 packages/sucrase/test/fixtures/preserve-dynamic-import/main.js
diff --git a/packages/sucrase/test/fixtures/inject-create-require/main.ts b/packages/sucrase/test/fixtures/inject-create-require/main.ts
new file mode 100644
index 000000000..6dc8b4b3c
--- /dev/null
+++ b/packages/sucrase/test/fixtures/inject-create-require/main.ts
@@ -0,0 +1,3 @@
+import foo = require('foo');
+
+export default foo;
diff --git a/packages/sucrase/test/fixtures/preserve-dynamic-import/main.js b/packages/sucrase/test/fixtures/preserve-dynamic-import/main.js
new file mode 100644
index 000000000..edb2ee72e
--- /dev/null
+++ b/packages/sucrase/test/fixtures/preserve-dynamic-import/main.js
@@ -0,0 +1,3 @@
+export default function loadModule(name) {
+ return import(name);
+}
diff --git a/packages/sucrase/test/test.js b/packages/sucrase/test/test.js
index 75eef611a..523865143 100644
--- a/packages/sucrase/test/test.js
+++ b/packages/sucrase/test/test.js
@@ -120,3 +120,27 @@ test('converts jsx with jsxImportSource', async (t) => {
t.regex(code, /require\(['"]preact\/jsx-dev-runtime['"]\)/);
t.notRegex(code, /['"]react\/jsx-dev-runtime['"]/);
});
+
+test('preserveDynamicImport keeps import() expression', async (t) => {
+ const bundle = await getBundle('fixtures/preserve-dynamic-import/main.js', {
+ transforms: ['imports'],
+ preserveDynamicImport: true
+ });
+ const { output } = await bundle.generate({ format: 'es' });
+ const [{ code }] = output;
+ t.regex(code, /import\(/);
+});
+
+test('injectCreateRequireForImportRequire emits createRequire', async (t) => {
+ const bundle = await getBundle(
+ 'fixtures/inject-create-require/main.ts',
+ {
+ transforms: ['typescript'],
+ injectCreateRequireForImportRequire: true
+ },
+ { external: ['foo', 'module'] }
+ );
+ const { output } = await bundle.generate({ format: 'es' });
+ const [{ code }] = output;
+ t.regex(code, /createRequire/);
+});
From 2020450646130d1f907462473c2b091683f8b79a Mon Sep 17 00:00:00 2001
From: vinny-silveira
Date: Mon, 16 Feb 2026 09:26:27 -0300
Subject: [PATCH 6/8] test: remove context option from getBundle helper
Reverts the context: 'this' setting to align with Rollup's default behavior.
The context option was added to silence build warnings but has no impact
on the plugin's transformation logic. Snapshots updated accordingly.
---
packages/sucrase/test/snapshots/test.js.md | 14 +++++++-------
packages/sucrase/test/snapshots/test.js.snap | Bin 454 -> 458 bytes
packages/sucrase/test/test.js | 1 -
3 files changed, 7 insertions(+), 8 deletions(-)
diff --git a/packages/sucrase/test/snapshots/test.js.md b/packages/sucrase/test/snapshots/test.js.md
index 7ca1a8db1..cabbf6a3d 100644
--- a/packages/sucrase/test/snapshots/test.js.md
+++ b/packages/sucrase/test/snapshots/test.js.md
@@ -8,13 +8,13 @@ Generated by [AVA](https://avajs.dev).
> Snapshot 1
- '() => React.createElement(\'div\', { id: "foo", __self: this, __source: {fileName: _jsxFileName, lineNumber: 1}}, "hello world" )'
+ '() => React.createElement(\'div\', { id: "foo", __self: undefined, __source: {fileName: _jsxFileName, lineNumber: 1}}, "hello world" )'
## converts jsx with custom jsxPragma
> Snapshot 1
- '() => FakeReactCreateElement(\'div\', { id: "foo", __self: this, __source: {fileName: _jsxFileName, lineNumber: 1}}, "hello world" )'
+ '() => FakeReactCreateElement(\'div\', { id: "foo", __self: undefined, __source: {fileName: _jsxFileName, lineNumber: 1}}, "hello world" )'
## converts typescript
@@ -54,20 +54,20 @@ Generated by [AVA](https://avajs.dev).
> Snapshot 1
- '() => React.createElement(\'div\', { id: "foo", __self: this, __source: {fileName: _jsxFileName$4, lineNumber: 1}}, "hello world" )'
+ '() => React.createElement(\'div\', { id: "foo", __self: undefined, __source: {fileName: _jsxFileName$4, lineNumber: 1}}, "hello world" )'
> Snapshot 2
- '() => React.createElement(\'div\', { id: "example-b", __self: this, __source: {fileName: _jsxFileName$3, lineNumber: 1}}, "hello world (a second time)" )'
+ '() => React.createElement(\'div\', { id: "example-b", __self: undefined, __source: {fileName: _jsxFileName$3, lineNumber: 1}}, "hello world (a second time)" )'
> Snapshot 3
- '() => React.createElement(\'div\', { id: "foo", __self: this, __source: {fileName: _jsxFileName$2, lineNumber: 1}}, "hello world" )'
+ '() => React.createElement(\'div\', { id: "foo", __self: undefined, __source: {fileName: _jsxFileName$2, lineNumber: 1}}, "hello world" )'
> Snapshot 4
- '() => React.createElement(\'div\', { id: "foo", __self: this, __source: {fileName: _jsxFileName$1, lineNumber: 1}}, "hello world" )'
+ '() => React.createElement(\'div\', { id: "foo", __self: undefined, __source: {fileName: _jsxFileName$1, lineNumber: 1}}, "hello world" )'
> Snapshot 5
- '() => React.createElement(\'div\', { id: "foo", __self: this, __source: {fileName: _jsxFileName, lineNumber: 1}}, "hello world" )'
+ '() => React.createElement(\'div\', { id: "foo", __self: undefined, __source: {fileName: _jsxFileName, lineNumber: 1}}, "hello world" )'
diff --git a/packages/sucrase/test/snapshots/test.js.snap b/packages/sucrase/test/snapshots/test.js.snap
index d3be49ecc410ae0f332e7609af2eb41bd8f0ba98..6fa2507cebff7b5042a769c6c22187ff11b461cd 100644
GIT binary patch
literal 458
zcmV;*0X6)^q|!G0HRl^58yLO>-LWpS`=DyOBg2KH#12;@P(u`-TOqtjX*(V)Ieo4RCU62
zL}Fc$MnCo$BZl0+ZfABggO%OM>~D25wgZ<}aEFANQ>u^{yb%~;Wb7Q{jhqW@;LHOn
zkkWFYT-GQ859$%afJexNN3yOcde9EIz!C}3gK||T#dPO_;1QPUp^wUgLZ{<`RY4&n
zG^G;E0w*O;tZ8&;a#I0X*G7he{jDMoA(0941y
A_5c6?
literal 454
zcmV;%0XhCbRzVXxb1R!Xoqewg-Vz0N7kc=M&}pbXnPaD+ngnsg`__Y5YOaUF@npQHh3TsjG%f-`F;_FV04NHjU+}F!TQxz2!0)nv2bpkQ9hIl
z=G-5IhI7qzkPTv+bmBuNP7?81c)F_*%xQn_1XP19qQTeMTR7u&bW_%Ti`DY
zO=2z(A;et+0TqZRob)jW_yYZX9>QorNT0_rUg2ejWK9!?3M=hUvUL}rlgv6EsDASk
zHyMKJCP}D(`aoFx%B{0+fzOot<^JV&Mcv1t4QqM7`dXH@MlV>w^*Y4$JT@2RBFPM{
w#^0dZ96<+x077X~1*{V+`vA}bo@^sG#%|
Date: Mon, 16 Feb 2026 10:26:01 -0300
Subject: [PATCH 7/8] refactor: add context this
Add the context again to eliminate warnings during test execution.
---
packages/sucrase/test/test.js | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/packages/sucrase/test/test.js b/packages/sucrase/test/test.js
index 8dd4c836f..39fa962f9 100644
--- a/packages/sucrase/test/test.js
+++ b/packages/sucrase/test/test.js
@@ -16,6 +16,11 @@ process.chdir(__dirname);
function getBundle(input, sucraseOptions, rollupOptions) {
return rollup({
+ /**
+ * Explicitly set Rollup's top-level `this` context to silence build-time warnings about `this` being undefined in ES modules.
+ * This is a bundler-level concern only and does not affect the plugin's transform behavior, which runs before bundling.
+ */
+ context: 'this',
input,
plugins: [sucrase(sucraseOptions)],
...rollupOptions
From ca88b7b07f4f3f7a82b57ee71aad977126296505 Mon Sep 17 00:00:00 2001
From: vinny-silveira
Date: Mon, 16 Feb 2026 10:26:20 -0300
Subject: [PATCH 8/8] test: update snapshots
---
packages/sucrase/test/snapshots/test.js.md | 14 +++++++-------
packages/sucrase/test/snapshots/test.js.snap | Bin 458 -> 454 bytes
2 files changed, 7 insertions(+), 7 deletions(-)
diff --git a/packages/sucrase/test/snapshots/test.js.md b/packages/sucrase/test/snapshots/test.js.md
index cabbf6a3d..7ca1a8db1 100644
--- a/packages/sucrase/test/snapshots/test.js.md
+++ b/packages/sucrase/test/snapshots/test.js.md
@@ -8,13 +8,13 @@ Generated by [AVA](https://avajs.dev).
> Snapshot 1
- '() => React.createElement(\'div\', { id: "foo", __self: undefined, __source: {fileName: _jsxFileName, lineNumber: 1}}, "hello world" )'
+ '() => React.createElement(\'div\', { id: "foo", __self: this, __source: {fileName: _jsxFileName, lineNumber: 1}}, "hello world" )'
## converts jsx with custom jsxPragma
> Snapshot 1
- '() => FakeReactCreateElement(\'div\', { id: "foo", __self: undefined, __source: {fileName: _jsxFileName, lineNumber: 1}}, "hello world" )'
+ '() => FakeReactCreateElement(\'div\', { id: "foo", __self: this, __source: {fileName: _jsxFileName, lineNumber: 1}}, "hello world" )'
## converts typescript
@@ -54,20 +54,20 @@ Generated by [AVA](https://avajs.dev).
> Snapshot 1
- '() => React.createElement(\'div\', { id: "foo", __self: undefined, __source: {fileName: _jsxFileName$4, lineNumber: 1}}, "hello world" )'
+ '() => React.createElement(\'div\', { id: "foo", __self: this, __source: {fileName: _jsxFileName$4, lineNumber: 1}}, "hello world" )'
> Snapshot 2
- '() => React.createElement(\'div\', { id: "example-b", __self: undefined, __source: {fileName: _jsxFileName$3, lineNumber: 1}}, "hello world (a second time)" )'
+ '() => React.createElement(\'div\', { id: "example-b", __self: this, __source: {fileName: _jsxFileName$3, lineNumber: 1}}, "hello world (a second time)" )'
> Snapshot 3
- '() => React.createElement(\'div\', { id: "foo", __self: undefined, __source: {fileName: _jsxFileName$2, lineNumber: 1}}, "hello world" )'
+ '() => React.createElement(\'div\', { id: "foo", __self: this, __source: {fileName: _jsxFileName$2, lineNumber: 1}}, "hello world" )'
> Snapshot 4
- '() => React.createElement(\'div\', { id: "foo", __self: undefined, __source: {fileName: _jsxFileName$1, lineNumber: 1}}, "hello world" )'
+ '() => React.createElement(\'div\', { id: "foo", __self: this, __source: {fileName: _jsxFileName$1, lineNumber: 1}}, "hello world" )'
> Snapshot 5
- '() => React.createElement(\'div\', { id: "foo", __self: undefined, __source: {fileName: _jsxFileName, lineNumber: 1}}, "hello world" )'
+ '() => React.createElement(\'div\', { id: "foo", __self: this, __source: {fileName: _jsxFileName, lineNumber: 1}}, "hello world" )'
diff --git a/packages/sucrase/test/snapshots/test.js.snap b/packages/sucrase/test/snapshots/test.js.snap
index 6fa2507cebff7b5042a769c6c22187ff11b461cd..d3be49ecc410ae0f332e7609af2eb41bd8f0ba98 100644
GIT binary patch
literal 454
zcmV;%0XhCbRzVXxb1R!Xoqewg-Vz0N7kc=M&}pbXnPaD+ngnsg`__Y5YOaUF@npQHh3TsjG%f-`F;_FV04NHjU+}F!TQxz2!0)nv2bpkQ9hIl
z=G-5IhI7qzkPTv+bmBuNP7?81c)F_*%xQn_1XP19qQTeMTR7u&bW_%Ti`DY
zO=2z(A;et+0TqZRob)jW_yYZX9>QorNT0_rUg2ejWK9!?3M=hUvUL}rlgv6EsDASk
zHyMKJCP}D(`aoFx%B{0+fzOot<^JV&Mcv1t4QqM7`dXH@MlV>w^*Y4$JT@2RBFPM{
w#^0dZ96<+x077X~1*{V+`vA}bo@^sG#%|)^q|!G0HRl^58yLO>-LWpS`=DyOBg2KH#12;@P(u`-TOqtjX*(V)Ieo4RCU62
zL}Fc$MnCo$BZl0+ZfABggO%OM>~D25wgZ<}aEFANQ>u^{yb%~;Wb7Q{jhqW@;LHOn
zkkWFYT-GQ859$%afJexNN3yOcde9EIz!C}3gK||T#dPO_;1QPUp^wUgLZ{<`RY4&n
zG^G;E0w*O;tZ8&;a#I0X*G7he{jDMoA(0941y
A_5c6?