@modern-js/plugin-data-loader 2.69.5 → 3.0.0-alpha.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 (47) hide show
  1. package/dist/cjs/cli/createRequest.js +122 -141
  2. package/dist/cjs/cli/data.js +129 -148
  3. package/dist/cjs/cli/generateClient.js +52 -52
  4. package/dist/cjs/cli/loader.js +63 -62
  5. package/dist/cjs/common/constants.js +41 -31
  6. package/dist/cjs/runtime/errors.js +84 -89
  7. package/dist/cjs/runtime/index.js +143 -155
  8. package/dist/cjs/runtime/response.js +66 -77
  9. package/dist/esm/cli/createRequest.mjs +93 -0
  10. package/dist/esm/cli/data.mjs +111 -0
  11. package/dist/esm/cli/generateClient.mjs +22 -0
  12. package/dist/esm/cli/loader.mjs +34 -0
  13. package/dist/esm/common/constants.mjs +4 -0
  14. package/dist/esm/runtime/errors.mjs +52 -0
  15. package/dist/esm/runtime/index.mjs +114 -0
  16. package/dist/esm/runtime/response.mjs +42 -0
  17. package/dist/esm-node/cli/createRequest.mjs +93 -0
  18. package/dist/esm-node/cli/data.mjs +111 -0
  19. package/dist/esm-node/cli/generateClient.mjs +22 -0
  20. package/dist/esm-node/cli/loader.mjs +34 -0
  21. package/dist/esm-node/common/constants.mjs +4 -0
  22. package/dist/esm-node/runtime/errors.mjs +52 -0
  23. package/dist/esm-node/runtime/index.mjs +114 -0
  24. package/dist/esm-node/runtime/response.mjs +42 -0
  25. package/dist/types/cli/createRequest.d.ts +1 -2
  26. package/dist/types/cli/loader.d.ts +2 -2
  27. package/dist/types/runtime/errors.d.ts +1 -1
  28. package/dist/types/runtime/response.d.ts +1 -1
  29. package/package.json +22 -26
  30. package/rslib.config.mts +4 -0
  31. package/rstest.config.ts +18 -0
  32. package/dist/esm/cli/createRequest.js +0 -297
  33. package/dist/esm/cli/data.js +0 -491
  34. package/dist/esm/cli/generateClient.js +0 -21
  35. package/dist/esm/cli/loader.js +0 -93
  36. package/dist/esm/common/constants.js +0 -8
  37. package/dist/esm/runtime/errors.js +0 -90
  38. package/dist/esm/runtime/index.js +0 -191
  39. package/dist/esm/runtime/response.js +0 -107
  40. package/dist/esm-node/cli/createRequest.js +0 -126
  41. package/dist/esm-node/cli/data.js +0 -140
  42. package/dist/esm-node/cli/generateClient.js +0 -32
  43. package/dist/esm-node/cli/loader.js +0 -47
  44. package/dist/esm-node/common/constants.js +0 -8
  45. package/dist/esm-node/runtime/errors.js +0 -75
  46. package/dist/esm-node/runtime/index.js +0 -142
  47. package/dist/esm-node/runtime/response.js +0 -63
@@ -1,169 +1,157 @@
1
1
  "use strict";
