From 931ecd56df70ca172825d7befad6cda3787b9bf7 Mon Sep 17 00:00:00 2001 From: Shinobu Hayashi Date: Mon, 20 Dec 2021 06:46:37 +0900 Subject: [PATCH] Fix: transpiling React.createElement into Preact h behavior (#7435) --- .../jsx-automatic-preact-with-alias/index.js | 1 + .../node_modules/preact/jsx-runtime.js | 0 .../node_modules/preact/package.json | 3 +++ .../jsx-automatic-preact-with-alias/package.json | 12 ++++++++++++ .../jsx-automatic-preact-with-alias/yarn.lock | 0 .../core/integration-tests/test/transpilation.js | 13 +++++++++++++ packages/transformers/js/src/JSTransformer.js | 12 ++++++++---- 7 files changed, 37 insertions(+), 4 deletions(-) create mode 100644 packages/core/integration-tests/test/integration/jsx-automatic-preact-with-alias/index.js create mode 100644 packages/core/integration-tests/test/integration/jsx-automatic-preact-with-alias/node_modules/preact/jsx-runtime.js create mode 100644 packages/core/integration-tests/test/integration/jsx-automatic-preact-with-alias/node_modules/preact/package.json create mode 100644 packages/core/integration-tests/test/integration/jsx-automatic-preact-with-alias/package.json create mode 100644 packages/core/integration-tests/test/integration/jsx-automatic-preact-with-alias/yarn.lock diff --git a/packages/core/integration-tests/test/integration/jsx-automatic-preact-with-alias/index.js b/packages/core/integration-tests/test/integration/jsx-automatic-preact-with-alias/index.js new file mode 100644 index 00000000000..8d097d55d7f --- /dev/null +++ b/packages/core/integration-tests/test/integration/jsx-automatic-preact-with-alias/index.js @@ -0,0 +1 @@ +module.exports =
; diff --git a/packages/core/integration-tests/test/integration/jsx-automatic-preact-with-alias/node_modules/preact/jsx-runtime.js b/packages/core/integration-tests/test/integration/jsx-automatic-preact-with-alias/node_modules/preact/jsx-runtime.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/packages/core/integration-tests/test/integration/jsx-automatic-preact-with-alias/node_modules/preact/package.json b/packages/core/integration-tests/test/integration/jsx-automatic-preact-with-alias/node_modules/preact/package.json new file mode 100644 index 00000000000..201dceb61ed --- /dev/null +++ b/packages/core/integration-tests/test/integration/jsx-automatic-preact-with-alias/node_modules/preact/package.json @@ -0,0 +1,3 @@ +{ + "name": "preact" +} diff --git a/packages/core/integration-tests/test/integration/jsx-automatic-preact-with-alias/package.json b/packages/core/integration-tests/test/integration/jsx-automatic-preact-with-alias/package.json new file mode 100644 index 00000000000..c9bd49e7568 --- /dev/null +++ b/packages/core/integration-tests/test/integration/jsx-automatic-preact-with-alias/package.json @@ -0,0 +1,12 @@ +{ + "private": true, + "dependencies": { + "preact": "^10.5" + }, + "alias": { + "react": "preact/compat", + "react-dom/test-utils": "preact/test-utils", + "react-dom": "preact/compat", + "react/jsx-runtime": "preact/jsx-runtime" + } +} diff --git a/packages/core/integration-tests/test/integration/jsx-automatic-preact-with-alias/yarn.lock b/packages/core/integration-tests/test/integration/jsx-automatic-preact-with-alias/yarn.lock new file mode 100644 index 00000000000..e69de29bb2d diff --git a/packages/core/integration-tests/test/transpilation.js b/packages/core/integration-tests/test/transpilation.js index de40708e7e2..6a5c9d0cc4b 100644 --- a/packages/core/integration-tests/test/transpilation.js +++ b/packages/core/integration-tests/test/transpilation.js @@ -183,6 +183,19 @@ describe('transpilation', function () { assert(file.includes('_jsxRuntime.jsx("div"')); }); + it('should support the automatic JSX runtime with preact with alias', async function () { + let b = await bundle( + path.join( + __dirname, + '/integration/jsx-automatic-preact-with-alias/index.js', + ), + ); + + let file = await outputFS.readFile(b.getBundles()[0].filePath, 'utf8'); + assert(/\Wreact\/jsx-runtime\W/.test(file)); + assert(file.includes('_jsxRuntime.jsx("div"')); + }); + it('should support the automatic JSX runtime with explicit tsconfig.json', async function () { let b = await bundle( path.join(__dirname, '/integration/jsx-automatic-tsconfig/index.js'), diff --git a/packages/transformers/js/src/JSTransformer.js b/packages/transformers/js/src/JSTransformer.js index a51365bd11c..60558f7ce10 100644 --- a/packages/transformers/js/src/JSTransformer.js +++ b/packages/transformers/js/src/JSTransformer.js @@ -200,11 +200,15 @@ export default (new Transformer({ jsxImportSource = compilerOptions?.jsxImportSource; automaticJSXRuntime = true; } else if (reactLib) { - let automaticVersion = JSX_PRAGMA[reactLib]?.automatic; + let effectiveReactLib = + pkg?.alias && pkg.alias['react'] === 'preact/compat' + ? 'preact' + : reactLib; + let automaticVersion = JSX_PRAGMA[effectiveReactLib]?.automatic; let reactLibVersion = - pkg?.dependencies?.[reactLib] || - pkg?.devDependencies?.[reactLib] || - pkg?.peerDependencies?.[reactLib]; + pkg?.dependencies?.[effectiveReactLib] || + pkg?.devDependencies?.[effectiveReactLib] || + pkg?.peerDependencies?.[effectiveReactLib]; let minReactLibVersion = reactLibVersion != null && reactLibVersion !== '*' ? semver.minVersion(reactLibVersion)?.toString()