Skip to content

Commit 0402ea2

Browse files
committed
Make Babel an optional peer dependency
1 parent b044c38 commit 0402ea2

2 files changed

Lines changed: 65 additions & 10 deletions

File tree

package.json

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,11 +38,8 @@
3838
"dist/"
3939
],
4040
"dependencies": {
41-
"@babel/plugin-transform-react-jsx": "^7.27.1",
42-
"@babel/plugin-transform-react-jsx-development": "^7.27.1",
4341
"@prefresh/vite": "^2.4.11",
4442
"@rollup/pluginutils": "^5.0.0",
45-
"babel-plugin-transform-hook-names": "^1.0.2",
4643
"debug": "^4.4.3",
4744
"magic-string": "^0.30.21",
4845
"picocolors": "^1.1.1",
@@ -51,10 +48,35 @@
5148
},
5249
"peerDependencies": {
5350
"@babel/core": "7.x",
51+
"@babel/parser": "^7.0.0",
52+
"@babel/plugin-transform-react-jsx": "^7.0.0",
53+
"@babel/plugin-transform-react-jsx-development": "^7.0.0",
54+
"babel-plugin-transform-hook-names": "^1.0.0",
5455
"vite": "2.x || 3.x || 4.x || 5.x || 6.x || 7.x || 8.x"
5556
},
57+
"peerDependenciesMeta": {
58+
"@babel/core": {
59+
"optional": true
60+
},
61+
"@babel/parser": {
62+
"optional": true
63+
},
64+
"@babel/plugin-transform-react-jsx": {
65+
"optional": true
66+
},
67+
"@babel/plugin-transform-react-jsx-development": {
68+
"optional": true
69+
},
70+
"babel-plugin-transform-hook-names": {
71+
"optional": true
72+
}
73+
},
5674
"devDependencies": {
5775
"@babel/core": "^7.28.5",
76+
"@babel/parser": "^7.28.5",
77+
"@babel/plugin-transform-react-jsx": "^7.27.1",
78+
"@babel/plugin-transform-react-jsx-development": "^7.27.1",
79+
"babel-plugin-transform-hook-names": "^1.0.2",
5880
"@types/babel__core": "^7.20.5",
5981
"@types/debug": "^4.1.12",
6082
"@types/estree": "^0.0.50",

src/index.ts

Lines changed: 40 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,43 @@ import { preactDevtoolsPlugin } from "./devtools.js";
88
import { transformHookNamesPlugin } from "./transform-hook-names.js";
99
import { createFilter, parseId } from "./utils.js";
1010
import { vitePrerenderPlugin } from "vite-prerender-plugin";
11-
import { transformAsync } from "@babel/core";
12-
// @ts-ignore package doesn't ship with declaration files
13-
import babelReactJsx from "@babel/plugin-transform-react-jsx";
14-
// @ts-ignore package doesn't ship with declaration files
15-
import babelReactJsxDev from "@babel/plugin-transform-react-jsx-development";
16-
// @ts-ignore package doesn't ship with declaration files
17-
import babelHookNames from "babel-plugin-transform-hook-names";
11+
12+
type BabelDeps = {
13+
transformAsync: typeof import("@babel/core").transformAsync;
14+
babelReactJsx: any;
15+
babelReactJsxDev: any;
16+
babelHookNames: any;
17+
};
18+
19+
let babelDepsPromise: Promise<BabelDeps> | null = null;
20+
21+
function loadBabelDeps(): Promise<BabelDeps> {
22+
return (babelDepsPromise ||= Promise.all([
23+
import("@babel/core"),
24+
// @ts-ignore package doesn't ship with declaration files
25+
import("@babel/plugin-transform-react-jsx"),
26+
// @ts-ignore package doesn't ship with declaration files
27+
import("@babel/plugin-transform-react-jsx-development"),
28+
// @ts-ignore package doesn't ship with declaration files
29+
import("babel-plugin-transform-hook-names"),
30+
])
31+
.then(([core, jsx, jsxDev, hookNames]) => ({
32+
transformAsync: core.transformAsync,
33+
babelReactJsx: (jsx as any).default ?? jsx,
34+
babelReactJsxDev: (jsxDev as any).default ?? jsxDev,
35+
babelHookNames: (hookNames as any).default ?? hookNames,
36+
}))
37+
.catch(err => {
38+
babelDepsPromise = null;
39+
throw new Error(
40+
"@preact/preset-vite: the `babel` option requires `@babel/core`, " +
41+
"`@babel/plugin-transform-react-jsx`, " +
42+
"`@babel/plugin-transform-react-jsx-development`, and " +
43+
"`babel-plugin-transform-hook-names` to be installed.\n" +
44+
`Underlying error: ${err instanceof Error ? err.message : err}`,
45+
);
46+
}));
47+
}
1848

1949
export type BabelOptions = Omit<
2050
TransformOptions,
@@ -237,6 +267,9 @@ function preactPlugin({
237267

238268
if (!useBabel || !shouldTransform(id)) return;
239269

270+
const { transformAsync, babelReactJsx, babelReactJsxDev, babelHookNames } =
271+
await loadBabelDeps();
272+
240273
const parserPlugins = [
241274
...baseParserOptions,
242275
"classProperties",

0 commit comments

Comments
 (0)