2
- var __defProp = Object.defineProperty;
3
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
- var __getOwnPropNames = Object.getOwnPropertyNames;
5
- var __hasOwnProp = Object.prototype.hasOwnProperty;
6
- var __export = (target, all) => {
7
- for (var name in all)
8
- __defProp(target, name, { get: all[name], enumerable: true });
9
- };
10
- var __copyProps = (to, from, except, desc) => {
11
- if (from && typeof from === "object" || typeof from === "function") {
12
- for (let key of __getOwnPropNames(from))
13
- if (!__hasOwnProp.call(to, key) && key !== except)
14
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
- }
16
- return to;
17
- };
18
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
- var runtime_exports = {};
20
- __export(runtime_exports, {
21
- handleRequest: () => handleRequest,
22
- hasFileExtension: () => hasFileExtension,
23
- isRedirectResponse: () => isRedirectResponse,
24
- isResponse: () => isResponse
2
+ var __webpack_require__ = {};
3
+ (()=>{
4
+ __webpack_require__.d = (exports1, definition)=>{
5
+ for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
6
+ enumerable: true,
7
+ get: definition[key]
8
+ });
9
+ };
10
+ })();
11
+ (()=>{
12
+ __webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
13
+ })();
14
+ (()=>{
15
+ __webpack_require__.r = (exports1)=>{
16
+ if ("u" > typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
17
+ value: 'Module'
18
+ });
19
+ Object.defineProperty(exports1, '__esModule', {
20
+ value: true
21
+ });
22
+ };
23
+ })();
24
+ var __webpack_exports__ = {};
25
+ __webpack_require__.r(__webpack_exports__);
26
+ __webpack_require__.d(__webpack_exports__, {
27
+ hasFileExtension: ()=>hasFileExtension,
28
+ isRedirectResponse: ()=>isRedirectResponse,
29
+ isResponse: ()=>isResponse,
30
+ handleRequest: ()=>handleRequest
25
31
  });
