Skip to content

Commit

Permalink
Add warnings if multiple JSX renderers are used (#12887)
Browse files Browse the repository at this point in the history
Co-authored-by: Florian Lefebvre <[email protected]>
Co-authored-by: Bjorn Lu <[email protected]>
  • Loading branch information
3 people authored Jan 14, 2025
1 parent c30070b commit ea603ae
Show file tree
Hide file tree
Showing 5 changed files with 43 additions and 0 deletions.
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 @@ -100,6 +100,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 @@ -108,6 +108,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 @@ -158,6 +158,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.');
}
}
},
};
}

0 comments on commit ea603ae

Please sign in to comment.