summaryrefslogtreecommitdiff
path: root/packages/integrations/preact/src/index.ts
diff options
context:
space:
mode:
Diffstat (limited to 'packages/integrations/preact/src/index.ts')
-rw-r--r--packages/integrations/preact/src/index.ts58
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),
});
},
},