@@ -11,7 +11,7 @@ import is from '@sindresorhus/is';
11
11
import CacheableLookup from 'cacheable-lookup' ;
12
12
import { Merge } from 'type-fest' ;
13
13
import { UnsupportedProtocolError } from './errors' ;
14
- import knownHookEvents from './known-hook-events' ;
14
+ import knownHookEvents , { InitHook } from './known-hook-events' ;
15
15
import dynamicRequire from './utils/dynamic-require' ;
16
16
import getBodySize from './utils/get-body-size' ;
17
17
import isFormData from './utils/is-form-data' ;
@@ -274,21 +274,39 @@ export const normalizeArguments = (url: URLOrOptions, options?: Options, default
274
274
options = { } ;
275
275
}
276
276
277
- if ( is . urlInstance ( url ) || is . string ( url ) ) {
277
+ const runInitHooks = ( hooks ?: InitHook [ ] , options ?: Options ) : void => {
278
+ if ( hooks ) {
279
+ for ( const hook of hooks ) {
280
+ const result = hook ( options ! ) ;
281
+
282
+ if ( is . promise ( result ) ) {
283
+ throw new TypeError ( 'The `init` hook must be a synchronous function' ) ;
284
+ }
285
+ }
286
+ }
287
+ } ;
288
+
289
+ const hasUrl = is . urlInstance ( url ) || is . string ( url ) ;
290
+ if ( hasUrl ) {
278
291
if ( Reflect . has ( options , 'url' ) ) {
279
292
throw new TypeError ( 'The `url` option cannot be used if the input is a valid URL.' ) ;
280
293
}
281
294
282
295
// @ts -ignore URL is not URL
283
296
options . url = url ;
284
297
285
- options = mergeOptions ( defaults ?. options ?? { } , options ) ;
298
+ runInitHooks ( options . hooks ?. init , options ) ;
299
+ } else if ( Reflect . has ( url as object , 'resolve' ) ) {
300
+ throw new Error ( 'The legacy `url.Url` is deprecated. Use `URL` instead.' ) ;
286
301
} else {
287
- if ( Reflect . has ( url , 'resolve' ) ) {
288
- throw new Error ( 'The legacy `url.Url` is deprecated. Use `URL` instead.' ) ;
289
- }
302
+ runInitHooks ( ( url as Options ) . hooks ?. init , url as Options ) ;
303
+ runInitHooks ( options . hooks ?. init , options ) ;
304
+ }
290
305
291
- options = mergeOptions ( defaults ?. options ?? { } , url , options ) ;
306
+ if ( hasUrl ) {
307
+ options = mergeOptions ( defaults ?. options ?? { } , options ) ;
308
+ } else {
309
+ options = mergeOptions ( defaults ?. options ?? { } , url as object , options ) ;
292
310
}
293
311
294
312
// Normalize URL
@@ -335,14 +353,6 @@ export const normalizeArguments = (url: URLOrOptions, options?: Options, default
335
353
}
336
354
}
337
355
338
- for ( const hook of normalizedOptions . hooks . init ) {
339
- const result = hook ( normalizedOptions ) ;
340
-
341
- if ( is . promise ( result ) ) {
342
- throw new TypeError ( 'The `init` hook must be a synchronous function' ) ;
343
- }
344
- }
345
-
346
356
return normalizedOptions ;
347
357
} ;
348
358
0 commit comments