@mswjs/interceptors 0.24.1 → 0.25.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (28) hide show
  1. package/lib/browser/{chunk-BRIUGDYQ.mjs → chunk-ANLPTCZ5.mjs} +7 -0
  2. package/lib/browser/{chunk-XAQQ5IUC.js → chunk-DBFLI5DJ.js} +12 -4
  3. package/lib/browser/{chunk-Y4XXQXAW.js → chunk-OSIUQA4X.js} +7 -0
  4. package/lib/browser/{chunk-KSCN3JS4.mjs → chunk-VMXB5F2J.mjs} +12 -4
  5. package/lib/browser/interceptors/XMLHttpRequest/index.js +2 -2
  6. package/lib/browser/interceptors/XMLHttpRequest/index.mjs +1 -1
  7. package/lib/browser/interceptors/fetch/index.js +2 -2
  8. package/lib/browser/interceptors/fetch/index.mjs +1 -1
  9. package/lib/browser/presets/browser.js +4 -4
  10. package/lib/browser/presets/browser.mjs +2 -2
  11. package/lib/node/RemoteHttpInterceptor.js +4 -4
  12. package/lib/node/RemoteHttpInterceptor.mjs +2 -2
  13. package/lib/node/{chunk-OOSIWXHX.js → chunk-3MYUI4B2.js} +9 -1
  14. package/lib/node/{chunk-NM5BWVVB.js → chunk-E6YC337Q.js} +7 -0
  15. package/lib/node/{chunk-SOWOSKLO.mjs → chunk-HSCXCLVT.mjs} +7 -0
  16. package/lib/node/{chunk-PSIO3L7D.mjs → chunk-OL7OR4RL.mjs} +9 -1
  17. package/lib/node/interceptors/ClientRequest/index.js +2 -2
  18. package/lib/node/interceptors/ClientRequest/index.mjs +1 -1
  19. package/lib/node/interceptors/XMLHttpRequest/index.js +2 -2
  20. package/lib/node/interceptors/XMLHttpRequest/index.mjs +1 -1
  21. package/lib/node/interceptors/fetch/index.js +12 -4
  22. package/lib/node/interceptors/fetch/index.mjs +12 -4
  23. package/lib/node/presets/node.js +4 -4
  24. package/lib/node/presets/node.mjs +2 -2
  25. package/package.json +2 -2
  26. package/src/interceptors/ClientRequest/NodeClientRequest.ts +18 -1
  27. package/src/interceptors/XMLHttpRequest/XMLHttpRequestProxy.ts +9 -0
  28. package/src/interceptors/fetch/index.ts +25 -5
@@ -694,6 +694,13 @@ function createXMLHttpRequestProxy({
694
694
  mockedResponse.status,
695
695
  mockedResponse.statusText
696
696
  );
697
+ if (mockedResponse.type === "error") {
698
+ this.logger.info(
699
+ "received a network error response, rejecting the request promise..."
700
+ );
701
+ requestController.errorWith(new TypeError("Network error"));
702
+ return;
703
+ }
697
704
  return requestController.respondWith(mockedResponse);
698
705
  }
