diff --git a/.changeset/metal-roses-flash.md b/.changeset/metal-roses-flash.md
new file mode 100644
index 000000000..109c218b0
--- /dev/null
+++ b/.changeset/metal-roses-flash.md
@@ -0,0 +1,7 @@
+---
+'preact-cli': major
+---
+
+Changes the JSX transform from 'classic' to the newer 'automatic'
+
+Users will no longer need to add `import { h } from 'preact'` in their components; it will be done automatically for them.
diff --git a/jsconfig.json b/jsconfig.json
index 3d7090679..2e7c7fcdf 100644
--- a/jsconfig.json
+++ b/jsconfig.json
@@ -7,9 +7,9 @@
"noEmit": true,
"resolveJsonModule": true,
"allowSyntheticDefaultImports": true,
- "jsx": "react",
- "jsxFactory": "h",
- "jsxFragmentFactory": "Fragment"
+ "jsx": "preserve",
+ "jsxFactory": "preact.h",
+ "jsxFragmentFactory": "preact.Fragment"
},
"include": ["packages/**/*"]
}
diff --git a/packages/cli/lib/lib/babel-config.js b/packages/cli/lib/lib/babel-config.js
index 288de4f2c..5a4859787 100644
--- a/packages/cli/lib/lib/babel-config.js
+++ b/packages/cli/lib/lib/babel-config.js
@@ -31,16 +31,14 @@ module.exports = function (env) {
require.resolve('babel-plugin-macros'),
[
require.resolve('@babel/plugin-transform-react-jsx'),
- { pragma: 'h', pragmaFrag: 'Fragment' },
+ { runtime: 'automatic', importSource: 'preact' },
],
].filter(Boolean),
overrides: [
// Transforms to apply only to first-party code:
{
exclude: '**/node_modules/**',
- presets: [
- [require.resolve('@babel/preset-typescript'), { jsxPragma: 'h' }],
- ],
+ presets: [require.resolve('@babel/preset-typescript')],
plugins: [
!isProd && refresh && require.resolve('react-refresh/babel'),
].filter(Boolean),
diff --git a/packages/cli/lib/lib/webpack/webpack-base-config.js b/packages/cli/lib/lib/webpack/webpack-base-config.js
index 254434613..18a134c79 100644
--- a/packages/cli/lib/lib/webpack/webpack-base-config.js
+++ b/packages/cli/lib/lib/webpack/webpack-base-config.js
@@ -287,10 +287,6 @@ module.exports = function createBaseConfig(env) {
}
)
),
- new webpack.ProvidePlugin({
- h: ['preact', 'h'],
- Fragment: ['preact', 'Fragment'],
- }),
// Fix for https://github.com/webpack-contrib/mini-css-extract-plugin/issues/151
new RemoveEmptyScriptsPlugin(),
new MiniCssExtractPlugin({
diff --git a/packages/cli/tests/images/build.js b/packages/cli/tests/images/build.js
index 852d4f18e..403a144d9 100644
--- a/packages/cli/tests/images/build.js
+++ b/packages/cli/tests/images/build.js
@@ -13,10 +13,10 @@ exports.default = {
'ssr-build/ssr-bundle.js.map': 30625,
'ssr-build/asset-manifest.json': 82,
- 'bundle.86ff2.js': 21323,
- 'bundle.86ff2.js.map': 85534,
- 'bundle.86ff2.legacy.js': 22514,
- 'bundle.86ff2.legacy.js.map': 106422,
+ 'bundle.3c823.js': 21323,
+ 'bundle.3c823.js.map': 85534,
+ 'bundle.3c823.legacy.js': 22514,
+ 'bundle.3c823.legacy.js.map': 106422,
'bundle.a2557.css': 945,
'bundle.a2557.css.map': 1758,
@@ -31,17 +31,17 @@ exports.default = {
'push-manifest.json': 450,
'asset-manifest.json': 943,
- 'route-home.chunk.b77d6.js': 306,
- 'route-home.chunk.b77d6.js.map': 1490,
- 'route-home.chunk.b77d6.legacy.js': 363,
- 'route-home.chunk.b77d6.legacy.js.map': 1752,
+ 'route-home.chunk.a00bd.js': 339,
+ 'route-home.chunk.a00bd.js.map': 1811,
+ 'route-home.chunk.a00bd.legacy.js': 394,
+ 'route-home.chunk.a00bd.legacy.js.map': 2102,
'route-home.chunk.6eaee.css': 112,
'route-home.chunk.6eaee.css.map': 224,
- 'route-profile.chunk.d8eb4.js': 2469,
- 'route-profile.chunk.d8eb4.js.map': 9736,
- 'route-profile.chunk.d8eb4.legacy.js': 2624,
- 'route-profile.chunk.d8eb4.legacy.js.map': 12373,
+ 'route-profile.chunk.05dd0.js': 2545,
+ 'route-profile.chunk.05dd0.js.map': 10268,
+ 'route-profile.chunk.05dd0.legacy.js': 2698,
+ 'route-profile.chunk.05dd0.legacy.js.map': 12894,
'route-profile.chunk.0af3e.css': 118,
'route-profile.chunk.0af3e.css.map': 231,
};
diff --git a/packages/cli/tests/subjects/css-inline/index.js b/packages/cli/tests/subjects/css-inline/index.js
index 581bd47fe..d4e555160 100644
--- a/packages/cli/tests/subjects/css-inline/index.js
+++ b/packages/cli/tests/subjects/css-inline/index.js
@@ -1,5 +1,3 @@
-import { h } from 'preact';
-
import './style.css';
export default () =>
Test CSS inlining
;
diff --git a/packages/cli/tests/subjects/css-modules/index.js b/packages/cli/tests/subjects/css-modules/index.js
index 69d56069a..d08b36ea9 100644
--- a/packages/cli/tests/subjects/css-modules/index.js
+++ b/packages/cli/tests/subjects/css-modules/index.js
@@ -1,5 +1,3 @@
-import { h } from 'preact';
-
import './style.css';
import styles from './style.module.css';
diff --git a/packages/cli/tests/subjects/css-sass/index.js b/packages/cli/tests/subjects/css-sass/index.js
index 03c0944cc..cb5f079c5 100644
--- a/packages/cli/tests/subjects/css-sass/index.js
+++ b/packages/cli/tests/subjects/css-sass/index.js
@@ -1,5 +1,3 @@
-import { h } from 'preact';
-
import './style.sass';
import './style.scss';
import sassStyles from './style.module.sass';
diff --git a/packages/cli/tests/subjects/custom-babelrc/index.js b/packages/cli/tests/subjects/custom-babelrc/index.js
index f176a7f41..5d8d926d5 100644
--- a/packages/cli/tests/subjects/custom-babelrc/index.js
+++ b/packages/cli/tests/subjects/custom-babelrc/index.js
@@ -1,4 +1,4 @@
-import { h, Component } from 'preact';
+import { Component } from 'preact';
const delay = t => new Promise(r => setTimeout(r, t));
diff --git a/packages/cli/tests/subjects/custom-template/index.js b/packages/cli/tests/subjects/custom-template/index.js
index dcf3bb109..49306f0d9 100644
--- a/packages/cli/tests/subjects/custom-template/index.js
+++ b/packages/cli/tests/subjects/custom-template/index.js
@@ -1,3 +1 @@
-import { h } from 'preact';
-
export default () => This is an app with custom template
;
diff --git a/packages/cli/tests/subjects/custom-webpack/index.js b/packages/cli/tests/subjects/custom-webpack/index.js
index dcf3bb109..49306f0d9 100644
--- a/packages/cli/tests/subjects/custom-webpack/index.js
+++ b/packages/cli/tests/subjects/custom-webpack/index.js
@@ -1,3 +1 @@
-import { h } from 'preact';
-
export default () => This is an app with custom template
;
diff --git a/packages/cli/tests/subjects/location-patch/index.js b/packages/cli/tests/subjects/location-patch/index.js
index 1e68f0a4d..32f92a9b2 100644
--- a/packages/cli/tests/subjects/location-patch/index.js
+++ b/packages/cli/tests/subjects/location-patch/index.js
@@ -1,5 +1,3 @@
-import { h } from 'preact';
-
export default () => {
if (
location.protocol === undefined ||
diff --git a/packages/cli/tests/subjects/minimal/index.js b/packages/cli/tests/subjects/minimal/index.js
index 31aba19f0..bc2725b1d 100644
--- a/packages/cli/tests/subjects/minimal/index.js
+++ b/packages/cli/tests/subjects/minimal/index.js
@@ -1,4 +1,3 @@
-import { h } from 'preact';
import './style.css';
export default () => Minimal App
;
diff --git a/packages/cli/tests/subjects/multiple-config-files/index.js b/packages/cli/tests/subjects/multiple-config-files/index.js
index 60c988215..c8ba8c15a 100644
--- a/packages/cli/tests/subjects/multiple-config-files/index.js
+++ b/packages/cli/tests/subjects/multiple-config-files/index.js
@@ -1,4 +1,4 @@
-import { h, Component } from 'preact';
+import { Component } from 'preact';
import { Router } from 'preact-router';
import Home from './routes/home';
diff --git a/packages/cli/tests/subjects/multiple-prerendering-with-provider/index.js b/packages/cli/tests/subjects/multiple-prerendering-with-provider/index.js
index 1ef9c567d..36022ac2f 100644
--- a/packages/cli/tests/subjects/multiple-prerendering-with-provider/index.js
+++ b/packages/cli/tests/subjects/multiple-prerendering-with-provider/index.js
@@ -1,4 +1,4 @@
-import { h, Component } from 'preact';
+import { Component } from 'preact';
import { Router } from 'preact-router';
import { Provider } from '@preact/prerender-data-provider';
import Home from './routes/home';
diff --git a/packages/cli/tests/subjects/multiple-prerendering-with-provider/routes/custom.js b/packages/cli/tests/subjects/multiple-prerendering-with-provider/routes/custom.js
index b1e284336..64398d202 100644
--- a/packages/cli/tests/subjects/multiple-prerendering-with-provider/routes/custom.js
+++ b/packages/cli/tests/subjects/multiple-prerendering-with-provider/routes/custom.js
@@ -1,4 +1,4 @@
-import { h, Component } from 'preact';
+import { Component } from 'preact';
import './custom.css';
import { PreRenderDataSource } from '@preact/prerender-data-provider';
class Custom extends Component {
diff --git a/packages/cli/tests/subjects/multiple-prerendering/index.js b/packages/cli/tests/subjects/multiple-prerendering/index.js
index 0449f4c10..9b7d5df3a 100644
--- a/packages/cli/tests/subjects/multiple-prerendering/index.js
+++ b/packages/cli/tests/subjects/multiple-prerendering/index.js
@@ -1,4 +1,4 @@
-import { h, Component } from 'preact';
+import { Component } from 'preact';
import { Router } from 'preact-router';
import Home from './routes/home';
import Route66 from './routes/route66';
diff --git a/packages/cli/tests/subjects/preload-chunks/index.js b/packages/cli/tests/subjects/preload-chunks/index.js
index b9e389a05..3eac12bde 100644
--- a/packages/cli/tests/subjects/preload-chunks/index.js
+++ b/packages/cli/tests/subjects/preload-chunks/index.js
@@ -1,4 +1,4 @@
-import { h, Component } from 'preact';
+import { Component } from 'preact';
import { Router } from 'preact-router';
import Home from './routes/home';
import Route66 from './routes/route66';
diff --git a/packages/cli/tests/subjects/preload-chunks/routes/base.js b/packages/cli/tests/subjects/preload-chunks/routes/base.js
index 753323af0..fcf09eb2b 100644
--- a/packages/cli/tests/subjects/preload-chunks/routes/base.js
+++ b/packages/cli/tests/subjects/preload-chunks/routes/base.js
@@ -1,4 +1,4 @@
-import { h, Component } from 'preact';
+import { Component } from 'preact';
export default class Base extends Component {
state = {
diff --git a/packages/cli/tests/subjects/preload-chunks/routes/home.js b/packages/cli/tests/subjects/preload-chunks/routes/home.js
index ec5fc6ba4..47d1d9638 100644
--- a/packages/cli/tests/subjects/preload-chunks/routes/home.js
+++ b/packages/cli/tests/subjects/preload-chunks/routes/home.js
@@ -1,4 +1,3 @@
-import { h } from 'preact';
import Base from './base';
import './home.css';
diff --git a/packages/cli/tests/subjects/preload-chunks/routes/route66.js b/packages/cli/tests/subjects/preload-chunks/routes/route66.js
index fc1391484..0e5960cf8 100644
--- a/packages/cli/tests/subjects/preload-chunks/routes/route66.js
+++ b/packages/cli/tests/subjects/preload-chunks/routes/route66.js
@@ -1,4 +1,3 @@
-import { h } from 'preact';
import Base from './base';
import './route66.css';
diff --git a/packages/cli/tests/subjects/preload-chunks/routes/route89.js b/packages/cli/tests/subjects/preload-chunks/routes/route89.js
index fe9e86aec..e81a51a0b 100644
--- a/packages/cli/tests/subjects/preload-chunks/routes/route89.js
+++ b/packages/cli/tests/subjects/preload-chunks/routes/route89.js
@@ -1,4 +1,3 @@
-import { h } from 'preact';
import Base from './base';
import './route89.css';
diff --git a/packages/cli/tests/subjects/prerendering-hydration/index.js b/packages/cli/tests/subjects/prerendering-hydration/index.js
index 27d1628a4..37d4f54d8 100644
--- a/packages/cli/tests/subjects/prerendering-hydration/index.js
+++ b/packages/cli/tests/subjects/prerendering-hydration/index.js
@@ -1,4 +1,4 @@
-import { h, Component } from 'preact';
+import { Component } from 'preact';
export default class App extends Component {
render() {
diff --git a/packages/cli/tests/subjects/proxy/index.js b/packages/cli/tests/subjects/proxy/index.js
index e154e7db6..678de5181 100644
--- a/packages/cli/tests/subjects/proxy/index.js
+++ b/packages/cli/tests/subjects/proxy/index.js
@@ -1,4 +1,3 @@
-import { h } from 'preact';
import { useEffect, useState } from 'preact/hooks';
export default () => {
diff --git a/packages/cli/tests/subjects/public-path/index.js b/packages/cli/tests/subjects/public-path/index.js
index 7152cbbe1..6c99cc9d4 100644
--- a/packages/cli/tests/subjects/public-path/index.js
+++ b/packages/cli/tests/subjects/public-path/index.js
@@ -1,4 +1,3 @@
-import { h } from 'preact';
import './style.css';
export default () => Public path test
;
diff --git a/packages/cli/tests/subjects/static-root/index.js b/packages/cli/tests/subjects/static-root/index.js
index cbed9ced6..5107516e3 100644
--- a/packages/cli/tests/subjects/static-root/index.js
+++ b/packages/cli/tests/subjects/static-root/index.js
@@ -1,5 +1,3 @@
-import { h } from 'preact';
-
export default () => {
return Static test
;
};