@modern-js/plugin-data-loader 2.69.4 → 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.
- package/dist/cjs/cli/createRequest.js +122 -141
- package/dist/cjs/cli/data.js +129 -148
- package/dist/cjs/cli/generateClient.js +52 -52
- package/dist/cjs/cli/loader.js +63 -62
- package/dist/cjs/common/constants.js +41 -31
- package/dist/cjs/runtime/errors.js +84 -89
- package/dist/cjs/runtime/index.js +143 -155
- package/dist/cjs/runtime/response.js +66 -77
- package/dist/esm/cli/createRequest.mjs +93 -0
- package/dist/esm/cli/data.mjs +111 -0
- package/dist/esm/cli/generateClient.mjs +22 -0
- package/dist/esm/cli/loader.mjs +34 -0
- package/dist/esm/common/constants.mjs +4 -0
- package/dist/esm/runtime/errors.mjs +52 -0
- package/dist/esm/runtime/index.mjs +114 -0
- package/dist/esm/runtime/response.mjs +42 -0
- package/dist/esm-node/cli/createRequest.mjs +93 -0
- package/dist/esm-node/cli/data.mjs +111 -0
- package/dist/esm-node/cli/generateClient.mjs +22 -0
- package/dist/esm-node/cli/loader.mjs +34 -0
- package/dist/esm-node/common/constants.mjs +4 -0
- package/dist/esm-node/runtime/errors.mjs +52 -0
- package/dist/esm-node/runtime/index.mjs +114 -0
- package/dist/esm-node/runtime/response.mjs +42 -0
- package/dist/types/cli/createRequest.d.ts +1 -2
- package/dist/types/cli/loader.d.ts +2 -2
- package/dist/types/runtime/errors.d.ts +1 -1
- package/dist/types/runtime/response.d.ts +1 -1
- package/package.json +22 -26
- package/rslib.config.mts +4 -0
- package/rstest.config.ts +18 -0
- package/dist/esm/cli/createRequest.js +0 -297
- package/dist/esm/cli/data.js +0 -491
- package/dist/esm/cli/generateClient.js +0 -21
- package/dist/esm/cli/loader.js +0 -93
- package/dist/esm/common/constants.js +0 -8
- package/dist/esm/runtime/errors.js +0 -90
- package/dist/esm/runtime/index.js +0 -191
- package/dist/esm/runtime/response.js +0 -107
- package/dist/esm-node/cli/createRequest.js +0 -126
- package/dist/esm-node/cli/data.js +0 -140
- package/dist/esm-node/cli/generateClient.js +0 -32
- package/dist/esm-node/cli/loader.js +0 -47
- package/dist/esm-node/common/constants.js +0 -8
- package/dist/esm-node/runtime/errors.js +0 -75
- package/dist/esm-node/runtime/index.js +0 -142
- package/dist/esm-node/runtime/response.js +0 -63
|
@@ -1,169 +1,157 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
var
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
};
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
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
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
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
|
-
|
|
51
|
+
return redirectStatusCodes.has(status);
|
|
48
52
|
}
|
|
49
53
|
function isResponse(value) {
|
|
50
|
-
|
|
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
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
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
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
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
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
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
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
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
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
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
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
var
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
};
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
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
|
-
|
|
24
|
-
|
|
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
|
-
|
|
32
|
+
return null != value && 'function' == typeof value.then && true === value._tracked;
|
|
28
33
|
}
|
|
29
|
-
const DEFERRED_VALUE_PLACEHOLDER_PREFIX =
|
|
34
|
+
const DEFERRED_VALUE_PLACEHOLDER_PREFIX = '__deferred_promise:';
|
|
30
35
|
function createDeferredReadableStream(deferredData, signal) {
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
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
|
-
|
|
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
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
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
|
-
|
|
85
|
-
|
|
86
|
-
|
|
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 };
|