From d61347d98a48f9f4df383e5346d1a6d318c34b8b Mon Sep 17 00:00:00 2001 From: Ian Sutherland Date: Thu, 22 Oct 2020 21:38:53 -0600 Subject: [PATCH] Use new JSX setting with TypeScript 4.1.0 (#9734) --- .../scripts/utils/verifyTypeScriptSetup.js | 25 +++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/packages/react-scripts/scripts/utils/verifyTypeScriptSetup.js b/packages/react-scripts/scripts/utils/verifyTypeScriptSetup.js index 6a1f2c625f7..00139ee4caf 100644 --- a/packages/react-scripts/scripts/utils/verifyTypeScriptSetup.js +++ b/packages/react-scripts/scripts/utils/verifyTypeScriptSetup.js @@ -14,9 +14,23 @@ const resolve = require('resolve'); const path = require('path'); const paths = require('../../config/paths'); const os = require('os'); +const semver = require('semver'); const immer = require('react-dev-utils/immer').produce; const globby = require('react-dev-utils/globby').sync; +const hasJsxRuntime = (() => { + if (process.env.DISABLE_NEW_JSX_TRANSFORM === 'true') { + return false; + } + + try { + require.resolve('react/jsx-runtime', { paths: [paths.appPath] }); + return true; + } catch (e) { + return false; + } +})(); + function writeJson(fileName, object) { fs.writeFileSync( fileName, @@ -132,8 +146,15 @@ function verifyTypeScriptSetup() { isolatedModules: { value: true, reason: 'implementation limitation' }, noEmit: { value: true }, jsx: { - parsedValue: ts.JsxEmit.React, - suggested: 'react', + parsedValue: + hasJsxRuntime && semver.gte(ts.version, '4.1.0-beta') + ? ts.JsxEmit.ReactJsx + : ts.JsxEmit.React, + value: + hasJsxRuntime && semver.gte(ts.version, '4.1.0-beta') + ? 'react-jsx' + : 'react', + reason: 'to support the new JSX transform in React 17', }, paths: { value: undefined, reason: 'aliased imports are not supported' }, };