Skip to content

Commit dfcb34f

Browse files
committed
feat(react): add support for new jsx transform
1 parent c6916d1 commit dfcb34f

File tree

22 files changed

+259
-60
lines changed

22 files changed

+259
-60
lines changed

packages/eslint-plugin-nx/src/configs/react-jsx.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ export default {
2828
'react/no-direct-mutation-state': 'warn',
2929
'react/no-is-mounted': 'warn',
3030
'react/no-typos': 'error',
31-
'react/react-in-jsx-scope': 'error',
31+
'react/react-in-jsx-scope': 'off',
3232
'react/require-render-return': 'error',
3333
'react/style-prop-object': 'warn',
3434
'react/jsx-no-useless-fragment': 'warn',

packages/react/babel.ts

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,39 @@
22
* Babel preset to provide React support for Nx.
33
*/
44

5-
module.exports = function (api: any, options: {}) {
5+
interface ReactBabelOptions {
6+
runtime?: string;
7+
}
8+
9+
module.exports = function (api: any, options: ReactBabelOptions) {
610
api.assertVersion(7);
11+
const env = api.env();
12+
713
return {
814
presets: [
915
'@nrwl/web/babel',
10-
[require.resolve('@babel/preset-react'), { useBuiltIns: true }],
16+
[
17+
require.resolve('@babel/preset-react'),
18+
getReactPresetOptions({
19+
presetOptions: options,
20+
env,
21+
}),
22+
],
1123
],
1224
};
1325
};
26+
27+
function getReactPresetOptions({ presetOptions, env }) {
28+
const reactPresetOptions: Record<string, string | boolean> = {
29+
runtime: presetOptions.runtime ?? 'automatic',
30+
development: env !== 'production',
31+
};
32+
33+
// JSX spread is transformed into object spread in `@babel/plugin-transform-react-jsx`
34+
// `useBuiltIns` will be removed in Babel 8.
35+
if (presetOptions.runtime === 'automatic') {
36+
reactPresetOptions.useBuiltIns = true;
37+
}
38+
39+
return reactPresetOptions;
40+
}

packages/react/migrations.json

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,12 @@
7474
"version": "11.2.0-beta.0",
7575
"description": "Move react redux typings from dependencies to devDependencies in package.json",
7676
"factory": "./src/migrations/update-11-2-0/move-react-redux-types-package-11-2-0"
77+
},
78+
"use-react-jsx-11.6.0": {
79+
"cli": "nx",
80+
"version": "11.6.0-beta.0",
81+
"description": "Migrate tsconfig.json to allow new jsx transform to be used. Removes the need for `import React from 'react'`",
82+
"factory": "./src/migrations/update-11-6-0/use-react-jsx-in-tsconfig"
7783
}
7884
},
7985
"packageJsonUpdates": {
@@ -416,6 +422,79 @@
416422
"alwaysAddToPackageJson": false
417423
}
418424
}
425+
},
426+
"11.6.0": {
427+
"version": "11.6.0-beta.0",
428+
"packages": {
429+
"react": {
430+
"version": "17.0.2",
431+
"alwaysAddToPackageJson": false
432+
},
433+
"react-dom": {
434+
"version": "17.0.2",
435+
"alwaysAddToPackageJson": false
436+
},
437+
"@types/react": {
438+
"version": "17.0.3",
439+
"alwaysAddToPackageJson": false
440+
},
441+
"@types/react-dom": {
442+
"version": "17.0.3",
443+
"alwaysAddToPackageJson": false
444+
},
445+
"@types/styled-components": {
446+
"version": "5.1.9",
447+
"alwaysAddToPackageJson": false
448+
},
449+
"react-is": {
450+
"version": "17.0.2",
451+
"alwaysAddToPackageJson": false
452+
},
453+
"@types/react-is": {
454+
"version": "17.0.0",
455+
"alwaysAddToPackageJson": false
456+
},
457+
"@emotion/styled": {
458+
"version": "11.1.5",
459+
"alwaysAddToPackageJson": false
460+
},
461+
"@emotion/react": {
462+
"version": "11.1.5",
463+
"alwaysAddToPackageJson": false
464+
},
465+
"@emotion/babel-preset-css-prop": {
466+
"version": "11.2.0",
467+
"alwaysAddToPackageJson": false
468+
},
469+
"styled-jsx": {
470+
"version": "3.4.4",
471+
"alwaysAddToPackageJson": false
472+
},
473+
"@types/react-router-dom": {
474+
"version": "5.1.7",
475+
"alwaysAddToPackageJson": false
476+
},
477+
"@testing-library/react": {
478+
"version": "11.2.5",
479+
"alwaysAddToPackageJson": false
480+
},
481+
"@reduxjs/toolkit": {
482+
"version": "1.5.0",
483+
"alwaysAddToPackageJson": false
484+
},
485+
"react-redux": {
486+
"version": "7.2.3",
487+
"alwaysAddToPackageJson": false
488+
},
489+
"@types/react-redux": {
490+
"version": "7.1.16",
491+
"alwaysAddToPackageJson": false
492+
},
493+
"eslint-plugin-react": {
494+
"version": "7.23.1",
495+
"alwaysAddToPackageJson": false
496+
}
497+
}
419498
}
420499
}
421500
}

