Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add warnings if multiple JSX renderers are used #12887

Merged
merged 11 commits into from
Jan 14, 2025
8 changes: 8 additions & 0 deletions .changeset/strong-games-travel.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
---
'@astrojs/preact': patch
'@astrojs/react': patch
'@astrojs/solid-js': patch
'@astrojs/vue': patch
---

Adds a warning message when multiple JSX-based UI frameworks are being used without either the `include` or `exclude` property being set on the integration.
8 changes: 8 additions & 0 deletions packages/integrations/preact/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,14 @@ export default function ({ include, exclude, compat, devtools }: Options = {}):
injectScript('page', 'import "preact/debug";');
}
},
'astro:config:done': ({ logger, config }) => {
const knownJsxRenderers = ['@astrojs/react', '@astrojs/preact', '@astrojs/solid-js'];
const enabledKnownJsxRenderers = config.integrations.filter((renderer) => knownJsxRenderers.includes(renderer.name));

if (enabledKnownJsxRenderers.length > 1 && !include && !exclude) {
logger.warn('More than one JSX renderer is enabled. This will lead to unexpected behavior unless you set the `include` or `exclude` option. See https://docs.astro.build/en/guides/integrations-guide/preact/#combining-multiple-jsx-frameworks for more information.');
}
}
},
};
}
8 changes: 8 additions & 0 deletions packages/integrations/react/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,14 @@ export default function ({
injectScript('before-hydration', preamble);
}
},
'astro:config:done': ({ logger, config }) => {
const knownJsxRenderers = ['@astrojs/react', '@astrojs/preact', '@astrojs/solid-js'];
const enabledKnownJsxRenderers = config.integrations.filter((renderer) => knownJsxRenderers.includes(renderer.name));

if (enabledKnownJsxRenderers.length > 1 && !include && !exclude) {
logger.warn('More than one JSX renderer is enabled. This will lead to unexpected behavior unless you set the `include` or `exclude` option. See https://docs.astro.build/en/guides/integrations-guide/react/#combining-multiple-jsx-frameworks for more information.');
}
}
},
};
}
Expand Down
8 changes: 8 additions & 0 deletions packages/integrations/solid/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,14 @@ export default function (options: Options = {}): AstroIntegration {
injectScript('page', 'import "solid-devtools";');
}
},
'astro:config:done': ({ logger, config }) => {
const knownJsxRenderers = ['@astrojs/react', '@astrojs/preact', '@astrojs/solid-js'];
const enabledKnownJsxRenderers = config.integrations.filter((renderer) => knownJsxRenderers.includes(renderer.name));

if (enabledKnownJsxRenderers.length > 1 && !options.include && !options.exclude) {
logger.warn('More than one JSX renderer is enabled. This will lead to unexpected behavior unless you set the `include` or `exclude` option. See https://docs.astro.build/en/guides/integrations-guide/solid-js/#combining-multiple-jsx-frameworks for more information.');
}
}
},
};
}
11 changes: 11 additions & 0 deletions packages/integrations/vue/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -156,6 +156,17 @@ export default function (options?: Options): AstroIntegration {
}
updateConfig({ vite: await getViteConfiguration(command, options) });
},
'astro:config:done': ({ logger, config }) => {
if (!options?.jsx) return;

const knownJsxRenderers = ['@astrojs/react', '@astrojs/preact', '@astrojs/solid-js'];
const enabledKnownJsxRenderers = config.integrations.filter((renderer) => knownJsxRenderers.includes(renderer.name));

// This error can only be thrown from here since Vue is an optional JSX renderer
if (enabledKnownJsxRenderers.length > 1 && !options?.include && !options?.exclude) {
logger.warn('More than one JSX renderer is enabled. This will lead to unexpected behavior unless you set the `include` or `exclude` option. See https://docs.astro.build/en/guides/integrations-guide/solid-js/#combining-multiple-jsx-frameworks for more information.');
}
}
},
};
}
Loading