699
706
  this.logger.info(
@@ -65,14 +65,17 @@ var _FetchInterceptor = class extends _chunk4CFMDU7Zjs.Interceptor {
65
65
  return Promise.reject(requestAborted.rejectionReason);
66
66
  }
67
67
  if (resolverResult.error) {
68
- const error = Object.assign(new TypeError("Failed to fetch"), {
69
- cause: resolverResult.error
70
- });
71
- return Promise.reject(error);
68
+ return Promise.reject(createNetworkError(resolverResult.error));
72
69
  }
73
70
  const mockedResponse = resolverResult.data;
74
71
  if (mockedResponse && !((_a = request.signal) == null ? void 0 : _a.aborted)) {
75
72
  this.logger.info("received mocked response:", mockedResponse);
73
+ if (mockedResponse.type === "error") {
74
+ this.logger.info(
75
+ "received a network error response, rejecting the request promise..."
76
+ );
77
+ return Promise.reject(createNetworkError(mockedResponse));
78
+ }
76
79
  const responseClone = mockedResponse.clone();
77
80
  this.emitter.emit("response", {
78
81
  response: responseClone,
@@ -121,6 +124,11 @@ var _FetchInterceptor = class extends _chunk4CFMDU7Zjs.Interceptor {
121
124
  };
122
125
  var FetchInterceptor = _FetchInterceptor;
123
126
  FetchInterceptor.symbol = Symbol("fetch");
127
+ function createNetworkError(cause) {
128
+ return Object.assign(new TypeError("Failed to fetch"), {
129
+ cause
130
+ });
131
+ }
124
132
 
125
133
 
126
134
 
@@ -694,6 +694,13 @@ function createXMLHttpRequestProxy({
694
694
  mockedResponse.status,
695
695
  mockedResponse.statusText
696
696
  );
697
+ if (mockedResponse.type === "error") {
698
+ this.logger.info(
699
+ "received a network error response, rejecting the request promise..."
700
+ );
701
+ requestController.errorWith(new TypeError("Network error"));
702
+ return;
703
+ }
697
704
  return requestController.respondWith(mockedResponse);
698
705
  }
699
706
  this.logger.info(
@@ -65,14 +65,17 @@ var _FetchInterceptor = class extends Interceptor {
65
65
  return Promise.reject(requestAborted.rejectionReason);
66
66
  }
67
67
  if (resolverResult.error) {
68
- const error = Object.assign(new TypeError("Failed to fetch"), {
69
- cause: resolverResult.error
70
- });
71
- return Promise.reject(error);
68
+ return Promise.reject(createNetworkError(resolverResult.error));
72
69
  }
73
70
  const mockedResponse = resolverResult.data;
74
71
  if (mockedResponse && !((_a = request.signal) == null ? void 0 : _a.aborted)) {
75
72
  this.logger.info("received mocked response:", mockedResponse);
73
+ if (mockedResponse.type === "error") {
74
+ this.logger.info(
75
+ "received a network error response, rejecting the request promise..."
76
+ );
77
+ return Promise.reject(createNetworkError(mockedResponse));
78
+ }
76
79
  const responseClone = mockedResponse.clone();
77
80
  this.emitter.emit("response", {
78
81
  response: responseClone,
@@ -121,6 +124,11 @@ var _FetchInterceptor = class extends Interceptor {
121
124
  };
122
125
  var FetchInterceptor = _FetchInterceptor;
123
126
  FetchInterceptor.symbol = Symbol("fetch");
127
+ function createNetworkError(cause) {
128
+ return Object.assign(new TypeError("Failed to fetch"), {
129
+ cause
130
+ });
131
+ }
124
132
 
125
133
  export {
126
134
  FetchInterceptor
@@ -1,9 +1,9 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true});
2
2
 
3
- var _chunkY4XXQXAWjs = require('../../chunk-Y4XXQXAW.js');
3
+ var _chunkOSIUQA4Xjs = require('../../chunk-OSIUQA4X.js');
4
4
  require('../../chunk-3LFH2WCF.js');
5
5
  require('../../chunk-PCFJD76X.js');
6
6
  require('../../chunk-4CFMDU7Z.js');
7
7
 
8
8
 
9
- exports.XMLHttpRequestInterceptor = _chunkY4XXQXAWjs.XMLHttpRequestInterceptor;
9
+ exports.XMLHttpRequestInterceptor = _chunkOSIUQA4Xjs.XMLHttpRequestInterceptor;
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  XMLHttpRequestInterceptor
3
- } from "../../chunk-BRIUGDYQ.mjs";
3
+ } from "../../chunk-ANLPTCZ5.mjs";
4
4
  import "../../chunk-7II4SWKS.mjs";
5
5
  import "../../chunk-RT3ATOJH.mjs";
6
6
  import "../../chunk-GXJLJMOT.mjs";
@@ -1,8 +1,8 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true});
2
2
 
3
- var _chunkXAQQ5IUCjs = require('../../chunk-XAQQ5IUC.js');
3
+ var _chunkDBFLI5DJjs = require('../../chunk-DBFLI5DJ.js');
4
4
  require('../../chunk-PCFJD76X.js');
5
5
  require('../../chunk-4CFMDU7Z.js');
6
6
 
7
7
 
8
- exports.FetchInterceptor = _chunkXAQQ5IUCjs.FetchInterceptor;
8
+ exports.FetchInterceptor = _chunkDBFLI5DJjs.FetchInterceptor;
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  FetchInterceptor
3
- } from "../../chunk-KSCN3JS4.mjs";
3
+ } from "../../chunk-VMXB5F2J.mjs";
4
4
  import "../../chunk-RT3ATOJH.mjs";
5
5
  import "../../chunk-GXJLJMOT.mjs";
6
6
  export {
@@ -1,17 +1,17 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true});
2
2
 
