@@ -8,13 +8,43 @@ import { preactDevtoolsPlugin } from "./devtools.js";
88import { transformHookNamesPlugin } from "./transform-hook-names.js" ;
99import { createFilter , parseId } from "./utils.js" ;
1010import { 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
1949export 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