packages/react/package.json

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,8 @@
2828
"migrations": "./migrations.json"
2929
},
3030
"dependencies": {
31-
"@babel/core": "7.9.6",
32-
"@babel/preset-react": "7.9.4",
31+
"@babel/core": "7.12.13",
32+
"@babel/preset-react": "7.12.13",
3333
"@nrwl/cypress": "*",
3434
"@nrwl/devkit": "*",
3535
"@nrwl/jest": "*",
@@ -38,10 +38,10 @@
3838
"@nrwl/web": "*",
3939
"@nrwl/workspace": "*",
4040
"@svgr/webpack": "^5.4.0",
41-
"eslint-plugin-import": "^2.20.1",
42-
"eslint-plugin-jsx-a11y": "^6.2.3",
43-
"eslint-plugin-react": "^7.18.3",
44-
"eslint-plugin-react-hooks": "4.2.0",
41+
"eslint-plugin-import": "^2.22.1",
42+
"eslint-plugin-jsx-a11y": "^6.4.1",
43+
"eslint-plugin-react": "^7.23.1",
44+
"eslint-plugin-react-hooks": "^4.2.0",
4545
"url-loader": "^3.0.0"
4646
}
4747
}

packages/react/src/generators/application/files/common/src/app/__fileName__.spec.tsx__tmpl__

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import React from 'react';
21
import { render } from '@testing-library/react';
32
<% if (routing) { %>
43
import { BrowserRouter } from 'react-router-dom';

packages/react/src/generators/application/files/common/src/main.tsx__tmpl__

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
import React from 'react';
2-
import ReactDOM from 'react-dom';
1+
import * as React from 'react';
2+
import * as ReactDOM from 'react-dom';
33
<% if (routing) { %>
44
import { BrowserRouter } from 'react-router-dom';
55
<% } %>

packages/react/src/generators/application/files/common/tsconfig.json__tmpl__

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"extends": "<%= offsetFromRoot %>tsconfig.base.json",
33
"compilerOptions": {
4-
"jsx": "react",
4+
"jsx": "react-jsx",
55
"allowJs": true,
66
"esModuleInterop": true,
77
"allowSyntheticDefaultImports": true

packages/react/src/generators/application/files/css-module/src/app/__fileName__.tsx__tmpl__

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
<% if (classComponent) { %>
2-
import React, { Component } from 'react';
3-
<% } else { %>
4-
import React from 'react';
2+
import { Component } from 'react';
53
<% } %>
64
import styles from './<%= fileName %>.module.<%= style %>';
75

packages/react/src/generators/application/files/global-css/src/app/__fileName__.tsx__tmpl__

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
<% if (classComponent) { %>
2-
import React, { Component } from 'react';
3-
<% } else { %>
4-
import React from 'react';
2+
import { Component } from 'react';
53
<% } %>
64
import './<%= fileName %>.<%= style %>';
75

packages/react/src/generators/application/files/none/src/app/__fileName__.tsx__tmpl__

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
<% if (classComponent) { %>
2-
import React, { Component } from 'react';
3-
<% } else { %>
4-
import React from 'react';
2+
import { Component } from 'react';
53
<% } %>
64

75
import { ReactComponent as Logo } from './logo.svg';

0 commit comments

Comments
 (0)