@@ -274,19 +274,15 @@ function prepareProxy(proxy, appPublicFolder) {
274
274
if ( ! proxy ) {
275
275
return undefined ;
276
276
}
277
- if ( typeof proxy !== 'object' && typeof proxy !== ' string') {
277
+ if ( typeof proxy !== 'string' ) {
278
278
console . log (
279
- chalk . red (
280
- 'When specified, "proxy" in package.json must be a string or an object.'
281
- )
279
+ chalk . red ( 'When specified, "proxy" in package.json must be a string.' )
282
280
) ;
283
281
console . log (
284
282
chalk . red ( 'Instead, the type of "proxy" was "' + typeof proxy + '".' )
285
283
) ;
286
284
console . log (
287
- chalk . red (
288
- 'Either remove "proxy" from package.json, or make it an object.'
289
- )
285
+ chalk . red ( 'Either remove "proxy" from package.json, or make it a string.' )
290
286
) ;
291
287
process . exit ( 1 ) ;
292
288
}
@@ -297,82 +293,42 @@ function prepareProxy(proxy, appPublicFolder) {
297
293
return ! fs . existsSync ( maybePublicPath ) ;
298
294
}
299
295
300
- // Support proxy as a string for those who are using the simple proxy option
301
- if ( typeof proxy === 'string' ) {
302
- if ( ! / ^ h t t p ( s ) ? : \/ \/ / . test ( proxy ) ) {
303
- console . log (
304
- chalk . red (
305
- 'When "proxy" is specified in package.json it must start with either http:// or https://'
306
- )
307
- ) ;
308
- process . exit ( 1 ) ;
309
- }
310
-
311
- let target ;
312
- if ( process . platform === 'win32' ) {
313
- target = resolveLoopback ( proxy ) ;
314
- } else {
315
- target = proxy ;
316
- }
317
- return [
318
- {
319
- target,
320
- logLevel : 'silent' ,
321
- // For single page apps, we generally want to fallback to /index.html.
322
- // However we also want to respect `proxy` for API calls.
323
- // So if `proxy` is specified as a string, we need to decide which fallback to use.
324
- // We use a heuristic: We want to proxy all the requests that are not meant
325
- // for static assets and as all the requests for static assets will be using
326
- // `GET` method, we can proxy all non-`GET` requests.
327
- // For `GET` requests, if request `accept`s text/html, we pick /index.html.
328
- // Modern browsers include text/html into `accept` header when navigating.
329
- // However API calls like `fetch()` won’t generally accept text/html.
330
- // If this heuristic doesn’t work well for you, use a custom `proxy` object.
331
- context : function ( pathname , req ) {
332
- return (
333
- req . method !== 'GET' ||
334
- ( mayProxy ( pathname ) &&
335
- req . headers . accept &&
336
- req . headers . accept . indexOf ( 'text/html' ) === - 1 )
337
- ) ;
338
- } ,
339
- onProxyReq : proxyReq => {
340
- // Browers may send Origin headers even with same-origin
341
- // requests. To prevent CORS issues, we have to change
342
- // the Origin to match the target URL.
343
- if ( proxyReq . getHeader ( 'origin' ) ) {
344
- proxyReq . setHeader ( 'origin' , target ) ;
345
- }
346
- } ,
347
- onError : onProxyError ( target ) ,
348
- secure : false ,
349
- changeOrigin : true ,
350
- ws : true ,
351
- xfwd : true ,
352
- } ,
353
- ] ;
296
+ if ( ! / ^ h t t p ( s ) ? : \/ \/ / . test ( proxy ) ) {
297
+ console . log (
298
+ chalk . red (
299
+ 'When "proxy" is specified in package.json it must start with either http:// or https://'
300
+ )
301
+ ) ;
302
+ process . exit ( 1 ) ;
354
303
}
355
304
356
- // Otherwise, proxy is an object so create an array of proxies to pass to webpackDevServer
357
- return Object . keys ( proxy ) . map ( function ( context ) {
358
- if ( ! proxy [ context ] . hasOwnProperty ( 'target' ) ) {
359
- console . log (
360
- chalk . red (
361
- 'When `proxy` in package.json is as an object, each `context` object must have a ' +
362
- '`target` property specified as a url string'
363
- )
364
- ) ;
365
- process . exit ( 1 ) ;
366
- }
367
- let target ;
368
- if ( process . platform === 'win32' ) {
369
- target = resolveLoopback ( proxy [ context ] . target ) ;
370
- } else {
371
- target = proxy [ context ] . target ;
372
- }
373
- return Object . assign ( { } , proxy [ context ] , {
374
- context : function ( pathname ) {
375
- return mayProxy ( pathname ) && pathname . match ( context ) ;
305
+ let target ;
306
+ if ( process . platform === 'win32' ) {
307
+ target = resolveLoopback ( proxy ) ;
308
+ } else {
309
+ target = proxy ;
310
+ }
311
+ return [
312
+ {
313
+ target,
314
+ logLevel : 'silent' ,
315
+ // For single page apps, we generally want to fallback to /index.html.
316
+ // However we also want to respect `proxy` for API calls.
317
+ // So if `proxy` is specified as a string, we need to decide which fallback to use.
318
+ // We use a heuristic: We want to proxy all the requests that are not meant
319
+ // for static assets and as all the requests for static assets will be using
320
+ // `GET` method, we can proxy all non-`GET` requests.
321
+ // For `GET` requests, if request `accept`s text/html, we pick /index.html.
322
+ // Modern browsers include text/html into `accept` header when navigating.
323
+ // However API calls like `fetch()` won’t generally accept text/html.
324
+ // If this heuristic doesn’t work well for you, use a custom `proxy` object.
325
+ context : function ( pathname , req ) {
326
+ return (
327
+ req . method !== 'GET' ||
328
+ ( mayProxy ( pathname ) &&
329
+ req . headers . accept &&
330
+ req . headers . accept . indexOf ( 'text/html' ) === - 1 )
331
+ ) ;
376
332
} ,
377
333
onProxyReq : proxyReq => {
378
334
// Browers may send Origin headers even with same-origin
@@ -382,10 +338,13 @@ function prepareProxy(proxy, appPublicFolder) {
382
338
proxyReq . setHeader ( 'origin' , target ) ;
383
339
}
384
340
} ,
385
- target,
386
341
onError : onProxyError ( target ) ,
387
- } ) ;
388
- } ) ;
342
+ secure : false ,
343
+ changeOrigin : true ,
344
+ ws : true ,
345
+ xfwd : true ,
346
+ } ,
347
+ ] ;
389
348
}
390
349
391
350
function choosePort ( host , defaultPort ) {
0 commit comments