26
- module.exports = __toCommonJS(runtime_exports);
27
- var import_browser = require("@modern-js/runtime-utils/browser");
28
- var import_node = require("@modern-js/runtime-utils/node");
29
- var import_node2 = require("@modern-js/runtime-utils/node");
30
- var import_remix_router = require("@modern-js/runtime-utils/remix-router");
31
- var import_server = require("@modern-js/runtime-utils/server");
32
- var import_time = require("@modern-js/runtime-utils/time");
33
- var import_request = require("@modern-js/runtime-utils/universal/request");
34
- var import_lodash = require("@modern-js/utils/lodash");
35
- var import_constants = require("@modern-js/utils/universal/constants");
36
- var import_constants2 = require("../common/constants");
37
- var import_errors = require("./errors");
38
- var import_response = require("./response");
39
- const redirectStatusCodes = /* @__PURE__ */ new Set([
40
- 301,
41
- 302,
42
- 303,
43
- 307,
44
- 308
32
+ const browser_namespaceObject = require("@modern-js/runtime-utils/browser");
33
+ const node_namespaceObject = require("@modern-js/runtime-utils/node");
34
+ const router_namespaceObject = require("@modern-js/runtime-utils/router");
35
+ const server_namespaceObject = require("@modern-js/runtime-utils/server");
36
+ const time_namespaceObject = require("@modern-js/runtime-utils/time");
37
+ const request_namespaceObject = require("@modern-js/runtime-utils/universal/request");
38
+ const lodash_namespaceObject = require("@modern-js/utils/lodash");
39
+ const constants_namespaceObject = require("@modern-js/utils/universal/constants");
40
+ const constants_js_namespaceObject = require("../common/constants.js");
41
+ const external_errors_js_namespaceObject = require("./errors.js");
42
+ const external_response_js_namespaceObject = require("./response.js");
43
+ const redirectStatusCodes = new Set([
44
+ 301,
45
+ 302,
46
+ 303,
47
+ 307,
48
+ 308
45
49
  ]);
46
50
  function isRedirectResponse(status) {
47
- return redirectStatusCodes.has(status);
51
+ return redirectStatusCodes.has(status);
48
52
  }
49
53
  function isResponse(value) {
50
- return value != null && typeof value.status === "number" && typeof value.statusText === "string" && typeof value.headers === "object" && typeof value.body !== "undefined";
54
+ return null != value && 'number' == typeof value.status && 'string' == typeof value.statusText && 'object' == typeof value.headers && void 0 !== value.body;
51
55
  }
52
56
  function convertModernRedirectResponse(headers, basename) {
53
- const newHeaders = new Headers(headers);
54
- let redirectUrl = headers.get("Location");
55
- if (basename !== "/") {
56
- redirectUrl = redirectUrl.replace(basename, "");
57
- }
58
- newHeaders.set("X-Modernjs-Redirect", redirectUrl);
59
- newHeaders.delete("Location");
60
- return new Response(null, {
61
- status: 204,
62
- headers: newHeaders
63
- });
57
+ const newHeaders = new Headers(headers);
58
+ let redirectUrl = headers.get('Location');
59
+ if ('/' !== basename) redirectUrl = redirectUrl.replace(basename, '');
60
+ newHeaders.set('X-Modernjs-Redirect', redirectUrl);
61
+ newHeaders.delete('Location');
62
+ return new Response(null, {
63
+ status: 204,
64
+ headers: newHeaders
65
+ });
64
66
  }
65
67
  function hasFileExtension(pathname) {
66
- const lastSegment = pathname.split("/").pop() || "";
67
- const dotIndex = lastSegment.lastIndexOf(".");
68
- if (dotIndex === -1) {
69
- return false;
70
- }
71
- const extension = lastSegment.substring(dotIndex).toLowerCase();
72
- return extension !== ".html";
68
+ const lastSegment = pathname.split('/').pop() || '';
69
+ const dotIndex = lastSegment.lastIndexOf('.');
70
+ if (-1 === dotIndex) return false;
71
+ const extension = lastSegment.substring(dotIndex).toLowerCase();
72
+ return '.html' !== extension;
73
73
  }
74
- const handleRequest = async ({ request, serverRoutes, routes: routesConfig, context, onTiming }) => {
75
- const url = new URL(request.url);
76
- const routeId = url.searchParams.get(import_constants2.LOADER_ID_PARAM);
77
- if (hasFileExtension(url.pathname)) {
78
- return;
79
- }
80
- const entry = (0, import_server.matchEntry)(url.pathname, serverRoutes);
81
- if (!routeId || !entry) {
82
- return;
83
- }
84
- const basename = entry.urlPath;
85
- const end = (0, import_time.time)();
86
- const { reporter, loaderContext, monitors } = context;
87
- const headersData = (0, import_request.parseHeaders)(request);
88
- const activeDeferreds = /* @__PURE__ */ new Map();
89
- return import_node2.storage.run({
90
- headers: headersData,
91
- monitors,
92
- request,
93
- activeDeferreds
94
- }, async () => {
95
- const routes = (0, import_browser.transformNestedRoutes)(routesConfig);
96
- const { queryRoute } = (0, import_remix_router.createStaticHandler)(routes, {
97
- basename
98
- });
99
- const requestContext = (0, import_node.createRequestContext)(loaderContext);
100
- requestContext.set(import_node.reporterCtx, reporter);
101
- let response;
102
- try {
103
- response = await queryRoute(request, {
104
- routeId,
105
- requestContext
106
- });
107
- if (isResponse(response) && isRedirectResponse(response.status)) {
108
- response = convertModernRedirectResponse(response.headers, basename);
109
- } else if ((0, import_lodash.isPlainObject)(response) && (import_remix_router.DEFERRED_SYMBOL in response || activeDeferreds.get(routeId))) {
110
- let deferredData;
111
- if (import_remix_router.DEFERRED_SYMBOL in response) {
112
- deferredData = response[import_remix_router.DEFERRED_SYMBOL];
113
- } else {
114
- deferredData = activeDeferreds.get(routeId);
115
- }
116
- const body = (0, import_response.createDeferredReadableStream)(
117
- // @ts-ignore
118
- deferredData,
119
- request.signal
120
- );
121
- const init = deferredData.init || {};
122
- if (init.status && isRedirectResponse(init.status)) {
123
- if (!init.headers) {
124
- throw new Error("redirect response includes no headers");
125
- }
126
- response = convertModernRedirectResponse(new Headers(init.headers), basename);
127
- } else {
128
- const headers = new Headers(init.headers);
129
- headers.set("Content-Type", `${import_constants2.CONTENT_TYPE_DEFERRED}; charset=UTF-8`);
130
- init.headers = headers;
131
- response = new Response(body, init);
132
- }
133
- } else {
134
- response = isResponse(response) ? response : new Response(JSON.stringify(response), {
135
- headers: {
136
- "Content-Type": "application/json; charset=utf-8"
137
- }
74
+ const handleRequest = async ({ request, serverRoutes, routes: routesConfig, context, onTiming })=>{
75
+ const url = new URL(request.url);
76
+ const routeId = url.searchParams.get(constants_js_namespaceObject.LOADER_ID_PARAM);
77
+ if (hasFileExtension(url.pathname)) return;
78
+ const entry = (0, server_namespaceObject.matchEntry)(url.pathname, serverRoutes);
79
+ if (!routeId || !entry) return;
80
+ const basename = entry.urlPath;
81
+ const end = (0, time_namespaceObject.time)();
82
+ const { reporter, loaderContext, monitors } = context;
83
+ const headersData = (0, request_namespaceObject.parseHeaders)(request);
84
+ const activeDeferreds = new Map();
85
+ return node_namespaceObject.storage.run({
86
+ headers: headersData,
87
+ monitors,
88
+ request,
89
+ activeDeferreds
90
+ }, async ()=>{
91
+ const routes = (0, browser_namespaceObject.transformNestedRoutes)(routesConfig);
92
+ const { queryRoute } = (0, router_namespaceObject.createStaticHandler)(routes, {
93
+ basename
138
94
  });
139
- }
140
- const cost = end();
141
- response.headers.set("X-Modernjs-Response", "yes");
142
- onTiming === null || onTiming === void 0 ? void 0 : onTiming(`${import_constants.LOADER_REPORTER_NAME}-navigation`, cost);
143
- } catch (error) {
144
- if (isResponse(error)) {
145
- error.headers.set("X-Modernjs-Catch", "yes");
146
- response = error;
147
- } else if ((0, import_remix_router.isRouteErrorResponse)(error)) {
148
- response = (0, import_errors.errorResponseToJson)(error);
149
- } else {
150
- const errorInstance = error instanceof Error || error instanceof DOMException ? error : new Error("Unexpected Server Error");
151
- response = new Response(JSON.stringify((0, import_errors.serializeError)(errorInstance)), {
152
- status: 500,
153
- headers: {
154
- "X-Modernjs-Error": "yes",
155
- "Content-Type": "application/json"
156
- }
157
- });
158
- }
159
- }
160
- return response;
161
- });
95
+ const requestContext = (0, node_namespaceObject.createRequestContext)(loaderContext);
96
+ requestContext.set(node_namespaceObject.reporterCtx, reporter);
97
+ let response;
98
+ try {
99
+ response = await queryRoute(request, {
100
+ routeId,
101
+ requestContext
102
+ });
103
+ if (isResponse(response) && isRedirectResponse(response.status)) response = convertModernRedirectResponse(response.headers, basename);
104
+ else if ((0, lodash_namespaceObject.isPlainObject)(response) && (router_namespaceObject.DEFERRED_SYMBOL in response || activeDeferreds.get(routeId))) {
105
+ let deferredData;
106
+ deferredData = router_namespaceObject.DEFERRED_SYMBOL in response ? response[router_namespaceObject.DEFERRED_SYMBOL] : activeDeferreds.get(routeId);
107
+ const body = (0, external_response_js_namespaceObject.createDeferredReadableStream)(deferredData, request.signal);
108
+ const init = deferredData.init || {};
109
+ if (init.status && isRedirectResponse(init.status)) {
110
+ if (!init.headers) throw new Error('redirect response includes no headers');
111
+ response = convertModernRedirectResponse(new Headers(init.headers), basename);
112
+ } else {
113
+ const headers = new Headers(init.headers);
114
+ headers.set('Content-Type', `${constants_js_namespaceObject.CONTENT_TYPE_DEFERRED}; charset=UTF-8`);
115
+ init.headers = headers;
116
+ response = new Response(body, init);
117
+ }
118
+ } else response = isResponse(response) ? response : new Response(JSON.stringify(response), {
119
+ headers: {
120
+ 'Content-Type': 'application/json; charset=utf-8'
121
+ }
122
+ });
123
+ const cost = end();
124
+ response.headers.set('X-Modernjs-Response', 'yes');
125
+ onTiming?.(`${constants_namespaceObject.LOADER_REPORTER_NAME}-navigation`, cost);
126
+ } catch (error) {
127
+ if (isResponse(error)) {
128
+ error.headers.set('X-Modernjs-Catch', 'yes');
129
+ response = error;
130
+ } else if ((0, router_namespaceObject.isRouteErrorResponse)(error)) response = (0, external_errors_js_namespaceObject.errorResponseToJson)(error);
131
+ else {
132
+ const errorInstance = error instanceof Error || error instanceof DOMException ? error : new Error('Unexpected Server Error');
133
+ response = new Response(JSON.stringify((0, external_errors_js_namespaceObject.serializeError)(errorInstance)), {
134
+ status: 500,
135
+ headers: {
136
+ 'X-Modernjs-Error': 'yes',
137
+ 'Content-Type': 'application/json'
138
+ }
139
+ });
140
+ }
141
+ }
142
+ return response;
143
+ });
162
144
  };
163
- // Annotate the CommonJS export names for ESM import in node:
164
- 0 && (module.exports = {
165
- handleRequest,
166
- hasFileExtension,
167
- isRedirectResponse,
168
- isResponse
145
+ exports.handleRequest = __webpack_exports__.handleRequest;
146
+ exports.hasFileExtension = __webpack_exports__.hasFileExtension;
147
+ exports.isRedirectResponse = __webpack_exports__.isRedirectResponse;
148
+ exports.isResponse = __webpack_exports__.isResponse;
149
+ for(var __rspack_i in __webpack_exports__)if (-1 === [
150
+ "handleRequest",
151
+ "hasFileExtension",
152
+ "isRedirectResponse",
153
+ "isResponse"
154
+ ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
155
+ Object.defineProperty(exports, '__esModule', {
156
+ value: true
169
157
  });
@@ -1,87 +1,76 @@
1
1
  "use strict";
2
- var __defProp = Object.defineProperty;
3
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
- var __getOwnPropNames = Object.getOwnPropertyNames;
5
- var __hasOwnProp = Object.prototype.hasOwnProperty;
6
- var __export = (target, all) => {
7
- for (var name in all)
8
- __defProp(target, name, { get: all[name], enumerable: true });
9
- };
10
- var __copyProps = (to, from, except, desc) => {
11
- if (from && typeof from === "object" || typeof from === "function") {
12
- for (let key of __getOwnPropNames(from))
13
- if (!__hasOwnProp.call(to, key) && key !== except)
14
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
- }
16
- return to;
17
- };
18
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
- var response_exports = {};
20
- __export(response_exports, {
21
- createDeferredReadableStream: () => createDeferredReadableStream
2
+ var __webpack_require__ = {};
3
+ (()=>{
4
+ __webpack_require__.d = (exports1, definition)=>{
5
+ for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
6
+ enumerable: true,
7
+ get: definition[key]
8
+ });
9
+ };
10
+ })();
11
+ (()=>{
12
+ __webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
13
+ })();
14
+ (()=>{
15
+ __webpack_require__.r = (exports1)=>{
16
+ if ("u" > typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
17
+ value: 'Module'
18
+ });
19
+ Object.defineProperty(exports1, '__esModule', {
20
+ value: true
21
+ });
22
+ };
23
+ })();
24
+ var __webpack_exports__ = {};
25
+ __webpack_require__.r(__webpack_exports__);
26
+ __webpack_require__.d(__webpack_exports__, {
27
+ createDeferredReadableStream: ()=>createDeferredReadableStream
22
28
  });
23
- module.exports = __toCommonJS(response_exports);
24
- var import_util = require("util");
25
- var import_node = require("@modern-js/runtime-utils/node");
29
+ const external_util_namespaceObject = require("util");
30
+ const node_namespaceObject = require("@modern-js/runtime-utils/node");
26
31
  function isTrackedPromise(value) {
27
- return value != null && typeof value.then === "function" && value._tracked === true;
32
+ return null != value && 'function' == typeof value.then && true === value._tracked;
28
33
  }
29
- const DEFERRED_VALUE_PLACEHOLDER_PREFIX = "__deferred_promise:";
34
+ const DEFERRED_VALUE_PLACEHOLDER_PREFIX = '__deferred_promise:';
30
35
  function createDeferredReadableStream(deferredData, signal) {
31
- const encoder = new import_util.TextEncoder();
32
- const stream = new ReadableStream({
33
- async start(controller) {
34
- const criticalData = {};
35
- const preresolvedKeys = [];
36
- for (const [key, value] of Object.entries(deferredData.data)) {
37
- if (isTrackedPromise(value)) {
38
- criticalData[key] = `${DEFERRED_VALUE_PLACEHOLDER_PREFIX}${key}`;
39
- if (typeof value._data !== "undefined" || typeof value._error !== "undefined") {
40
- preresolvedKeys.push(key);
41
- }
42
- } else {
43
- criticalData[key] = value;
36
+ const encoder = new external_util_namespaceObject.TextEncoder();
37
+ const stream = new ReadableStream({
38
+ async start (controller) {
39
+ const criticalData = {};
40
+ const preresolvedKeys = [];
41
+ for (const [key, value] of Object.entries(deferredData.data))if (isTrackedPromise(value)) {
42
+ criticalData[key] = `${DEFERRED_VALUE_PLACEHOLDER_PREFIX}${key}`;
43
+ if (void 0 !== value._data || void 0 !== value._error) preresolvedKeys.push(key);
44
+ } else criticalData[key] = value;
45
+ controller.enqueue(encoder.encode(`${JSON.stringify(criticalData)}\n\n`));
46
+ for (const preresolvedKey of preresolvedKeys)enqueueTrackedPromise(controller, encoder, preresolvedKey, deferredData.data[preresolvedKey]);
47
+ const unsubscribe = deferredData.subscribe((aborted, settledKey)=>{
48
+ if (settledKey) enqueueTrackedPromise(controller, encoder, settledKey, deferredData.data[settledKey]);
49
+ });
50
+ await deferredData.resolveData(signal);
51
+ unsubscribe();
52
+ controller.close();
44
53
  }
45
- }
46
- controller.enqueue(encoder.encode(`${JSON.stringify(criticalData)}
47
-
48
- `));
49
- for (const preresolvedKey of preresolvedKeys) {
50
- enqueueTrackedPromise(controller, encoder, preresolvedKey, deferredData.data[preresolvedKey]);
51
- }
52
- const unsubscribe = deferredData.subscribe((aborted, settledKey) => {
53
- if (settledKey) {
54
- enqueueTrackedPromise(controller, encoder, settledKey, deferredData.data[settledKey]);
55
- }
56
- });
57
- await deferredData.resolveData(signal);
58
- unsubscribe();
59
- controller.close();
60
- }
61
- });
62
- return stream;
54
+ });
55
+ return stream;
63
56
  }
64
57
  function enqueueTrackedPromise(controller, encoder, settledKey, promise) {
65
- if ("_error" in promise) {
66
- const { _error } = promise;
67
- controller.enqueue(encoder.encode(`error:${(0, import_node.serializeJson)({
68
- [settledKey]: {
69
- message: _error.message,
70
- stack: _error.stack
71
- }
72
- })}
73
-
74
- `));
75
- } else {
76
- var _promise__data;
77
- controller.enqueue(encoder.encode(`data:${JSON.stringify({
78
- [settledKey]: (_promise__data = promise._data) !== null && _promise__data !== void 0 ? _promise__data : null
79
- })}
80
-
81
- `));
82
- }
58
+ if ('_error' in promise) {
59
+ const { _error } = promise;
60
+ controller.enqueue(encoder.encode(`error:${(0, node_namespaceObject.serializeJson)({
61
+ [settledKey]: {
62
+ message: _error.message,
63
+ stack: _error.stack
64
+ }
65
+ })}\n\n`));
66
+ } else controller.enqueue(encoder.encode(`data:${JSON.stringify({
67
+ [settledKey]: promise._data ?? null
68
+ })}\n\n`));
83
69
  }
84
- // Annotate the CommonJS export names for ESM import in node:
85
- 0 && (module.exports = {
86
- createDeferredReadableStream
70
+ exports.createDeferredReadableStream = __webpack_exports__.createDeferredReadableStream;
71
+ for(var __rspack_i in __webpack_exports__)if (-1 === [
72
+ "createDeferredReadableStream"
73
+ ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
74
+ Object.defineProperty(exports, '__esModule', {
75
+ value: true
87
76
  });
@@ -0,0 +1,93 @@
1
+ import { redirect } from "@modern-js/runtime-utils/router";
2
+ import { compile } from "path-to-regexp";
3
+ import { CONTENT_TYPE_DEFERRED, DIRECT_PARAM, LOADER_ID_PARAM } from "../common/constants";
4
+ import { parseDeferredReadableStream } from "./data";
5
+ const getRequestUrl = ({ params, request, routeId })=>{
6
+ const url = new URL(request.url);
7
+ const toPath = compile(url.pathname, {
8
+ encode: encodeURIComponent
9
+ });
10
+ const newPathName = toPath(params);
11
+ url.pathname = newPathName;
12
+ url.searchParams.append(LOADER_ID_PARAM, routeId);
13
+ url.searchParams.append(DIRECT_PARAM, 'true');
14
+ return url;
15
+ };
16
+ const handleRedirectResponse = (res)=>{
17
+ const { headers } = res;
18
+ const location = headers.get('X-Modernjs-Redirect');
19
+ if (location) throw redirect(location);
20
+ return res;
21
+ };
22
+ const isDeferredResponse = (res)=>res.headers.get('Content-Type')?.match(CONTENT_TYPE_DEFERRED) && res.body;
23
+ const isRedirectResponse = (res)=>null != res.headers.get('X-Modernjs-Redirect');
24
+ const isErrorResponse = (res)=>null != res.headers.get('X-Modernjs-Error');
25
+ function isOtherErrorResponse(res) {
26
+ return res.status >= 400 && null == res.headers.get('X-Modernjs-Error') && null == res.headers.get('X-Modernjs-Catch') && null == res.headers.get('X-Modernjs-Response');
27
+ }
28
+ const isCatchResponse = (res)=>null != res.headers.get('X-Modernjs-Catch');
29
+ const handleErrorResponse = async (res)=>{
30
+ const data = await res.json();
31
+ const error = new Error(data.message);
32
+ error.stack = data.stack;
33
+ throw error;
34
+ };
35
+ const handleNetworkErrorResponse = async (res)=>{
36
+ const text = await res.text();
37
+ const error = new Error(text);
38
+ error.stack = void 0;
39
+ throw error;
40
+ };
41
+ const createRequest = (routeId, method = 'get')=>async ({ params, request })=>{
42
+ const url = getRequestUrl({
43
+ params,
44
+ request,
45
+ routeId
46
+ });
47
+ let res;
48
+ res = await fetch(url, {
49
+ method,
50
+ signal: request.signal
51
+ }).catch((error)=>{
52
+ throw error;
53
+ });
54
+ if (isRedirectResponse(res)) return handleRedirectResponse(res);
55
+ if (isErrorResponse(res)) return await handleErrorResponse(res);
56
+ if (isCatchResponse(res)) throw res;
57
+ if (isDeferredResponse(res)) {
58
+ const deferredData = await parseDeferredReadableStream(res.body);
59
+ return deferredData.data;
60
+ }
61
+ if (isOtherErrorResponse(res)) return await handleNetworkErrorResponse(res);
62
+ return res;
63
+ };
64
+ const createActionRequest = (routeId)=>async ({ params, request })=>{
65
+ const url = getRequestUrl({
66
+ params,
67
+ request,
68
+ routeId
69
+ });
70
+ const init = {
71
+ signal: request.signal
72
+ };
73
+ if ('GET' !== request.method) {
74
+ init.method = request.method;
75
+ const contentType = request.headers.get('Content-Type');
76
+ if (contentType && /\bapplication\/json\b/.test(contentType)) {
77
+ init.headers = {
78
+ 'Content-Type': contentType
79
+ };
80
+ init.body = JSON.stringify(await request.json());
81
+ } else if (contentType && /\btext\/plain\b/.test(contentType)) {
82
+ init.headers = {
83
+ 'Content-Type': contentType
84
+ };
85
+ init.body = await request.text();
86
+ } else if (contentType && /\bapplication\/x-www-form-urlencoded\b/.test(contentType)) init.body = new URLSearchParams(await request.text());
87
+ else init.body = await request.formData();
88
+ }
89
+ const res = await fetch(url, init);
90
+ if (!res.ok) throw res;
91
+ return res;
92
+ };
93
+ export { createActionRequest, createRequest, getRequestUrl };