@modern-js/plugin-data-loader 2.6.0 → 2.7.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/{create-request.js → createRequest.js} +17 -6
- package/dist/cjs/cli/data.js +162 -0
- package/dist/cjs/cli/{generate-client.js → generateClient.js} +4 -4
- package/dist/cjs/cli/loader.js +2 -2
- package/dist/cjs/common/constants.js +3 -0
- package/dist/cjs/runtime/index.js +165 -0
- package/dist/cjs/runtime/response.js +102 -0
- package/dist/cjs/server/index.js +22 -181
- package/dist/esm/cli/{create-request.js → createRequest.js} +42 -3
- package/dist/esm/cli/data.js +820 -0
- package/dist/esm/cli/{generate-client.js → generateClient.js} +1 -1
- package/dist/esm/cli/loader.js +1 -1
- package/dist/esm/common/constants.js +2 -1
- package/dist/esm/runtime/index.js +427 -0
- package/dist/esm/runtime/response.js +284 -0
- package/dist/esm/server/index.js +38 -432
- package/dist/esm-node/cli/{create-request.js → createRequest.js} +19 -4
- package/dist/esm-node/cli/data.js +142 -0
- package/dist/esm-node/cli/{generate-client.js → generateClient.js} +1 -1
- package/dist/esm-node/cli/loader.js +1 -1
- package/dist/esm-node/common/constants.js +2 -0
- package/dist/esm-node/runtime/index.js +147 -0
- package/dist/esm-node/runtime/response.js +79 -0
- package/dist/esm-node/server/index.js +21 -181
- package/dist/types/cli/{create-request.d.ts → createRequest.d.ts} +2 -1
- package/dist/types/cli/data.d.ts +6 -0
- package/dist/types/common/constants.d.ts +2 -1
- package/dist/types/runtime/index.d.ts +15 -0
- package/dist/types/runtime/response.d.ts +2 -0
- package/dist/types/server/index.d.ts +0 -15
- package/package.json +19 -9
- /package/dist/types/cli/{generate-client.d.ts → generateClient.d.ts} +0 -0
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import {
|
|
2
|
+
installGlobals,
|
|
3
|
+
writeReadableStreamToWritable,
|
|
4
|
+
Response as NodeResponse
|
|
5
|
+
} from "@remix-run/node";
|
|
6
|
+
import { transformNestedRoutes } from "@modern-js/utils/nestedRoutes";
|
|
7
|
+
import {
|
|
8
|
+
createStaticHandler,
|
|
9
|
+
ErrorResponse,
|
|
10
|
+
UNSAFE_DEFERRED_SYMBOL as DEFERRED_SYMBOL
|
|
11
|
+
} from "@modern-js/utils/remix-router";
|
|
12
|
+
import { isPlainObject } from "@modern-js/utils/lodash";
|
|
13
|
+
import { CONTENT_TYPE_DEFERRED, LOADER_ID_PARAM } from "../common/constants";
|
|
14
|
+
import { createDeferredReadableStream } from "./response";
|
|
15
|
+
installGlobals();
|
|
16
|
+
const redirectStatusCodes = /* @__PURE__ */ new Set([301, 302, 303, 307, 308]);
|
|
17
|
+
function isRedirectResponse(status) {
|
|
18
|
+
return redirectStatusCodes.has(status);
|
|
19
|
+
}
|
|
20
|
+
function isResponse(value) {
|
|
21
|
+
return value != null && typeof value.status === "number" && typeof value.statusText === "string" && typeof value.headers === "object" && typeof value.body !== "undefined";
|
|
22
|
+
}
|
|
23
|
+
function convertModernRedirectResponse(headers, basename) {
|
|
24
|
+
const newHeaders = new Headers(headers);
|
|
25
|
+
let redirectUrl = headers.get("Location");
|
|
26
|
+
if (basename !== "/") {
|
|
27
|
+
redirectUrl = redirectUrl.replace(basename, "");
|
|
28
|
+
}
|
|
29
|
+
newHeaders.set("X-Modernjs-Redirect", redirectUrl);
|
|
30
|
+
newHeaders.delete("Location");
|
|
31
|
+
return new NodeResponse(null, {
|
|
32
|
+
status: 204,
|
|
33
|
+
headers: newHeaders
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
const createLoaderHeaders = (requestHeaders) => {
|
|
37
|
+
const headers = new Headers();
|
|
38
|
+
for (const [key, values] of Object.entries(requestHeaders)) {
|
|
39
|
+
if (values) {
|
|
40
|
+
if (Array.isArray(values)) {
|
|
41
|
+
for (const value of values) {
|
|
42
|
+
headers.append(key, value);
|
|
43
|
+
}
|
|
44
|
+
} else {
|
|
45
|
+
headers.set(key, values);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return headers;
|
|
50
|
+
};
|
|
51
|
+
const createLoaderRequest = (context) => {
|
|
52
|
+
const origin = `${context.protocol}://${context.host}`;
|
|
53
|
+
const url = new URL(context.url, origin);
|
|
54
|
+
const controller = new AbortController();
|
|
55
|
+
const init = {
|
|
56
|
+
method: context.method,
|
|
57
|
+
headers: createLoaderHeaders(context.headers),
|
|
58
|
+
signal: controller.signal
|
|
59
|
+
};
|
|
60
|
+
return new Request(url.href, init);
|
|
61
|
+
};
|
|
62
|
+
const sendLoaderResponse = async (res, nodeResponse) => {
|
|
63
|
+
res.statusMessage = nodeResponse.statusText;
|
|
64
|
+
res.statusCode = nodeResponse.status;
|
|
65
|
+
for (const [key, value] of nodeResponse.headers.entries()) {
|
|
66
|
+
res.setHeader(key, value);
|
|
67
|
+
}
|
|
68
|
+
if (nodeResponse.body) {
|
|
69
|
+
await writeReadableStreamToWritable(nodeResponse.body, res);
|
|
70
|
+
} else {
|
|
71
|
+
res.end();
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
const matchEntry = (pathname, entries) => {
|
|
75
|
+
return entries.find((entry) => pathname.startsWith(entry.urlPath));
|
|
76
|
+
};
|
|
77
|
+
const handleRequest = async ({
|
|
78
|
+
context,
|
|
79
|
+
serverRoutes,
|
|
80
|
+
routes
|
|
81
|
+
}) => {
|
|
82
|
+
const { method, query } = context;
|
|
83
|
+
const routeId = query[LOADER_ID_PARAM];
|
|
84
|
+
const entry = matchEntry(context.path, serverRoutes);
|
|
85
|
+
if (!routeId || !entry) {
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
if (method.toLowerCase() !== "get") {
|
|
89
|
+
throw new Error("CSR data loader request only support http GET method");
|
|
90
|
+
}
|
|
91
|
+
const basename = entry.urlPath;
|
|
92
|
+
const dataRoutes = transformNestedRoutes(routes);
|
|
93
|
+
const staticHandler = createStaticHandler(dataRoutes, {
|
|
94
|
+
basename
|
|
95
|
+
});
|
|
96
|
+
const { res } = context;
|
|
97
|
+
const request = createLoaderRequest(context);
|
|
98
|
+
let response;
|
|
99
|
+
try {
|
|
100
|
+
response = await staticHandler.queryRoute(request, {
|
|
101
|
+
routeId,
|
|
102
|
+
requestContext: context
|
|
103
|
+
});
|
|
104
|
+
if (isResponse(response) && isRedirectResponse(response.status)) {
|
|
105
|
+
response = convertModernRedirectResponse(response.headers, basename);
|
|
106
|
+
} else if (isPlainObject(response) && DEFERRED_SYMBOL in response) {
|
|
107
|
+
const deferredData = response[DEFERRED_SYMBOL];
|
|
108
|
+
const body = createDeferredReadableStream(deferredData, request.signal);
|
|
109
|
+
const init = deferredData.init || {};
|
|
110
|
+
if (init.status && isRedirectResponse(init.status)) {
|
|
111
|
+
if (!init.headers) {
|
|
112
|
+
throw new Error("redirect response includes no headers");
|
|
113
|
+
}
|
|
114
|
+
response = convertModernRedirectResponse(
|
|
115
|
+
new Headers(init.headers),
|
|
116
|
+
basename
|
|
117
|
+
);
|
|
118
|
+
} else {
|
|
119
|
+
const headers = new Headers(init.headers);
|
|
120
|
+
headers.set("Content-Type", CONTENT_TYPE_DEFERRED);
|
|
121
|
+
init.headers = headers;
|
|
122
|
+
response = new NodeResponse(body, init);
|
|
123
|
+
}
|
|
124
|
+
} else {
|
|
125
|
+
response = isResponse(response) ? response : new NodeResponse(JSON.stringify(response), {
|
|
126
|
+
headers: {
|
|
127
|
+
"Content-Type": "application/json; charset=utf-8"
|
|
128
|
+
}
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
} catch (error) {
|
|
132
|
+
const message = error instanceof ErrorResponse ? error.data : String(error);
|
|
133
|
+
response = new NodeResponse(message, {
|
|
134
|
+
status: 500,
|
|
135
|
+
headers: {
|
|
136
|
+
"Content-Type": "text/plain"
|
|
137
|
+
}
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
sendLoaderResponse(res, response);
|
|
141
|
+
};
|
|
142
|
+
export {
|
|
143
|
+
handleRequest,
|
|
144
|
+
isRedirectResponse,
|
|
145
|
+
isResponse,
|
|
146
|
+
matchEntry
|
|
147
|
+
};
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { TextEncoder } from "util";
|
|
2
|
+
import { serializeJson } from "@modern-js/utils/serialize";
|
|
3
|
+
function isTrackedPromise(value) {
|
|
4
|
+
return value != null && typeof value.then === "function" && value._tracked === true;
|
|
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)) {
|
|
14
|
+
if (isTrackedPromise(value)) {
|
|
15
|
+
criticalData[key] = `${DEFERRED_VALUE_PLACEHOLDER_PREFIX}${key}`;
|
|
16
|
+
if (typeof value._data !== "undefined" || typeof value._error !== "undefined") {
|
|
17
|
+
preresolvedKeys.push(key);
|
|
18
|
+
}
|
|
19
|
+
} else {
|
|
20
|
+
criticalData[key] = value;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
controller.enqueue(encoder.encode(`${JSON.stringify(criticalData)}
|
|
24
|
+
|
|
25
|
+
`));
|
|
26
|
+
for (const preresolvedKey of preresolvedKeys) {
|
|
27
|
+
enqueueTrackedPromise(
|
|
28
|
+
controller,
|
|
29
|
+
encoder,
|
|
30
|
+
preresolvedKey,
|
|
31
|
+
deferredData.data[preresolvedKey]
|
|
32
|
+
);
|
|
33
|
+
}
|
|
34
|
+
const unsubscribe = deferredData.subscribe((aborted, settledKey) => {
|
|
35
|
+
if (settledKey) {
|
|
36
|
+
enqueueTrackedPromise(
|
|
37
|
+
controller,
|
|
38
|
+
encoder,
|
|
39
|
+
settledKey,
|
|
40
|
+
deferredData.data[settledKey]
|
|
41
|
+
);
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
await deferredData.resolveData(signal);
|
|
45
|
+
unsubscribe();
|
|
46
|
+
controller.close();
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
return stream;
|
|
50
|
+
}
|
|
51
|
+
function enqueueTrackedPromise(controller, encoder, settledKey, promise) {
|
|
52
|
+
var _a;
|
|
53
|
+
if ("_error" in promise) {
|
|
54
|
+
const { _error } = promise;
|
|
55
|
+
controller.enqueue(
|
|
56
|
+
encoder.encode(
|
|
57
|
+
`error:${serializeJson({
|
|
58
|
+
[settledKey]: {
|
|
59
|
+
message: _error.message,
|
|
60
|
+
stack: _error.stack
|
|
61
|
+
}
|
|
62
|
+
})}
|
|
63
|
+
|
|
64
|
+
`
|
|
65
|
+
)
|
|
66
|
+
);
|
|
67
|
+
} else {
|
|
68
|
+
controller.enqueue(
|
|
69
|
+
encoder.encode(
|
|
70
|
+
`data:${JSON.stringify({ [settledKey]: (_a = promise._data) != null ? _a : null })}
|
|
71
|
+
|
|
72
|
+
`
|
|
73
|
+
)
|
|
74
|
+
);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
export {
|
|
78
|
+
createDeferredReadableStream
|
|
79
|
+
};
|
|
@@ -1,179 +1,7 @@
|
|
|
1
1
|
import path from "path";
|
|
2
|
-
import
|
|
3
|
-
installGlobals,
|
|
4
|
-
writeReadableStreamToWritable,
|
|
5
|
-
Response as NodeResponse
|
|
6
|
-
} from "@remix-run/node";
|
|
7
|
-
import {
|
|
8
|
-
matchRoutes
|
|
9
|
-
} from "react-router-dom";
|
|
2
|
+
import fs from "fs";
|
|
10
3
|
import { MAIN_ENTRY_NAME, SERVER_BUNDLE_DIRECTORY } from "@modern-js/utils";
|
|
11
|
-
import {
|
|
12
|
-
installGlobals();
|
|
13
|
-
const redirectStatusCodes = /* @__PURE__ */ new Set([301, 302, 303, 307, 308]);
|
|
14
|
-
function isRedirectResponse(response) {
|
|
15
|
-
return redirectStatusCodes.has(response.status);
|
|
16
|
-
}
|
|
17
|
-
function isResponse(value) {
|
|
18
|
-
return value != null && typeof value.status === "number" && typeof value.statusText === "string" && typeof value.headers === "object" && typeof value.body !== "undefined";
|
|
19
|
-
}
|
|
20
|
-
const json = (data, init = {}) => {
|
|
21
|
-
const responseInit = typeof init === "number" ? { status: init } : init;
|
|
22
|
-
const headers = new Headers(responseInit.headers);
|
|
23
|
-
if (!headers.has("Content-Type")) {
|
|
24
|
-
headers.set("Content-Type", "application/json; charset=utf-8");
|
|
25
|
-
}
|
|
26
|
-
return new NodeResponse(JSON.stringify(data), {
|
|
27
|
-
...responseInit,
|
|
28
|
-
headers
|
|
29
|
-
});
|
|
30
|
-
};
|
|
31
|
-
const callRouteLoader = async ({
|
|
32
|
-
routeId,
|
|
33
|
-
loader,
|
|
34
|
-
params,
|
|
35
|
-
request,
|
|
36
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
37
|
-
loadContext
|
|
38
|
-
}) => {
|
|
39
|
-
if (!loader) {
|
|
40
|
-
throw new Error(
|
|
41
|
-
`You made a ${request.method} request to ${request.url} but did not provide a default component or \`loader\` for route "${routeId}", so there is no way to handle the request.`
|
|
42
|
-
);
|
|
43
|
-
}
|
|
44
|
-
let result;
|
|
45
|
-
try {
|
|
46
|
-
result = await loader({
|
|
47
|
-
request,
|
|
48
|
-
params
|
|
49
|
-
});
|
|
50
|
-
} catch (error) {
|
|
51
|
-
if (!isResponse(error)) {
|
|
52
|
-
throw error;
|
|
53
|
-
}
|
|
54
|
-
result = error;
|
|
55
|
-
}
|
|
56
|
-
if (result === void 0) {
|
|
57
|
-
throw new Error(
|
|
58
|
-
`You defined a loader for route "${routeId}" but didn't return anything from your \`loader\` function. Please return a value or \`null\`.`
|
|
59
|
-
);
|
|
60
|
-
}
|
|
61
|
-
return isResponse(result) ? result : json(result);
|
|
62
|
-
};
|
|
63
|
-
const createLoaderHeaders = (requestHeaders) => {
|
|
64
|
-
const headers = new Headers();
|
|
65
|
-
for (const [key, values] of Object.entries(requestHeaders)) {
|
|
66
|
-
if (values) {
|
|
67
|
-
if (Array.isArray(values)) {
|
|
68
|
-
for (const value of values) {
|
|
69
|
-
headers.append(key, value);
|
|
70
|
-
}
|
|
71
|
-
} else {
|
|
72
|
-
headers.set(key, values);
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
return headers;
|
|
77
|
-
};
|
|
78
|
-
const createLoaderRequest = (context) => {
|
|
79
|
-
const origin = `${context.protocol}://${context.host}`;
|
|
80
|
-
const url = new URL(context.url, origin);
|
|
81
|
-
const controller = new AbortController();
|
|
82
|
-
const init = {
|
|
83
|
-
method: context.method,
|
|
84
|
-
headers: createLoaderHeaders(context.headers),
|
|
85
|
-
signal: controller.signal
|
|
86
|
-
};
|
|
87
|
-
return new Request(url.href, init);
|
|
88
|
-
};
|
|
89
|
-
const sendLoaderResponse = async (res, nodeResponse) => {
|
|
90
|
-
res.statusMessage = nodeResponse.statusText;
|
|
91
|
-
res.statusCode = nodeResponse.status;
|
|
92
|
-
for (const [key, value] of nodeResponse.headers.entries()) {
|
|
93
|
-
res.setHeader(key, value);
|
|
94
|
-
}
|
|
95
|
-
if (nodeResponse.body) {
|
|
96
|
-
await writeReadableStreamToWritable(nodeResponse.body, res);
|
|
97
|
-
} else {
|
|
98
|
-
res.end();
|
|
99
|
-
}
|
|
100
|
-
};
|
|
101
|
-
const getPathWithoutEntry = (pathname, entryPath) => {
|
|
102
|
-
if (entryPath === "/") {
|
|
103
|
-
return pathname;
|
|
104
|
-
}
|
|
105
|
-
return pathname.replace(entryPath, "");
|
|
106
|
-
};
|
|
107
|
-
const matchEntry = (pathname, entries) => {
|
|
108
|
-
return entries.find((entry) => pathname.startsWith(entry.urlPath));
|
|
109
|
-
};
|
|
110
|
-
const handleRequest = async ({
|
|
111
|
-
context,
|
|
112
|
-
serverRoutes,
|
|
113
|
-
distDir
|
|
114
|
-
}) => {
|
|
115
|
-
const { method, query } = context;
|
|
116
|
-
const routeId = query[LOADER_ID_PARAM];
|
|
117
|
-
if (!routeId || method.toLowerCase() !== "get") {
|
|
118
|
-
return;
|
|
119
|
-
}
|
|
120
|
-
const entry = matchEntry(context.path, serverRoutes);
|
|
121
|
-
if (!entry) {
|
|
122
|
-
return;
|
|
123
|
-
}
|
|
124
|
-
const routesPath = path.join(
|
|
125
|
-
distDir,
|
|
126
|
-
SERVER_BUNDLE_DIRECTORY,
|
|
127
|
-
`${entry.entryName || MAIN_ENTRY_NAME}-server-loaders`
|
|
128
|
-
);
|
|
129
|
-
const { routes } = await import(routesPath);
|
|
130
|
-
if (!routes) {
|
|
131
|
-
return;
|
|
132
|
-
}
|
|
133
|
-
const { res } = context;
|
|
134
|
-
const pathname = getPathWithoutEntry(context.path, entry.urlPath);
|
|
135
|
-
const matches = matchRoutes(routes, pathname);
|
|
136
|
-
if (!matches) {
|
|
137
|
-
res.statusCode = 403;
|
|
138
|
-
res.end(`Route ${pathname} was not matched`);
|
|
139
|
-
return;
|
|
140
|
-
}
|
|
141
|
-
const match = matches == null ? void 0 : matches.find((match2) => match2.route.id === routeId);
|
|
142
|
-
if (!match) {
|
|
143
|
-
res.statusCode = 403;
|
|
144
|
-
res.end(`Route ${routeId} does not match URL ${context.path}`);
|
|
145
|
-
return;
|
|
146
|
-
}
|
|
147
|
-
const request = createLoaderRequest(context);
|
|
148
|
-
let response;
|
|
149
|
-
try {
|
|
150
|
-
response = await callRouteLoader({
|
|
151
|
-
loader: match.route.loader,
|
|
152
|
-
routeId: match.route.id,
|
|
153
|
-
params: match.params,
|
|
154
|
-
request,
|
|
155
|
-
loadContext: {}
|
|
156
|
-
});
|
|
157
|
-
if (isRedirectResponse(response)) {
|
|
158
|
-
const headers = new Headers(response.headers);
|
|
159
|
-
headers.set("X-Modernjs-Redirect", headers.get("Location"));
|
|
160
|
-
headers.delete("Location");
|
|
161
|
-
response = new NodeResponse(null, {
|
|
162
|
-
status: 204,
|
|
163
|
-
headers
|
|
164
|
-
});
|
|
165
|
-
}
|
|
166
|
-
} catch (error) {
|
|
167
|
-
const message = String(error);
|
|
168
|
-
response = new NodeResponse(message, {
|
|
169
|
-
status: 500,
|
|
170
|
-
headers: {
|
|
171
|
-
"Content-Type": "text/plain"
|
|
172
|
-
}
|
|
173
|
-
});
|
|
174
|
-
}
|
|
175
|
-
sendLoaderResponse(res, response);
|
|
176
|
-
};
|
|
4
|
+
import { matchEntry } from "../runtime";
|
|
177
5
|
var server_default = () => ({
|
|
178
6
|
name: "@modern-js/plugin-data-loader",
|
|
179
7
|
setup: () => ({
|
|
@@ -182,19 +10,31 @@ var server_default = () => ({
|
|
|
182
10
|
distDir
|
|
183
11
|
}) {
|
|
184
12
|
return async (context) => {
|
|
13
|
+
const entry = matchEntry(context.path, serverRoutes);
|
|
14
|
+
if (!entry) {
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
const routesPath = path.join(
|
|
18
|
+
distDir,
|
|
19
|
+
SERVER_BUNDLE_DIRECTORY,
|
|
20
|
+
`${entry.entryName || MAIN_ENTRY_NAME}-server-loaders.js`
|
|
21
|
+
);
|
|
22
|
+
if (!fs.existsSync(routesPath)) {
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
const { routes, handleRequest } = await import(routesPath);
|
|
26
|
+
if (!routes) {
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
185
29
|
return handleRequest({
|
|
186
30
|
serverRoutes,
|
|
187
|
-
|
|
188
|
-
|
|
31
|
+
context,
|
|
32
|
+
routes
|
|
189
33
|
});
|
|
190
34
|
};
|
|
191
35
|
}
|
|
192
36
|
})
|
|
193
37
|
});
|
|
194
38
|
export {
|
|
195
|
-
server_default as default
|
|
196
|
-
getPathWithoutEntry,
|
|
197
|
-
handleRequest,
|
|
198
|
-
isRedirectResponse,
|
|
199
|
-
isResponse
|
|
39
|
+
server_default as default
|
|
200
40
|
};
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type UNSAFE_DeferredData as DeferredData } from '@modern-js/utils/remix-router';
|
|
1
2
|
export declare const getRequestUrl: ({
|
|
2
3
|
params,
|
|
3
4
|
request,
|
|
@@ -13,4 +14,4 @@ export declare const createRequest: (routeId: string, method?: string) => ({
|
|
|
13
14
|
}: {
|
|
14
15
|
params: Record<string, string>;
|
|
15
16
|
request: Request;
|
|
16
|
-
}) => Promise<Response>;
|
|
17
|
+
}) => Promise<DeferredData | Response>;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* modified from https://github.com/remix-run/remix/blob/main/packages/remix-react/data.ts
|
|
3
|
+
* license at https://github.com/remix-run/remix/blob/main/LICENSE.md
|
|
4
|
+
*/
|
|
5
|
+
import { UNSAFE_DeferredData as DeferredData } from '@modern-js/utils/remix-router';
|
|
6
|
+
export declare function parseDeferredReadableStream(stream: ReadableStream<Uint8Array>): Promise<DeferredData>;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { ModernServerContext, NestedRoute, ServerRoute } from '@modern-js/types';
|
|
2
|
+
import { Response as NodeResponse } from '@remix-run/node';
|
|
3
|
+
export type ServerContext = Pick<ModernServerContext, 'req' | 'res' | 'params' | 'headers' | 'method' | 'url' | 'host' | 'protocol' | 'origin' | 'href' | 'path' | 'query'>;
|
|
4
|
+
export declare function isRedirectResponse(status: number): boolean;
|
|
5
|
+
export declare function isResponse(value: any): value is NodeResponse;
|
|
6
|
+
export declare const matchEntry: (pathname: string, entries: ServerRoute[]) => ServerRoute | undefined;
|
|
7
|
+
export declare const handleRequest: ({
|
|
8
|
+
context,
|
|
9
|
+
serverRoutes,
|
|
10
|
+
routes
|
|
11
|
+
}: {
|
|
12
|
+
context: ServerContext;
|
|
13
|
+
serverRoutes: ServerRoute[];
|
|
14
|
+
routes: NestedRoute[];
|
|
15
|
+
}) => Promise<void>;
|
|
@@ -1,19 +1,4 @@
|
|
|
1
1
|
import type { ServerPlugin } from '@modern-js/server-core';
|
|
2
|
-
import type { ModernServerContext, ServerRoute } from '@modern-js/types';
|
|
3
|
-
import { Response as NodeResponse } from '@remix-run/node';
|
|
4
|
-
export type ServerContext = Pick<ModernServerContext, 'req' | 'res' | 'params' | 'headers' | 'method' | 'url' | 'host' | 'protocol' | 'origin' | 'href' | 'path' | 'query'>;
|
|
5
|
-
export declare function isRedirectResponse(response: NodeResponse): boolean;
|
|
6
|
-
export declare function isResponse(value: any): value is NodeResponse;
|
|
7
|
-
export declare const getPathWithoutEntry: (pathname: string, entryPath: string) => string;
|
|
8
|
-
export declare const handleRequest: ({
|
|
9
|
-
context,
|
|
10
|
-
serverRoutes,
|
|
11
|
-
distDir
|
|
12
|
-
}: {
|
|
13
|
-
context: ServerContext;
|
|
14
|
-
serverRoutes: ServerRoute[];
|
|
15
|
-
distDir: string;
|
|
16
|
-
}) => Promise<void>;
|
|
17
2
|
|
|
18
3
|
declare const _default: () => ServerPlugin;
|
|
19
4
|
|
package/package.json
CHANGED
|
@@ -11,7 +11,10 @@
|
|
|
11
11
|
"modern",
|
|
12
12
|
"modern.js"
|
|
13
13
|
],
|
|
14
|
-
"version": "2.
|
|
14
|
+
"version": "2.7.0",
|
|
15
|
+
"engines": {
|
|
16
|
+
"node": ">=14.17.6"
|
|
17
|
+
},
|
|
15
18
|
"jsnext:source": "./src/index.ts",
|
|
16
19
|
"types": "./dist/types/index.d.ts",
|
|
17
20
|
"main": "./dist/cjs/index.js",
|
|
@@ -24,6 +27,10 @@
|
|
|
24
27
|
"./server": {
|
|
25
28
|
"jsnext:source": "./src/server/index.ts",
|
|
26
29
|
"default": "./dist/cjs/server/index.js"
|
|
30
|
+
},
|
|
31
|
+
"./runtime": {
|
|
32
|
+
"jsnext:source": "./src/runtime/index.ts",
|
|
33
|
+
"default": "./dist/esm/runtime/index.js"
|
|
27
34
|
}
|
|
28
35
|
},
|
|
29
36
|
"typesVersions": {
|
|
@@ -33,16 +40,19 @@
|
|
|
33
40
|
],
|
|
34
41
|
"server": [
|
|
35
42
|
"./dist/types/server/index.d.ts"
|
|
43
|
+
],
|
|
44
|
+
"runtime": [
|
|
45
|
+
"./dist/types/runtime/index.d.ts"
|
|
36
46
|
]
|
|
37
47
|
}
|
|
38
48
|
},
|
|
39
49
|
"dependencies": {
|
|
40
50
|
"@babel/core": "^7.18.0",
|
|
41
51
|
"@babel/runtime": "^7.18.0",
|
|
42
|
-
"@remix-run/node": "^1.
|
|
52
|
+
"@remix-run/node": "^1.12.0",
|
|
43
53
|
"path-to-regexp": "^6.2.0",
|
|
44
|
-
"react-router-dom": "^6.
|
|
45
|
-
"@modern-js/utils": "2.
|
|
54
|
+
"react-router-dom": "^6.8.1",
|
|
55
|
+
"@modern-js/utils": "2.7.0"
|
|
46
56
|
},
|
|
47
57
|
"devDependencies": {
|
|
48
58
|
"@types/babel__core": "^7.1.15",
|
|
@@ -57,11 +67,11 @@
|
|
|
57
67
|
"typescript": "^4",
|
|
58
68
|
"webpack": "^5.75.0",
|
|
59
69
|
"webpack-chain": "^6.5.1",
|
|
60
|
-
"@modern-js/core": "2.
|
|
61
|
-
"@modern-js/server-core": "2.
|
|
62
|
-
"@modern-js/types": "2.
|
|
63
|
-
"@scripts/build": "2.
|
|
64
|
-
"@scripts/jest-config": "2.
|
|
70
|
+
"@modern-js/core": "2.7.0",
|
|
71
|
+
"@modern-js/server-core": "2.7.0",
|
|
72
|
+
"@modern-js/types": "2.7.0",
|
|
73
|
+
"@scripts/build": "2.7.0",
|
|
74
|
+
"@scripts/jest-config": "2.7.0"
|
|
65
75
|
},
|
|
66
76
|
"sideEffects": false,
|
|
67
77
|
"publishConfig": {
|
|
File without changes
|