@zimic/interceptor 1.3.6-canary.2 → 1.3.6-canary.4
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.
- package/dist/{chunk-2YIGHTHM.js → chunk-SNMNOHD6.js} +5 -2
- package/dist/{chunk-2YIGHTHM.js.map → chunk-SNMNOHD6.js.map} +1 -1
- package/dist/{chunk-4XT4ZOJ2.mjs → chunk-WG7EXKWT.mjs} +5 -2
- package/dist/{chunk-4XT4ZOJ2.mjs.map → chunk-WG7EXKWT.mjs.map} +1 -1
- package/dist/cli.js +17 -17
- package/dist/cli.js.map +1 -1
- package/dist/cli.mjs +2 -2
- package/dist/cli.mjs.map +1 -1
- package/dist/http.js +73 -69
- package/dist/http.js.map +1 -1
- package/dist/http.mjs +73 -49
- package/dist/http.mjs.map +1 -1
- package/dist/scripts/postinstall.js +6 -52
- package/dist/scripts/postinstall.js.map +1 -1
- package/dist/scripts/postinstall.mjs +7 -52
- package/dist/scripts/postinstall.mjs.map +1 -1
- package/dist/server.js +6 -6
- package/dist/server.mjs +1 -1
- package/package.json +3 -3
- package/src/http/interceptor/HttpInterceptorStore.ts +1 -0
- package/src/http/interceptor/LocalHttpInterceptor.ts +2 -6
- package/src/http/interceptorWorker/HttpInterceptorWorker.ts +4 -0
- package/src/http/interceptorWorker/LocalHttpInterceptorWorker.ts +82 -43
- package/src/http/interceptorWorker/types/msw.ts +2 -2
|
@@ -11,68 +11,22 @@ var path__default = /*#__PURE__*/_interopDefault(path);
|
|
|
11
11
|
|
|
12
12
|
var MSW_ROOT_DIRECTORY = path__default.default.join(chunkDGUM43GV_js.__require.resolve("msw"), "..", "..", "..");
|
|
13
13
|
var MSW_PACKAGE_PATH = path__default.default.join(MSW_ROOT_DIRECTORY, "package.json");
|
|
14
|
-
var MSW_CORE_DIRECTORY = path__default.default.join(MSW_ROOT_DIRECTORY, "lib", "core");
|
|
15
14
|
async function patchMSWExports() {
|
|
16
15
|
const mswPackageContentAsString = await fs__default.default.promises.readFile(MSW_PACKAGE_PATH, "utf-8");
|
|
17
16
|
const mswPackageContent = JSON.parse(mswPackageContentAsString);
|
|
18
|
-
const
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
17
|
+
const mswExports = mswPackageContent.exports;
|
|
18
|
+
mswExports["./browser"].node = mswExports["./node"].node;
|
|
19
|
+
mswExports["./node"].browser = mswExports["./browser"].browser;
|
|
20
|
+
const { browser: browserNodeExport, ...nodeExportsWithoutBrowser } = mswExports["./node"];
|
|
21
|
+
mswExports["./node"] = { browser: browserNodeExport, ...nodeExportsWithoutBrowser };
|
|
22
22
|
const patchedMSWPackageContentAsString = JSON.stringify(mswPackageContent, null, 2);
|
|
23
23
|
await fs__default.default.promises.writeFile(MSW_PACKAGE_PATH, patchedMSWPackageContentAsString);
|
|
24
24
|
}
|
|
25
|
-
async function patchMSWWebSocketBroadcastChannel() {
|
|
26
|
-
await Promise.all(
|
|
27
|
-
["ws.js", "ws.mjs"].map(async (webSocketFileName) => {
|
|
28
|
-
const mswWebSocketPath = path__default.default.join(MSW_CORE_DIRECTORY, webSocketFileName);
|
|
29
|
-
const mswWebSocketContent = await fs__default.default.promises.readFile(mswWebSocketPath, "utf-8");
|
|
30
|
-
const patchedMSWWebSocketContent = mswWebSocketContent.replace(
|
|
31
|
-
[
|
|
32
|
-
'const webSocketChannel = new BroadcastChannel("msw:websocket-client-manager");',
|
|
33
|
-
"if (isBroadcastChannelWithUnref(webSocketChannel)) {",
|
|
34
|
-
" webSocketChannel.unref();",
|
|
35
|
-
"}"
|
|
36
|
-
].join("\n"),
|
|
37
|
-
"let webSocketChannel;"
|
|
38
|
-
).replace(
|
|
39
|
-
[
|
|
40
|
-
" );",
|
|
41
|
-
" const clientManager = new import_WebSocketClientManager.WebSocketClientManager(webSocketChannel);"
|
|
42
|
-
].join("\n"),
|
|
43
|
-
[
|
|
44
|
-
" );",
|
|
45
|
-
" if (!webSocketChannel) {",
|
|
46
|
-
' webSocketChannel = new BroadcastChannel("msw:websocket-client-manager");',
|
|
47
|
-
" if (isBroadcastChannelWithUnref(webSocketChannel)) {",
|
|
48
|
-
" webSocketChannel.unref();",
|
|
49
|
-
" }",
|
|
50
|
-
" }",
|
|
51
|
-
" const clientManager = new import_WebSocketClientManager.WebSocketClientManager(webSocketChannel);"
|
|
52
|
-
].join("\n")
|
|
53
|
-
).replace(
|
|
54
|
-
[" );", " const clientManager = new WebSocketClientManager(webSocketChannel);"].join("\n"),
|
|
55
|
-
[
|
|
56
|
-
" );",
|
|
57
|
-
" if (!webSocketChannel) {",
|
|
58
|
-
' webSocketChannel = new BroadcastChannel("msw:websocket-client-manager");',
|
|
59
|
-
" if (isBroadcastChannelWithUnref(webSocketChannel)) {",
|
|
60
|
-
" webSocketChannel.unref();",
|
|
61
|
-
" }",
|
|
62
|
-
" }",
|
|
63
|
-
" const clientManager = new WebSocketClientManager(webSocketChannel);"
|
|
64
|
-
].join("\n")
|
|
65
|
-
);
|
|
66
|
-
await fs__default.default.promises.writeFile(mswWebSocketPath, patchedMSWWebSocketContent);
|
|
67
|
-
})
|
|
68
|
-
);
|
|
69
|
-
}
|
|
70
25
|
async function postinstall() {
|
|
71
|
-
await
|
|
26
|
+
await patchMSWExports();
|
|
72
27
|
}
|
|
73
28
|
var postinstallPromise = postinstall();
|
|
74
29
|
|
|
75
|
-
exports.MSW_CORE_DIRECTORY = MSW_CORE_DIRECTORY;
|
|
76
30
|
exports.MSW_PACKAGE_PATH = MSW_PACKAGE_PATH;
|
|
77
31
|
exports.MSW_ROOT_DIRECTORY = MSW_ROOT_DIRECTORY;
|
|
78
32
|
exports.postinstallPromise = postinstallPromise;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../scripts/postinstall.ts"],"names":["path","__require","fs"],"mappings":";;;;;;;;;;;AAQO,IAAM,kBAAA,GAAqBA,sBAAK,IAAA,CAAKC,0BAAA,CAAQ,QAAQ,KAAK,CAAA,EAAG,IAAA,EAAM,IAAA,EAAM,IAAI;
|
|
1
|
+
{"version":3,"sources":["../../scripts/postinstall.ts"],"names":["path","__require","fs"],"mappings":";;;;;;;;;;;AAQO,IAAM,kBAAA,GAAqBA,sBAAK,IAAA,CAAKC,0BAAA,CAAQ,QAAQ,KAAK,CAAA,EAAG,IAAA,EAAM,IAAA,EAAM,IAAI;AAC7E,IAAM,gBAAA,GAAmBD,qBAAA,CAAK,IAAA,CAAK,kBAAA,EAAoB,cAAc;AAE5E,eAAe,eAAA,GAAkB;AAC/B,EAAA,MAAM,4BAA4B,MAAME,mBAAA,CAAG,QAAA,CAAS,QAAA,CAAS,kBAAkB,OAAO,CAAA;AACtF,EAAA,MAAM,iBAAA,GAAoB,IAAA,CAAK,KAAA,CAAM,yBAAyB,CAAA;AAE9D,EAAA,MAAM,aAAa,iBAAA,CAAkB,OAAA;AAKrC,EAAA,UAAA,CAAW,WAAW,CAAA,CAAE,IAAA,GAAO,UAAA,CAAW,QAAQ,CAAA,CAAE,IAAA;AACpD,EAAA,UAAA,CAAW,QAAQ,CAAA,CAAE,OAAA,GAAU,UAAA,CAAW,WAAW,CAAA,CAAE,OAAA;AAGvD,EAAA,MAAM,EAAE,OAAA,EAAS,iBAAA,EAAmB,GAAG,yBAAA,EAA0B,GAAI,WAAW,QAAQ,CAAA;AACxF,EAAA,UAAA,CAAW,QAAQ,CAAA,GAAI,EAAE,OAAA,EAAS,iBAAA,EAAmB,GAAG,yBAAA,EAA0B;AAElF,EAAA,MAAM,gCAAA,GAAmC,IAAA,CAAK,SAAA,CAAU,iBAAA,EAAmB,MAAM,CAAC,CAAA;AAClF,EAAA,MAAMA,mBAAA,CAAG,QAAA,CAAS,SAAA,CAAU,gBAAA,EAAkB,gCAAgC,CAAA;AAChF;AAEA,eAAe,WAAA,GAAc;AAC3B,EAAA,MAAM,eAAA,EAAgB;AACxB;AAEO,IAAM,qBAAqB,WAAA","file":"postinstall.js","sourcesContent":["import { Override } from '@zimic/utils/types';\nimport fs from 'fs';\nimport type mswPackage from 'msw/package.json';\nimport path from 'path';\n\nexport type MSWPackage = typeof mswPackage;\nexport type MSWExports = MSWPackage['exports'];\n\nexport const MSW_ROOT_DIRECTORY = path.join(require.resolve('msw'), '..', '..', '..');\nexport const MSW_PACKAGE_PATH = path.join(MSW_ROOT_DIRECTORY, 'package.json');\n\nasync function patchMSWExports() {\n const mswPackageContentAsString = await fs.promises.readFile(MSW_PACKAGE_PATH, 'utf-8');\n const mswPackageContent = JSON.parse(mswPackageContentAsString) as MSWPackage;\n\n const mswExports = mswPackageContent.exports as {\n './browser': Override<MSWExports['./browser'], { node: MSWExports['./node']['node'] | string | null }>;\n './node': Override<MSWExports['./node'], { browser: MSWExports['./browser']['browser'] | string | null }>;\n };\n\n mswExports['./browser'].node = mswExports['./node'].node;\n mswExports['./node'].browser = mswExports['./browser'].browser;\n\n // To avoid issues with export condition ordering, the browser export must be defined before the node export.\n const { browser: browserNodeExport, ...nodeExportsWithoutBrowser } = mswExports['./node'];\n mswExports['./node'] = { browser: browserNodeExport, ...nodeExportsWithoutBrowser };\n\n const patchedMSWPackageContentAsString = JSON.stringify(mswPackageContent, null, 2);\n await fs.promises.writeFile(MSW_PACKAGE_PATH, patchedMSWPackageContentAsString);\n}\n\nasync function postinstall() {\n await patchMSWExports();\n}\n\nexport const postinstallPromise = postinstall();\n"]}
|
|
@@ -4,67 +4,22 @@ import path from 'path';
|
|
|
4
4
|
|
|
5
5
|
var MSW_ROOT_DIRECTORY = path.join(__require.resolve("msw"), "..", "..", "..");
|
|
6
6
|
var MSW_PACKAGE_PATH = path.join(MSW_ROOT_DIRECTORY, "package.json");
|
|
7
|
-
var MSW_CORE_DIRECTORY = path.join(MSW_ROOT_DIRECTORY, "lib", "core");
|
|
8
7
|
async function patchMSWExports() {
|
|
9
8
|
const mswPackageContentAsString = await fs.promises.readFile(MSW_PACKAGE_PATH, "utf-8");
|
|
10
9
|
const mswPackageContent = JSON.parse(mswPackageContentAsString);
|
|
11
|
-
const
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
10
|
+
const mswExports = mswPackageContent.exports;
|
|
11
|
+
mswExports["./browser"].node = mswExports["./node"].node;
|
|
12
|
+
mswExports["./node"].browser = mswExports["./browser"].browser;
|
|
13
|
+
const { browser: browserNodeExport, ...nodeExportsWithoutBrowser } = mswExports["./node"];
|
|
14
|
+
mswExports["./node"] = { browser: browserNodeExport, ...nodeExportsWithoutBrowser };
|
|
15
15
|
const patchedMSWPackageContentAsString = JSON.stringify(mswPackageContent, null, 2);
|
|
16
16
|
await fs.promises.writeFile(MSW_PACKAGE_PATH, patchedMSWPackageContentAsString);
|
|
17
17
|
}
|
|
18
|
-
async function patchMSWWebSocketBroadcastChannel() {
|
|
19
|
-
await Promise.all(
|
|
20
|
-
["ws.js", "ws.mjs"].map(async (webSocketFileName) => {
|
|
21
|
-
const mswWebSocketPath = path.join(MSW_CORE_DIRECTORY, webSocketFileName);
|
|
22
|
-
const mswWebSocketContent = await fs.promises.readFile(mswWebSocketPath, "utf-8");
|
|
23
|
-
const patchedMSWWebSocketContent = mswWebSocketContent.replace(
|
|
24
|
-
[
|
|
25
|
-
'const webSocketChannel = new BroadcastChannel("msw:websocket-client-manager");',
|
|
26
|
-
"if (isBroadcastChannelWithUnref(webSocketChannel)) {",
|
|
27
|
-
" webSocketChannel.unref();",
|
|
28
|
-
"}"
|
|
29
|
-
].join("\n"),
|
|
30
|
-
"let webSocketChannel;"
|
|
31
|
-
).replace(
|
|
32
|
-
[
|
|
33
|
-
" );",
|
|
34
|
-
" const clientManager = new import_WebSocketClientManager.WebSocketClientManager(webSocketChannel);"
|
|
35
|
-
].join("\n"),
|
|
36
|
-
[
|
|
37
|
-
" );",
|
|
38
|
-
" if (!webSocketChannel) {",
|
|
39
|
-
' webSocketChannel = new BroadcastChannel("msw:websocket-client-manager");',
|
|
40
|
-
" if (isBroadcastChannelWithUnref(webSocketChannel)) {",
|
|
41
|
-
" webSocketChannel.unref();",
|
|
42
|
-
" }",
|
|
43
|
-
" }",
|
|
44
|
-
" const clientManager = new import_WebSocketClientManager.WebSocketClientManager(webSocketChannel);"
|
|
45
|
-
].join("\n")
|
|
46
|
-
).replace(
|
|
47
|
-
[" );", " const clientManager = new WebSocketClientManager(webSocketChannel);"].join("\n"),
|
|
48
|
-
[
|
|
49
|
-
" );",
|
|
50
|
-
" if (!webSocketChannel) {",
|
|
51
|
-
' webSocketChannel = new BroadcastChannel("msw:websocket-client-manager");',
|
|
52
|
-
" if (isBroadcastChannelWithUnref(webSocketChannel)) {",
|
|
53
|
-
" webSocketChannel.unref();",
|
|
54
|
-
" }",
|
|
55
|
-
" }",
|
|
56
|
-
" const clientManager = new WebSocketClientManager(webSocketChannel);"
|
|
57
|
-
].join("\n")
|
|
58
|
-
);
|
|
59
|
-
await fs.promises.writeFile(mswWebSocketPath, patchedMSWWebSocketContent);
|
|
60
|
-
})
|
|
61
|
-
);
|
|
62
|
-
}
|
|
63
18
|
async function postinstall() {
|
|
64
|
-
await
|
|
19
|
+
await patchMSWExports();
|
|
65
20
|
}
|
|
66
21
|
var postinstallPromise = postinstall();
|
|
67
22
|
|
|
68
|
-
export {
|
|
23
|
+
export { MSW_PACKAGE_PATH, MSW_ROOT_DIRECTORY, postinstallPromise };
|
|
69
24
|
//# sourceMappingURL=postinstall.mjs.map
|
|
70
25
|
//# sourceMappingURL=postinstall.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../scripts/postinstall.ts"],"names":[],"mappings":";;;;AAQO,IAAM,kBAAA,GAAqB,KAAK,IAAA,CAAK,SAAA,CAAQ,QAAQ,KAAK,CAAA,EAAG,IAAA,EAAM,IAAA,EAAM,IAAI;
|
|
1
|
+
{"version":3,"sources":["../../scripts/postinstall.ts"],"names":[],"mappings":";;;;AAQO,IAAM,kBAAA,GAAqB,KAAK,IAAA,CAAK,SAAA,CAAQ,QAAQ,KAAK,CAAA,EAAG,IAAA,EAAM,IAAA,EAAM,IAAI;AAC7E,IAAM,gBAAA,GAAmB,IAAA,CAAK,IAAA,CAAK,kBAAA,EAAoB,cAAc;AAE5E,eAAe,eAAA,GAAkB;AAC/B,EAAA,MAAM,4BAA4B,MAAM,EAAA,CAAG,QAAA,CAAS,QAAA,CAAS,kBAAkB,OAAO,CAAA;AACtF,EAAA,MAAM,iBAAA,GAAoB,IAAA,CAAK,KAAA,CAAM,yBAAyB,CAAA;AAE9D,EAAA,MAAM,aAAa,iBAAA,CAAkB,OAAA;AAKrC,EAAA,UAAA,CAAW,WAAW,CAAA,CAAE,IAAA,GAAO,UAAA,CAAW,QAAQ,CAAA,CAAE,IAAA;AACpD,EAAA,UAAA,CAAW,QAAQ,CAAA,CAAE,OAAA,GAAU,UAAA,CAAW,WAAW,CAAA,CAAE,OAAA;AAGvD,EAAA,MAAM,EAAE,OAAA,EAAS,iBAAA,EAAmB,GAAG,yBAAA,EAA0B,GAAI,WAAW,QAAQ,CAAA;AACxF,EAAA,UAAA,CAAW,QAAQ,CAAA,GAAI,EAAE,OAAA,EAAS,iBAAA,EAAmB,GAAG,yBAAA,EAA0B;AAElF,EAAA,MAAM,gCAAA,GAAmC,IAAA,CAAK,SAAA,CAAU,iBAAA,EAAmB,MAAM,CAAC,CAAA;AAClF,EAAA,MAAM,EAAA,CAAG,QAAA,CAAS,SAAA,CAAU,gBAAA,EAAkB,gCAAgC,CAAA;AAChF;AAEA,eAAe,WAAA,GAAc;AAC3B,EAAA,MAAM,eAAA,EAAgB;AACxB;AAEO,IAAM,qBAAqB,WAAA","file":"postinstall.mjs","sourcesContent":["import { Override } from '@zimic/utils/types';\nimport fs from 'fs';\nimport type mswPackage from 'msw/package.json';\nimport path from 'path';\n\nexport type MSWPackage = typeof mswPackage;\nexport type MSWExports = MSWPackage['exports'];\n\nexport const MSW_ROOT_DIRECTORY = path.join(require.resolve('msw'), '..', '..', '..');\nexport const MSW_PACKAGE_PATH = path.join(MSW_ROOT_DIRECTORY, 'package.json');\n\nasync function patchMSWExports() {\n const mswPackageContentAsString = await fs.promises.readFile(MSW_PACKAGE_PATH, 'utf-8');\n const mswPackageContent = JSON.parse(mswPackageContentAsString) as MSWPackage;\n\n const mswExports = mswPackageContent.exports as {\n './browser': Override<MSWExports['./browser'], { node: MSWExports['./node']['node'] | string | null }>;\n './node': Override<MSWExports['./node'], { browser: MSWExports['./browser']['browser'] | string | null }>;\n };\n\n mswExports['./browser'].node = mswExports['./node'].node;\n mswExports['./node'].browser = mswExports['./browser'].browser;\n\n // To avoid issues with export condition ordering, the browser export must be defined before the node export.\n const { browser: browserNodeExport, ...nodeExportsWithoutBrowser } = mswExports['./node'];\n mswExports['./node'] = { browser: browserNodeExport, ...nodeExportsWithoutBrowser };\n\n const patchedMSWPackageContentAsString = JSON.stringify(mswPackageContent, null, 2);\n await fs.promises.writeFile(MSW_PACKAGE_PATH, patchedMSWPackageContentAsString);\n}\n\nasync function postinstall() {\n await patchMSWExports();\n}\n\nexport const postinstallPromise = postinstall();\n"]}
|
package/dist/server.js
CHANGED
|
@@ -1,29 +1,29 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunkSNMNOHD6_js = require('./chunk-SNMNOHD6.js');
|
|
4
4
|
require('./chunk-DGUM43GV.js');
|
|
5
5
|
|
|
6
6
|
|
|
7
7
|
|
|
8
8
|
Object.defineProperty(exports, "DEFAULT_ACCESS_CONTROL_HEADERS", {
|
|
9
9
|
enumerable: true,
|
|
10
|
-
get: function () { return
|
|
10
|
+
get: function () { return chunkSNMNOHD6_js.DEFAULT_ACCESS_CONTROL_HEADERS; }
|
|
11
11
|
});
|
|
12
12
|
Object.defineProperty(exports, "DEFAULT_PREFLIGHT_STATUS_CODE", {
|
|
13
13
|
enumerable: true,
|
|
14
|
-
get: function () { return
|
|
14
|
+
get: function () { return chunkSNMNOHD6_js.DEFAULT_PREFLIGHT_STATUS_CODE; }
|
|
15
15
|
});
|
|
16
16
|
Object.defineProperty(exports, "NotRunningInterceptorServerError", {
|
|
17
17
|
enumerable: true,
|
|
18
|
-
get: function () { return
|
|
18
|
+
get: function () { return chunkSNMNOHD6_js.NotRunningInterceptorServerError_default; }
|
|
19
19
|
});
|
|
20
20
|
Object.defineProperty(exports, "RunningInterceptorServerError", {
|
|
21
21
|
enumerable: true,
|
|
22
|
-
get: function () { return
|
|
22
|
+
get: function () { return chunkSNMNOHD6_js.RunningInterceptorServerError_default; }
|
|
23
23
|
});
|
|
24
24
|
Object.defineProperty(exports, "createInterceptorServer", {
|
|
25
25
|
enumerable: true,
|
|
26
|
-
get: function () { return
|
|
26
|
+
get: function () { return chunkSNMNOHD6_js.createInterceptorServer; }
|
|
27
27
|
});
|
|
28
28
|
//# sourceMappingURL=server.js.map
|
|
29
29
|
//# sourceMappingURL=server.js.map
|
package/dist/server.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { DEFAULT_ACCESS_CONTROL_HEADERS, DEFAULT_PREFLIGHT_STATUS_CODE, NotRunningInterceptorServerError_default as NotRunningInterceptorServerError, RunningInterceptorServerError_default as RunningInterceptorServerError, createInterceptorServer } from './chunk-
|
|
1
|
+
export { DEFAULT_ACCESS_CONTROL_HEADERS, DEFAULT_PREFLIGHT_STATUS_CODE, NotRunningInterceptorServerError_default as NotRunningInterceptorServerError, RunningInterceptorServerError_default as RunningInterceptorServerError, createInterceptorServer } from './chunk-WG7EXKWT.mjs';
|
|
2
2
|
import './chunk-BJTO5JO5.mjs';
|
|
3
3
|
//# sourceMappingURL=server.mjs.map
|
|
4
4
|
//# sourceMappingURL=server.mjs.map
|
package/package.json
CHANGED
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
"api",
|
|
15
15
|
"static"
|
|
16
16
|
],
|
|
17
|
-
"version": "1.3.6-canary.
|
|
17
|
+
"version": "1.3.6-canary.4",
|
|
18
18
|
"homepage": "https://zimic.dev/docs/interceptor",
|
|
19
19
|
"repository": {
|
|
20
20
|
"type": "git",
|
|
@@ -97,7 +97,7 @@
|
|
|
97
97
|
"dependencies": {
|
|
98
98
|
"@whatwg-node/server": "0.10.18",
|
|
99
99
|
"isomorphic-ws": "5.0.0",
|
|
100
|
-
"msw": "2.
|
|
100
|
+
"msw": "2.13.4",
|
|
101
101
|
"picocolors": "^1.1.1",
|
|
102
102
|
"ws": "8.20.0",
|
|
103
103
|
"yargs": "18.0.0",
|
|
@@ -119,7 +119,7 @@
|
|
|
119
119
|
"eslint": "^9.39.4",
|
|
120
120
|
"playwright": "^1.59.1",
|
|
121
121
|
"tsup": "^8.5.1",
|
|
122
|
-
"typescript": "6.0.
|
|
122
|
+
"typescript": "6.0.3",
|
|
123
123
|
"vitest": "^4.1.4"
|
|
124
124
|
},
|
|
125
125
|
"peerDependencies": {
|
|
@@ -18,12 +18,8 @@ class LocalHttpInterceptor<Schema extends HttpSchema> implements PublicLocalHttp
|
|
|
18
18
|
this.implementation = new HttpInterceptorImplementation<Schema, typeof LocalHttpRequestHandler>({
|
|
19
19
|
store: this.store,
|
|
20
20
|
baseURL,
|
|
21
|
-
createWorker: () => {
|
|
22
|
-
|
|
23
|
-
},
|
|
24
|
-
deleteWorker: () => {
|
|
25
|
-
this.store.deleteLocalWorker();
|
|
26
|
-
},
|
|
21
|
+
createWorker: () => this.store.getOrCreateLocalWorker({}),
|
|
22
|
+
deleteWorker: () => this.store.deleteLocalWorker(),
|
|
27
23
|
Handler: LocalHttpRequestHandler,
|
|
28
24
|
onUnhandledRequest: options.onUnhandledRequest,
|
|
29
25
|
requestSaving: options.requestSaving,
|
|
@@ -87,12 +87,16 @@ abstract class HttpInterceptorWorker {
|
|
|
87
87
|
if (!this.isRunning) {
|
|
88
88
|
return;
|
|
89
89
|
}
|
|
90
|
+
|
|
90
91
|
if (this.stoppingPromise) {
|
|
91
92
|
return this.stoppingPromise;
|
|
92
93
|
}
|
|
93
94
|
|
|
94
95
|
const stoppingResult = internalStop();
|
|
95
96
|
|
|
97
|
+
/* istanbul ignore next -- @preserve
|
|
98
|
+
* This if statement only runs if concurrent calls to stop() are made, which is an edge case that is hard to
|
|
99
|
+
* reliably reproduce in tests. */
|
|
96
100
|
if (stoppingResult instanceof Promise) {
|
|
97
101
|
this.stoppingPromise = stoppingResult;
|
|
98
102
|
await this.stoppingPromise;
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
import { HttpRequest, HttpResponse, HttpMethod, HttpSchema, HttpHeadersInit, HttpBody } from '@zimic/http';
|
|
2
|
+
import { createCachedDynamicImport } from '@zimic/utils/import';
|
|
2
3
|
import { createRegexFromPath, excludeNonPathParams, validatePathParams } from '@zimic/utils/url';
|
|
3
4
|
import { SharedOptions as MSWWorkerSharedOptions, bypass, http, passthrough } from 'msw';
|
|
4
|
-
import * as mswBrowser from 'msw/browser';
|
|
5
|
-
import * as mswNode from 'msw/node';
|
|
6
5
|
|
|
7
6
|
import { removeArrayIndex } from '@/utils/arrays';
|
|
8
7
|
import { isClientSide, isServerSide } from '@/utils/environment';
|
|
@@ -16,9 +15,12 @@ import { UnhandledRequestStrategy } from '../interceptor/types/options';
|
|
|
16
15
|
import UnregisteredBrowserServiceWorkerError from './errors/UnregisteredBrowserServiceWorkerError';
|
|
17
16
|
import HttpInterceptorWorker from './HttpInterceptorWorker';
|
|
18
17
|
import { HttpResponseFactory, HttpResponseFactoryContext } from './types/http';
|
|
19
|
-
import { BrowserMSWWorker, MSWWorker, NodeMSWWorker } from './types/msw';
|
|
18
|
+
import { BrowserMSWWorker, MSWHttpHandler, MSWWorker, NodeMSWWorker } from './types/msw';
|
|
20
19
|
import { LocalHttpInterceptorWorkerOptions } from './types/options';
|
|
21
20
|
|
|
21
|
+
const importMSWNode = createCachedDynamicImport(() => import('msw/node'));
|
|
22
|
+
const importMSWBrowser = createCachedDynamicImport(() => import('msw/browser'));
|
|
23
|
+
|
|
22
24
|
interface HttpHandler {
|
|
23
25
|
baseURL: string;
|
|
24
26
|
method: HttpMethod;
|
|
@@ -28,7 +30,12 @@ interface HttpHandler {
|
|
|
28
30
|
}
|
|
29
31
|
|
|
30
32
|
class LocalHttpInterceptorWorker extends HttpInterceptorWorker {
|
|
31
|
-
|
|
33
|
+
// Re-creating MSW workers may cause issues, so we should keep a single worker instance, even if all interceptor
|
|
34
|
+
// workers are stopped. See https://github.com/mswjs/msw/issues/2597.
|
|
35
|
+
private static mswWorker?: MSWWorker;
|
|
36
|
+
static isMSWWorkerRunning = false;
|
|
37
|
+
|
|
38
|
+
private mswHttpHandler?: MSWHttpHandler;
|
|
32
39
|
|
|
33
40
|
private httpHandlersByMethod: {
|
|
34
41
|
[Method in HttpMethod]: HttpHandler[];
|
|
@@ -46,38 +53,50 @@ class LocalHttpInterceptorWorker extends HttpInterceptorWorker {
|
|
|
46
53
|
super();
|
|
47
54
|
}
|
|
48
55
|
|
|
56
|
+
get class() {
|
|
57
|
+
return LocalHttpInterceptorWorker;
|
|
58
|
+
}
|
|
59
|
+
|
|
49
60
|
get type() {
|
|
50
61
|
return 'local' as const;
|
|
51
62
|
}
|
|
52
63
|
|
|
53
|
-
get
|
|
64
|
+
get mswWorkerOrThrow() {
|
|
54
65
|
/* istanbul ignore if -- @preserve
|
|
55
66
|
* Trying to access the internal worker when it does not exist should not happen. */
|
|
56
|
-
if (!this.
|
|
67
|
+
if (!this.class.mswWorker) {
|
|
57
68
|
throw new NotRunningHttpInterceptorError();
|
|
58
69
|
}
|
|
59
|
-
return this.
|
|
70
|
+
return this.class.mswWorker;
|
|
60
71
|
}
|
|
61
72
|
|
|
62
|
-
|
|
63
|
-
this.
|
|
64
|
-
return this.
|
|
73
|
+
async getMSWWorkerOrCreate() {
|
|
74
|
+
this.class.mswWorker ??= await this.createMSWWorker();
|
|
75
|
+
return this.class.mswWorker;
|
|
65
76
|
}
|
|
66
77
|
|
|
67
|
-
private
|
|
68
|
-
|
|
69
|
-
const
|
|
70
|
-
const response = await this.createResponseForRequest(request);
|
|
71
|
-
return response;
|
|
72
|
-
});
|
|
78
|
+
private async createMSWWorker() {
|
|
79
|
+
if (isServerSide()) {
|
|
80
|
+
const mswNode = await importMSWNode();
|
|
73
81
|
|
|
74
|
-
|
|
75
|
-
|
|
82
|
+
/* istanbul ignore else -- @preserve
|
|
83
|
+
* We still check if we actually imported the server module in case our `isServerSide()` check returns true, but
|
|
84
|
+
* the environment actually resolves the browser module. */
|
|
85
|
+
if ('setupServer' in mswNode) {
|
|
86
|
+
return mswNode.setupServer();
|
|
87
|
+
}
|
|
76
88
|
}
|
|
77
89
|
|
|
78
90
|
/* istanbul ignore else -- @preserve */
|
|
79
|
-
if (isClientSide()
|
|
80
|
-
|
|
91
|
+
if (isClientSide()) {
|
|
92
|
+
const mswBrowser = await importMSWBrowser();
|
|
93
|
+
|
|
94
|
+
/* istanbul ignore else -- @preserve
|
|
95
|
+
* We still check if we actually imported the browser module in case our `isClientSide()` check returns true, but
|
|
96
|
+
* the environment actually resolves the server module. */
|
|
97
|
+
if ('setupWorker' in mswBrowser) {
|
|
98
|
+
return mswBrowser.setupWorker();
|
|
99
|
+
}
|
|
81
100
|
}
|
|
82
101
|
|
|
83
102
|
/* istanbul ignore next -- @preserve
|
|
@@ -87,65 +106,85 @@ class LocalHttpInterceptorWorker extends HttpInterceptorWorker {
|
|
|
87
106
|
|
|
88
107
|
async start() {
|
|
89
108
|
await super.sharedStart(async () => {
|
|
90
|
-
const
|
|
109
|
+
const mswWorker = await this.getMSWWorkerOrCreate();
|
|
91
110
|
|
|
92
111
|
const sharedOptions: MSWWorkerSharedOptions = {
|
|
93
112
|
onUnhandledRequest: 'bypass',
|
|
94
113
|
};
|
|
95
114
|
|
|
96
|
-
|
|
115
|
+
this.mswHttpHandler = http.all('*', async (context) => {
|
|
116
|
+
const request = context.request satisfies Request as HttpRequest;
|
|
117
|
+
const response = await this.createResponseForRequest(request);
|
|
118
|
+
return response;
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
mswWorker.use(this.mswHttpHandler);
|
|
122
|
+
|
|
123
|
+
if (this.isInternalBrowserWorker(mswWorker)) {
|
|
97
124
|
this.platform = 'browser';
|
|
98
|
-
|
|
125
|
+
|
|
126
|
+
// Even after https://github.com/mswjs/msw/issues/2714 was fixed, there are collateral effects preventing us
|
|
127
|
+
// from restarting the global browser worker even if unused. Restarting it causes interception issues in MSW.
|
|
128
|
+
if (!this.class.isMSWWorkerRunning) {
|
|
129
|
+
await this.startInBrowser(mswWorker, sharedOptions);
|
|
130
|
+
this.class.isMSWWorkerRunning = true;
|
|
131
|
+
}
|
|
99
132
|
} else {
|
|
100
133
|
this.platform = 'node';
|
|
101
|
-
this.startInNode(
|
|
134
|
+
this.startInNode(mswWorker, sharedOptions);
|
|
135
|
+
this.class.isMSWWorkerRunning = true;
|
|
102
136
|
}
|
|
103
137
|
|
|
104
138
|
this.isRunning = true;
|
|
105
139
|
});
|
|
106
140
|
}
|
|
107
141
|
|
|
108
|
-
private async startInBrowser(
|
|
142
|
+
private async startInBrowser(mswWorker: BrowserMSWWorker, sharedOptions: MSWWorkerSharedOptions) {
|
|
109
143
|
try {
|
|
110
|
-
await
|
|
144
|
+
await mswWorker.start({ ...sharedOptions, quiet: true });
|
|
111
145
|
} catch (error) {
|
|
112
146
|
this.handleBrowserWorkerStartError(error);
|
|
113
147
|
}
|
|
114
148
|
}
|
|
115
149
|
|
|
116
150
|
private handleBrowserWorkerStartError(error: unknown) {
|
|
151
|
+
/* istanbul ignore else -- @preserve
|
|
152
|
+
* Since we start the internal worker once and do not stop it, tests may not be able exercise this branch. */
|
|
117
153
|
if (UnregisteredBrowserServiceWorkerError.matchesRawError(error)) {
|
|
118
154
|
throw new UnregisteredBrowserServiceWorkerError();
|
|
155
|
+
} else {
|
|
156
|
+
throw error;
|
|
119
157
|
}
|
|
120
|
-
throw error;
|
|
121
158
|
}
|
|
122
159
|
|
|
123
|
-
private startInNode(
|
|
124
|
-
|
|
160
|
+
private startInNode(mswWorker: NodeMSWWorker, sharedOptions: MSWWorkerSharedOptions) {
|
|
161
|
+
mswWorker.listen(sharedOptions);
|
|
125
162
|
}
|
|
126
163
|
|
|
127
164
|
async stop() {
|
|
128
|
-
await super.sharedStop(() => {
|
|
129
|
-
const
|
|
165
|
+
await super.sharedStop(async () => {
|
|
166
|
+
const mswWorker = await this.getMSWWorkerOrCreate();
|
|
167
|
+
|
|
168
|
+
this.clearHandlers();
|
|
169
|
+
|
|
170
|
+
const newMSWHandlers = mswWorker.listHandlers().filter((handler) => handler !== this.mswHttpHandler);
|
|
171
|
+
mswWorker.resetHandlers(...newMSWHandlers);
|
|
130
172
|
|
|
131
|
-
if (this.isInternalBrowserWorker(
|
|
132
|
-
|
|
173
|
+
if (this.isInternalBrowserWorker(mswWorker)) {
|
|
174
|
+
// Even after https://github.com/mswjs/msw/issues/2714 was fixed, restarting browser workers causes interception
|
|
175
|
+
// issues, so we keep it running and just remove our handlers.
|
|
133
176
|
} else {
|
|
134
|
-
this.stopInNode(
|
|
177
|
+
this.stopInNode(mswWorker);
|
|
178
|
+
this.class.isMSWWorkerRunning = false;
|
|
135
179
|
}
|
|
136
|
-
this.clearHandlers();
|
|
137
180
|
|
|
138
|
-
this.
|
|
181
|
+
this.mswHttpHandler = undefined;
|
|
139
182
|
this.isRunning = false;
|
|
140
183
|
});
|
|
141
184
|
}
|
|
142
185
|
|
|
143
|
-
private
|
|
144
|
-
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
private stopInNode(internalWorker: NodeMSWWorker) {
|
|
148
|
-
internalWorker.close();
|
|
186
|
+
private stopInNode(mswWorker: NodeMSWWorker) {
|
|
187
|
+
mswWorker.close();
|
|
149
188
|
}
|
|
150
189
|
|
|
151
190
|
private isInternalBrowserWorker(worker: MSWWorker) {
|
|
@@ -153,7 +192,7 @@ class LocalHttpInterceptorWorker extends HttpInterceptorWorker {
|
|
|
153
192
|
}
|
|
154
193
|
|
|
155
194
|
hasInternalBrowserWorker() {
|
|
156
|
-
return this.isInternalBrowserWorker(this.
|
|
195
|
+
return this.isInternalBrowserWorker(this.mswWorkerOrThrow);
|
|
157
196
|
}
|
|
158
197
|
|
|
159
198
|
hasInternalNodeWorker() {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import type { HttpHandler as
|
|
1
|
+
import type { HttpHandler as MSWHttpHandler } from 'msw';
|
|
2
2
|
import type { SetupWorker as BrowserMSWWorker } from 'msw/browser';
|
|
3
3
|
import type { SetupServer as NodeMSWWorker } from 'msw/node';
|
|
4
4
|
|
|
5
|
-
export type {
|
|
5
|
+
export type { MSWHttpHandler, NodeMSWWorker, BrowserMSWWorker };
|
|
6
6
|
|
|
7
7
|
export type MSWWorker = NodeMSWWorker | BrowserMSWWorker;
|