@@ -12,15 +12,44 @@ export type ReactIntegrationOptions = Pick<
12
12
13
13
const FAST_REFRESH_PREAMBLE = react . preambleCode ;
14
14
15
- function getRenderer ( ) {
15
+ const versionsConfig = {
16
+ 17 : {
17
+ server : '@astrojs/react/server-v17.js' ,
18
+ client : '@astrojs/react/client-v17.js' ,
19
+ externals : [ 'react-dom/server.js' , 'react-dom/client.js' ] ,
20
+ } ,
21
+ 18 : {
22
+ server : '@astrojs/react/server.js' ,
23
+ client : '@astrojs/react/client.js' ,
24
+ externals : [ 'react-dom/server' , 'react-dom/client' ]
25
+ } ,
26
+ 19 : {
27
+ server : '@astrojs/react/server.js' ,
28
+ client : '@astrojs/react/client.js' ,
29
+ externals : [ 'react-dom/server' , 'react-dom/client' ]
30
+ }
31
+ } ;
32
+
33
+ type SupportedReactVersion = keyof ( typeof versionsConfig ) ;
34
+ type ReactVersionConfig = ( typeof versionsConfig ) [ SupportedReactVersion ] ;
35
+
36
+ function getReactMajorVersion ( ) : number {
37
+ const matches = / \d + \. / . exec ( ReactVersion ) ;
38
+ if ( ! matches ) {
39
+ return NaN ;
40
+ }
41
+ return Number ( matches [ 0 ] ) ;
42
+ }
43
+
44
+ function isUnsupportedVersion ( majorVersion : number ) {
45
+ return majorVersion < 17 || majorVersion > 19 || Number . isNaN ( majorVersion ) ;
46
+ }
47
+
48
+ function getRenderer ( reactConfig : ReactVersionConfig ) {
16
49
return {
17
50
name : '@astrojs/react' ,
18
- clientEntrypoint : ReactVersion . startsWith ( '18.' )
19
- ? '@astrojs/react/client.js'
20
- : '@astrojs/react/client-v17.js' ,
21
- serverEntrypoint : ReactVersion . startsWith ( '18.' )
22
- ? '@astrojs/react/server.js'
23
- : '@astrojs/react/server-v17.js' ,
51
+ clientEntrypoint : reactConfig . client ,
52
+ serverEntrypoint : reactConfig . server ,
24
53
} ;
25
54
}
26
55
@@ -51,32 +80,26 @@ function getViteConfiguration({
51
80
exclude,
52
81
babel,
53
82
experimentalReactChildren,
54
- } : ReactIntegrationOptions = { } ) {
83
+ } : ReactIntegrationOptions = { } , reactConfig : ReactVersionConfig ) {
55
84
return {
56
85
optimizeDeps : {
57
86
include : [
58
- ReactVersion . startsWith ( '18.' )
59
- ? '@astrojs/react/client.js'
60
- : '@astrojs/react/client-v17.js' ,
87
+ reactConfig . client ,
61
88
'react' ,
62
89
'react/jsx-runtime' ,
63
90
'react/jsx-dev-runtime' ,
64
91
'react-dom' ,
65
92
] ,
66
93
exclude : [
67
- ReactVersion . startsWith ( '18.' )
68
- ? '@astrojs/react/server.js'
69
- : '@astrojs/react/server-v17.js' ,
94
+ reactConfig . server ,
70
95
] ,
71
96
} ,
72
97
plugins : [ react ( { include, exclude, babel } ) , optionsPlugin ( ! ! experimentalReactChildren ) ] ,
73
98
resolve : {
74
99
dedupe : [ 'react' , 'react-dom' , 'react-dom/server' ] ,
75
100
} ,
76
101
ssr : {
77
- external : ReactVersion . startsWith ( '18.' )
78
- ? [ 'react-dom/server' , 'react-dom/client' ]
79
- : [ 'react-dom/server.js' , 'react-dom/client.js' ] ,
102
+ external : reactConfig . externals ,
80
103
noExternal : [
81
104
// These are all needed to get mui to work.
82
105
'@mui/material' ,
@@ -95,13 +118,19 @@ export default function ({
95
118
babel,
96
119
experimentalReactChildren,
97
120
} : ReactIntegrationOptions = { } ) : AstroIntegration {
121
+ const majorVersion = getReactMajorVersion ( ) ;
122
+ if ( isUnsupportedVersion ( majorVersion ) ) {
123
+ throw new Error ( `Unsupported React version: ${ majorVersion } .` ) ;
124
+ }
125
+ const versionConfig = versionsConfig [ majorVersion as SupportedReactVersion ] ;
126
+
98
127
return {
99
128
name : '@astrojs/react' ,
100
129
hooks : {
101
130
'astro:config:setup' : ( { command, addRenderer, updateConfig, injectScript } ) => {
102
- addRenderer ( getRenderer ( ) ) ;
131
+ addRenderer ( getRenderer ( versionConfig ) ) ;
103
132
updateConfig ( {
104
- vite : getViteConfiguration ( { include, exclude, babel, experimentalReactChildren } ) ,
133
+ vite : getViteConfiguration ( { include, exclude, babel, experimentalReactChildren } , versionConfig ) ,
105
134
} ) ;
106
135
if ( command === 'dev' ) {
107
136
const preamble = FAST_REFRESH_PREAMBLE . replace ( `__BASE__` , '/' ) ;
0 commit comments