@@ -141,6 +141,39 @@ export async function loadConfig({
141141 return { content : content as RslibConfig , filePath : configFilePath } ;
142142}
143143
144+ // Match logic is derived from https://github.com/webpack/webpack/blob/94aba382eccf3de1004d235045d4462918dfdbb7/lib/ExternalModuleFactoryPlugin.js#L89-L158
145+ const handleMatchedExternal = (
146+ value : string | string [ ] | boolean | Record < string , string | string [ ] > ,
147+ request : string ,
148+ ) : boolean => {
149+ if ( typeof value === 'boolean' ) {
150+ return value ;
151+ }
152+
153+ if ( typeof value === 'string' ) {
154+ const [ first , second ] = value . split ( ' ' ) ;
155+ const hasType = ! ! second ;
156+ const _request = second ? second : first ;
157+
158+ // Don't need to warn explicit declared external type.
159+ if ( ! hasType ) {
160+ return request === _request ;
161+ }
162+
163+ return false ;
164+ }
165+
166+ if ( Array . isArray ( value ) ) {
167+ return handleMatchedExternal ( value [ 0 ] ?? '' , request ) ;
168+ }
169+
170+ if ( typeof value === 'object' ) {
171+ return false ;
172+ }
173+
174+ return false ;
175+ } ;
176+
144177const composeExternalsWarnConfig = (
145178 format : Format ,
146179 ...externalsArray : NonNullable < EnvironmentConfig [ 'output' ] > [ 'externals' ] [ ]
@@ -163,18 +196,24 @@ const composeExternalsWarnConfig = (
163196 const matchUserExternals = (
164197 externals : NonNullable < EnvironmentConfig [ 'output' ] > [ 'externals' ] ,
165198 request : string ,
166- callback : ( matched ?: true ) => void ,
199+ callback : ( matched : boolean , shouldWarn ?: boolean ) => void ,
167200 ) => {
201+ // string
168202 if ( typeof externals === 'string' ) {
169- if ( externals === request ) {
170- callback ( true ) ;
203+ if ( handleMatchedExternal ( externals , request ) ) {
204+ callback ( true , true ) ;
171205 return ;
172206 }
173- } else if ( Array . isArray ( externals ) ) {
207+ }
208+ // array
209+ if ( Array . isArray ( externals ) ) {
174210 let i = 0 ;
175211 const next = ( ) => {
176212 let asyncFlag : boolean ;
177- const handleExternalsAndCallback = ( matched ?: true ) => {
213+ const handleExternalsAndCallback = (
214+ matched : boolean ,
215+ shouldWarn ?: boolean ,
216+ ) => {
178217 if ( ! matched ) {
179218 if ( asyncFlag ) {
180219 asyncFlag = false ;
@@ -183,13 +222,13 @@ const composeExternalsWarnConfig = (
183222 return next ( ) ;
184223 }
185224
186- callback ( matched ) ;
225+ callback ( matched , shouldWarn ) ;
187226 } ;
188227
189228 do {
190229 asyncFlag = true ;
191230 if ( i >= externals . length ) {
192- return callback ( ) ;
231+ return callback ( false ) ;
193232 }
194233 matchUserExternals (
195234 externals [ i ++ ] ,
@@ -202,37 +241,47 @@ const composeExternalsWarnConfig = (
202241
203242 next ( ) ;
204243 return ;
205- } else if ( externals instanceof RegExp ) {
244+ }
245+ // regexp
246+ if ( externals instanceof RegExp ) {
206247 if ( externals . test ( request ) ) {
207- callback ( true ) ;
248+ callback ( true , true ) ;
208249 return ;
209250 }
210- } else if ( typeof externals === 'function' ) {
251+ }
252+ // function
253+ else if ( typeof externals === 'function' ) {
211254 // TODO: Support function
212- } else if ( typeof externals === 'object' ) {
255+ }
256+ // object
257+ else if ( typeof externals === 'object' ) {
213258 if ( Object . prototype . hasOwnProperty . call ( externals , request ) ) {
214- callback ( true ) ;
259+ if ( handleMatchedExternal ( externals [ request ] ! , request ) ) {
260+ callback ( true , true ) ;
261+ } else {
262+ callback ( true ) ;
263+ }
215264 return ;
216265 }
217266 }
218267
219- callback ( ) ;
268+ callback ( false ) ;
220269 } ;
221270
222271 return {
223272 output : {
224273 externals : [
225274 ( { request, dependencyType, contextInfo } : any , callback : any ) => {
226- let externalized = false ;
227- const _callback = ( matched ?: true ) => {
228- if ( matched ) {
229- externalized = true ;
275+ let shouldWarn = false ;
276+ const _callback = ( _matched : boolean , _shouldWarn ?: boolean ) => {
277+ if ( _shouldWarn ) {
278+ shouldWarn = true ;
230279 }
231280 } ;
232281
233282 if ( contextInfo . issuer && dependencyType === 'commonjs' ) {
234283 matchUserExternals ( externals , request , _callback ) ;
235- if ( externalized ) {
284+ if ( shouldWarn ) {
236285 logger . warn ( composeModuleImportWarn ( request ) ) ;
237286 }
238287 }
@@ -1449,8 +1498,8 @@ async function composeLibRsbuildConfig(
14491498 const dtsConfig = await composeDtsConfig ( config , dtsExtension ) ;
14501499 const externalsWarnConfig = composeExternalsWarnConfig (
14511500 format ! ,
1452- autoExternalConfig ?. output ?. externals ,
14531501 userExternalsConfig ?. output ?. externals ,
1502+ autoExternalConfig ?. output ?. externals ,
14541503 ) ;
14551504 const minifyConfig = composeMinifyConfig ( config ) ;
14561505 const bannerFooterConfig = composeBannerFooterConfig ( banner , footer ) ;
0 commit comments