diff options
Diffstat (limited to 'packages/integrations/preact/src/index.ts')
-rw-r--r-- | packages/integrations/preact/src/index.ts | 58 |
1 files changed, 53 insertions, 5 deletions
diff --git a/packages/integrations/preact/src/index.ts b/packages/integrations/preact/src/index.ts index 4c01e66f7..7c7ad618d 100644 --- a/packages/integrations/preact/src/index.ts +++ b/packages/integrations/preact/src/index.ts @@ -1,6 +1,6 @@ -import { AstroIntegration } from 'astro'; +import { AstroIntegration, AstroRenderer, ViteUserConfig } from 'astro'; -function getRenderer() { +function getRenderer(): AstroRenderer { return { name: '@astrojs/preact', clientEntrypoint: '@astrojs/preact/client.js', @@ -18,8 +18,36 @@ function getRenderer() { }; } -function getViteConfiguration() { +function getCompatRenderer(): AstroRenderer { return { + name: '@astrojs/preact', + clientEntrypoint: '@astrojs/preact/client.js', + serverEntrypoint: '@astrojs/preact/server.js', + jsxImportSource: 'react', + jsxTransformOptions: async () => { + const { + default: { default: jsx }, + // @ts-expect-error types not found + } = await import('@babel/plugin-transform-react-jsx'); + return { + plugins: [ + jsx({}, { runtime: 'automatic', importSource: 'preact/compat' }), + ['babel-plugin-module-resolver', { + alias: { + 'react': 'preact/compat', + 'react-dom/test-utils': 'preact/test-utils', + 'react-dom': 'preact/compat', + 'react/jsx-runtime': 'preact/jsx-runtime' + } + }], + ], + }; + }, + }; +} + +function getViteConfiguration(compat?: boolean): ViteUserConfig { + const viteConfig: ViteUserConfig = { optimizeDeps: { include: [ '@astrojs/preact/client.js', @@ -33,16 +61,36 @@ function getViteConfiguration() { external: ['preact-render-to-string'], }, }; + + if (compat) { + viteConfig.optimizeDeps!.include!.push( + 'preact/compat', + 'preact/test-utils', + 'preact/compat/jsx-runtime', + ); + viteConfig.resolve = { + alias: [ + { find: 'react', replacement: 'preact/compat' }, + { find: 'react-dom/test-utils', replacement: 'preact/test-utils' }, + { find: 'react-dom', replacement: 'preact/compat' }, + { find: 'react/jsx-runtime', replacement: 'preact/jsx-runtime' } + ], + dedupe: ['preact/compat'], + }; + } + + return viteConfig } -export default function (): AstroIntegration { +export default function ({ compat }: { compat?: boolean } = {}): AstroIntegration { return { name: '@astrojs/preact', hooks: { 'astro:config:setup': ({ addRenderer, updateConfig }) => { + if (compat) addRenderer(getCompatRenderer()); addRenderer(getRenderer()); updateConfig({ - vite: getViteConfiguration(), + vite: getViteConfiguration(compat), }); }, }, |