4
4
resolveRequests ,
5
5
normalizeUrl ,
6
6
requestify ,
7
- isUrlRequestable ,
8
- isDataUrl ,
7
+ isURLRequestable ,
9
8
WEBPACK_IGNORE_COMMENT_REGEXP ,
10
9
} from "../utils" ;
11
10
@@ -48,30 +47,16 @@ function getWebpackIgnoreCommentValue(index, nodes, inBetween) {
48
47
return matched && matched [ 2 ] === "true" ;
49
48
}
50
49
51
- function shouldHandleURL ( url , declaration , result , options = { } ) {
50
+ function shouldHandleURL ( url , declaration , result , options ) {
52
51
if ( url . length === 0 ) {
53
52
result . warn ( `Unable to find uri in '${ declaration . toString ( ) } '` , {
54
53
node : declaration ,
55
54
} ) ;
56
55
57
- return false ;
56
+ return { requestable : false , needResolve : false } ;
58
57
}
59
58
60
- if ( isDataUrl ( url ) && options . isSupportDataURL ) {
61
- try {
62
- decodeURIComponent ( url ) ;
63
- } catch ( ignoreError ) {
64
- return false ;
65
- }
66
-
67
- return true ;
68
- }
69
-
70
- if ( ! isUrlRequestable ( url , options . isSupportAbsoluteURL ) ) {
71
- return false ;
72
- }
73
-
74
- return true ;
59
+ return isURLRequestable ( url , options ) ;
75
60
}
76
61
77
62
function parseDeclaration ( declaration , key , result , options ) {
@@ -138,15 +123,24 @@ function parseDeclaration(declaration, key, result, options) {
138
123
const { nodes } = valueNode ;
139
124
const isStringValue = nodes . length !== 0 && nodes [ 0 ] . type === "string" ;
140
125
let url = isStringValue ? nodes [ 0 ] . value : valueParser . stringify ( nodes ) ;
126
+
141
127
url = normalizeUrl ( url , isStringValue ) ;
142
128
129
+ const { requestable, needResolve } = shouldHandleURL (
130
+ url ,
131
+ declaration ,
132
+ result ,
133
+ options
134
+ ) ;
135
+
143
136
// Do not traverse inside `url`
144
- if ( ! shouldHandleURL ( url , declaration , result , options ) ) {
137
+ if ( ! requestable ) {
145
138
// eslint-disable-next-line consistent-return
146
139
return false ;
147
140
}
148
141
149
142
const queryParts = url . split ( "!" ) ;
143
+
150
144
let prefix ;
151
145
152
146
if ( queryParts . length > 1 ) {
@@ -161,6 +155,7 @@ function parseDeclaration(declaration, key, result, options) {
161
155
prefix,
162
156
url,
163
157
needQuotes : false ,
158
+ needResolve,
164
159
} ) ;
165
160
166
161
// eslint-disable-next-line consistent-return
@@ -194,15 +189,24 @@ function parseDeclaration(declaration, key, result, options) {
194
189
let url = isStringValue
195
190
? nodes [ 0 ] . value
196
191
: valueParser . stringify ( nodes ) ;
192
+
197
193
url = normalizeUrl ( url , isStringValue ) ;
198
194
195
+ const { requestable, needResolve } = shouldHandleURL (
196
+ url ,
197
+ declaration ,
198
+ result ,
199
+ options
200
+ ) ;
201
+
199
202
// Do not traverse inside `url`
200
- if ( ! shouldHandleURL ( url , declaration , result , options ) ) {
203
+ if ( ! requestable ) {
201
204
// eslint-disable-next-line consistent-return
202
205
return false ;
203
206
}
204
207
205
208
const queryParts = url . split ( "!" ) ;
209
+
206
210
let prefix ;
207
211
208
212
if ( queryParts . length > 1 ) {
@@ -217,6 +221,7 @@ function parseDeclaration(declaration, key, result, options) {
217
221
prefix,
218
222
url,
219
223
needQuotes : false ,
224
+ needResolve,
220
225
} ) ;
221
226
} else if ( type === "string" ) {
222
227
needIgnore = getWebpackIgnoreCommentValue (
@@ -239,13 +244,21 @@ function parseDeclaration(declaration, key, result, options) {
239
244
240
245
let url = normalizeUrl ( value , true ) ;
241
246
247
+ const { requestable, needResolve } = shouldHandleURL (
248
+ url ,
249
+ declaration ,
250
+ result ,
251
+ options
252
+ ) ;
253
+
242
254
// Do not traverse inside `url`
243
- if ( ! shouldHandleURL ( url , declaration , result , options ) ) {
255
+ if ( ! requestable ) {
244
256
// eslint-disable-next-line consistent-return
245
257
return false ;
246
258
}
247
259
248
260
const queryParts = url . split ( "!" ) ;
261
+
249
262
let prefix ;
250
263
251
264
if ( queryParts . length > 1 ) {
@@ -260,6 +273,7 @@ function parseDeclaration(declaration, key, result, options) {
260
273
prefix,
261
274
url,
262
275
needQuotes : true ,
276
+ needResolve,
263
277
} ) ;
264
278
}
265
279
}
@@ -301,7 +315,7 @@ const plugin = (options = {}) => {
301
315
302
316
const resolvedDeclarations = await Promise . all (
303
317
parsedDeclarations . map ( async ( parsedDeclaration ) => {
304
- const { url } = parsedDeclaration ;
318
+ const { url, needResolve } = parsedDeclaration ;
305
319
306
320
if ( options . filter ) {
307
321
const needKeep = await options . filter ( url ) ;
@@ -312,7 +326,7 @@ const plugin = (options = {}) => {
312
326
}
313
327
}
314
328
315
- if ( isDataUrl ( url ) ) {
329
+ if ( ! needResolve ) {
316
330
// eslint-disable-next-line consistent-return
317
331
return parsedDeclaration ;
318
332
}
@@ -323,30 +337,31 @@ const plugin = (options = {}) => {
323
337
let hash = query ? "?" : "" ;
324
338
hash += hashOrQuery ? `#${ hashOrQuery } ` : "" ;
325
339
326
- const { needToResolveURL , rootContext } = options ;
340
+ const { resolver , rootContext } = options ;
327
341
const request = requestify (
328
342
pathname ,
329
343
rootContext ,
330
- needToResolveURL
344
+ Boolean ( resolver )
331
345
) ;
332
346
333
- if ( ! needToResolveURL ) {
347
+ if ( ! resolver ) {
334
348
// eslint-disable-next-line consistent-return
335
349
return { ...parsedDeclaration , url : request , hash } ;
336
350
}
337
351
338
- const { resolver, context } = options ;
339
- const resolvedUrl = await resolveRequests ( resolver , context , [
340
- ...new Set ( [ request , url ] ) ,
341
- ] ) ;
352
+ const resolvedURL = await resolveRequests (
353
+ resolver ,
354
+ options . context ,
355
+ [ ...new Set ( [ request , url ] ) ]
356
+ ) ;
342
357
343
- if ( ! resolvedUrl ) {
358
+ if ( ! resolvedURL ) {
344
359
// eslint-disable-next-line consistent-return
345
360
return ;
346
361
}
347
362
348
363
// eslint-disable-next-line consistent-return
349
- return { ...parsedDeclaration , url : resolvedUrl , hash } ;
364
+ return { ...parsedDeclaration , url : resolvedURL , hash } ;
350
365
} )
351
366
) ;
352
367
@@ -391,7 +406,7 @@ const plugin = (options = {}) => {
391
406
options . imports . push ( {
392
407
type : "url" ,
393
408
importName,
394
- url : options . needToResolveURL
409
+ url : options . resolver
395
410
? options . urlHandler ( newUrl )
396
411
: JSON . stringify ( newUrl ) ,
397
412
index,
0 commit comments