msw 0.43.1 → 0.44.2
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/lib/{glossary-58eca5a8.d.ts → glossary-297d38ba.d.ts} +48 -26
- package/lib/iife/index.js +4847 -2318
- package/lib/iife/index.js.map +1 -1
- package/lib/index.d.ts +11 -14
- package/lib/index.js +283 -329
- package/lib/index.js.map +1 -1
- package/lib/mockServiceWorker.js +5 -69
- package/lib/native/index.d.ts +1 -1
- package/lib/native/index.js +480 -458
- package/lib/native/index.mjs +470 -448
- package/lib/node/index.d.ts +2 -2
- package/lib/node/index.js +480 -458
- package/lib/node/index.js.map +1 -1
- package/lib/node/index.mjs +470 -448
- package/lib/node/index.mjs.map +1 -1
- package/package.json +7 -4
package/lib/index.js
CHANGED
|
@@ -52,6 +52,7 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
52
52
|
var src_exports = {};
|
|
53
53
|
__export(src_exports, {
|
|
54
54
|
GraphQLHandler: () => GraphQLHandler,
|
|
55
|
+
MockedRequest: () => MockedRequest,
|
|
55
56
|
RESTMethods: () => RESTMethods,
|
|
56
57
|
RequestHandler: () => RequestHandler,
|
|
57
58
|
RestHandler: () => RestHandler,
|
|
@@ -65,7 +66,6 @@ __export(src_exports, {
|
|
|
65
66
|
graphqlContext: () => graphqlContext,
|
|
66
67
|
handleRequest: () => handleRequest,
|
|
67
68
|
matchRequestUrl: () => matchRequestUrl,
|
|
68
|
-
parseIsomorphicRequest: () => parseIsomorphicRequest,
|
|
69
69
|
response: () => response,
|
|
70
70
|
rest: () => rest,
|
|
71
71
|
restContext: () => restContext,
|
|
@@ -425,17 +425,15 @@ async function enableMocking(context, options) {
|
|
|
425
425
|
}
|
|
426
426
|
|
|
427
427
|
// src/setupWorker/start/utils/createMessageChannel.ts
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
};
|
|
438
|
-
}
|
|
428
|
+
var WorkerChannel = class {
|
|
429
|
+
constructor(port) {
|
|
430
|
+
this.port = port;
|
|
431
|
+
}
|
|
432
|
+
postMessage(event, ...rest2) {
|
|
433
|
+
const [data2, transfer] = rest2;
|
|
434
|
+
this.port.postMessage({ type: event, data: data2 }, { transfer });
|
|
435
|
+
}
|
|
436
|
+
};
|
|
439
437
|
|
|
440
438
|
// src/utils/NetworkError.ts
|
|
441
439
|
var NetworkError = class extends Error {
|
|
@@ -446,166 +444,15 @@ var NetworkError = class extends Error {
|
|
|
446
444
|
};
|
|
447
445
|
|
|
448
446
|
// src/utils/request/parseWorkerRequest.ts
|
|
449
|
-
var
|
|
450
|
-
|
|
451
|
-
// src/handlers/RequestHandler.ts
|
|
447
|
+
var import_interceptors2 = require("@mswjs/interceptors");
|
|
452
448
|
var import_headers_polyfill4 = require("headers-polyfill");
|
|
453
449
|
|
|
454
|
-
// src/
|
|
455
|
-
var import_headers_polyfill3 = require("headers-polyfill");
|
|
456
|
-
|
|
457
|
-
// src/utils/internal/compose.ts
|
|
458
|
-
function compose(...fns) {
|
|
459
|
-
return (...args) => {
|
|
460
|
-
return fns.reduceRight((leftFn, rightFn) => {
|
|
461
|
-
return leftFn instanceof Promise ? Promise.resolve(leftFn).then(rightFn) : rightFn(leftFn);
|
|
462
|
-
}, args[0]);
|
|
463
|
-
};
|
|
464
|
-
}
|
|
465
|
-
|
|
466
|
-
// src/response.ts
|
|
467
|
-
var defaultResponse = {
|
|
468
|
-
status: 200,
|
|
469
|
-
statusText: "OK",
|
|
470
|
-
body: null,
|
|
471
|
-
delay: 0,
|
|
472
|
-
once: false,
|
|
473
|
-
passthrough: false
|
|
474
|
-
};
|
|
475
|
-
var defaultResponseTransformers = [];
|
|
476
|
-
function createResponseComposition(responseOverrides, defaultTransformers = defaultResponseTransformers) {
|
|
477
|
-
return async (...transformers) => {
|
|
478
|
-
const initialResponse = Object.assign({}, defaultResponse, {
|
|
479
|
-
headers: new import_headers_polyfill3.Headers({
|
|
480
|
-
"x-powered-by": "msw"
|
|
481
|
-
})
|
|
482
|
-
}, responseOverrides);
|
|
483
|
-
const resolvedTransformers = [
|
|
484
|
-
...defaultTransformers,
|
|
485
|
-
...transformers
|
|
486
|
-
].filter(Boolean);
|
|
487
|
-
const resolvedResponse = resolvedTransformers.length > 0 ? compose(...resolvedTransformers)(initialResponse) : initialResponse;
|
|
488
|
-
return resolvedResponse;
|
|
489
|
-
};
|
|
490
|
-
}
|
|
491
|
-
var response = Object.assign(createResponseComposition(), {
|
|
492
|
-
once: createResponseComposition({ once: true }),
|
|
493
|
-
networkError(message) {
|
|
494
|
-
throw new NetworkError(message);
|
|
495
|
-
}
|
|
496
|
-
});
|
|
497
|
-
|
|
498
|
-
// src/utils/internal/getCallFrame.ts
|
|
499
|
-
var SOURCE_FRAME = /\/msw\/src\/(.+)/;
|
|
500
|
-
var BUILD_FRAME = /(node_modules)?[\/\\]lib[\/\\](umd|esm|iief|cjs)[\/\\]|^[^\/\\]*$/;
|
|
501
|
-
function getCallFrame(error2) {
|
|
502
|
-
const stack = error2.stack;
|
|
503
|
-
if (!stack) {
|
|
504
|
-
return;
|
|
505
|
-
}
|
|
506
|
-
const frames = stack.split("\n").slice(1);
|
|
507
|
-
const declarationFrame = frames.find((frame) => {
|
|
508
|
-
return !(SOURCE_FRAME.test(frame) || BUILD_FRAME.test(frame));
|
|
509
|
-
});
|
|
510
|
-
if (!declarationFrame) {
|
|
511
|
-
return;
|
|
512
|
-
}
|
|
513
|
-
const declarationPath = declarationFrame.replace(/\s*at [^()]*\(([^)]+)\)/, "$1").replace(/^@/, "");
|
|
514
|
-
return declarationPath;
|
|
515
|
-
}
|
|
516
|
-
|
|
517
|
-
// src/utils/internal/isIterable.ts
|
|
518
|
-
function isIterable(fn) {
|
|
519
|
-
if (!fn) {
|
|
520
|
-
return false;
|
|
521
|
-
}
|
|
522
|
-
return typeof fn[Symbol.iterator] == "function";
|
|
523
|
-
}
|
|
524
|
-
|
|
525
|
-
// src/handlers/RequestHandler.ts
|
|
526
|
-
var defaultContext = {
|
|
527
|
-
status,
|
|
528
|
-
set,
|
|
529
|
-
delay,
|
|
530
|
-
fetch
|
|
531
|
-
};
|
|
532
|
-
var RequestHandler = class {
|
|
533
|
-
constructor(options) {
|
|
534
|
-
this.shouldSkip = false;
|
|
535
|
-
this.ctx = options.ctx || defaultContext;
|
|
536
|
-
this.resolver = options.resolver;
|
|
537
|
-
const callFrame = getCallFrame(new Error());
|
|
538
|
-
this.info = __spreadProps(__spreadValues({}, options.info), {
|
|
539
|
-
callFrame
|
|
540
|
-
});
|
|
541
|
-
}
|
|
542
|
-
parse(_request, _resolutionContext) {
|
|
543
|
-
return null;
|
|
544
|
-
}
|
|
545
|
-
test(request, resolutionContext) {
|
|
546
|
-
return this.predicate(request, this.parse(request, resolutionContext), resolutionContext);
|
|
547
|
-
}
|
|
548
|
-
getPublicRequest(request, _parsedResult) {
|
|
549
|
-
return request;
|
|
550
|
-
}
|
|
551
|
-
markAsSkipped(shouldSkip = true) {
|
|
552
|
-
this.shouldSkip = shouldSkip;
|
|
553
|
-
}
|
|
554
|
-
async run(request, resolutionContext) {
|
|
555
|
-
if (this.shouldSkip) {
|
|
556
|
-
return null;
|
|
557
|
-
}
|
|
558
|
-
const parsedResult = this.parse(request, resolutionContext);
|
|
559
|
-
const shouldIntercept = this.predicate(request, parsedResult, resolutionContext);
|
|
560
|
-
if (!shouldIntercept) {
|
|
561
|
-
return null;
|
|
562
|
-
}
|
|
563
|
-
const publicRequest = this.getPublicRequest(request, parsedResult);
|
|
564
|
-
const executeResolver = this.wrapResolver(this.resolver);
|
|
565
|
-
const mockedResponse = await executeResolver(publicRequest, response, this.ctx);
|
|
566
|
-
return this.createExecutionResult(parsedResult, publicRequest, mockedResponse);
|
|
567
|
-
}
|
|
568
|
-
wrapResolver(resolver) {
|
|
569
|
-
return async (req, res, ctx) => {
|
|
570
|
-
const result = this.resolverGenerator || await resolver(req, res, ctx);
|
|
571
|
-
if (isIterable(result)) {
|
|
572
|
-
const { value, done } = result[Symbol.iterator]().next();
|
|
573
|
-
const nextResponse = await value;
|
|
574
|
-
if (!nextResponse && done) {
|
|
575
|
-
return this.resolverGeneratorResult;
|
|
576
|
-
}
|
|
577
|
-
if (!this.resolverGenerator) {
|
|
578
|
-
this.resolverGenerator = result;
|
|
579
|
-
}
|
|
580
|
-
this.resolverGeneratorResult = nextResponse;
|
|
581
|
-
return nextResponse;
|
|
582
|
-
}
|
|
583
|
-
return result;
|
|
584
|
-
};
|
|
585
|
-
}
|
|
586
|
-
createExecutionResult(parsedResult, request, response2) {
|
|
587
|
-
return {
|
|
588
|
-
handler: this,
|
|
589
|
-
parsedResult: parsedResult || null,
|
|
590
|
-
request,
|
|
591
|
-
response: response2 || null
|
|
592
|
-
};
|
|
593
|
-
}
|
|
594
|
-
};
|
|
595
|
-
function passthrough() {
|
|
596
|
-
return {
|
|
597
|
-
status: 101,
|
|
598
|
-
statusText: "Continue",
|
|
599
|
-
headers: new import_headers_polyfill4.Headers(),
|
|
600
|
-
body: null,
|
|
601
|
-
passthrough: true,
|
|
602
|
-
once: false
|
|
603
|
-
};
|
|
604
|
-
}
|
|
605
|
-
|
|
606
|
-
// src/utils/request/setRequestCookies.ts
|
|
450
|
+
// src/utils/request/MockedRequest.ts
|
|
607
451
|
var cookieUtils3 = __toESM(require("cookie"));
|
|
608
452
|
var import_cookies = require("@mswjs/cookies");
|
|
453
|
+
var import_interceptors = require("@mswjs/interceptors");
|
|
454
|
+
var import_bufferUtils = require("@mswjs/interceptors/lib/utils/bufferUtils");
|
|
455
|
+
var import_lib = require("headers-polyfill/lib");
|
|
609
456
|
|
|
610
457
|
// src/utils/request/getRequestCookies.ts
|
|
611
458
|
var cookieUtils2 = __toESM(require("cookie"));
|
|
@@ -629,28 +476,11 @@ function getRequestCookies(request) {
|
|
|
629
476
|
}
|
|
630
477
|
}
|
|
631
478
|
|
|
632
|
-
// src/utils/request/setRequestCookies.ts
|
|
633
|
-
function setRequestCookies(request) {
|
|
634
|
-
var _a;
|
|
635
|
-
const requestCookiesString = request.headers.get("cookie");
|
|
636
|
-
import_cookies.store.hydrate();
|
|
637
|
-
const cookiesFromStore = Array.from((_a = import_cookies.store.get(__spreadProps(__spreadValues({}, request), { url: request.url.toString() }))) == null ? void 0 : _a.entries()).reduce((cookies, [name, { value }]) => {
|
|
638
|
-
return Object.assign(cookies, { [name.trim()]: value });
|
|
639
|
-
}, {});
|
|
640
|
-
const cookiesFromDocument = getRequestCookies(request);
|
|
641
|
-
const forwardedCookies = __spreadValues(__spreadValues({}, cookiesFromDocument), cookiesFromStore);
|
|
642
|
-
for (const [name, value] of Object.entries(forwardedCookies)) {
|
|
643
|
-
request.headers.append("cookie", `${name}=${value}`);
|
|
644
|
-
}
|
|
645
|
-
const ownCookies = requestCookiesString ? cookieUtils3.parse(requestCookiesString) : {};
|
|
646
|
-
request.cookies = __spreadValues(__spreadValues(__spreadValues({}, request.cookies), forwardedCookies), ownCookies);
|
|
647
|
-
}
|
|
648
|
-
|
|
649
479
|
// src/utils/internal/parseMultipartData.ts
|
|
650
|
-
var
|
|
480
|
+
var import_headers_polyfill3 = require("headers-polyfill");
|
|
651
481
|
function parseContentHeaders(headersString) {
|
|
652
482
|
var _a, _b;
|
|
653
|
-
const headers = (0,
|
|
483
|
+
const headers = (0, import_headers_polyfill3.stringToHeaders)(headersString);
|
|
654
484
|
const contentType = headers.get("content-type") || "text/plain";
|
|
655
485
|
const disposition = headers.get("content-disposition");
|
|
656
486
|
if (!disposition) {
|
|
@@ -729,39 +559,67 @@ function isStringEqual(actual, expected) {
|
|
|
729
559
|
return actual.toLowerCase() === expected.toLowerCase();
|
|
730
560
|
}
|
|
731
561
|
|
|
732
|
-
// src/utils/request/
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
562
|
+
// src/utils/request/MockedRequest.ts
|
|
563
|
+
var MockedRequest = class extends import_interceptors.IsomorphicRequest {
|
|
564
|
+
constructor(url, init = {}) {
|
|
565
|
+
super(url, init);
|
|
566
|
+
if (init.id) {
|
|
567
|
+
this.id = init.id;
|
|
568
|
+
}
|
|
569
|
+
this.cache = init.cache || "default";
|
|
570
|
+
this.destination = init.destination || "";
|
|
571
|
+
this.integrity = init.integrity || "";
|
|
572
|
+
this.keepalive = init.keepalive || false;
|
|
573
|
+
this.mode = init.mode || "cors";
|
|
574
|
+
this.priority = init.priority || "auto";
|
|
575
|
+
this.redirect = init.redirect || "follow";
|
|
576
|
+
this.referrer = init.referrer || "";
|
|
577
|
+
this.referrerPolicy = init.referrerPolicy || "no-referrer";
|
|
578
|
+
this.cookies = init.cookies || this.getCookies();
|
|
579
|
+
}
|
|
580
|
+
get body() {
|
|
581
|
+
const text2 = (0, import_bufferUtils.decodeBuffer)(this["_body"]);
|
|
582
|
+
const body2 = parseBody(text2, this.headers);
|
|
583
|
+
if (isStringEqual(this.method, "GET") && body2 === "") {
|
|
584
|
+
return void 0;
|
|
585
|
+
}
|
|
586
|
+
return body2;
|
|
736
587
|
}
|
|
737
|
-
|
|
738
|
-
|
|
588
|
+
passthrough() {
|
|
589
|
+
return {
|
|
590
|
+
status: 101,
|
|
591
|
+
statusText: "Continue",
|
|
592
|
+
headers: new import_lib.Headers(),
|
|
593
|
+
body: null,
|
|
594
|
+
passthrough: true,
|
|
595
|
+
once: false
|
|
596
|
+
};
|
|
597
|
+
}
|
|
598
|
+
getCookies() {
|
|
599
|
+
var _a;
|
|
600
|
+
const requestCookiesString = this.headers.get("cookie");
|
|
601
|
+
const ownCookies = requestCookiesString ? cookieUtils3.parse(requestCookiesString) : {};
|
|
602
|
+
import_cookies.store.hydrate();
|
|
603
|
+
const cookiesFromStore = Array.from((_a = import_cookies.store.get(__spreadProps(__spreadValues({}, this), { url: this.url.href }))) == null ? void 0 : _a.entries()).reduce((cookies, [name, { value }]) => {
|
|
604
|
+
return Object.assign(cookies, { [name.trim()]: value });
|
|
605
|
+
}, {});
|
|
606
|
+
const cookiesFromDocument = getRequestCookies(this);
|
|
607
|
+
const forwardedCookies = __spreadValues(__spreadValues({}, cookiesFromDocument), cookiesFromStore);
|
|
608
|
+
for (const [name, value] of Object.entries(forwardedCookies)) {
|
|
609
|
+
this.headers.append("cookie", `${name}=${value}`);
|
|
610
|
+
}
|
|
611
|
+
return __spreadValues(__spreadValues({}, forwardedCookies), ownCookies);
|
|
612
|
+
}
|
|
613
|
+
};
|
|
739
614
|
|
|
740
615
|
// src/utils/request/parseWorkerRequest.ts
|
|
741
616
|
function parseWorkerRequest(rawRequest) {
|
|
742
|
-
const
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
referrer: rawRequest.referrer,
|
|
749
|
-
referrerPolicy: rawRequest.referrerPolicy,
|
|
750
|
-
redirect: rawRequest.redirect,
|
|
751
|
-
mode: rawRequest.mode,
|
|
752
|
-
params: {},
|
|
753
|
-
cookies: {},
|
|
754
|
-
integrity: rawRequest.integrity,
|
|
755
|
-
keepalive: rawRequest.keepalive,
|
|
756
|
-
destination: rawRequest.destination,
|
|
757
|
-
body: pruneGetRequestBody(rawRequest),
|
|
758
|
-
bodyUsed: rawRequest.bodyUsed,
|
|
759
|
-
headers: new import_headers_polyfill6.Headers(rawRequest.headers),
|
|
760
|
-
passthrough
|
|
761
|
-
};
|
|
762
|
-
setRequestCookies(request);
|
|
763
|
-
request.body = parseBody(request.body, request.headers);
|
|
764
|
-
return request;
|
|
617
|
+
const url = new URL(rawRequest.url);
|
|
618
|
+
const headers = new import_headers_polyfill4.Headers(rawRequest.headers);
|
|
619
|
+
return new MockedRequest(url, __spreadProps(__spreadValues({}, rawRequest), {
|
|
620
|
+
body: (0, import_interceptors2.encodeBuffer)(rawRequest.body || ""),
|
|
621
|
+
headers
|
|
622
|
+
}));
|
|
765
623
|
}
|
|
766
624
|
|
|
767
625
|
// src/utils/handleRequest.ts
|
|
@@ -940,14 +798,15 @@ function getTimestamp() {
|
|
|
940
798
|
// src/utils/logging/prepareRequest.ts
|
|
941
799
|
function prepareRequest(request) {
|
|
942
800
|
return __spreadProps(__spreadValues({}, request), {
|
|
801
|
+
body: request.body,
|
|
943
802
|
headers: request.headers.all()
|
|
944
803
|
});
|
|
945
804
|
}
|
|
946
805
|
|
|
947
806
|
// src/utils/logging/prepareResponse.ts
|
|
948
|
-
var
|
|
807
|
+
var import_headers_polyfill5 = require("headers-polyfill");
|
|
949
808
|
function prepareResponse(res) {
|
|
950
|
-
const responseHeaders = (0,
|
|
809
|
+
const responseHeaders = (0, import_headers_polyfill5.objectToHeaders)(res.headers);
|
|
951
810
|
return __spreadProps(__spreadValues({}, res), {
|
|
952
811
|
body: parseBody(res.body, responseHeaders)
|
|
953
812
|
});
|
|
@@ -1014,6 +873,151 @@ function matchRequestUrl(url, path, baseUrl) {
|
|
|
1014
873
|
};
|
|
1015
874
|
}
|
|
1016
875
|
|
|
876
|
+
// src/handlers/RequestHandler.ts
|
|
877
|
+
var import_headers_polyfill7 = require("headers-polyfill");
|
|
878
|
+
|
|
879
|
+
// src/response.ts
|
|
880
|
+
var import_headers_polyfill6 = require("headers-polyfill");
|
|
881
|
+
|
|
882
|
+
// src/utils/internal/compose.ts
|
|
883
|
+
function compose(...fns) {
|
|
884
|
+
return (...args) => {
|
|
885
|
+
return fns.reduceRight((leftFn, rightFn) => {
|
|
886
|
+
return leftFn instanceof Promise ? Promise.resolve(leftFn).then(rightFn) : rightFn(leftFn);
|
|
887
|
+
}, args[0]);
|
|
888
|
+
};
|
|
889
|
+
}
|
|
890
|
+
|
|
891
|
+
// src/response.ts
|
|
892
|
+
var defaultResponse = {
|
|
893
|
+
status: 200,
|
|
894
|
+
statusText: "OK",
|
|
895
|
+
body: null,
|
|
896
|
+
delay: 0,
|
|
897
|
+
once: false,
|
|
898
|
+
passthrough: false
|
|
899
|
+
};
|
|
900
|
+
var defaultResponseTransformers = [];
|
|
901
|
+
function createResponseComposition(responseOverrides, defaultTransformers = defaultResponseTransformers) {
|
|
902
|
+
return async (...transformers) => {
|
|
903
|
+
const initialResponse = Object.assign({}, defaultResponse, {
|
|
904
|
+
headers: new import_headers_polyfill6.Headers({
|
|
905
|
+
"x-powered-by": "msw"
|
|
906
|
+
})
|
|
907
|
+
}, responseOverrides);
|
|
908
|
+
const resolvedTransformers = [
|
|
909
|
+
...defaultTransformers,
|
|
910
|
+
...transformers
|
|
911
|
+
].filter(Boolean);
|
|
912
|
+
const resolvedResponse = resolvedTransformers.length > 0 ? compose(...resolvedTransformers)(initialResponse) : initialResponse;
|
|
913
|
+
return resolvedResponse;
|
|
914
|
+
};
|
|
915
|
+
}
|
|
916
|
+
var response = Object.assign(createResponseComposition(), {
|
|
917
|
+
once: createResponseComposition({ once: true }),
|
|
918
|
+
networkError(message) {
|
|
919
|
+
throw new NetworkError(message);
|
|
920
|
+
}
|
|
921
|
+
});
|
|
922
|
+
|
|
923
|
+
// src/utils/internal/getCallFrame.ts
|
|
924
|
+
var SOURCE_FRAME = /\/msw\/src\/(.+)/;
|
|
925
|
+
var BUILD_FRAME = /(node_modules)?[\/\\]lib[\/\\](umd|esm|iief|cjs)[\/\\]|^[^\/\\]*$/;
|
|
926
|
+
function getCallFrame(error2) {
|
|
927
|
+
const stack = error2.stack;
|
|
928
|
+
if (!stack) {
|
|
929
|
+
return;
|
|
930
|
+
}
|
|
931
|
+
const frames = stack.split("\n").slice(1);
|
|
932
|
+
const declarationFrame = frames.find((frame) => {
|
|
933
|
+
return !(SOURCE_FRAME.test(frame) || BUILD_FRAME.test(frame));
|
|
934
|
+
});
|
|
935
|
+
if (!declarationFrame) {
|
|
936
|
+
return;
|
|
937
|
+
}
|
|
938
|
+
const declarationPath = declarationFrame.replace(/\s*at [^()]*\(([^)]+)\)/, "$1").replace(/^@/, "");
|
|
939
|
+
return declarationPath;
|
|
940
|
+
}
|
|
941
|
+
|
|
942
|
+
// src/utils/internal/isIterable.ts
|
|
943
|
+
function isIterable(fn) {
|
|
944
|
+
if (!fn) {
|
|
945
|
+
return false;
|
|
946
|
+
}
|
|
947
|
+
return typeof fn[Symbol.iterator] == "function";
|
|
948
|
+
}
|
|
949
|
+
|
|
950
|
+
// src/handlers/RequestHandler.ts
|
|
951
|
+
var defaultContext = {
|
|
952
|
+
status,
|
|
953
|
+
set,
|
|
954
|
+
delay,
|
|
955
|
+
fetch
|
|
956
|
+
};
|
|
957
|
+
var RequestHandler = class {
|
|
958
|
+
constructor(options) {
|
|
959
|
+
this.shouldSkip = false;
|
|
960
|
+
this.ctx = options.ctx || defaultContext;
|
|
961
|
+
this.resolver = options.resolver;
|
|
962
|
+
const callFrame = getCallFrame(new Error());
|
|
963
|
+
this.info = __spreadProps(__spreadValues({}, options.info), {
|
|
964
|
+
callFrame
|
|
965
|
+
});
|
|
966
|
+
}
|
|
967
|
+
parse(_request, _resolutionContext) {
|
|
968
|
+
return null;
|
|
969
|
+
}
|
|
970
|
+
test(request, resolutionContext) {
|
|
971
|
+
return this.predicate(request, this.parse(request, resolutionContext), resolutionContext);
|
|
972
|
+
}
|
|
973
|
+
getPublicRequest(request, _parsedResult) {
|
|
974
|
+
return request;
|
|
975
|
+
}
|
|
976
|
+
markAsSkipped(shouldSkip = true) {
|
|
977
|
+
this.shouldSkip = shouldSkip;
|
|
978
|
+
}
|
|
979
|
+
async run(request, resolutionContext) {
|
|
980
|
+
if (this.shouldSkip) {
|
|
981
|
+
return null;
|
|
982
|
+
}
|
|
983
|
+
const parsedResult = this.parse(request, resolutionContext);
|
|
984
|
+
const shouldIntercept = this.predicate(request, parsedResult, resolutionContext);
|
|
985
|
+
if (!shouldIntercept) {
|
|
986
|
+
return null;
|
|
987
|
+
}
|
|
988
|
+
const publicRequest = this.getPublicRequest(request, parsedResult);
|
|
989
|
+
const executeResolver = this.wrapResolver(this.resolver);
|
|
990
|
+
const mockedResponse = await executeResolver(publicRequest, response, this.ctx);
|
|
991
|
+
return this.createExecutionResult(parsedResult, publicRequest, mockedResponse);
|
|
992
|
+
}
|
|
993
|
+
wrapResolver(resolver) {
|
|
994
|
+
return async (req, res, ctx) => {
|
|
995
|
+
const result = this.resolverGenerator || await resolver(req, res, ctx);
|
|
996
|
+
if (isIterable(result)) {
|
|
997
|
+
const { value, done } = result[Symbol.iterator]().next();
|
|
998
|
+
const nextResponse = await value;
|
|
999
|
+
if (!nextResponse && done) {
|
|
1000
|
+
return this.resolverGeneratorResult;
|
|
1001
|
+
}
|
|
1002
|
+
if (!this.resolverGenerator) {
|
|
1003
|
+
this.resolverGenerator = result;
|
|
1004
|
+
}
|
|
1005
|
+
this.resolverGeneratorResult = nextResponse;
|
|
1006
|
+
return nextResponse;
|
|
1007
|
+
}
|
|
1008
|
+
return result;
|
|
1009
|
+
};
|
|
1010
|
+
}
|
|
1011
|
+
createExecutionResult(parsedResult, request, response2) {
|
|
1012
|
+
return {
|
|
1013
|
+
handler: this,
|
|
1014
|
+
parsedResult: parsedResult || null,
|
|
1015
|
+
request,
|
|
1016
|
+
response: response2 || null
|
|
1017
|
+
};
|
|
1018
|
+
}
|
|
1019
|
+
};
|
|
1020
|
+
|
|
1017
1021
|
// src/handlers/RestHandler.ts
|
|
1018
1022
|
var RESTMethods = /* @__PURE__ */ ((RESTMethods2) => {
|
|
1019
1023
|
RESTMethods2["HEAD"] = "HEAD";
|
|
@@ -1032,6 +1036,15 @@ var restContext = __spreadProps(__spreadValues({}, defaultContext), {
|
|
|
1032
1036
|
json,
|
|
1033
1037
|
xml
|
|
1034
1038
|
});
|
|
1039
|
+
var RestRequest = class extends MockedRequest {
|
|
1040
|
+
constructor(request, params) {
|
|
1041
|
+
super(request.url, __spreadProps(__spreadValues({}, request), {
|
|
1042
|
+
body: request["_body"]
|
|
1043
|
+
}));
|
|
1044
|
+
this.params = params;
|
|
1045
|
+
this.id = request.id;
|
|
1046
|
+
}
|
|
1047
|
+
};
|
|
1035
1048
|
var RestHandler = class extends RequestHandler {
|
|
1036
1049
|
constructor(method, path, resolver) {
|
|
1037
1050
|
super({
|
|
@@ -1065,9 +1078,7 @@ var RestHandler = class extends RequestHandler {
|
|
|
1065
1078
|
return matchRequestUrl(request.url, this.info.path, resolutionContext == null ? void 0 : resolutionContext.baseUrl);
|
|
1066
1079
|
}
|
|
1067
1080
|
getPublicRequest(request, parsedResult) {
|
|
1068
|
-
return
|
|
1069
|
-
params: parsedResult.params || {}
|
|
1070
|
-
});
|
|
1081
|
+
return new RestRequest(request, parsedResult.params || {});
|
|
1071
1082
|
}
|
|
1072
1083
|
predicate(request, parsedResult) {
|
|
1073
1084
|
const matchesMethod = this.info.method instanceof RegExp ? this.info.method.test(request.method) : isStringEqual(this.info.method, request.method);
|
|
@@ -1130,6 +1141,14 @@ function isDocumentNode(value) {
|
|
|
1130
1141
|
}
|
|
1131
1142
|
return typeof value === "object" && "kind" in value && "definitions" in value;
|
|
1132
1143
|
}
|
|
1144
|
+
var GraphQLRequest = class extends MockedRequest {
|
|
1145
|
+
constructor(request, variables) {
|
|
1146
|
+
super(request.url, __spreadProps(__spreadValues({}, request), {
|
|
1147
|
+
body: request["_body"]
|
|
1148
|
+
}));
|
|
1149
|
+
this.variables = variables;
|
|
1150
|
+
}
|
|
1151
|
+
};
|
|
1133
1152
|
var GraphQLHandler = class extends RequestHandler {
|
|
1134
1153
|
constructor(operationType, operationName, endpoint, resolver) {
|
|
1135
1154
|
let resolvedOperationName = operationName;
|
|
@@ -1159,9 +1178,7 @@ var GraphQLHandler = class extends RequestHandler {
|
|
|
1159
1178
|
return tryCatch(() => parseGraphQLRequest(request), (error2) => console.error(error2.message));
|
|
1160
1179
|
}
|
|
1161
1180
|
getPublicRequest(request, parsedResult) {
|
|
1162
|
-
return
|
|
1163
|
-
variables: (parsedResult == null ? void 0 : parsedResult.variables) || {}
|
|
1164
|
-
});
|
|
1181
|
+
return new GraphQLRequest(request, (parsedResult == null ? void 0 : parsedResult.variables) || {});
|
|
1165
1182
|
}
|
|
1166
1183
|
predicate(request, parsedResult) {
|
|
1167
1184
|
if (!parsedResult) {
|
|
@@ -1356,69 +1373,27 @@ async function handleRequest(request, handlers, options, emitter, handleRequestO
|
|
|
1356
1373
|
return transformedResponse;
|
|
1357
1374
|
}
|
|
1358
1375
|
|
|
1359
|
-
// src/setupWorker/start/utils/streamResponse.ts
|
|
1360
|
-
var import_outvariant3 = require("outvariant");
|
|
1361
|
-
async function streamResponse(operationChannel, messageChannel, mockedResponse) {
|
|
1362
|
-
const response2 = new Response(mockedResponse.body, mockedResponse);
|
|
1363
|
-
delete mockedResponse.body;
|
|
1364
|
-
messageChannel.send({
|
|
1365
|
-
type: "MOCK_RESPONSE_START",
|
|
1366
|
-
payload: mockedResponse
|
|
1367
|
-
});
|
|
1368
|
-
(0, import_outvariant3.invariant)(response2.body, "Failed to stream mocked response with no body");
|
|
1369
|
-
const reader = response2.body.getReader();
|
|
1370
|
-
while (true) {
|
|
1371
|
-
const { done, value } = await reader.read();
|
|
1372
|
-
if (!done) {
|
|
1373
|
-
operationChannel.postMessage({
|
|
1374
|
-
type: "MOCK_RESPONSE_CHUNK",
|
|
1375
|
-
payload: value
|
|
1376
|
-
});
|
|
1377
|
-
continue;
|
|
1378
|
-
}
|
|
1379
|
-
operationChannel.postMessage({
|
|
1380
|
-
type: "MOCK_RESPONSE_END"
|
|
1381
|
-
});
|
|
1382
|
-
operationChannel.close();
|
|
1383
|
-
reader.releaseLock();
|
|
1384
|
-
break;
|
|
1385
|
-
}
|
|
1386
|
-
}
|
|
1387
|
-
|
|
1388
|
-
// src/utils/internal/StrictBroadcastChannel.ts
|
|
1389
|
-
var ParentClass = typeof BroadcastChannel == "undefined" ? class UnsupportedEnvironment {
|
|
1390
|
-
constructor() {
|
|
1391
|
-
throw new Error("Cannot construct BroadcastChannel in a non-browser environment");
|
|
1392
|
-
}
|
|
1393
|
-
} : BroadcastChannel;
|
|
1394
|
-
var StrictBroadcastChannel = class extends ParentClass {
|
|
1395
|
-
postMessage(message) {
|
|
1396
|
-
return super.postMessage(message);
|
|
1397
|
-
}
|
|
1398
|
-
};
|
|
1399
|
-
|
|
1400
1376
|
// src/setupWorker/start/createRequestListener.ts
|
|
1401
1377
|
var createRequestListener = (context, options) => {
|
|
1402
1378
|
return async (event, message) => {
|
|
1403
|
-
const messageChannel =
|
|
1379
|
+
const messageChannel = new WorkerChannel(event.ports[0]);
|
|
1380
|
+
const request = parseWorkerRequest(message.payload);
|
|
1404
1381
|
try {
|
|
1405
|
-
const request = parseWorkerRequest(message.payload);
|
|
1406
|
-
const operationChannel = new StrictBroadcastChannel(`msw-response-stream-${request.id}`);
|
|
1407
1382
|
await handleRequest(request, context.requestHandlers, options, context.emitter, {
|
|
1408
1383
|
transformResponse,
|
|
1409
1384
|
onPassthroughResponse() {
|
|
1410
|
-
|
|
1411
|
-
type: "MOCK_NOT_FOUND"
|
|
1412
|
-
});
|
|
1385
|
+
messageChannel.postMessage("NOT_FOUND");
|
|
1413
1386
|
},
|
|
1414
|
-
onMockedResponse(response2) {
|
|
1415
|
-
if (response2.body
|
|
1416
|
-
|
|
1417
|
-
type: "MOCK_RESPONSE",
|
|
1418
|
-
payload: response2
|
|
1419
|
-
});
|
|
1387
|
+
async onMockedResponse(response2) {
|
|
1388
|
+
if (response2.body instanceof ReadableStream) {
|
|
1389
|
+
throw new Error(devUtils.formatMessage('Failed to construct a mocked response with a "ReadableStream" body: mocked streams are not supported. Follow https://github.com/mswjs/msw/issues/1336 for more details.'));
|
|
1420
1390
|
}
|
|
1421
|
-
|
|
1391
|
+
const responseInstance = new Response(response2.body, response2);
|
|
1392
|
+
const responseBodyBuffer = await responseInstance.arrayBuffer();
|
|
1393
|
+
const responseBody = response2.body == null ? null : responseBodyBuffer;
|
|
1394
|
+
messageChannel.postMessage("MOCK_RESPONSE", __spreadProps(__spreadValues({}, response2), {
|
|
1395
|
+
body: responseBody
|
|
1396
|
+
}), [responseBodyBuffer]);
|
|
1422
1397
|
},
|
|
1423
1398
|
onMockedResponseSent(response2, { handler, publicRequest, parsedRequest }) {
|
|
1424
1399
|
if (options.quiet) {
|
|
@@ -1429,25 +1404,29 @@ var createRequestListener = (context, options) => {
|
|
|
1429
1404
|
});
|
|
1430
1405
|
} catch (error2) {
|
|
1431
1406
|
if (error2 instanceof NetworkError) {
|
|
1432
|
-
|
|
1433
|
-
|
|
1434
|
-
|
|
1435
|
-
name: error2.name,
|
|
1436
|
-
message: error2.message
|
|
1437
|
-
}
|
|
1407
|
+
messageChannel.postMessage("NETWORK_ERROR", {
|
|
1408
|
+
name: error2.name,
|
|
1409
|
+
message: error2.message
|
|
1438
1410
|
});
|
|
1411
|
+
return;
|
|
1439
1412
|
}
|
|
1440
1413
|
if (error2 instanceof Error) {
|
|
1441
|
-
|
|
1442
|
-
|
|
1443
|
-
|
|
1444
|
-
|
|
1445
|
-
|
|
1446
|
-
|
|
1447
|
-
|
|
1448
|
-
|
|
1449
|
-
|
|
1450
|
-
|
|
1414
|
+
devUtils.error(`Uncaught exception in the request handler for "%s %s":
|
|
1415
|
+
|
|
1416
|
+
%s
|
|
1417
|
+
|
|
1418
|
+
This exception has been gracefully handled as a 500 response, however, it's strongly recommended to resolve this error, as it indicates a mistake in your code. If you wish to mock an error response, please see this guide: https://mswjs.io/docs/recipes/mocking-error-responses`, request.method, request.url, error2);
|
|
1419
|
+
messageChannel.postMessage("MOCK_RESPONSE", {
|
|
1420
|
+
status: 500,
|
|
1421
|
+
statusText: "Request Handler Error",
|
|
1422
|
+
headers: {
|
|
1423
|
+
"Content-Type": "application/json"
|
|
1424
|
+
},
|
|
1425
|
+
body: JSON.stringify({
|
|
1426
|
+
name: error2.name,
|
|
1427
|
+
message: error2.message,
|
|
1428
|
+
stack: error2.stack
|
|
1429
|
+
})
|
|
1451
1430
|
});
|
|
1452
1431
|
}
|
|
1453
1432
|
}
|
|
@@ -1467,8 +1446,8 @@ function transformResponse(response2) {
|
|
|
1467
1446
|
async function requestIntegrityCheck(context, serviceWorker) {
|
|
1468
1447
|
context.workerChannel.send("INTEGRITY_CHECK_REQUEST");
|
|
1469
1448
|
const { payload: actualChecksum } = await context.events.once("INTEGRITY_CHECK_RESPONSE");
|
|
1470
|
-
if (actualChecksum !== "
|
|
1471
|
-
throw new Error(`Currently active Service Worker (${actualChecksum}) is behind the latest published one (${"
|
|
1449
|
+
if (actualChecksum !== "b3066ef78c2f9090b4ce87e874965995") {
|
|
1450
|
+
throw new Error(`Currently active Service Worker (${actualChecksum}) is behind the latest published one (${"b3066ef78c2f9090b4ce87e874965995"}).`);
|
|
1472
1451
|
}
|
|
1473
1452
|
return serviceWorker;
|
|
1474
1453
|
}
|
|
@@ -1646,43 +1625,18 @@ function prepareStartHandler(handler, context) {
|
|
|
1646
1625
|
}
|
|
1647
1626
|
|
|
1648
1627
|
// src/setupWorker/start/createFallbackRequestListener.ts
|
|
1649
|
-
var
|
|
1628
|
+
var import_interceptors3 = require("@mswjs/interceptors");
|
|
1650
1629
|
var import_fetch3 = require("@mswjs/interceptors/lib/interceptors/fetch");
|
|
1651
1630
|
var import_XMLHttpRequest = require("@mswjs/interceptors/lib/interceptors/XMLHttpRequest");
|
|
1652
|
-
|
|
1653
|
-
// src/utils/request/parseIsomorphicRequest.ts
|
|
1654
|
-
function parseIsomorphicRequest(request) {
|
|
1655
|
-
const mockedRequest = {
|
|
1656
|
-
id: request.id,
|
|
1657
|
-
url: request.url,
|
|
1658
|
-
method: request.method,
|
|
1659
|
-
body: parseBody(request.body, request.headers),
|
|
1660
|
-
credentials: request.credentials || "same-origin",
|
|
1661
|
-
headers: request.headers,
|
|
1662
|
-
cookies: {},
|
|
1663
|
-
redirect: "manual",
|
|
1664
|
-
referrer: "",
|
|
1665
|
-
keepalive: false,
|
|
1666
|
-
cache: "default",
|
|
1667
|
-
mode: "cors",
|
|
1668
|
-
referrerPolicy: "no-referrer",
|
|
1669
|
-
integrity: "",
|
|
1670
|
-
destination: "document",
|
|
1671
|
-
bodyUsed: false,
|
|
1672
|
-
passthrough
|
|
1673
|
-
};
|
|
1674
|
-
setRequestCookies(mockedRequest);
|
|
1675
|
-
return mockedRequest;
|
|
1676
|
-
}
|
|
1677
|
-
|
|
1678
|
-
// src/setupWorker/start/createFallbackRequestListener.ts
|
|
1679
1631
|
function createFallbackRequestListener(context, options) {
|
|
1680
|
-
const interceptor = new
|
|
1632
|
+
const interceptor = new import_interceptors3.BatchInterceptor({
|
|
1681
1633
|
name: "fallback",
|
|
1682
1634
|
interceptors: [new import_fetch3.FetchInterceptor(), new import_XMLHttpRequest.XMLHttpRequestInterceptor()]
|
|
1683
1635
|
});
|
|
1684
1636
|
interceptor.on("request", async (request) => {
|
|
1685
|
-
const mockedRequest =
|
|
1637
|
+
const mockedRequest = new MockedRequest(request.url, __spreadProps(__spreadValues({}, request), {
|
|
1638
|
+
body: await request.arrayBuffer()
|
|
1639
|
+
}));
|
|
1686
1640
|
const response2 = await handleRequest(mockedRequest, context.requestHandlers, options, context.emitter, {
|
|
1687
1641
|
transformResponse(response3) {
|
|
1688
1642
|
return {
|
|
@@ -1767,7 +1721,7 @@ function setupWorker(...requestHandlers) {
|
|
|
1767
1721
|
if (event.source !== context.worker) {
|
|
1768
1722
|
return;
|
|
1769
1723
|
}
|
|
1770
|
-
const message =
|
|
1724
|
+
const message = event.data;
|
|
1771
1725
|
if (!message) {
|
|
1772
1726
|
return;
|
|
1773
1727
|
}
|
|
@@ -1800,7 +1754,7 @@ function setupWorker(...requestHandlers) {
|
|
|
1800
1754
|
return new Promise((resolve, reject) => {
|
|
1801
1755
|
const handleIncomingMessage = (event) => {
|
|
1802
1756
|
try {
|
|
1803
|
-
const message =
|
|
1757
|
+
const message = event.data;
|
|
1804
1758
|
if (message.type === eventType) {
|
|
1805
1759
|
resolve(message);
|
|
1806
1760
|
}
|
|
@@ -1911,6 +1865,7 @@ var graphql = __spreadProps(__spreadValues({}, standardGraphQLHandlers), {
|
|
|
1911
1865
|
// Annotate the CommonJS export names for ESM import in node:
|
|
1912
1866
|
0 && (module.exports = {
|
|
1913
1867
|
GraphQLHandler,
|
|
1868
|
+
MockedRequest,
|
|
1914
1869
|
RESTMethods,
|
|
1915
1870
|
RequestHandler,
|
|
1916
1871
|
RestHandler,
|
|
@@ -1924,7 +1879,6 @@ var graphql = __spreadProps(__spreadValues({}, standardGraphQLHandlers), {
|
|
|
1924
1879
|
graphqlContext,
|
|
1925
1880
|
handleRequest,
|
|
1926
1881
|
matchRequestUrl,
|
|
1927
|
-
parseIsomorphicRequest,
|
|
1928
1882
|
response,
|
|
1929
1883
|
rest,
|
|
1930
1884
|
restContext,
|