3
- var _chunkY4XXQXAWjs = require('../chunk-Y4XXQXAW.js');
3
+ var _chunkOSIUQA4Xjs = require('../chunk-OSIUQA4X.js');
4
4
  require('../chunk-3LFH2WCF.js');
5
5
 
6
6
 
7
- var _chunkXAQQ5IUCjs = require('../chunk-XAQQ5IUC.js');
7
+ var _chunkDBFLI5DJjs = require('../chunk-DBFLI5DJ.js');
8
8
  require('../chunk-PCFJD76X.js');
9
9
  require('../chunk-4CFMDU7Z.js');
10
10
 
11
11
  // src/presets/browser.ts
12
12
  var browser_default = [
13
- new (0, _chunkXAQQ5IUCjs.FetchInterceptor)(),
14
- new (0, _chunkY4XXQXAWjs.XMLHttpRequestInterceptor)()
13
+ new (0, _chunkDBFLI5DJjs.FetchInterceptor)(),
14
+ new (0, _chunkOSIUQA4Xjs.XMLHttpRequestInterceptor)()
15
15
  ];
16
16
 
17
17
 
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  XMLHttpRequestInterceptor
3
- } from "../chunk-BRIUGDYQ.mjs";
3
+ } from "../chunk-ANLPTCZ5.mjs";
4
4
  import "../chunk-7II4SWKS.mjs";
5
5
  import {
6
6
  FetchInterceptor
7
- } from "../chunk-KSCN3JS4.mjs";
7
+ } from "../chunk-VMXB5F2J.mjs";
8
8
  import "../chunk-RT3ATOJH.mjs";
9
9
  import "../chunk-GXJLJMOT.mjs";
10
10
 
@@ -3,10 +3,10 @@
3
3
  var _chunkMVPEJK4Vjs = require('./chunk-MVPEJK4V.js');
4
4
 
5
5
 
6
- var _chunkOOSIWXHXjs = require('./chunk-OOSIWXHX.js');
6
+ var _chunk3MYUI4B2js = require('./chunk-3MYUI4B2.js');
7
7
 
8
8
 
9
- var _chunkNM5BWVVBjs = require('./chunk-NM5BWVVB.js');
9
+ var _chunkE6YC337Qjs = require('./chunk-E6YC337Q.js');
10
10
  require('./chunk-3LFH2WCF.js');
11
11
  require('./chunk-VQ4DZOBB.js');
12
12
 
@@ -22,8 +22,8 @@ var RemoteHttpInterceptor = class extends _chunkMVPEJK4Vjs.BatchInterceptor {
22
22
  super({
23
23
  name: "remote-interceptor",
24
24
  interceptors: [
25
- new (0, _chunkOOSIWXHXjs.ClientRequestInterceptor)(),
26
- new (0, _chunkNM5BWVVBjs.XMLHttpRequestInterceptor)()
25
+ new (0, _chunk3MYUI4B2js.ClientRequestInterceptor)(),
26
+ new (0, _chunkE6YC337Qjs.XMLHttpRequestInterceptor)()
27
27
  ]
28
28
  });
29
29
  }
@@ -3,10 +3,10 @@ import {
3
3
  } from "./chunk-VS3GJPUE.mjs";
4
4
  import {
5
5
  ClientRequestInterceptor
6
- } from "./chunk-PSIO3L7D.mjs";
6
+ } from "./chunk-OL7OR4RL.mjs";
7
7
  import {
8
8
  XMLHttpRequestInterceptor
9
- } from "./chunk-SOWOSKLO.mjs";
9
+ } from "./chunk-HSCXCLVT.mjs";
10
10
  import "./chunk-7II4SWKS.mjs";
11
11
  import "./chunk-GFH37L5D.mjs";
