@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.
- 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
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { isRouteErrorResponse } from "@modern-js/runtime-utils/router";
|
|
2
|
+
function sanitizeError(error) {
|
|
3
|
+
if (error instanceof Error && 'development' !== process.env.NODE_ENV && 'test' !== process.env.NODE_ENV) {
|
|
4
|
+
const sanitized = new Error(error.message || 'Unexpected Server Error');
|
|
5
|
+
sanitized.stack = void 0;
|
|
6
|
+
return sanitized;
|
|
7
|
+
}
|
|
8
|
+
return error;
|
|
9
|
+
}
|
|
10
|
+
function sanitizeErrors(errors) {
|
|
11
|
+
return Object.entries(errors).reduce((acc, [routeId, error])=>Object.assign(acc, {
|
|
12
|
+
[routeId]: sanitizeError(error)
|
|
13
|
+
}), {});
|
|
14
|
+
}
|
|
15
|
+
function serializeError(error) {
|
|
16
|
+
const sanitized = sanitizeError(error);
|
|
17
|
+
return {
|
|
18
|
+
message: sanitized.message,
|
|
19
|
+
stack: sanitized.stack
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
function serializeErrors(errors) {
|
|
23
|
+
if (!errors) return null;
|
|
24
|
+
const entries = Object.entries(errors);
|
|
25
|
+
const serialized = {};
|
|
26
|
+
for (const [key, val] of entries)if (isRouteErrorResponse(val)) serialized[key] = {
|
|
27
|
+
...val,
|
|
28
|
+
__type: 'RouteErrorResponse'
|
|
29
|
+
};
|
|
30
|
+
else if (val instanceof Error) {
|
|
31
|
+
const sanitized = sanitizeError(val);
|
|
32
|
+
serialized[key] = {
|
|
33
|
+
message: sanitized.message,
|
|
34
|
+
stack: sanitized.stack,
|
|
35
|
+
__type: 'Error',
|
|
36
|
+
...'Error' !== sanitized.name ? {
|
|
37
|
+
__subType: sanitized.name
|
|
38
|
+
} : {}
|
|
39
|
+
};
|
|
40
|
+
} else serialized[key] = val;
|
|
41
|
+
return serialized;
|
|
42
|
+
}
|
|
43
|
+
function errorResponseToJson(errorResponse) {
|
|
44
|
+
return Response.json(serializeError(errorResponse.error || new Error('Unexpected Server Error')), {
|
|
45
|
+
status: errorResponse.status,
|
|
46
|
+
statusText: errorResponse.statusText,
|
|
47
|
+
headers: {
|
|
48
|
+
'X-Modernjs-Error': 'yes'
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
export { errorResponseToJson, sanitizeError, sanitizeErrors, serializeError, serializeErrors };
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { transformNestedRoutes } from "@modern-js/runtime-utils/browser";
|
|
2
|
+
import { createRequestContext, reporterCtx, storage } from "@modern-js/runtime-utils/node";
|
|
3
|
+
import { DEFERRED_SYMBOL, createStaticHandler, isRouteErrorResponse } from "@modern-js/runtime-utils/router";
|
|
4
|
+
import { matchEntry } from "@modern-js/runtime-utils/server";
|
|
5
|
+
import { time } from "@modern-js/runtime-utils/time";
|
|
6
|
+
import { parseHeaders } from "@modern-js/runtime-utils/universal/request";
|
|
7
|
+
import { isPlainObject } from "@modern-js/utils/lodash";
|
|
8
|
+
import { LOADER_REPORTER_NAME } from "@modern-js/utils/universal/constants";
|
|
9
|
+
import { CONTENT_TYPE_DEFERRED, LOADER_ID_PARAM } from "../common/constants.mjs";
|
|
10
|
+
import { errorResponseToJson, serializeError } from "./errors.mjs";
|
|
11
|
+
import { createDeferredReadableStream } from "./response.mjs";
|
|
12
|
+
const redirectStatusCodes = new Set([
|
|
13
|
+
301,
|
|
14
|
+
302,
|
|
15
|
+
303,
|
|
16
|
+
307,
|
|
17
|
+
308
|
|
18
|
+
]);
|
|
19
|
+
function isRedirectResponse(status) {
|
|
20
|
+
return redirectStatusCodes.has(status);
|
|
21
|
+
}
|
|
22
|
+
function isResponse(value) {
|
|
23
|
+
return null != value && 'number' == typeof value.status && 'string' == typeof value.statusText && 'object' == typeof value.headers && void 0 !== value.body;
|
|
24
|
+
}
|
|
25
|
+
function convertModernRedirectResponse(headers, basename) {
|
|
26
|
+
const newHeaders = new Headers(headers);
|
|
27
|
+
let redirectUrl = headers.get('Location');
|
|
28
|
+
if ('/' !== basename) redirectUrl = redirectUrl.replace(basename, '');
|
|
29
|
+
newHeaders.set('X-Modernjs-Redirect', redirectUrl);
|
|
30
|
+
newHeaders.delete('Location');
|
|
31
|
+
return new Response(null, {
|
|
32
|
+
status: 204,
|
|
33
|
+
headers: newHeaders
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
function hasFileExtension(pathname) {
|
|
37
|
+
const lastSegment = pathname.split('/').pop() || '';
|
|
38
|
+
const dotIndex = lastSegment.lastIndexOf('.');
|
|
39
|
+
if (-1 === dotIndex) return false;
|
|
40
|
+
const extension = lastSegment.substring(dotIndex).toLowerCase();
|
|
41
|
+
return '.html' !== extension;
|
|
42
|
+
}
|
|
43
|
+
const handleRequest = async ({ request, serverRoutes, routes: routesConfig, context, onTiming })=>{
|
|
44
|
+
const url = new URL(request.url);
|
|
45
|
+
const routeId = url.searchParams.get(LOADER_ID_PARAM);
|
|
46
|
+
if (hasFileExtension(url.pathname)) return;
|
|
47
|
+
const entry = matchEntry(url.pathname, serverRoutes);
|
|
48
|
+
if (!routeId || !entry) return;
|
|
49
|
+
const basename = entry.urlPath;
|
|
50
|
+
const end = time();
|
|
51
|
+
const { reporter, loaderContext, monitors } = context;
|
|
52
|
+
const headersData = parseHeaders(request);
|
|
53
|
+
const activeDeferreds = new Map();
|
|
54
|
+
return storage.run({
|
|
55
|
+
headers: headersData,
|
|
56
|
+
monitors,
|
|
57
|
+
request,
|
|
58
|
+
activeDeferreds
|
|
59
|
+
}, async ()=>{
|
|
60
|
+
const routes = transformNestedRoutes(routesConfig);
|
|
61
|
+
const { queryRoute } = createStaticHandler(routes, {
|
|
62
|
+
basename
|
|
63
|
+
});
|
|
64
|
+
const requestContext = createRequestContext(loaderContext);
|
|
65
|
+
requestContext.set(reporterCtx, reporter);
|
|
66
|
+
let response;
|
|
67
|
+
try {
|
|
68
|
+
response = await queryRoute(request, {
|
|
69
|
+
routeId,
|
|
70
|
+
requestContext
|
|
71
|
+
});
|
|
72
|
+
if (isResponse(response) && isRedirectResponse(response.status)) response = convertModernRedirectResponse(response.headers, basename);
|
|
73
|
+
else if (isPlainObject(response) && (DEFERRED_SYMBOL in response || activeDeferreds.get(routeId))) {
|
|
74
|
+
let deferredData;
|
|
75
|
+
deferredData = DEFERRED_SYMBOL in response ? response[DEFERRED_SYMBOL] : activeDeferreds.get(routeId);
|
|
76
|
+
const body = createDeferredReadableStream(deferredData, request.signal);
|
|
77
|
+
const init = deferredData.init || {};
|
|
78
|
+
if (init.status && isRedirectResponse(init.status)) {
|
|
79
|
+
if (!init.headers) throw new Error('redirect response includes no headers');
|
|
80
|
+
response = convertModernRedirectResponse(new Headers(init.headers), basename);
|
|
81
|
+
} else {
|
|
82
|
+
const headers = new Headers(init.headers);
|
|
83
|
+
headers.set('Content-Type', `${CONTENT_TYPE_DEFERRED}; charset=UTF-8`);
|
|
84
|
+
init.headers = headers;
|
|
85
|
+
response = new Response(body, init);
|
|
86
|
+
}
|
|
87
|
+
} else response = isResponse(response) ? response : new Response(JSON.stringify(response), {
|
|
88
|
+
headers: {
|
|
89
|
+
'Content-Type': 'application/json; charset=utf-8'
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
const cost = end();
|
|
93
|
+
response.headers.set('X-Modernjs-Response', 'yes');
|
|
94
|
+
onTiming?.(`${LOADER_REPORTER_NAME}-navigation`, cost);
|
|
95
|
+
} catch (error) {
|
|
96
|
+
if (isResponse(error)) {
|
|
97
|
+
error.headers.set('X-Modernjs-Catch', 'yes');
|
|
98
|
+
response = error;
|
|
99
|
+
} else if (isRouteErrorResponse(error)) response = errorResponseToJson(error);
|
|
100
|
+
else {
|
|
101
|
+
const errorInstance = error instanceof Error || error instanceof DOMException ? error : new Error('Unexpected Server Error');
|
|
102
|
+
response = new Response(JSON.stringify(serializeError(errorInstance)), {
|
|
103
|
+
status: 500,
|
|
104
|
+
headers: {
|
|
105
|
+
'X-Modernjs-Error': 'yes',
|
|
106
|
+
'Content-Type': 'application/json'
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
return response;
|
|
112
|
+
});
|
|
113
|
+
};
|
|
114
|
+
export { handleRequest, hasFileExtension, isRedirectResponse, isResponse };
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { TextEncoder } from "util";
|
|
2
|
+
import { serializeJson } from "@modern-js/runtime-utils/node";
|
|
3
|
+
function isTrackedPromise(value) {
|
|
4
|
+
return null != value && 'function' == typeof value.then && true === value._tracked;
|
|
5
|
+
}
|
|
6
|
+
const DEFERRED_VALUE_PLACEHOLDER_PREFIX = '__deferred_promise:';
|
|
7
|
+
function createDeferredReadableStream(deferredData, signal) {
|
|
8
|
+
const encoder = new TextEncoder();
|
|
9
|
+
const stream = new ReadableStream({
|
|
10
|
+
async start (controller) {
|
|
11
|
+
const criticalData = {};
|
|
12
|
+
const preresolvedKeys = [];
|
|
13
|
+
for (const [key, value] of Object.entries(deferredData.data))if (isTrackedPromise(value)) {
|
|
14
|
+
criticalData[key] = `${DEFERRED_VALUE_PLACEHOLDER_PREFIX}${key}`;
|
|
15
|
+
if (void 0 !== value._data || void 0 !== value._error) preresolvedKeys.push(key);
|
|
16
|
+
} else criticalData[key] = value;
|
|
17
|
+
controller.enqueue(encoder.encode(`${JSON.stringify(criticalData)}\n\n`));
|
|
18
|
+
for (const preresolvedKey of preresolvedKeys)enqueueTrackedPromise(controller, encoder, preresolvedKey, deferredData.data[preresolvedKey]);
|
|
19
|
+
const unsubscribe = deferredData.subscribe((aborted, settledKey)=>{
|
|
20
|
+
if (settledKey) enqueueTrackedPromise(controller, encoder, settledKey, deferredData.data[settledKey]);
|
|
21
|
+
});
|
|
22
|
+
await deferredData.resolveData(signal);
|
|
23
|
+
unsubscribe();
|
|
24
|
+
controller.close();
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
return stream;
|
|
28
|
+
}
|
|
29
|
+
function enqueueTrackedPromise(controller, encoder, settledKey, promise) {
|
|
30
|
+
if ('_error' in promise) {
|
|
31
|
+
const { _error } = promise;
|
|
32
|
+
controller.enqueue(encoder.encode(`error:${serializeJson({
|
|
33
|
+
[settledKey]: {
|
|
34
|
+
message: _error.message,
|
|
35
|
+
stack: _error.stack
|
|
36
|
+
}
|
|
37
|
+
})}\n\n`));
|
|
38
|
+
} else controller.enqueue(encoder.encode(`data:${JSON.stringify({
|
|
39
|
+
[settledKey]: promise._data ?? null
|
|
40
|
+
})}\n\n`));
|
|
41
|
+
}
|
|
42
|
+
export { createDeferredReadableStream };
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import type { DeferredData } from '@modern-js/runtime-utils/browser';
|
|
2
1
|
export declare const getRequestUrl: ({ params, request, routeId, }: {
|
|
3
2
|
params: Record<string, string>;
|
|
4
3
|
request: Request;
|
|
@@ -7,7 +6,7 @@ export declare const getRequestUrl: ({ params, request, routeId, }: {
|
|
|
7
6
|
export declare const createRequest: (routeId: string, method?: string) => ({ params, request, }: {
|
|
8
7
|
params: Record<string, string>;
|
|
9
8
|
request: Request;
|
|
10
|
-
}) => Promise<
|
|
9
|
+
}) => Promise<Record<string, unknown> | Response>;
|
|
11
10
|
export declare const createActionRequest: (routeId: string) => ({ params, request, }: {
|
|
12
11
|
params: Record<string, string>;
|
|
13
12
|
request: Request;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { Rspack } from '@rsbuild/core';
|
|
2
2
|
type Context = {
|
|
3
3
|
mapFile: string;
|
|
4
4
|
loaderId: string;
|
|
@@ -8,5 +8,5 @@ type Context = {
|
|
|
8
8
|
routeId: string;
|
|
9
9
|
retain: boolean;
|
|
10
10
|
};
|
|
11
|
-
export default function loader(this: LoaderContext<Context>, source: string): Promise<
|
|
11
|
+
export default function loader(this: Rspack.LoaderContext<Context>, source: string): Promise<any>;
|
|
12
12
|
export {};
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
* Copyright 2021 Remix Software Inc.
|
|
8
8
|
* https://github.com/remix-run/remix/blob/main/LICENSE.md
|
|
9
9
|
*/
|
|
10
|
-
import type { ErrorResponse, StaticHandlerContext } from '@modern-js/runtime-utils/
|
|
10
|
+
import type { ErrorResponse, StaticHandlerContext } from '@modern-js/runtime-utils/router';
|
|
11
11
|
/**
|
|
12
12
|
* This thing probably warrants some explanation.
|
|
13
13
|
*
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { DeferredData } from '@modern-js/runtime-utils/browser';
|
|
2
2
|
export declare function createDeferredReadableStream(deferredData: DeferredData, signal: AbortSignal): any;
|
package/package.json
CHANGED
|
@@ -15,14 +15,14 @@
|
|
|
15
15
|
"modern",
|
|
16
16
|
"modern.js"
|
|
17
17
|
],
|
|
18
|
-
"version": "
|
|
18
|
+
"version": "3.0.0-alpha.0",
|
|
19
19
|
"engines": {
|
|
20
|
-
"node": ">=
|
|
20
|
+
"node": ">=20"
|
|
21
21
|
},
|
|
22
22
|
"jsnext:source": "./src/runtime/index.ts",
|
|
23
23
|
"types": "./dist/types/runtime/index.d.ts",
|
|
24
24
|
"main": "./dist/cjs/runtime/index.js",
|
|
25
|
-
"module": "./dist/esm/runtime/index.
|
|
25
|
+
"module": "./dist/esm/runtime/index.mjs",
|
|
26
26
|
"exports": {
|
|
27
27
|
"./loader": {
|
|
28
28
|
"types": "./dist/types/cli/loader.d.ts",
|
|
@@ -32,7 +32,7 @@
|
|
|
32
32
|
"./runtime": {
|
|
33
33
|
"types": "./dist/types/runtime/index.d.ts",
|
|
34
34
|
"jsnext:source": "./src/runtime/index.ts",
|
|
35
|
-
"default": "./dist/esm/runtime/index.
|
|
35
|
+
"default": "./dist/esm/runtime/index.mjs"
|
|
36
36
|
}
|
|
37
37
|
},
|
|
38
38
|
"typesVersions": {
|
|
@@ -46,34 +46,31 @@
|
|
|
46
46
|
}
|
|
47
47
|
},
|
|
48
48
|
"dependencies": {
|
|
49
|
-
"@babel/core": "^7.
|
|
49
|
+
"@babel/core": "^7.28.5",
|
|
50
50
|
"@swc/helpers": "^0.5.17",
|
|
51
51
|
"path-to-regexp": "^6.3.0",
|
|
52
|
-
"@modern-js/runtime-utils": "
|
|
53
|
-
"@modern-js/utils": "
|
|
52
|
+
"@modern-js/runtime-utils": "3.0.0-alpha.0",
|
|
53
|
+
"@modern-js/utils": "3.0.0-alpha.0"
|
|
54
54
|
},
|
|
55
55
|
"devDependencies": {
|
|
56
|
+
"@rslib/core": "0.18.5",
|
|
56
57
|
"@types/babel__core": "^7.20.5",
|
|
57
|
-
"@types/
|
|
58
|
-
"@types/
|
|
59
|
-
"@types/supertest": "^2.0.11",
|
|
58
|
+
"@types/node": "^20",
|
|
59
|
+
"@types/supertest": "^2.0.16",
|
|
60
60
|
"isomorphic-fetch": "^3.0.0",
|
|
61
|
-
"jest": "^29",
|
|
62
61
|
"memfs": "^3.5.3",
|
|
63
|
-
"react": "^
|
|
64
|
-
"react-dom": "^
|
|
65
|
-
"supertest": "^6.
|
|
66
|
-
"ts-jest": "^29.1.0",
|
|
62
|
+
"react": "^19.2.3",
|
|
63
|
+
"react-dom": "^19.2.3",
|
|
64
|
+
"supertest": "^6.3.4",
|
|
67
65
|
"typescript": "^5",
|
|
68
|
-
"
|
|
69
|
-
"@modern-js/
|
|
70
|
-
"@
|
|
71
|
-
"@modern-js/
|
|
72
|
-
"@
|
|
73
|
-
"@scripts/jest-config": "2.66.0"
|
|
66
|
+
"@rsbuild/core": "1.6.15",
|
|
67
|
+
"@modern-js/types": "3.0.0-alpha.0",
|
|
68
|
+
"@scripts/rstest-config": "2.66.0",
|
|
69
|
+
"@modern-js/rslib": "2.68.10",
|
|
70
|
+
"@modern-js/server-core": "3.0.0-alpha.0"
|
|
74
71
|
},
|
|
75
72
|
"peerDependencies": {
|
|
76
|
-
"react": ">=17.0.
|
|
73
|
+
"react": ">=17.0.2"
|
|
77
74
|
},
|
|
78
75
|
"sideEffects": false,
|
|
79
76
|
"publishConfig": {
|
|
@@ -81,9 +78,8 @@
|
|
|
81
78
|
"access": "public"
|
|
82
79
|
},
|
|
83
80
|
"scripts": {
|
|
84
|
-
"
|
|
85
|
-
"
|
|
86
|
-
"
|
|
87
|
-
"test": "jest --passWithNoTests"
|
|
81
|
+
"build": "rslib build",
|
|
82
|
+
"dev": "rslib build --watch",
|
|
83
|
+
"test": "rstest --passWithNoTests"
|
|
88
84
|
}
|
|
89
85
|
}
|
package/rslib.config.mts
ADDED
package/rstest.config.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { withTestPreset } from '@scripts/rstest-config';
|
|
2
|
+
|
|
3
|
+
export default withTestPreset({
|
|
4
|
+
root: __dirname,
|
|
5
|
+
testEnvironment: 'node',
|
|
6
|
+
globals: true,
|
|
7
|
+
tools: {
|
|
8
|
+
swc: {
|
|
9
|
+
jsc: {
|
|
10
|
+
transform: {
|
|
11
|
+
react: {
|
|
12
|
+
runtime: 'automatic',
|
|
13
|
+
},
|
|
14
|
+
},
|
|
15
|
+
},
|
|
16
|
+
},
|
|
17
|
+
},
|
|
18
|
+
});
|
|
@@ -1,297 +0,0 @@
|
|
|
1
|
-
import { _ as _async_to_generator } from "@swc/helpers/_/_async_to_generator";
|
|
2
|
-
import { _ as _ts_generator } from "@swc/helpers/_/_ts_generator";
|
|
3
|
-
import { redirect } from "@modern-js/runtime-utils/router";
|
|
4
|
-
import { compile } from "path-to-regexp";
|
|
5
|
-
import { CONTENT_TYPE_DEFERRED, DIRECT_PARAM, LOADER_ID_PARAM } from "../common/constants";
|
|
6
|
-
import { parseDeferredReadableStream } from "./data";
|
|
7
|
-
var getRequestUrl = function(param) {
|
|
8
|
-
var params = param.params, request = param.request, routeId = param.routeId;
|
|
9
|
-
var url = new URL(request.url);
|
|
10
|
-
var toPath = compile(url.pathname, {
|
|
11
|
-
encode: encodeURIComponent
|
|
12
|
-
});
|
|
13
|
-
var newPathName = toPath(params);
|
|
14
|
-
url.pathname = newPathName;
|
|
15
|
-
url.searchParams.append(LOADER_ID_PARAM, routeId);
|
|
16
|
-
url.searchParams.append(DIRECT_PARAM, "true");
|
|
17
|
-
return url;
|
|
18
|
-
};
|
|
19
|
-
var handleRedirectResponse = function(res) {
|
|
20
|
-
var headers = res.headers;
|
|
21
|
-
var location = headers.get("X-Modernjs-Redirect");
|
|
22
|
-
if (location) {
|
|
23
|
-
throw redirect(location);
|
|
24
|
-
}
|
|
25
|
-
return res;
|
|
26
|
-
};
|
|
27
|
-
var isDeferredResponse = function(res) {
|
|
28
|
-
var _res_headers_get;
|
|
29
|
-
return ((_res_headers_get = res.headers.get("Content-Type")) === null || _res_headers_get === void 0 ? void 0 : _res_headers_get.match(CONTENT_TYPE_DEFERRED)) && res.body;
|
|
30
|
-
};
|
|
31
|
-
var isRedirectResponse = function(res) {
|
|
32
|
-
return res.headers.get("X-Modernjs-Redirect") != null;
|
|
33
|
-
};
|
|
34
|
-
var isErrorResponse = function(res) {
|
|
35
|
-
return res.headers.get("X-Modernjs-Error") != null;
|
|
36
|
-
};
|
|
37
|
-
function isOtherErrorResponse(res) {
|
|
38
|
-
return res.status >= 400 && res.headers.get("X-Modernjs-Error") == null && res.headers.get("X-Modernjs-Catch") == null && res.headers.get("X-Modernjs-Response") == null;
|
|
39
|
-
}
|
|
40
|
-
var isCatchResponse = function(res) {
|
|
41
|
-
return res.headers.get("X-Modernjs-Catch") != null;
|
|
42
|
-
};
|
|
43
|
-
var handleErrorResponse = function() {
|
|
44
|
-
var _ref = _async_to_generator(function(res) {
|
|
45
|
-
var data, error;
|
|
46
|
-
return _ts_generator(this, function(_state) {
|
|
47
|
-
switch (_state.label) {
|
|
48
|
-
case 0:
|
|
49
|
-
return [
|
|
50
|
-
4,
|
|
51
|
-
res.json()
|
|
52
|
-
];
|
|
53
|
-
case 1:
|
|
54
|
-
data = _state.sent();
|
|
55
|
-
error = new Error(data.message);
|
|
56
|
-
error.stack = data.stack;
|
|
57
|
-
throw error;
|
|
58
|
-
}
|
|
59
|
-
});
|
|
60
|
-
});
|
|
61
|
-
return function handleErrorResponse2(res) {
|
|
62
|
-
return _ref.apply(this, arguments);
|
|
63
|
-
};
|
|
64
|
-
}();
|
|
65
|
-
var handleNetworkErrorResponse = function() {
|
|
66
|
-
var _ref = _async_to_generator(function(res) {
|
|
67
|
-
var text, error;
|
|
68
|
-
return _ts_generator(this, function(_state) {
|
|
69
|
-
switch (_state.label) {
|
|
70
|
-
case 0:
|
|
71
|
-
return [
|
|
72
|
-
4,
|
|
73
|
-
res.text()
|
|
74
|
-
];
|
|
75
|
-
case 1:
|
|
76
|
-
text = _state.sent();
|
|
77
|
-
error = new Error(text);
|
|
78
|
-
error.stack = void 0;
|
|
79
|
-
throw error;
|
|
80
|
-
}
|
|
81
|
-
});
|
|
82
|
-
});
|
|
83
|
-
return function handleNetworkErrorResponse2(res) {
|
|
84
|
-
return _ref.apply(this, arguments);
|
|
85
|
-
};
|
|
86
|
-
}();
|
|
87
|
-
var createRequest = function(routeId) {
|
|
88
|
-
var method = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : "get";
|
|
89
|
-
var isRouterV7 = process.env._MODERN_ROUTER_VERSION === "v7";
|
|
90
|
-
return function() {
|
|
91
|
-
var _ref = _async_to_generator(function(param) {
|
|
92
|
-
var params, request, url, res, deferredData;
|
|
93
|
-
return _ts_generator(this, function(_state) {
|
|
94
|
-
switch (_state.label) {
|
|
95
|
-
case 0:
|
|
96
|
-
params = param.params, request = param.request;
|
|
97
|
-
url = getRequestUrl({
|
|
98
|
-
params,
|
|
99
|
-
request,
|
|
100
|
-
routeId
|
|
101
|
-
});
|
|
102
|
-
return [
|
|
103
|
-
4,
|
|
104
|
-
fetch(url, {
|
|
105
|
-
method,
|
|
106
|
-
signal: request.signal
|
|
107
|
-
}).catch(function(error) {
|
|
108
|
-
throw error;
|
|
109
|
-
})
|
|
110
|
-
];
|
|
111
|
-
case 1:
|
|
112
|
-
res = _state.sent();
|
|
113
|
-
if (isRedirectResponse(res)) {
|
|
114
|
-
return [
|
|
115
|
-
2,
|
|
116
|
-
handleRedirectResponse(res)
|
|
117
|
-
];
|
|
118
|
-
}
|
|
119
|
-
if (!isErrorResponse(res))
|
|
120
|
-
return [
|
|
121
|
-
3,
|
|
122
|
-
3
|
|
123
|
-
];
|
|
124
|
-
return [
|
|
125
|
-
4,
|
|
126
|
-
handleErrorResponse(res)
|
|
127
|
-
];
|
|
128
|
-
case 2:
|
|
129
|
-
return [
|
|
130
|
-
2,
|
|
131
|
-
_state.sent()
|
|
132
|
-
];
|
|
133
|
-
case 3:
|
|
134
|
-
if (isCatchResponse(res)) {
|
|
135
|
-
throw res;
|
|
136
|
-
}
|
|
137
|
-
if (!isDeferredResponse(res))
|
|
138
|
-
return [
|
|
139
|
-
3,
|
|
140
|
-
5
|
|
141
|
-
];
|
|
142
|
-
return [
|
|
143
|
-
4,
|
|
144
|
-
parseDeferredReadableStream(res.body)
|
|
145
|
-
];
|
|
146
|
-
case 4:
|
|
147
|
-
deferredData = _state.sent();
|
|
148
|
-
return [
|
|
149
|
-
2,
|
|
150
|
-
isRouterV7 ? deferredData.data : deferredData
|
|
151
|
-
];
|
|
152
|
-
case 5:
|
|
153
|
-
if (!isOtherErrorResponse(res))
|
|
154
|
-
return [
|
|
155
|
-
3,
|
|
156
|
-
7
|
|
157
|
-
];
|
|
158
|
-
return [
|
|
159
|
-
4,
|
|
160
|
-
handleNetworkErrorResponse(res)
|
|
161
|
-
];
|
|
162
|
-
case 6:
|
|
163
|
-
return [
|
|
164
|
-
2,
|
|
165
|
-
_state.sent()
|
|
166
|
-
];
|
|
167
|
-
case 7:
|
|
168
|
-
return [
|
|
169
|
-
2,
|
|
170
|
-
res
|
|
171
|
-
];
|
|
172
|
-
}
|
|
173
|
-
});
|
|
174
|
-
});
|
|
175
|
-
return function(_) {
|
|
176
|
-
return _ref.apply(this, arguments);
|
|
177
|
-
};
|
|
178
|
-
}();
|
|
179
|
-
};
|
|
180
|
-
var createActionRequest = function(routeId) {
|
|
181
|
-
return function() {
|
|
182
|
-
var _ref = _async_to_generator(function(param) {
|
|
183
|
-
var params, request, url, init, contentType, _, _1, res;
|
|
184
|
-
return _ts_generator(this, function(_state) {
|
|
185
|
-
switch (_state.label) {
|
|
186
|
-
case 0:
|
|
187
|
-
params = param.params, request = param.request;
|
|
188
|
-
url = getRequestUrl({
|
|
189
|
-
params,
|
|
190
|
-
request,
|
|
191
|
-
routeId
|
|
192
|
-
});
|
|
193
|
-
init = {
|
|
194
|
-
signal: request.signal
|
|
195
|
-
};
|
|
196
|
-
if (!(request.method !== "GET"))
|
|
197
|
-
return [
|
|
198
|
-
3,
|
|
199
|
-
8
|
|
200
|
-
];
|
|
201
|
-
init.method = request.method;
|
|
202
|
-
contentType = request.headers.get("Content-Type");
|
|
203
|
-
if (!(contentType && /\bapplication\/json\b/.test(contentType)))
|
|
204
|
-
return [
|
|
205
|
-
3,
|
|
206
|
-
2
|
|
207
|
-
];
|
|
208
|
-
init.headers = {
|
|
209
|
-
"Content-Type": contentType
|
|
210
|
-
};
|
|
211
|
-
_ = JSON.stringify;
|
|
212
|
-
return [
|
|
213
|
-
4,
|
|
214
|
-
request.json()
|
|
215
|
-
];
|
|
216
|
-
case 1:
|
|
217
|
-
init.body = _.apply(JSON, [
|
|
218
|
-
_state.sent()
|
|
219
|
-
]);
|
|
220
|
-
return [
|
|
221
|
-
3,
|
|
222
|
-
8
|
|
223
|
-
];
|
|
224
|
-
case 2:
|
|
225
|
-
if (!(contentType && /\btext\/plain\b/.test(contentType)))
|
|
226
|
-
return [
|
|
227
|
-
3,
|
|
228
|
-
4
|
|
229
|
-
];
|
|
230
|
-
init.headers = {
|
|
231
|
-
"Content-Type": contentType
|
|
232
|
-
};
|
|
233
|
-
return [
|
|
234
|
-
4,
|
|
235
|
-
request.text()
|
|
236
|
-
];
|
|
237
|
-
case 3:
|
|
238
|
-
init.body = _state.sent();
|
|
239
|
-
return [
|
|
240
|
-
3,
|
|
241
|
-
8
|
|
242
|
-
];
|
|
243
|
-
case 4:
|
|
244
|
-
if (!(contentType && /\bapplication\/x-www-form-urlencoded\b/.test(contentType)))
|
|
245
|
-
return [
|
|
246
|
-
3,
|
|
247
|
-
6
|
|
248
|
-
];
|
|
249
|
-
_1 = URLSearchParams.bind;
|
|
250
|
-
return [
|
|
251
|
-
4,
|
|
252
|
-
request.text()
|
|
253
|
-
];
|
|
254
|
-
case 5:
|
|
255
|
-
init.body = new (_1.apply(URLSearchParams, [
|
|
256
|
-
void 0,
|
|
257
|
-
_state.sent()
|
|
258
|
-
]))();
|
|
259
|
-
return [
|
|
260
|
-
3,
|
|
261
|
-
8
|
|
262
|
-
];
|
|
263
|
-
case 6:
|
|
264
|
-
return [
|
|
265
|
-
4,
|
|
266
|
-
request.formData()
|
|
267
|
-
];
|
|
268
|
-
case 7:
|
|
269
|
-
init.body = _state.sent();
|
|
270
|
-
_state.label = 8;
|
|
271
|
-
case 8:
|
|
272
|
-
return [
|
|
273
|
-
4,
|
|
274
|
-
fetch(url, init)
|
|
275
|
-
];
|
|
276
|
-
case 9:
|
|
277
|
-
res = _state.sent();
|
|
278
|
-
if (!res.ok) {
|
|
279
|
-
throw res;
|
|
280
|
-
}
|
|
281
|
-
return [
|
|
282
|
-
2,
|
|
283
|
-
res
|
|
284
|
-
];
|
|
285
|
-
}
|
|
286
|
-
});
|
|
287
|
-
});
|
|
288
|
-
return function(_) {
|
|
289
|
-
return _ref.apply(this, arguments);
|
|
290
|
-
};
|
|
291
|
-
}();
|
|
292
|
-
};
|
|
293
|
-
export {
|
|
294
|
-
createActionRequest,
|
|
295
|
-
createRequest,
|
|
296
|
-
getRequestUrl
|
|
297
|
-
};
|