@@ -107,38 +107,66 @@ export function shouldExternalizeForSSR(
107
107
108
108
export function createIsConfiguredAsSsrExternal (
109
109
config : ResolvedConfig
110
- ) : ( id : string ) => boolean | undefined {
111
- const { ssr } = config
110
+ ) : ( id : string ) => boolean {
111
+ const { ssr, root } = config
112
112
const noExternal = ssr ?. noExternal
113
113
const noExternalFilter =
114
114
noExternal !== 'undefined' &&
115
115
typeof noExternal !== 'boolean' &&
116
116
createFilter ( undefined , noExternal , { resolve : false } )
117
117
118
+ const resolveOptions : InternalResolveOptions = {
119
+ root,
120
+ preserveSymlinks : config . resolve . preserveSymlinks ,
121
+ isProduction : false ,
122
+ isBuild : true
123
+ }
124
+
125
+ const isExternalizable = (
126
+ id : string ,
127
+ configuredAsExternal ?: boolean
128
+ ) : boolean => {
129
+ if ( ! bareImportRE . test ( id ) || id . includes ( '\0' ) ) {
130
+ return false
131
+ }
132
+ return ! ! tryNodeResolve (
133
+ id ,
134
+ undefined ,
135
+ resolveOptions ,
136
+ ssr ?. target === 'webworker' ,
137
+ undefined ,
138
+ true ,
139
+ // try to externalize, will return undefined or an object without
140
+ // a external flag if it isn't externalizable
141
+ true ,
142
+ // Allow linked packages to be externalized if they are explicitly
143
+ // configured as external
144
+ ! ! configuredAsExternal
145
+ ) ?. external
146
+ }
147
+
118
148
// Returns true if it is configured as external, false if it is filtered
119
149
// by noExternal and undefined if it isn't affected by the explicit config
120
150
return ( id : string ) => {
121
151
const { ssr } = config
122
152
if ( ssr ) {
123
- const pkgName = getNpmPackageName ( id )
124
- if ( ! pkgName ) {
125
- return undefined
126
- }
127
153
if (
128
154
// If this id is defined as external, force it as external
129
155
// Note that individual package entries are allowed in ssr.external
130
156
ssr . external ?. includes ( id )
131
157
) {
132
158
return true
133
159
}
160
+ const pkgName = getNpmPackageName ( id )
161
+ if ( ! pkgName ) {
162
+ return isExternalizable ( id )
163
+ }
134
164
if (
135
- // A package name in ssr.external externalizes every entry
165
+ // A package name in ssr.external externalizes every
166
+ // externalizable package entry
136
167
ssr . external ?. includes ( pkgName )
137
168
) {
138
- // Return undefined here to avoid short-circuiting the isExternalizable check,
139
- // that will filter this id out if it is not externalizable (e.g. a CSS file)
140
- // We return here to make ssr.external take precedence over noExternal
141
- return undefined
169
+ return isExternalizable ( id , true )
142
170
}
143
171
if ( typeof noExternal === 'boolean' ) {
144
172
return ! noExternal
@@ -147,7 +175,7 @@ export function createIsConfiguredAsSsrExternal(
147
175
return false
148
176
}
149
177
}
150
- return undefined
178
+ return isExternalizable ( id )
151
179
}
152
180
}
153
181
@@ -156,40 +184,15 @@ function createIsSsrExternal(
156
184
) : ( id : string ) => boolean | undefined {
157
185
const processedIds = new Map < string , boolean | undefined > ( )
158
186
159
- const { ssr, root } = config
160
-
161
187
const isConfiguredAsExternal = createIsConfiguredAsSsrExternal ( config )
162
188
163
- const resolveOptions : InternalResolveOptions = {
164
- root,
165
- preserveSymlinks : config . resolve . preserveSymlinks ,
166
- isProduction : false ,
167
- isBuild : true
168
- }
169
-
170
- const isExternalizable = ( id : string ) => {
171
- if ( ! bareImportRE . test ( id ) || id . includes ( '\0' ) ) {
172
- return false
173
- }
174
- return ! ! tryNodeResolve (
175
- id ,
176
- undefined ,
177
- resolveOptions ,
178
- ssr ?. target === 'webworker' ,
179
- undefined ,
180
- true ,
181
- true // try to externalize, will return undefined if not possible
182
- )
183
- }
184
-
185
189
return ( id : string ) => {
186
190
if ( processedIds . has ( id ) ) {
187
191
return processedIds . get ( id )
188
192
}
189
193
let external = false
190
194
if ( ! id . startsWith ( '.' ) && ! path . isAbsolute ( id ) ) {
191
- external =
192
- isBuiltin ( id ) || ( isConfiguredAsExternal ( id ) ?? isExternalizable ( id ) )
195
+ external = isBuiltin ( id ) || isConfiguredAsExternal ( id )
193
196
}
194
197
processedIds . set ( id , external )
195
198
return external
0 commit comments