12
12
  import {
@@ -249,8 +249,16 @@ var _NodeClientRequest = class extends _http.ClientRequest {
249
249
  }
250
250
  const mockedResponse = resolverResult.data;
251
251
  if (mockedResponse) {
252
- const responseClone = mockedResponse.clone();
253
252
  this.logger.info("received mocked response:", mockedResponse);
253
+ if (mockedResponse.type === "error") {
254
+ this.logger.info(
255
+ "received network error response, aborting request..."
256
+ );
257
+ this.emit("error", new TypeError("Network error"));
258
+ this.terminate();
259
+ return this;
260
+ }
261
+ const responseClone = mockedResponse.clone();
254
262
  this.responseSource = "mock";
255
263
  this.respondWith(mockedResponse);
256
264
  this.logger.info(
@@ -696,6 +696,13 @@ function createXMLHttpRequestProxy({
696
696
  mockedResponse.status,
697
697
  mockedResponse.statusText
698
698
  );
699
+ if (mockedResponse.type === "error") {
700
+ this.logger.info(
701
+ "received a network error response, rejecting the request promise..."
702
+ );
703
+ requestController.errorWith(new TypeError("Network error"));
704
+ return;
705
+ }
699
706
  return requestController.respondWith(mockedResponse);
700
707
  }
701
708
  this.logger.info(
@@ -696,6 +696,13 @@ function createXMLHttpRequestProxy({
696
696
  mockedResponse.status,
697
697
  mockedResponse.statusText
698
698
  );
699
+ if (mockedResponse.type === "error") {
700
+ this.logger.info(
701
+ "received a network error response, rejecting the request promise..."
702
+ );
703
+ requestController.errorWith(new TypeError("Network error"));
704
+ return;
705
+ }
699
706
  return requestController.respondWith(mockedResponse);
700
707
  }
701
708
  this.logger.info(
@@ -249,8 +249,16 @@ var _NodeClientRequest = class extends ClientRequest {
249
249
  }
250
250
  const mockedResponse = resolverResult.data;
251
251
  if (mockedResponse) {
252
- const responseClone = mockedResponse.clone();
253
252
  this.logger.info("received mocked response:", mockedResponse);
253
+ if (mockedResponse.type === "error") {
254
+ this.logger.info(
255
+ "received network error response, aborting request..."
256
+ );
257
+ this.emit("error", new TypeError("Network error"));
258
+ this.terminate();
259
+ return this;
260
+ }
261
+ const responseClone = mockedResponse.clone();
254
262
  this.responseSource = "mock";
255
263
  this.respondWith(mockedResponse);
256
264
  this.logger.info(
@@ -1,8 +1,8 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true});
2
2
 
3
- var _chunkOOSIWXHXjs = require('../../chunk-OOSIWXHX.js');
3
+ var _chunk3MYUI4B2js = require('../../chunk-3MYUI4B2.js');
4
4
  require('../../chunk-ZJOF5MEZ.js');
5
5
  require('../../chunk-XYZRP5S2.js');
6
6
 
7
7
 
8
- exports.ClientRequestInterceptor = _chunkOOSIWXHXjs.ClientRequestInterceptor;
8
+ exports.ClientRequestInterceptor = _chunk3MYUI4B2js.ClientRequestInterceptor;
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  ClientRequestInterceptor
3
- } from "../../chunk-PSIO3L7D.mjs";
3
+ } from "../../chunk-OL7OR4RL.mjs";
4
4
  import "../../chunk-STA6QBYM.mjs";
5
5
  import "../../chunk-RGYCLCLK.mjs";
6
6
  export {
@@ -1,10 +1,10 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true});
2
2
 
3
- var _chunkNM5BWVVBjs = require('../../chunk-NM5BWVVB.js');
3
+ var _chunkE6YC337Qjs = require('../../chunk-E6YC337Q.js');
4
4
  require('../../chunk-3LFH2WCF.js');
5
5
  require('../../chunk-VQ4DZOBB.js');
6
6
  require('../../chunk-ZJOF5MEZ.js');
7
7
  require('../../chunk-XYZRP5S2.js');
8
8
 
9
9
 
10
- exports.XMLHttpRequestInterceptor = _chunkNM5BWVVBjs.XMLHttpRequestInterceptor;
10
+ exports.XMLHttpRequestInterceptor = _chunkE6YC337Qjs.XMLHttpRequestInterceptor;
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  XMLHttpRequestInterceptor
3
- } from "../../chunk-SOWOSKLO.mjs";
3
+ } from "../../chunk-HSCXCLVT.mjs";
4
4
  import "../../chunk-7II4SWKS.mjs";
5
5
  import "../../chunk-GFH37L5D.mjs";
6
6
  import "../../chunk-STA6QBYM.mjs";
@@ -67,14 +67,17 @@ var _FetchInterceptor = class extends _chunkXYZRP5S2js.Interceptor {
67
67
  return Promise.reject(requestAborted.rejectionReason);
68
68
  }
69
69
  if (resolverResult.error) {
70
- const error = Object.assign(new TypeError("Failed to fetch"), {
71
- cause: resolverResult.error
72
- });
73
- return Promise.reject(error);
70
+ return Promise.reject(createNetworkError(resolverResult.error));
74
71
  }
