msw 2.0.14 → 2.1.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 (133) hide show
  1. package/cli/index.js +11 -3
  2. package/cli/init.js +126 -73
  3. package/config/scripts/postinstall.js +8 -20
  4. package/lib/browser/index.js +111 -176
  5. package/lib/browser/index.js.map +1 -1
  6. package/lib/browser/index.mjs +111 -179
  7. package/lib/browser/index.mjs.map +1 -1
  8. package/lib/core/{GraphQLHandler-JB4bsrLF.d.ts → GraphQLHandler-LZ8jH42-.d.ts} +1 -1
  9. package/lib/core/{GraphQLHandler-mT-MmgeB.d.mts → GraphQLHandler-c0pfLv8e.d.mts} +1 -1
  10. package/lib/core/HttpResponse.d.mts +1 -1
  11. package/lib/core/HttpResponse.d.ts +1 -1
  12. package/lib/core/{RequestHandler-rmY-HeFN.d.ts → RequestHandler-SdFwV297.d.ts} +8 -1
  13. package/lib/core/{RequestHandler-YiqamK0M.d.mts → RequestHandler-hEwneHZE.d.mts} +8 -1
  14. package/lib/core/SetupApi.d.mts +1 -1
  15. package/lib/core/SetupApi.d.ts +1 -1
  16. package/lib/core/SetupApi.js +5 -0
  17. package/lib/core/SetupApi.js.map +1 -1
  18. package/lib/core/SetupApi.mjs +5 -0
  19. package/lib/core/SetupApi.mjs.map +1 -1
  20. package/lib/core/delay.js +24 -46
  21. package/lib/core/delay.js.map +1 -1
  22. package/lib/core/delay.mjs +24 -46
  23. package/lib/core/delay.mjs.map +1 -1
  24. package/lib/core/graphql.d.mts +2 -2
  25. package/lib/core/graphql.d.ts +2 -2
  26. package/lib/core/graphql.js +3 -19
  27. package/lib/core/graphql.js.map +1 -1
  28. package/lib/core/graphql.mjs +3 -21
  29. package/lib/core/graphql.mjs.map +1 -1
  30. package/lib/core/handlers/GraphQLHandler.d.mts +2 -2
  31. package/lib/core/handlers/GraphQLHandler.d.ts +2 -2
  32. package/lib/core/handlers/GraphQLHandler.js +51 -77
  33. package/lib/core/handlers/GraphQLHandler.js.map +1 -1
  34. package/lib/core/handlers/GraphQLHandler.mjs +51 -77
  35. package/lib/core/handlers/GraphQLHandler.mjs.map +1 -1
  36. package/lib/core/handlers/HttpHandler.d.mts +1 -1
  37. package/lib/core/handlers/HttpHandler.d.ts +1 -1
  38. package/lib/core/handlers/HttpHandler.js +29 -55
  39. package/lib/core/handlers/HttpHandler.js.map +1 -1
  40. package/lib/core/handlers/HttpHandler.mjs +29 -55
  41. package/lib/core/handlers/HttpHandler.mjs.map +1 -1
  42. package/lib/core/handlers/RequestHandler.d.mts +1 -1
  43. package/lib/core/handlers/RequestHandler.d.ts +1 -1
  44. package/lib/core/handlers/RequestHandler.js +79 -103
  45. package/lib/core/handlers/RequestHandler.js.map +1 -1
  46. package/lib/core/handlers/RequestHandler.mjs +79 -105
  47. package/lib/core/handlers/RequestHandler.mjs.map +1 -1
  48. package/lib/core/http.d.mts +1 -1
  49. package/lib/core/http.d.ts +1 -1
  50. package/lib/core/index.d.mts +2 -2
  51. package/lib/core/index.d.ts +2 -2
  52. package/lib/core/sharedOptions.d.mts +1 -1
  53. package/lib/core/sharedOptions.d.ts +1 -1
  54. package/lib/core/utils/HttpResponse/decorators.d.mts +1 -1
  55. package/lib/core/utils/HttpResponse/decorators.d.ts +1 -1
  56. package/lib/core/utils/HttpResponse/decorators.js +7 -24
  57. package/lib/core/utils/HttpResponse/decorators.js.map +1 -1
  58. package/lib/core/utils/HttpResponse/decorators.mjs +7 -26
  59. package/lib/core/utils/HttpResponse/decorators.mjs.map +1 -1
  60. package/lib/core/utils/getResponse.d.mts +1 -1
  61. package/lib/core/utils/getResponse.d.ts +1 -1
  62. package/lib/core/utils/getResponse.js +11 -26
  63. package/lib/core/utils/getResponse.js.map +1 -1
  64. package/lib/core/utils/getResponse.mjs +11 -26
  65. package/lib/core/utils/getResponse.mjs.map +1 -1
  66. package/lib/core/utils/handleRequest.d.mts +1 -1
  67. package/lib/core/utils/handleRequest.d.ts +1 -1
  68. package/lib/core/utils/handleRequest.js +49 -72
  69. package/lib/core/utils/handleRequest.js.map +1 -1
  70. package/lib/core/utils/handleRequest.mjs +49 -72
  71. package/lib/core/utils/handleRequest.mjs.map +1 -1
  72. package/lib/core/utils/internal/Disposable.js +3 -27
  73. package/lib/core/utils/internal/Disposable.js.map +1 -1
  74. package/lib/core/utils/internal/Disposable.mjs +3 -27
  75. package/lib/core/utils/internal/Disposable.mjs.map +1 -1
  76. package/lib/core/utils/internal/parseGraphQLRequest.d.mts +2 -2
  77. package/lib/core/utils/internal/parseGraphQLRequest.d.ts +2 -2
  78. package/lib/core/utils/internal/parseGraphQLRequest.js +72 -112
  79. package/lib/core/utils/internal/parseGraphQLRequest.js.map +1 -1
  80. package/lib/core/utils/internal/parseGraphQLRequest.mjs +72 -113
  81. package/lib/core/utils/internal/parseGraphQLRequest.mjs.map +1 -1
  82. package/lib/core/utils/internal/parseMultipartData.d.mts +1 -1
  83. package/lib/core/utils/internal/parseMultipartData.d.ts +1 -1
  84. package/lib/core/utils/internal/parseMultipartData.js +3 -4
  85. package/lib/core/utils/internal/parseMultipartData.js.map +1 -1
  86. package/lib/core/utils/internal/parseMultipartData.mjs +3 -4
  87. package/lib/core/utils/internal/parseMultipartData.mjs.map +1 -1
  88. package/lib/core/utils/internal/requestHandlerUtils.d.mts +1 -1
  89. package/lib/core/utils/internal/requestHandlerUtils.d.ts +1 -1
  90. package/lib/core/utils/internal/tryCatch.js +1 -1
  91. package/lib/core/utils/internal/tryCatch.js.map +1 -1
  92. package/lib/core/utils/internal/tryCatch.mjs +1 -1
  93. package/lib/core/utils/internal/tryCatch.mjs.map +1 -1
  94. package/lib/core/utils/logging/serializeRequest.js +9 -31
  95. package/lib/core/utils/logging/serializeRequest.js.map +1 -1
  96. package/lib/core/utils/logging/serializeRequest.mjs +9 -31
  97. package/lib/core/utils/logging/serializeRequest.mjs.map +1 -1
  98. package/lib/core/utils/logging/serializeResponse.js +11 -33
  99. package/lib/core/utils/logging/serializeResponse.js.map +1 -1
  100. package/lib/core/utils/logging/serializeResponse.mjs +11 -33
  101. package/lib/core/utils/logging/serializeResponse.mjs.map +1 -1
  102. package/lib/core/utils/request/getRequestCookies.js +9 -18
  103. package/lib/core/utils/request/getRequestCookies.js.map +1 -1
  104. package/lib/core/utils/request/getRequestCookies.mjs +9 -20
  105. package/lib/core/utils/request/getRequestCookies.mjs.map +1 -1
  106. package/lib/core/utils/request/onUnhandledRequest.d.mts +1 -1
  107. package/lib/core/utils/request/onUnhandledRequest.d.ts +1 -1
  108. package/lib/core/utils/request/onUnhandledRequest.js +62 -84
  109. package/lib/core/utils/request/onUnhandledRequest.js.map +1 -1
  110. package/lib/core/utils/request/onUnhandledRequest.mjs +62 -84
  111. package/lib/core/utils/request/onUnhandledRequest.mjs.map +1 -1
  112. package/lib/core/utils/request/readResponseCookies.js +1 -18
  113. package/lib/core/utils/request/readResponseCookies.js.map +1 -1
  114. package/lib/core/utils/request/readResponseCookies.mjs +1 -20
  115. package/lib/core/utils/request/readResponseCookies.mjs.map +1 -1
  116. package/lib/iife/index.js +678 -958
  117. package/lib/iife/index.js.map +1 -1
  118. package/lib/mockServiceWorker.js +2 -2
  119. package/lib/native/index.js +5 -23
  120. package/lib/native/index.js.map +1 -1
  121. package/lib/native/index.mjs +5 -24
  122. package/lib/native/index.mjs.map +1 -1
  123. package/lib/node/index.js +5 -23
  124. package/lib/node/index.js.map +1 -1
  125. package/lib/node/index.mjs +5 -24
  126. package/lib/node/index.mjs.map +1 -1
  127. package/package.json +32 -37
  128. package/src/browser/setupWorker/setupWorker.ts +6 -0
  129. package/src/browser/setupWorker/start/createStartHandler.ts +0 -8
  130. package/src/core/handlers/RequestHandler.ts +23 -4
  131. package/src/core/utils/getResponse.ts +12 -6
  132. package/src/core/utils/handleRequest.test.ts +20 -0
  133. package/src/core/utils/handleRequest.ts +4 -3
