Skip to content

Commit 1a501e0

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

File tree

26 files changed

+585
-133
lines changed

26 files changed

+585
-133
lines changed

package.json

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -46,13 +46,13 @@
4646
"@angular/router": "~11.2.0",
4747
"@angular/service-worker": "~11.2.0",
4848
"@angular/upgrade": "~11.2.0",
49-
"@babel/core": "7.9.6",
50-
"@babel/plugin-proposal-class-properties": "7.8.3",
51-
"@babel/plugin-proposal-decorators": "7.8.3",
52-
"@babel/plugin-transform-regenerator": "7.8.7",
53-
"@babel/preset-env": "7.9.6",
54-
"@babel/preset-react": "7.9.4",
55-
"@babel/preset-typescript": "7.10.4",
49+
"@babel/core": "7.12.13",
50+
"@babel/plugin-proposal-class-properties": "7.12.13",
51+
"@babel/plugin-proposal-decorators": "7.12.13",
52+
"@babel/plugin-transform-regenerator": "7.12.13",
53+
"@babel/preset-env": "7.12.13",
54+
"@babel/preset-react": "7.12.13",
55+
"@babel/preset-typescript": "7.12.13",
5656
"@cypress/webpack-preprocessor": "~4.1.2",
5757
"@nestjs/common": "^7.0.0",
5858
"@nestjs/core": "^7.0.0",
@@ -157,7 +157,7 @@
157157
"eslint-plugin-cypress": "^2.10.3",
158158
"eslint-plugin-import": "2.22.1",
159159
"eslint-plugin-jsx-a11y": "6.4.1",
160-
"eslint-plugin-react": "7.21.5",
160+
"eslint-plugin-react": "^7.23.1",
161161
"eslint-plugin-react-hooks": "4.2.0",
162162
"express": "4.17.1",
163163
"file-loader": "4.2.0",

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: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,44 @@
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+
importSource?: string;
8+
}
9+
10+
module.exports = function (api: any, options: ReactBabelOptions) {
611
api.assertVersion(7);
12+
const env = api.env();
13+
714
return {
815
presets: [
916
'@nrwl/web/babel',
10-
[require.resolve('@babel/preset-react'), { useBuiltIns: true }],
17+
[
18+
require.resolve('@babel/preset-react'),
19+
getReactPresetOptions({
20+
presetOptions: options,
21+
env,
22+
}),
23+
],
1124
],
1225
};
1326
};
27+
28+
function getReactPresetOptions({ presetOptions, env }) {
29+
const reactPresetOptions: Record<string, string | boolean> = {
30+
runtime: presetOptions.runtime ?? 'automatic',
31+
development: env !== 'production',
32+
};
33+
34+
// JSX spread is transformed into object spread in `@babel/plugin-transform-react-jsx`
35+
// `useBuiltIns` will be removed in Babel 8.
36+
if (presetOptions.runtime === 'automatic') {
37+
reactPresetOptions.useBuiltIns = true;
38+
}
39+
40+
if (presetOptions.importSource) {
41+
reactPresetOptions.importSource = presetOptions.importSource;
42+
}
43+
44+
return reactPresetOptions;
45+
}

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/.babelrc__tmpl__

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,12 @@
11
{
22
"presets": [
3-
"@nrwl/react/babel"
4-
<% if (style === '@emotion/styled') { %>,"@emotion/babel-preset-css-prop"<% } %>
3+
[
4+
"@nrwl/react/babel", {
5+
"runtime": "automatic"
6+
<% if (style === '@emotion/styled') { %>,"importSource": "@emotion/react" }<% } %>
7+
}
8+
]
9+
<% if (style === '@emotion/styled') { %>,"@emotion/babel-plugin"<% } %>
510
],
611
"plugins": [
712
<% if (style === 'styled-components') { %>["styled-components", { "pure": true, "ssr": true }]<% } %>

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

0 commit comments

Comments
 (0)