75
72
  const mockedResponse = resolverResult.data;
76
73
  if (mockedResponse && !((_a = request.signal) == null ? void 0 : _a.aborted)) {
77
74
  this.logger.info("received mocked response:", mockedResponse);
75
+ if (mockedResponse.type === "error") {
76
+ this.logger.info(
77
+ "received a network error response, rejecting the request promise..."
78
+ );
79
+ return Promise.reject(createNetworkError(mockedResponse));
80
+ }
78
81
  const responseClone = mockedResponse.clone();
79
82
  this.emitter.emit("response", {
80
83
  response: responseClone,
@@ -123,6 +126,11 @@ var _FetchInterceptor = class extends _chunkXYZRP5S2js.Interceptor {
123
126
  };
124
127
  var FetchInterceptor = _FetchInterceptor;
125
128
  FetchInterceptor.symbol = Symbol("fetch");
129
+ function createNetworkError(cause) {
130
+ return Object.assign(new TypeError("Failed to fetch"), {
131
+ cause
132
+ });
133
+ }
126
134
 
127
135
 
128
136
  exports.FetchInterceptor = FetchInterceptor;
@@ -67,14 +67,17 @@ var _FetchInterceptor = class extends Interceptor {
67
67
  return Promise.reject(requestAborted.rejectionReason);
68
68
  }
69
69
  if (resolverResult.error) {
70
- const error = Object.assign(new TypeError("Failed to fetch"), {
71
- cause: resolverResult.error
72
- });
73
- return Promise.reject(error);
70
+ return Promise.reject(createNetworkError(resolverResult.error));
74
71
  }
75
72
  const mockedResponse = resolverResult.data;
76
73
  if (mockedResponse && !((_a = request.signal) == null ? void 0 : _a.aborted)) {
77
74
  this.logger.info("received mocked response:", mockedResponse);
75
+ if (mockedResponse.type === "error") {
76
+ this.logger.info(
77
+ "received a network error response, rejecting the request promise..."
78
+ );
79
+ return Promise.reject(createNetworkError(mockedResponse));
80
+ }
78
81
  const responseClone = mockedResponse.clone();
79
82
  this.emitter.emit("response", {
80
83
  response: responseClone,
@@ -123,6 +126,11 @@ var _FetchInterceptor = class extends Interceptor {
123
126
  };
124
127
  var FetchInterceptor = _FetchInterceptor;
125
128
  FetchInterceptor.symbol = Symbol("fetch");
129
+ function createNetworkError(cause) {
130
+ return Object.assign(new TypeError("Failed to fetch"), {
131
+ cause
132
+ });
133
+ }
126
134
  export {
127
135
  FetchInterceptor
128
136
  };
@@ -1,9 +1,9 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true});
2
2
 
3
- var _chunkOOSIWXHXjs = require('../chunk-OOSIWXHX.js');
3
+ var _chunk3MYUI4B2js = require('../chunk-3MYUI4B2.js');
4
4
 
5
5
 
6
- var _chunkNM5BWVVBjs = require('../chunk-NM5BWVVB.js');
6
+ var _chunkE6YC337Qjs = require('../chunk-E6YC337Q.js');
7
7
  require('../chunk-3LFH2WCF.js');
8
8
  require('../chunk-VQ4DZOBB.js');
9
9
  require('../chunk-ZJOF5MEZ.js');
@@ -11,8 +11,8 @@ require('../chunk-XYZRP5S2.js');
11
11
 
12
12
  // src/presets/node.ts
13
13
  var node_default = [
14
- new (0, _chunkOOSIWXHXjs.ClientRequestInterceptor)(),
15
- new (0, _chunkNM5BWVVBjs.XMLHttpRequestInterceptor)()
14
+ new (0, _chunk3MYUI4B2js.ClientRequestInterceptor)(),
15
+ new (0, _chunkE6YC337Qjs.XMLHttpRequestInterceptor)()
16
16
  ];
17
17
 
18
18
 
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  ClientRequestInterceptor
3
- } from "../chunk-PSIO3L7D.mjs";
3
+ } from "../chunk-OL7OR4RL.mjs";
4
4
  import {
5
5
  XMLHttpRequestInterceptor
6
- } from "../chunk-SOWOSKLO.mjs";
6
+ } from "../chunk-HSCXCLVT.mjs";
7
7
  import "../chunk-7II4SWKS.mjs";
8
8
  import "../chunk-GFH37L5D.mjs";
9
9
  import "../chunk-STA6QBYM.mjs";
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@mswjs/interceptors",
3
3
  "description": "Low-level HTTP/HTTPS/XHR/fetch request interception library.",
4
- "version": "0.24.1",
4
+ "version": "0.25.0",
5
5
  "main": "./lib/node/index.js",
6
6
  "module": "./lib/node/index.mjs",
7
7
  "types": "./lib/node/index.d.ts",
@@ -88,7 +88,7 @@
88
88
  "@commitlint/cli": "^16.0.2",
89
89
  "@commitlint/config-conventional": "^16.0.0",
90
90
  "@open-draft/test-server": "^0.5.1",
91
- "@ossjs/release": "^0.5.1",
91
+ "@ossjs/release": "^0.7.2",
92
92
  "@playwright/test": "^1.37.1",
93
93
  "@types/cors": "^2.8.12",
94
94
  "@types/express": "^4.17.13",
@@ -212,9 +212,26 @@ export class NodeClientRequest extends ClientRequest {
212
212
  const mockedResponse = resolverResult.data
213
213
 
214
214
  if (mockedResponse) {
215
+ this.logger.info('received mocked response:', mockedResponse)
216
+
217
+ // Handle mocked "Response.error" network error responses.
218
+ if (mockedResponse.type === 'error') {
219
+ this.logger.info(
220
+ 'received network error response, aborting request...'
221
+ )
222
+
223
+ /**
224
+ * There is no standardized error format for network errors
225
+ * in Node.js. Instead, emit a generic TypeError.
226
+ */
227
+ this.emit('error', new TypeError('Network error'))
228
+ this.terminate()
229
+
230
+ return this
231
+ }
232
+
215
233
  const responseClone = mockedResponse.clone()
216
234
 
217
- this.logger.info('received mocked response:', mockedResponse)
218
235
  this.responseSource = 'mock'
219
236
 
220
237
  this.respondWith(mockedResponse)
@@ -104,6 +104,15 @@ export function createXMLHttpRequestProxy({
104
104
  mockedResponse.statusText
105
105
  )
106
106
 
107
+ if (mockedResponse.type === 'error') {
108
+ this.logger.info(
109
+ 'received a network error response, rejecting the request promise...'
110
+ )
111
+
112
+ requestController.errorWith(new TypeError('Network error'))
113
+ return
114
+ }
115
+
107
116
  return requestController.respondWith(mockedResponse)
108
117
  }
109
118
 
@@ -81,17 +81,31 @@ export class FetchInterceptor extends Interceptor<HttpRequestEventMap> {
81
81
  }
82
82
 
83
83
  if (resolverResult.error) {
84
- const error = Object.assign(new TypeError('Failed to fetch'), {
85
- cause: resolverResult.error,
86
- })
87
-
88
- return Promise.reject(error)
84
+ return Promise.reject(createNetworkError(resolverResult.error))
89
85
  }
90
86
 
91
87
  const mockedResponse = resolverResult.data
92
88
 
93
89
  if (mockedResponse && !request.signal?.aborted) {
94
90
  this.logger.info('received mocked response:', mockedResponse)
91
+
92
+ // Reject the request Promise on mocked "Response.error" responses.
93
+ if (mockedResponse.type === 'error') {
94
+ this.logger.info(
95
+ 'received a network error response, rejecting the request promise...'
96
+ )
97
+
98
+ /**
99
+ * Set the cause of the request promise rejection to the
100
+ * network error Response instance. This different from Undici.
101
+ * Undici will forward the "response.error" custom property
102
+ * as the rejection reason but for "Response.error()" static method
103
+ * "response.error" will equal to undefined, making "cause" an empty Error.
104
+ * @see https://github.com/nodejs/undici/blob/83cb522ae0157a19d149d72c7d03d46e34510d0a/lib/fetch/response.js#L344
105
+ */
106
+ return Promise.reject(createNetworkError(mockedResponse))
107
+ }
108
+
95
109
  const responseClone = mockedResponse.clone()
96
110
 
97
111
  this.emitter.emit('response', {
@@ -151,3 +165,9 @@ export class FetchInterceptor extends Interceptor<HttpRequestEventMap> {
151
165
  })
152
166
  }
153
167
  }
168
+
169
+ function createNetworkError(cause: unknown) {
170
+ return Object.assign(new TypeError('Failed to fetch'), {
171
+ cause,
172
+ })
173
+ }