@@ -1,81 +1,58 @@
1
- var __async = (__this, __arguments, generator) => {
2
- return new Promise((resolve, reject) => {
3
- var fulfilled = (value) => {
4
- try {
5
- step(generator.next(value));
6
- } catch (e) {
7
- reject(e);
8
- }
9
- };
10
- var rejected = (value) => {
11
- try {
12
- step(generator.throw(value));
13
- } catch (e) {
14
- reject(e);
15
- }
16
- };
17
- var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
18
- step((generator = generator.apply(__this, __arguments)).next());
19
- });
20
- };
21
1
  import { until } from "@open-draft/until";
22
2
  import { getResponse } from './getResponse.mjs';
23
3
  import { onUnhandledRequest } from './request/onUnhandledRequest.mjs';
24
4
  import { readResponseCookies } from './request/readResponseCookies.mjs';
25
- function handleRequest(request, requestId, handlers, options, emitter, handleRequestOptions) {
26
- return __async(this, null, function* () {
27
- var _a, _b, _c, _d, _e, _f;
28
- emitter.emit("request:start", { request, requestId });
29
- if (request.headers.get("x-msw-intention") === "bypass") {
30
- emitter.emit("request:end", { request, requestId });
31
- (_a = handleRequestOptions == null ? void 0 : handleRequestOptions.onPassthroughResponse) == null ? void 0 : _a.call(handleRequestOptions, request);
32
- return;
33
- }
34
- const lookupResult = yield until(() => {
35
- return getResponse(
36
- request,
37
- handlers,
38
- handleRequestOptions == null ? void 0 : handleRequestOptions.resolutionContext
39
- );
40
- });
41
- if (lookupResult.error) {
42
- emitter.emit("unhandledException", {
43
- error: lookupResult.error,
44
- request,
45
- requestId
46
- });
47
- throw lookupResult.error;
48
- }
49
- if (!lookupResult.data) {
50
- yield onUnhandledRequest(request, handlers, options.onUnhandledRequest);
51
- emitter.emit("request:unhandled", { request, requestId });
52
- emitter.emit("request:end", { request, requestId });
53
- (_b = handleRequestOptions == null ? void 0 : handleRequestOptions.onPassthroughResponse) == null ? void 0 : _b.call(handleRequestOptions, request);
54
- return;
55
- }
56
- const { response } = lookupResult.data;
57
- if (!response) {
58
- emitter.emit("request:end", { request, requestId });
59
- (_c = handleRequestOptions == null ? void 0 : handleRequestOptions.onPassthroughResponse) == null ? void 0 : _c.call(handleRequestOptions, request);
60
- return;
61
- }
62
- if (response.status === 302 && response.headers.get("x-msw-intention") === "passthrough") {
63
- emitter.emit("request:end", { request, requestId });
64
- (_d = handleRequestOptions == null ? void 0 : handleRequestOptions.onPassthroughResponse) == null ? void 0 : _d.call(handleRequestOptions, request);
65
- return;
66
- }
67
- readResponseCookies(request, response);
68
- emitter.emit("request:match", { request, requestId });
69
- const requiredLookupResult = lookupResult.data;
70
- const transformedResponse = ((_e = handleRequestOptions == null ? void 0 : handleRequestOptions.transformResponse) == null ? void 0 : _e.call(handleRequestOptions, response)) || response;
71
- (_f = handleRequestOptions == null ? void 0 : handleRequestOptions.onMockedResponse) == null ? void 0 : _f.call(
72
- handleRequestOptions,
73
- transformedResponse,
74
- requiredLookupResult
75
- );
5
+ async function handleRequest(request, requestId, handlers, options, emitter, handleRequestOptions) {
6
+ emitter.emit("request:start", { request, requestId });
7
+ if (request.headers.get("x-msw-intention") === "bypass") {
76
8
  emitter.emit("request:end", { request, requestId });
77
- return transformedResponse;
9
+ handleRequestOptions?.onPassthroughResponse?.(request);
10
+ return;
11
+ }
12
+ const lookupResult = await until(() => {
13
+ return getResponse({
14
+ request,
15
+ requestId,
16
+ handlers,
17
+ resolutionContext: handleRequestOptions?.resolutionContext
18
+ });
78
19
  });
20
+ if (lookupResult.error) {
21
+ emitter.emit("unhandledException", {
22
+ error: lookupResult.error,
23
+ request,
24
+ requestId
25
+ });
26
+ throw lookupResult.error;
27
+ }
28
+ if (!lookupResult.data) {
29
+ await onUnhandledRequest(request, handlers, options.onUnhandledRequest);
30
+ emitter.emit("request:unhandled", { request, requestId });
31
+ emitter.emit("request:end", { request, requestId });
32
+ handleRequestOptions?.onPassthroughResponse?.(request);
33
+ return;
34
+ }
35
+ const { response } = lookupResult.data;
36
+ if (!response) {
37
+ emitter.emit("request:end", { request, requestId });
38
+ handleRequestOptions?.onPassthroughResponse?.(request);
39
+ return;
40
+ }
41
+ if (response.status === 302 && response.headers.get("x-msw-intention") === "passthrough") {
42
+ emitter.emit("request:end", { request, requestId });
43
+ handleRequestOptions?.onPassthroughResponse?.(request);
44
+ return;
45
+ }
46
+ readResponseCookies(request, response);
47
+ emitter.emit("request:match", { request, requestId });
48
+ const requiredLookupResult = lookupResult.data;
49
+ const transformedResponse = handleRequestOptions?.transformResponse?.(response) || response;
50
+ handleRequestOptions?.onMockedResponse?.(
51
+ transformedResponse,
52
+ requiredLookupResult
53
+ );
54
+ emitter.emit("request:end", { request, requestId });
55
+ return transformedResponse;
79
56
  }
80
57
  export {
81
58
  handleRequest
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/core/utils/handleRequest.ts"],"sourcesContent":["import { until } from '@open-draft/until'\nimport { Emitter } from 'strict-event-emitter'\nimport { RequestHandler } from '../handlers/RequestHandler'\nimport { LifeCycleEventsMap, SharedOptions } from '../sharedOptions'\nimport { RequiredDeep } from '../typeUtils'\nimport { ResponseLookupResult, getResponse } from './getResponse'\nimport { onUnhandledRequest } from './request/onUnhandledRequest'\nimport { readResponseCookies } from './request/readResponseCookies'\n\nexport interface HandleRequestOptions {\n /**\n * `resolutionContext` is not part of the general public api\n * but is exposed to aid in creating extensions like\n * `@mswjs/http-middleware`.\n */\n resolutionContext?: {\n /**\n * A base url to use when resolving relative urls.\n * @note This is primarily used by the `@mswjs/http-middleware`\n * to resolve relative urls in the context of the running server\n */\n baseUrl?: string\n }\n\n /**\n * Transforms a `MockedResponse` instance returned from a handler\n * to a response instance supported by the lower tooling (i.e. interceptors).\n */\n transformResponse?(response: Response): Response\n\n /**\n * Invoked whenever a request is performed as-is.\n */\n onPassthroughResponse?(request: Request): void\n\n /**\n * Invoked when the mocked response is ready to be sent.\n */\n onMockedResponse?(\n response: Response,\n handler: RequiredDeep<ResponseLookupResult>,\n ): void\n}\n\nexport async function handleRequest(\n request: Request,\n requestId: string,\n handlers: Array<RequestHandler>,\n options: RequiredDeep<SharedOptions>,\n emitter: Emitter<LifeCycleEventsMap>,\n handleRequestOptions?: HandleRequestOptions,\n): Promise<Response | undefined> {\n emitter.emit('request:start', { request, requestId })\n\n // Perform bypassed requests (i.e. issued via \"ctx.fetch\") as-is.\n if (request.headers.get('x-msw-intention') === 'bypass') {\n emitter.emit('request:end', { request, requestId })\n handleRequestOptions?.onPassthroughResponse?.(request)\n return\n }\n\n // Resolve a mocked response from the list of request handlers.\n const lookupResult = await until(() => {\n return getResponse(\n request,\n handlers,\n handleRequestOptions?.resolutionContext,\n )\n })\n\n if (lookupResult.error) {\n // Allow developers to react to unhandled exceptions in request handlers.\n emitter.emit('unhandledException', {\n error: lookupResult.error,\n request,\n requestId,\n })\n throw lookupResult.error\n }\n\n // If the handler lookup returned nothing, no request handler was found\n // matching this request. Report the request as unhandled.\n if (!lookupResult.data) {\n await onUnhandledRequest(request, handlers, options.onUnhandledRequest)\n emitter.emit('request:unhandled', { request, requestId })\n emitter.emit('request:end', { request, requestId })\n handleRequestOptions?.onPassthroughResponse?.(request)\n return\n }\n\n const { response } = lookupResult.data\n\n // When the handled request returned no mocked response, warn the developer,\n // as it may be an oversight on their part. Perform the request as-is.\n if (!response) {\n emitter.emit('request:end', { request, requestId })\n handleRequestOptions?.onPassthroughResponse?.(request)\n return\n }\n\n // Perform the request as-is when the developer explicitly returned \"req.passthrough()\".\n // This produces no warning as the request was handled.\n if (\n response.status === 302 &&\n response.headers.get('x-msw-intention') === 'passthrough'\n ) {\n emitter.emit('request:end', { request, requestId })\n handleRequestOptions?.onPassthroughResponse?.(request)\n return\n }\n\n // Store all the received response cookies in the virtual cookie store.\n readResponseCookies(request, response)\n\n emitter.emit('request:match', { request, requestId })\n\n const requiredLookupResult =\n lookupResult.data as RequiredDeep<ResponseLookupResult>\n\n const transformedResponse =\n handleRequestOptions?.transformResponse?.(response) ||\n (response as any as Response)\n\n handleRequestOptions?.onMockedResponse?.(\n transformedResponse,\n requiredLookupResult,\n )\n\n emitter.emit('request:end', { request, requestId })\n\n return transformedResponse\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA,SAAS,aAAa;AAKtB,SAA+B,mBAAmB;AAClD,SAAS,0BAA0B;AACnC,SAAS,2BAA2B;AAqCpC,SAAsB,cACpB,SACA,WACA,UACA,SACA,SACA,sBAC+B;AAAA;AAnDjC;AAoDE,YAAQ,KAAK,iBAAiB,EAAE,SAAS,UAAU,CAAC;AAGpD,QAAI,QAAQ,QAAQ,IAAI,iBAAiB,MAAM,UAAU;AACvD,cAAQ,KAAK,eAAe,EAAE,SAAS,UAAU,CAAC;AAClD,yEAAsB,0BAAtB,8CAA8C;AAC9C;AAAA,IACF;AAGA,UAAM,eAAe,MAAM,MAAM,MAAM;AACrC,aAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA,6DAAsB;AAAA,MACxB;AAAA,IACF,CAAC;AAED,QAAI,aAAa,OAAO;AAEtB,cAAQ,KAAK,sBAAsB;AAAA,QACjC,OAAO,aAAa;AAAA,QACpB;AAAA,QACA;AAAA,MACF,CAAC;AACD,YAAM,aAAa;AAAA,IACrB;AAIA,QAAI,CAAC,aAAa,MAAM;AACtB,YAAM,mBAAmB,SAAS,UAAU,QAAQ,kBAAkB;AACtE,cAAQ,KAAK,qBAAqB,EAAE,SAAS,UAAU,CAAC;AACxD,cAAQ,KAAK,eAAe,EAAE,SAAS,UAAU,CAAC;AAClD,yEAAsB,0BAAtB,8CAA8C;AAC9C;AAAA,IACF;AAEA,UAAM,EAAE,SAAS,IAAI,aAAa;AAIlC,QAAI,CAAC,UAAU;AACb,cAAQ,KAAK,eAAe,EAAE,SAAS,UAAU,CAAC;AAClD,yEAAsB,0BAAtB,8CAA8C;AAC9C;AAAA,IACF;AAIA,QACE,SAAS,WAAW,OACpB,SAAS,QAAQ,IAAI,iBAAiB,MAAM,eAC5C;AACA,cAAQ,KAAK,eAAe,EAAE,SAAS,UAAU,CAAC;AAClD,yEAAsB,0BAAtB,8CAA8C;AAC9C;AAAA,IACF;AAGA,wBAAoB,SAAS,QAAQ;AAErC,YAAQ,KAAK,iBAAiB,EAAE,SAAS,UAAU,CAAC;AAEpD,UAAM,uBACJ,aAAa;AAEf,UAAM,wBACJ,kEAAsB,sBAAtB,8CAA0C,cACzC;AAEH,uEAAsB,qBAAtB;AAAA;AAAA,MACE;AAAA,MACA;AAAA;AAGF,YAAQ,KAAK,eAAe,EAAE,SAAS,UAAU,CAAC;AAElD,WAAO;AAAA,EACT;AAAA;","names":[]}
1
+ {"version":3,"sources":["../../../src/core/utils/handleRequest.ts"],"sourcesContent":["import { until } from '@open-draft/until'\nimport { Emitter } from 'strict-event-emitter'\nimport { RequestHandler } from '../handlers/RequestHandler'\nimport { LifeCycleEventsMap, SharedOptions } from '../sharedOptions'\nimport { RequiredDeep } from '../typeUtils'\nimport { ResponseLookupResult, getResponse } from './getResponse'\nimport { onUnhandledRequest } from './request/onUnhandledRequest'\nimport { readResponseCookies } from './request/readResponseCookies'\n\nexport interface HandleRequestOptions {\n /**\n * `resolutionContext` is not part of the general public api\n * but is exposed to aid in creating extensions like\n * `@mswjs/http-middleware`.\n */\n resolutionContext?: {\n /**\n * A base url to use when resolving relative urls.\n * @note This is primarily used by the `@mswjs/http-middleware`\n * to resolve relative urls in the context of the running server\n */\n baseUrl?: string\n }\n\n /**\n * Transforms a `MockedResponse` instance returned from a handler\n * to a response instance supported by the lower tooling (i.e. interceptors).\n */\n transformResponse?(response: Response): Response\n\n /**\n * Invoked whenever a request is performed as-is.\n */\n onPassthroughResponse?(request: Request): void\n\n /**\n * Invoked when the mocked response is ready to be sent.\n */\n onMockedResponse?(\n response: Response,\n handler: RequiredDeep<ResponseLookupResult>,\n ): void\n}\n\nexport async function handleRequest(\n request: Request,\n requestId: string,\n handlers: Array<RequestHandler>,\n options: RequiredDeep<SharedOptions>,\n emitter: Emitter<LifeCycleEventsMap>,\n handleRequestOptions?: HandleRequestOptions,\n): Promise<Response | undefined> {\n emitter.emit('request:start', { request, requestId })\n\n // Perform bypassed requests (i.e. issued via \"ctx.fetch\") as-is.\n if (request.headers.get('x-msw-intention') === 'bypass') {\n emitter.emit('request:end', { request, requestId })\n handleRequestOptions?.onPassthroughResponse?.(request)\n return\n }\n\n // Resolve a mocked response from the list of request handlers.\n const lookupResult = await until(() => {\n return getResponse({\n request,\n requestId,\n handlers,\n resolutionContext: handleRequestOptions?.resolutionContext,\n })\n })\n\n if (lookupResult.error) {\n // Allow developers to react to unhandled exceptions in request handlers.\n emitter.emit('unhandledException', {\n error: lookupResult.error,\n request,\n requestId,\n })\n throw lookupResult.error\n }\n\n // If the handler lookup returned nothing, no request handler was found\n // matching this request. Report the request as unhandled.\n if (!lookupResult.data) {\n await onUnhandledRequest(request, handlers, options.onUnhandledRequest)\n emitter.emit('request:unhandled', { request, requestId })\n emitter.emit('request:end', { request, requestId })\n handleRequestOptions?.onPassthroughResponse?.(request)\n return\n }\n\n const { response } = lookupResult.data\n\n // When the handled request returned no mocked response, warn the developer,\n // as it may be an oversight on their part. Perform the request as-is.\n if (!response) {\n emitter.emit('request:end', { request, requestId })\n handleRequestOptions?.onPassthroughResponse?.(request)\n return\n }\n\n // Perform the request as-is when the developer explicitly returned \"req.passthrough()\".\n // This produces no warning as the request was handled.\n if (\n response.status === 302 &&\n response.headers.get('x-msw-intention') === 'passthrough'\n ) {\n emitter.emit('request:end', { request, requestId })\n handleRequestOptions?.onPassthroughResponse?.(request)\n return\n }\n\n // Store all the received response cookies in the virtual cookie store.\n readResponseCookies(request, response)\n\n emitter.emit('request:match', { request, requestId })\n\n const requiredLookupResult =\n lookupResult.data as RequiredDeep<ResponseLookupResult>\n\n const transformedResponse =\n handleRequestOptions?.transformResponse?.(response) ||\n (response as any as Response)\n\n handleRequestOptions?.onMockedResponse?.(\n transformedResponse,\n requiredLookupResult,\n )\n\n emitter.emit('request:end', { request, requestId })\n\n return transformedResponse\n}\n"],"mappings":"AAAA,SAAS,aAAa;AAKtB,SAA+B,mBAAmB;AAClD,SAAS,0BAA0B;AACnC,SAAS,2BAA2B;AAqCpC,eAAsB,cACpB,SACA,WACA,UACA,SACA,SACA,sBAC+B;AAC/B,UAAQ,KAAK,iBAAiB,EAAE,SAAS,UAAU,CAAC;AAGpD,MAAI,QAAQ,QAAQ,IAAI,iBAAiB,MAAM,UAAU;AACvD,YAAQ,KAAK,eAAe,EAAE,SAAS,UAAU,CAAC;AAClD,0BAAsB,wBAAwB,OAAO;AACrD;AAAA,EACF;AAGA,QAAM,eAAe,MAAM,MAAM,MAAM;AACrC,WAAO,YAAY;AAAA,MACjB;AAAA,MACA;AAAA,MACA;AAAA,MACA,mBAAmB,sBAAsB;AAAA,IAC3C,CAAC;AAAA,EACH,CAAC;AAED,MAAI,aAAa,OAAO;AAEtB,YAAQ,KAAK,sBAAsB;AAAA,MACjC,OAAO,aAAa;AAAA,MACpB;AAAA,MACA;AAAA,IACF,CAAC;AACD,UAAM,aAAa;AAAA,EACrB;AAIA,MAAI,CAAC,aAAa,MAAM;AACtB,UAAM,mBAAmB,SAAS,UAAU,QAAQ,kBAAkB;AACtE,YAAQ,KAAK,qBAAqB,EAAE,SAAS,UAAU,CAAC;AACxD,YAAQ,KAAK,eAAe,EAAE,SAAS,UAAU,CAAC;AAClD,0BAAsB,wBAAwB,OAAO;AACrD;AAAA,EACF;AAEA,QAAM,EAAE,SAAS,IAAI,aAAa;AAIlC,MAAI,CAAC,UAAU;AACb,YAAQ,KAAK,eAAe,EAAE,SAAS,UAAU,CAAC;AAClD,0BAAsB,wBAAwB,OAAO;AACrD;AAAA,EACF;AAIA,MACE,SAAS,WAAW,OACpB,SAAS,QAAQ,IAAI,iBAAiB,MAAM,eAC5C;AACA,YAAQ,KAAK,eAAe,EAAE,SAAS,UAAU,CAAC;AAClD,0BAAsB,wBAAwB,OAAO;AACrD;AAAA,EACF;AAGA,sBAAoB,SAAS,QAAQ;AAErC,UAAQ,KAAK,iBAAiB,EAAE,SAAS,UAAU,CAAC;AAEpD,QAAM,uBACJ,aAAa;AAEf,QAAM,sBACJ,sBAAsB,oBAAoB,QAAQ,KACjD;AAEH,wBAAsB;AAAA,IACpB;AAAA,IACA;AAAA,EACF;AAEA,UAAQ,KAAK,eAAe,EAAE,SAAS,UAAU,CAAC;AAElD,SAAO;AACT;","names":[]}
@@ -16,39 +16,15 @@ var __copyProps = (to, from, except, desc) => {
16
16
  return to;
17
17
  };
18
18
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
- var __async = (__this, __arguments, generator) => {
20
- return new Promise((resolve, reject) => {
21
- var fulfilled = (value) => {
22
- try {
23
- step(generator.next(value));
24
- } catch (e) {
25
- reject(e);
26
- }
27
- };
28
- var rejected = (value) => {
29
- try {
30
- step(generator.throw(value));
31
- } catch (e) {
32
- reject(e);
33
- }
34
- };
35
- var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
36
- step((generator = generator.apply(__this, __arguments)).next());
37
- });
38
- };
39
19
  var Disposable_exports = {};
40
20
  __export(Disposable_exports, {
41
21
  Disposable: () => Disposable
42
22
  });
43
23
  module.exports = __toCommonJS(Disposable_exports);
44
24
  class Disposable {
45
- constructor() {
46
- this.subscriptions = [];
47
- }
48
- dispose() {
49
- return __async(this, null, function* () {
50
- yield Promise.all(this.subscriptions.map((subscription) => subscription()));
51
- });
25
+ subscriptions = [];
26
+ async dispose() {
27
+ await Promise.all(this.subscriptions.map((subscription) => subscription()));
52
28
  }
53
29
  }
54
30
  //# sourceMappingURL=Disposable.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/core/utils/internal/Disposable.ts"],"sourcesContent":["export type DisposableSubscription = () => Promise<void> | void\n\nexport class Disposable {\n protected subscriptions: Array<DisposableSubscription> = []\n\n public async dispose() {\n await Promise.all(this.subscriptions.map((subscription) => subscription()))\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAEO,MAAM,WAAW;AAAA,EAAjB;AACL,SAAU,gBAA+C,CAAC;AAAA;AAAA,EAE7C,UAAU;AAAA;AACrB,YAAM,QAAQ,IAAI,KAAK,cAAc,IAAI,CAAC,iBAAiB,aAAa,CAAC,CAAC;AAAA,IAC5E;AAAA;AACF;","names":[]}
1
+ {"version":3,"sources":["../../../../src/core/utils/internal/Disposable.ts"],"sourcesContent":["export type DisposableSubscription = () => Promise<void> | void\n\nexport class Disposable {\n protected subscriptions: Array<DisposableSubscription> = []\n\n public async dispose() {\n await Promise.all(this.subscriptions.map((subscription) => subscription()))\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAEO,MAAM,WAAW;AAAA,EACZ,gBAA+C,CAAC;AAAA,EAE1D,MAAa,UAAU;AACrB,UAAM,QAAQ,IAAI,KAAK,cAAc,IAAI,CAAC,iBAAiB,aAAa,CAAC,CAAC;AAAA,EAC5E;AACF;","names":[]}
@@ -1,31 +1,7 @@
1
- var __async = (__this, __arguments, generator) => {
2
- return new Promise((resolve, reject) => {
3
- var fulfilled = (value) => {
4
- try {
5
- step(generator.next(value));
6
- } catch (e) {
7
- reject(e);
8
- }
9
- };
10
- var rejected = (value) => {
11
- try {
12
- step(generator.throw(value));
13
- } catch (e) {
14
- reject(e);
15
- }
16
- };
17
- var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
18
- step((generator = generator.apply(__this, __arguments)).next());
19
- });
20
- };
21
1
  class Disposable {
22
- constructor() {
23
- this.subscriptions = [];
24
- }
25
- dispose() {
26
- return __async(this, null, function* () {
27
- yield Promise.all(this.subscriptions.map((subscription) => subscription()));
28
- });
2
+ subscriptions = [];
3
+ async dispose() {
4
+ await Promise.all(this.subscriptions.map((subscription) => subscription()));
29
5
  }
30
6
  }
31
7
  export {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/core/utils/internal/Disposable.ts"],"sourcesContent":["export type DisposableSubscription = () => Promise<void> | void\n\nexport class Disposable {\n protected subscriptions: Array<DisposableSubscription> = []\n\n public async dispose() {\n await Promise.all(this.subscriptions.map((subscription) => subscription()))\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAEO,MAAM,WAAW;AAAA,EAAjB;AACL,SAAU,gBAA+C,CAAC;AAAA;AAAA,EAE7C,UAAU;AAAA;AACrB,YAAM,QAAQ,IAAI,KAAK,cAAc,IAAI,CAAC,iBAAiB,aAAa,CAAC,CAAC;AAAA,IAC5E;AAAA;AACF;","names":[]}
1
+ {"version":3,"sources":["../../../../src/core/utils/internal/Disposable.ts"],"sourcesContent":["export type DisposableSubscription = () => Promise<void> | void\n\nexport class Disposable {\n protected subscriptions: Array<DisposableSubscription> = []\n\n public async dispose() {\n await Promise.all(this.subscriptions.map((subscription) => subscription()))\n }\n}\n"],"mappings":"AAEO,MAAM,WAAW;AAAA,EACZ,gBAA+C,CAAC;AAAA,EAE1D,MAAa,UAAU;AACrB,UAAM,QAAQ,IAAI,KAAK,cAAc,IAAI,CAAC,iBAAiB,aAAa,CAAC,CAAC;AAAA,EAC5E;AACF;","names":[]}
@@ -1,5 +1,5 @@
1
1
  import 'graphql';
2
- export { j as GraphQLMultipartRequestBody, i as GraphQLParsedOperationsMap, h as ParsedGraphQLQuery, P as ParsedGraphQLRequest, p as parseDocumentNode, k as parseGraphQLRequest } from '../../GraphQLHandler-mT-MmgeB.mjs';
3
- import '../../RequestHandler-YiqamK0M.mjs';
2
+ export { j as GraphQLMultipartRequestBody, i as GraphQLParsedOperationsMap, h as ParsedGraphQLQuery, P as ParsedGraphQLRequest, p as parseDocumentNode, k as parseGraphQLRequest } from '../../GraphQLHandler-c0pfLv8e.mjs';
3
+ import '../../RequestHandler-hEwneHZE.mjs';
4
4
  import '../../typeUtils.mjs';
5
5
  import '../matching/matchRequestUrl.mjs';
@@ -1,5 +1,5 @@
1
1
  import 'graphql';
2
- export { j as GraphQLMultipartRequestBody, i as GraphQLParsedOperationsMap, h as ParsedGraphQLQuery, P as ParsedGraphQLRequest, p as parseDocumentNode, k as parseGraphQLRequest } from '../../GraphQLHandler-JB4bsrLF.js';
3
- import '../../RequestHandler-rmY-HeFN.js';
2
+ export { j as GraphQLMultipartRequestBody, i as GraphQLParsedOperationsMap, h as ParsedGraphQLQuery, P as ParsedGraphQLRequest, p as parseDocumentNode, k as parseGraphQLRequest } from '../../GraphQLHandler-LZ8jH42-.js';
3
+ import '../../RequestHandler-SdFwV297.js';
4
4
  import '../../typeUtils.js';
5
5
  import '../matching/matchRequestUrl.js';
@@ -2,21 +2,7 @@
2
2
  var __defProp = Object.defineProperty;
3
3
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
4
  var __getOwnPropNames = Object.getOwnPropertyNames;
5
- var __getOwnPropSymbols = Object.getOwnPropertySymbols;
6
5
  var __hasOwnProp = Object.prototype.hasOwnProperty;
7
- var __propIsEnum = Object.prototype.propertyIsEnumerable;
8
- var __objRest = (source, exclude) => {
9
- var target = {};
10
- for (var prop in source)
11
- if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0)
12
- target[prop] = source[prop];
13
- if (source != null && __getOwnPropSymbols)
14
- for (var prop of __getOwnPropSymbols(source)) {
15
- if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop))
16
- target[prop] = source[prop];
17
- }
18
- return target;
19
- };
20
6
  var __export = (target, all) => {
21
7
  for (var name in all)
22
8
  __defProp(target, name, { get: all[name], enumerable: true });
@@ -30,26 +16,6 @@ var __copyProps = (to, from, except, desc) => {
30
16
  return to;
31
17
  };
32
18
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
33
- var __async = (__this, __arguments, generator) => {
34
- return new Promise((resolve, reject) => {
35
- var fulfilled = (value) => {
36
- try {
37
- step(generator.next(value));
38
- } catch (e) {
39
- reject(e);
40
- }
41
- };
42
- var rejected = (value) => {
43
- try {
44
- step(generator.throw(value));
45
- } catch (e) {
46
- reject(e);
47
- }
48
- };
49
- var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
50
- step((generator = generator.apply(__this, __arguments)).next());
51
- });
52
- };
53
19
  var parseGraphQLRequest_exports = {};
54
20
  __export(parseGraphQLRequest_exports, {
55
21
  parseDocumentNode: () => parseDocumentNode,
@@ -62,13 +28,12 @@ var import_devUtils = require("./devUtils.js");
62
28
  var import_jsonParse = require("./jsonParse.js");
63
29
  var import_parseMultipartData = require("./parseMultipartData.js");
64
30
  function parseDocumentNode(node) {
65
- var _a;
66
31
  const operationDef = node.definitions.find((definition) => {
67
32
  return definition.kind === "OperationDefinition";
68
33
  });
69
34
  return {
70
- operationType: operationDef == null ? void 0 : operationDef.operation,
71
- operationName: (_a = operationDef == null ? void 0 : operationDef.name) == null ? void 0 : _a.value
35
+ operationType: operationDef?.operation,
36
+ operationName: operationDef?.name?.value
72
37
  };
73
38
  }
74
39
  function parseQuery(query) {
@@ -100,86 +65,81 @@ function extractMultipartVariables(variables, map, files) {
100
65
  }
101
66
  return operations.variables;
102
67
  }
103
- function getGraphQLInput(request) {
104
- return __async(this, null, function* () {
105
- var _a;
106
- switch (request.method) {
107
- case "GET": {
108
- const url = new URL(request.url);
109
- const query = url.searchParams.get("query");
110
- const variables = url.searchParams.get("variables") || "";
68
+ async function getGraphQLInput(request) {
69
+ switch (request.method) {
70
+ case "GET": {
71
+ const url = new URL(request.url);
72
+ const query = url.searchParams.get("query");
73
+ const variables = url.searchParams.get("variables") || "";
74
+ return {
75
+ query,
76
+ variables: (0, import_jsonParse.jsonParse)(variables)
77
+ };
78
+ }
79
+ case "POST": {
80
+ const requestClone = request.clone();
81
+ if (request.headers.get("content-type")?.includes("multipart/form-data")) {
82
+ const responseJson = (0, import_parseMultipartData.parseMultipartData)(
83
+ await requestClone.text(),
84
+ request.headers
85
+ );
86
+ if (!responseJson) {
87
+ return null;
88
+ }
89
+ const { operations, map, ...files } = responseJson;
90
+ const parsedOperations = (0, import_jsonParse.jsonParse)(
91
+ operations
92
+ ) || {};
93
+ if (!parsedOperations.query) {
94
+ return null;
95
+ }
96
+ const parsedMap = (0, import_jsonParse.jsonParse)(map || "") || {};
97
+ const variables = parsedOperations.variables ? extractMultipartVariables(
98
+ parsedOperations.variables,
99
+ parsedMap,
100
+ files
101
+ ) : {};
111
102
  return {
112
- query,
113
- variables: (0, import_jsonParse.jsonParse)(variables)
103
+ query: parsedOperations.query,
104
+ variables
114
105
  };
115
106
  }
116
- case "POST": {
117
- const requestClone = request.clone();
118
- if ((_a = request.headers.get("content-type")) == null ? void 0 : _a.includes("multipart/form-data")) {
119
- const responseJson = (0, import_parseMultipartData.parseMultipartData)(
120
- yield requestClone.text(),
121
- request.headers
122
- );
123
- if (!responseJson) {
124
- return null;
125
- }
126
- const _b = responseJson, { operations, map } = _b, files = __objRest(_b, ["operations", "map"]);
127
- const parsedOperations = (0, import_jsonParse.jsonParse)(
128
- operations
129
- ) || {};
130
- if (!parsedOperations.query) {
131
- return null;
132
- }
133
- const parsedMap = (0, import_jsonParse.jsonParse)(map || "") || {};
134
- const variables = parsedOperations.variables ? extractMultipartVariables(
135
- parsedOperations.variables,
136
- parsedMap,
137
- files
138
- ) : {};
139
- return {
140
- query: parsedOperations.query,
141
- variables
142
- };
143
- }
144
- const requestJson = yield requestClone.json().catch(() => null);
145
- if (requestJson == null ? void 0 : requestJson.query) {
146
- const { query, variables } = requestJson;
147
- return {
148
- query,
149
- variables
150
- };
151
- }
107
+ const requestJson = await requestClone.json().catch(() => null);
108
+ if (requestJson?.query) {
109
+ const { query, variables } = requestJson;
110
+ return {
111
+ query,
112
+ variables
113
+ };
152
114
  }
153
- default:
154
- return null;
155
115
  }
156
- });
116
+ default:
117
+ return null;
118
+ }
157
119
  }
158
- function parseGraphQLRequest(request) {
159
- return __async(this, null, function* () {
160
- const input = yield getGraphQLInput(request);
161
- if (!input || !input.query) {
162
- return;
163
- }
164
- const { query, variables } = input;
165
- const parsedResult = parseQuery(query);
166
- if (parsedResult instanceof Error) {
167
- const requestPublicUrl = (0, import_getPublicUrlFromRequest.getPublicUrlFromRequest)(request);
168
- throw new Error(
169
- import_devUtils.devUtils.formatMessage(
170
- 'Failed to intercept a GraphQL request to "%s %s": cannot parse query. See the error message from the parser below.\n\n%s',
171
- request.method,
172
- requestPublicUrl,
173
- parsedResult.message
174
- )
175
- );
176
- }
177
- return {
178
- query: input.query,
179
- operationType: parsedResult.operationType,
180
- operationName: parsedResult.operationName,
181
- variables
182
- };
183
- });
120
+ async function parseGraphQLRequest(request) {
121
+ const input = await getGraphQLInput(request);
122
+ if (!input || !input.query) {
123
+ return;
124
+ }
125
+ const { query, variables } = input;
126
+ const parsedResult = parseQuery(query);
127
+ if (parsedResult instanceof Error) {
128
+ const requestPublicUrl = (0, import_getPublicUrlFromRequest.getPublicUrlFromRequest)(request);
129
+ throw new Error(
130
+ import_devUtils.devUtils.formatMessage(
131
+ 'Failed to intercept a GraphQL request to "%s %s": cannot parse query. See the error message from the parser below.\n\n%s',
132
+ request.method,
133
+ requestPublicUrl,
134
+ parsedResult.message
135
+ )
136
+ );
137
+ }
138
+ return {
139
+ query: input.query,
140
+ operationType: parsedResult.operationType,
141
+ operationName: parsedResult.operationName,
142
+ variables
143
+ };
184
144
  }
185
145
  //# sourceMappingURL=parseGraphQLRequest.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/core/utils/internal/parseGraphQLRequest.ts"],"sourcesContent":["import type {\n DocumentNode,\n OperationDefinitionNode,\n OperationTypeNode,\n} from 'graphql'\nimport { parse } from 'graphql'\nimport type { GraphQLVariables } from '../../handlers/GraphQLHandler'\nimport { getPublicUrlFromRequest } from '../request/getPublicUrlFromRequest'\nimport { devUtils } from './devUtils'\nimport { jsonParse } from './jsonParse'\nimport { parseMultipartData } from './parseMultipartData'\n\ninterface GraphQLInput {\n query: string | null\n variables?: GraphQLVariables\n}\n\nexport interface ParsedGraphQLQuery {\n operationType: OperationTypeNode\n operationName?: string\n}\n\nexport type ParsedGraphQLRequest<\n VariablesType extends GraphQLVariables = GraphQLVariables,\n> =\n | (ParsedGraphQLQuery & {\n query: string\n variables?: VariablesType\n })\n | undefined\n\nexport function parseDocumentNode(node: DocumentNode): ParsedGraphQLQuery {\n const operationDef = node.definitions.find((definition) => {\n return definition.kind === 'OperationDefinition'\n }) as OperationDefinitionNode\n\n return {\n operationType: operationDef?.operation,\n operationName: operationDef?.name?.value,\n }\n}\n\nfunction parseQuery(query: string): ParsedGraphQLQuery | Error {\n try {\n const ast = parse(query)\n return parseDocumentNode(ast)\n } catch (error) {\n return error as Error\n }\n}\n\nexport type GraphQLParsedOperationsMap = Record<string, string[]>\nexport type GraphQLMultipartRequestBody = {\n operations: string\n map?: string\n} & {\n [fileName: string]: File\n}\n\nfunction extractMultipartVariables<VariablesType extends GraphQLVariables>(\n variables: VariablesType,\n map: GraphQLParsedOperationsMap,\n files: Record<string, File>,\n) {\n const operations = { variables }\n\n for (const [key, pathArray] of Object.entries(map)) {\n if (!(key in files)) {\n throw new Error(`Given files do not have a key '${key}' .`)\n }\n\n for (const dotPath of pathArray) {\n const [lastPath, ...reversedPaths] = dotPath.split('.').reverse()\n const paths = reversedPaths.reverse()\n let target: Record<string, any> = operations\n\n for (const path of paths) {\n if (!(path in target)) {\n throw new Error(`Property '${paths}' is not in operations.`)\n }\n\n target = target[path]\n }\n\n target[lastPath] = files[key]\n }\n }\n\n return operations.variables\n}\n\nasync function getGraphQLInput(request: Request): Promise<GraphQLInput | null> {\n switch (request.method) {\n case 'GET': {\n const url = new URL(request.url)\n const query = url.searchParams.get('query')\n const variables = url.searchParams.get('variables') || ''\n\n return {\n query,\n variables: jsonParse(variables),\n }\n }\n\n case 'POST': {\n // Clone the request so we could read its body without locking\n // the body stream to the downward consumers.\n const requestClone = request.clone()\n\n // Handle multipart body GraphQL operations.\n if (\n request.headers.get('content-type')?.includes('multipart/form-data')\n ) {\n const responseJson = parseMultipartData<GraphQLMultipartRequestBody>(\n await requestClone.text(),\n request.headers,\n )\n\n if (!responseJson) {\n return null\n }\n\n const { operations, map, ...files } = responseJson\n const parsedOperations =\n jsonParse<{ query?: string; variables?: GraphQLVariables }>(\n operations,\n ) || {}\n\n if (!parsedOperations.query) {\n return null\n }\n\n const parsedMap = jsonParse<GraphQLParsedOperationsMap>(map || '') || {}\n const variables = parsedOperations.variables\n ? extractMultipartVariables(\n parsedOperations.variables,\n parsedMap,\n files,\n )\n : {}\n\n return {\n query: parsedOperations.query,\n variables,\n }\n }\n\n // Handle plain POST GraphQL operations.\n const requestJson: {\n query: string\n variables?: GraphQLVariables\n operations?: any /** @todo Annotate this */\n } = await requestClone.json().catch(() => null)\n\n if (requestJson?.query) {\n const { query, variables } = requestJson\n\n return {\n query,\n variables,\n }\n }\n }\n\n default:\n return null\n }\n}\n\n/**\n * Determines if a given request can be considered a GraphQL request.\n * Does not parse the query and does not guarantee its validity.\n */\nexport async function parseGraphQLRequest(\n request: Request,\n): Promise<ParsedGraphQLRequest> {\n const input = await getGraphQLInput(request)\n\n if (!input || !input.query) {\n return\n }\n\n const { query, variables } = input\n const parsedResult = parseQuery(query)\n\n if (parsedResult instanceof Error) {\n const requestPublicUrl = getPublicUrlFromRequest(request)\n\n throw new Error(\n devUtils.formatMessage(\n 'Failed to intercept a GraphQL request to \"%s %s\": cannot parse query. See the error message from the parser below.\\n\\n%s',\n request.method,\n requestPublicUrl,\n parsedResult.message,\n ),\n )\n }\n\n return {\n query: input.query,\n operationType: parsedResult.operationType,\n operationName: parsedResult.operationName,\n variables,\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../../src/core/utils/internal/parseGraphQLRequest.ts"],"sourcesContent":["import type {\n DocumentNode,\n OperationDefinitionNode,\n OperationTypeNode,\n} from 'graphql'\nimport { parse } from 'graphql'\nimport type { GraphQLVariables } from '../../handlers/GraphQLHandler'\nimport { getPublicUrlFromRequest } from '../request/getPublicUrlFromRequest'\nimport { devUtils } from './devUtils'\nimport { jsonParse } from './jsonParse'\nimport { parseMultipartData } from './parseMultipartData'\n\ninterface GraphQLInput {\n query: string | null\n variables?: GraphQLVariables\n}\n\nexport interface ParsedGraphQLQuery {\n operationType: OperationTypeNode\n operationName?: string\n}\n\nexport type ParsedGraphQLRequest<\n VariablesType extends GraphQLVariables = GraphQLVariables,\n> =\n | (ParsedGraphQLQuery & {\n query: string\n variables?: VariablesType\n })\n | undefined\n\nexport function parseDocumentNode(node: DocumentNode): ParsedGraphQLQuery {\n const operationDef = node.definitions.find((definition) => {\n return definition.kind === 'OperationDefinition'\n }) as OperationDefinitionNode\n\n return {\n operationType: operationDef?.operation,\n operationName: operationDef?.name?.value,\n }\n}\n\nfunction parseQuery(query: string): ParsedGraphQLQuery | Error {\n try {\n const ast = parse(query)\n return parseDocumentNode(ast)\n } catch (error) {\n return error as Error\n }\n}\n\nexport type GraphQLParsedOperationsMap = Record<string, string[]>\nexport type GraphQLMultipartRequestBody = {\n operations: string\n map?: string\n} & {\n [fileName: string]: File\n}\n\nfunction extractMultipartVariables<VariablesType extends GraphQLVariables>(\n variables: VariablesType,\n map: GraphQLParsedOperationsMap,\n files: Record<string, File>,\n) {\n const operations = { variables }\n\n for (const [key, pathArray] of Object.entries(map)) {\n if (!(key in files)) {\n throw new Error(`Given files do not have a key '${key}' .`)\n }\n\n for (const dotPath of pathArray) {\n const [lastPath, ...reversedPaths] = dotPath.split('.').reverse()\n const paths = reversedPaths.reverse()\n let target: Record<string, any> = operations\n\n for (const path of paths) {\n if (!(path in target)) {\n throw new Error(`Property '${paths}' is not in operations.`)\n }\n\n target = target[path]\n }\n\n target[lastPath] = files[key]\n }\n }\n\n return operations.variables\n}\n\nasync function getGraphQLInput(request: Request): Promise<GraphQLInput | null> {\n switch (request.method) {\n case 'GET': {\n const url = new URL(request.url)\n const query = url.searchParams.get('query')\n const variables = url.searchParams.get('variables') || ''\n\n return {\n query,\n variables: jsonParse(variables),\n }\n }\n\n case 'POST': {\n // Clone the request so we could read its body without locking\n // the body stream to the downward consumers.\n const requestClone = request.clone()\n\n // Handle multipart body GraphQL operations.\n if (\n request.headers.get('content-type')?.includes('multipart/form-data')\n ) {\n const responseJson = parseMultipartData<GraphQLMultipartRequestBody>(\n await requestClone.text(),\n request.headers,\n )\n\n if (!responseJson) {\n return null\n }\n\n const { operations, map, ...files } = responseJson\n const parsedOperations =\n jsonParse<{ query?: string; variables?: GraphQLVariables }>(\n operations,\n ) || {}\n\n if (!parsedOperations.query) {\n return null\n }\n\n const parsedMap = jsonParse<GraphQLParsedOperationsMap>(map || '') || {}\n const variables = parsedOperations.variables\n ? extractMultipartVariables(\n parsedOperations.variables,\n parsedMap,\n files,\n )\n : {}\n\n return {\n query: parsedOperations.query,\n variables,\n }\n }\n\n // Handle plain POST GraphQL operations.\n const requestJson: {\n query: string\n variables?: GraphQLVariables\n operations?: any /** @todo Annotate this */\n } = await requestClone.json().catch(() => null)\n\n if (requestJson?.query) {\n const { query, variables } = requestJson\n\n return {\n query,\n variables,\n }\n }\n }\n\n default:\n return null\n }\n}\n\n/**\n * Determines if a given request can be considered a GraphQL request.\n * Does not parse the query and does not guarantee its validity.\n */\nexport async function parseGraphQLRequest(\n request: Request,\n): Promise<ParsedGraphQLRequest> {\n const input = await getGraphQLInput(request)\n\n if (!input || !input.query) {\n return\n }\n\n const { query, variables } = input\n const parsedResult = parseQuery(query)\n\n if (parsedResult instanceof Error) {\n const requestPublicUrl = getPublicUrlFromRequest(request)\n\n throw new Error(\n devUtils.formatMessage(\n 'Failed to intercept a GraphQL request to \"%s %s\": cannot parse query. See the error message from the parser below.\\n\\n%s',\n request.method,\n requestPublicUrl,\n parsedResult.message,\n ),\n )\n }\n\n return {\n query: input.query,\n operationType: parsedResult.operationType,\n operationName: parsedResult.operationName,\n variables,\n }\n}\n"],"mappings":"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","names":[]}