diff --git a/docusaurus/docs/proxying-api-requests-in-development.md b/docusaurus/docs/proxying-api-requests-in-development.md index 66563e25e45..536f6587f01 100644 --- a/docusaurus/docs/proxying-api-requests-in-development.md +++ b/docusaurus/docs/proxying-api-requests-in-development.md @@ -110,6 +110,6 @@ module.exports = function(app) { > **Note:** You do not need to import this file anywhere. It is automatically registered when you start the development server. -> **Note:** This file only supports Node's JavaScript syntax. Be sure to only use supported language features (i.e. no support for Flow, ES Modules, etc). +> **Note:** This file does not support ES Modules. But, if you would like more than what Node's JavaScript syntax has to offer (e.g. TypeScript support), install `@babel/register` as a dependency or devDependency using npm or Yarn > **Note:** Passing the path to the proxy function allows you to use globbing and/or pattern matching on the path, which is more flexible than the express route matching. diff --git a/packages/cra-template-typescript/template.json b/packages/cra-template-typescript/template.json index 7e6f0fcc426..00ae2a16792 100644 --- a/packages/cra-template-typescript/template.json +++ b/packages/cra-template-typescript/template.json @@ -1,6 +1,7 @@ { "package": { "dependencies": { + "@babel/register": "^7.9.0", "@testing-library/jest-dom": "^5.11.4", "@testing-library/react": "^11.1.0", "@testing-library/user-event": "^12.1.10", diff --git a/packages/react-scripts/config/paths.js b/packages/react-scripts/config/paths.js index f4470a02f63..2450a48f5a3 100644 --- a/packages/react-scripts/config/paths.js +++ b/packages/react-scripts/config/paths.js @@ -72,7 +72,7 @@ module.exports = { appJsConfig: resolveApp('jsconfig.json'), yarnLockFile: resolveApp('yarn.lock'), testsSetup: resolveModule(resolveApp, 'src/setupTests'), - proxySetup: resolveApp('src/setupProxy.js'), + proxySetup: resolveModule(resolveApp, 'src/setupProxy'), appNodeModules: resolveApp('node_modules'), appWebpackCache: resolveApp('node_modules/.cache'), appTsBuildInfoFile: resolveApp('node_modules/.cache/tsconfig.tsbuildinfo'), @@ -97,7 +97,7 @@ module.exports = { appJsConfig: resolveApp('jsconfig.json'), yarnLockFile: resolveApp('yarn.lock'), testsSetup: resolveModule(resolveApp, 'src/setupTests'), - proxySetup: resolveApp('src/setupProxy.js'), + proxySetup: resolveModule(resolveApp, 'src/setupProxy'), appNodeModules: resolveApp('node_modules'), appWebpackCache: resolveApp('node_modules/.cache'), appTsBuildInfoFile: resolveApp('node_modules/.cache/tsconfig.tsbuildinfo'), @@ -135,7 +135,7 @@ if ( appJsConfig: resolveOwn(`${templatePath}/jsconfig.json`), yarnLockFile: resolveOwn(`${templatePath}/yarn.lock`), testsSetup: resolveModule(resolveOwn, `${templatePath}/src/setupTests`), - proxySetup: resolveOwn(`${templatePath}/src/setupProxy.js`), + proxySetup: resolveModule(resolveOwn, `${templatePath}/src/setupProxy`), appNodeModules: resolveOwn('node_modules'), appWebpackCache: resolveOwn('node_modules/.cache'), appTsBuildInfoFile: resolveOwn('node_modules/.cache/tsconfig.tsbuildinfo'), diff --git a/packages/react-scripts/config/webpackDevServer.config.js b/packages/react-scripts/config/webpackDevServer.config.js index 2202da20346..b9407bc6e2a 100644 --- a/packages/react-scripts/config/webpackDevServer.config.js +++ b/packages/react-scripts/config/webpackDevServer.config.js @@ -108,6 +108,17 @@ module.exports = function (proxy, allowedHost) { app.use(evalSourceMapMiddleware(server)); if (fs.existsSync(paths.proxySetup)) { + // Importing the proxySetup may require typescript (or other) support. + // @babel/register can be used to add support at runtime, so if it's + // listed as a dependency, then import it before importing proxySetup + const packageJSON = fs.readFileSync(paths.appPackageJson).toString(); + const { dependencies, devDependencies } = JSON.parse(packageJSON); + if ( + '@babel/register' in (dependencies || {}) || + '@babel/register' in (devDependencies || {}) + ) { + require('@babel/register'); + } // This registers user provided middleware for proxy reasons require(paths.proxySetup)(app); }