diff options
author | 2024-06-13 14:05:06 +0100 | |
---|---|---|
committer | 2024-06-13 14:05:06 +0100 | |
commit | 4385bf7a4dc9c65bff53a30c660f7a909fcabfc9 (patch) | |
tree | fee7442038a0792d3212de229638215599f1d721 /packages/integrations/react/src | |
parent | d07d2f7ac9d87af907beaca700ba4116dc1d6f37 (diff) | |
download | astro-4385bf7a4dc9c65bff53a30c660f7a909fcabfc9.tar.gz astro-4385bf7a4dc9c65bff53a30c660f7a909fcabfc9.tar.zst astro-4385bf7a4dc9c65bff53a30c660f7a909fcabfc9.zip |
feat(@astrojs/react): export renderer for easy loading (#11234)
* wip
* feat(@astrojs/react): export `renderer` for easy loading
* restore change
* chore: address feedback
* revert changes
* revert changes to react integration
* update changeset
Diffstat (limited to 'packages/integrations/react/src')
-rw-r--r-- | packages/integrations/react/src/index.ts | 69 | ||||
-rw-r--r-- | packages/integrations/react/src/version.ts | 34 |
2 files changed, 55 insertions, 48 deletions
diff --git a/packages/integrations/react/src/index.ts b/packages/integrations/react/src/index.ts index 85d79eef8..c20146949 100644 --- a/packages/integrations/react/src/index.ts +++ b/packages/integrations/react/src/index.ts @@ -1,7 +1,13 @@ import react, { type Options as ViteReactPluginOptions } from '@vitejs/plugin-react'; -import type { AstroIntegration, ContainerRenderer } from 'astro'; -import { version as ReactVersion } from 'react-dom'; +import type {AstroIntegration, ContainerRenderer} from 'astro'; import type * as vite from 'vite'; +import { + getReactMajorVersion, + isUnsupportedVersion, + versionsConfig, + type ReactVersionConfig, + type SupportedReactVersion, +} from './version.js'; export type ReactIntegrationOptions = Pick< ViteReactPluginOptions, @@ -12,39 +18,6 @@ export type ReactIntegrationOptions = Pick< const FAST_REFRESH_PREAMBLE = react.preambleCode; -const versionsConfig = { - 17: { - server: '@astrojs/react/server-v17.js', - client: '@astrojs/react/client-v17.js', - externals: ['react-dom/server.js', 'react-dom/client.js'], - }, - 18: { - server: '@astrojs/react/server.js', - client: '@astrojs/react/client.js', - externals: ['react-dom/server', 'react-dom/client'], - }, - 19: { - server: '@astrojs/react/server.js', - client: '@astrojs/react/client.js', - externals: ['react-dom/server', 'react-dom/client'], - }, -}; - -type SupportedReactVersion = keyof typeof versionsConfig; -type ReactVersionConfig = (typeof versionsConfig)[SupportedReactVersion]; - -function getReactMajorVersion(): number { - const matches = /\d+\./.exec(ReactVersion); - if (!matches) { - return NaN; - } - return Number(matches[0]); -} - -function isUnsupportedVersion(majorVersion: number) { - return majorVersion < 17 || majorVersion > 19 || Number.isNaN(majorVersion); -} - function getRenderer(reactConfig: ReactVersionConfig) { return { name: '@astrojs/react', @@ -53,19 +26,6 @@ function getRenderer(reactConfig: ReactVersionConfig) { }; } -export function getContainerRenderer(): ContainerRenderer { - const majorVersion = getReactMajorVersion(); - if (isUnsupportedVersion(majorVersion)) { - throw new Error(`Unsupported React version: ${majorVersion}.`); - } - const versionConfig = versionsConfig[majorVersion as SupportedReactVersion]; - - return { - name: '@astrojs/react', - serverEntrypoint: versionConfig.server, - }; -} - function optionsPlugin(experimentalReactChildren: boolean): vite.Plugin { const virtualModule = 'astro:react:opts'; const virtualModuleId = '\0' + virtualModule; @@ -152,3 +112,16 @@ export default function ({ }, }; } + +export function getContainerRenderer(): ContainerRenderer { + const majorVersion = getReactMajorVersion(); + if (isUnsupportedVersion(majorVersion)) { + throw new Error(`Unsupported React version: ${majorVersion}.`); + } + const versionConfig = versionsConfig[majorVersion as SupportedReactVersion]; + + return { + name: '@astrojs/react', + serverEntrypoint: versionConfig.server, + }; +} diff --git a/packages/integrations/react/src/version.ts b/packages/integrations/react/src/version.ts new file mode 100644 index 000000000..dc3a7a85a --- /dev/null +++ b/packages/integrations/react/src/version.ts @@ -0,0 +1,34 @@ +import { version as ReactVersion } from 'react-dom'; + +export type SupportedReactVersion = keyof typeof versionsConfig; +export type ReactVersionConfig = (typeof versionsConfig)[SupportedReactVersion]; + +export function getReactMajorVersion(): number { + const matches = /\d+\./.exec(ReactVersion); + if (!matches) { + return NaN; + } + return Number(matches[0]); +} + +export function isUnsupportedVersion(majorVersion: number) { + return majorVersion < 17 || majorVersion > 19 || Number.isNaN(majorVersion); +} + +export const versionsConfig = { + 17: { + server: '@astrojs/react/server-v17.js', + client: '@astrojs/react/client-v17.js', + externals: ['react-dom/server.js', 'react-dom/client.js'], + }, + 18: { + server: '@astrojs/react/server.js', + client: '@astrojs/react/client.js', + externals: ['react-dom/server', 'react-dom/client'], + }, + 19: { + server: '@astrojs/react/server.js', + client: '@astrojs/react/client.js', + externals: ['react-dom/server', 'react-dom/client'], + }, +}; |