@modern-js/plugin-data-loader 0.0.0-next-20221212073036 → 0.0.0-next-20221212085956
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/CHANGELOG.md +3 -3
- package/dist/js/modern/cli/create-request.js +24 -38
- package/dist/js/modern/cli/generate-client.js +9 -10
- package/dist/js/modern/cli/loader.js +15 -37
- package/dist/js/modern/server/index.js +66 -107
- package/dist/js/node/cli/create-request.js +32 -56
- package/dist/js/node/cli/generate-client.js +15 -33
- package/dist/js/node/cli/loader.js +21 -56
- package/dist/js/node/server/index.js +79 -141
- package/dist/js/treeshaking/cli/create-request.js +68 -182
- package/dist/js/treeshaking/cli/generate-client.js +18 -35
- package/dist/js/treeshaking/cli/loader.js +31 -145
- package/dist/js/treeshaking/server/index.js +296 -556
- package/dist/types/server/index.d.ts +0 -2
- package/package.json +8 -8
package/CHANGELOG.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# @modern-js/plugin-data-loader
|
|
2
2
|
|
|
3
|
-
## 0.0.0-next-
|
|
3
|
+
## 0.0.0-next-20221212085956
|
|
4
4
|
|
|
5
5
|
### Major Changes
|
|
6
6
|
|
|
@@ -43,5 +43,5 @@
|
|
|
43
43
|
- Updated dependencies [abf3421a7]
|
|
44
44
|
- Updated dependencies [543be9558]
|
|
45
45
|
- Updated dependencies [14b712da8]
|
|
46
|
-
- @modern-js/utils@0.0.0-next-
|
|
47
|
-
- @modern-js/babel-compiler@0.0.0-next-
|
|
46
|
+
- @modern-js/utils@0.0.0-next-20221212085956
|
|
47
|
+
- @modern-js/babel-compiler@0.0.0-next-20221212085956
|
|
@@ -1,26 +1,10 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
}
|
|
9
|
-
};
|
|
10
|
-
var rejected = (value) => {
|
|
11
|
-
try {
|
|
12
|
-
step(generator.throw(value));
|
|
13
|
-
} catch (e) {
|
|
14
|
-
reject(e);
|
|
15
|
-
}
|
|
16
|
-
};
|
|
17
|
-
var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
|
|
18
|
-
step((generator = generator.apply(__this, __arguments)).next());
|
|
19
|
-
});
|
|
20
|
-
};
|
|
21
|
-
import { compile } from "path-to-regexp";
|
|
22
|
-
import { redirect } from "react-router-dom";
|
|
23
|
-
const getRequestUrl = ({
|
|
1
|
+
// eslint-disable-next-line eslint-comments/disable-enable-pair
|
|
2
|
+
/* eslint-disable node/prefer-global/url */
|
|
3
|
+
// eslint-disable-next-line eslint-comments/disable-enable-pair
|
|
4
|
+
/* eslint-disable node/no-unsupported-features/node-builtins */
|
|
5
|
+
import { compile } from 'path-to-regexp';
|
|
6
|
+
import { redirect } from 'react-router-dom';
|
|
7
|
+
export const getRequestUrl = ({
|
|
24
8
|
params,
|
|
25
9
|
request,
|
|
26
10
|
routeId
|
|
@@ -31,24 +15,30 @@ const getRequestUrl = ({
|
|
|
31
15
|
});
|
|
32
16
|
const newPathName = toPath(params);
|
|
33
17
|
url.pathname = newPathName;
|
|
34
|
-
url.searchParams.append(
|
|
18
|
+
url.searchParams.append('_loader', routeId);
|
|
35
19
|
return url;
|
|
36
20
|
};
|
|
37
|
-
const handleRedirectResponse =
|
|
38
|
-
const {
|
|
39
|
-
|
|
21
|
+
const handleRedirectResponse = res => {
|
|
22
|
+
const {
|
|
23
|
+
headers
|
|
24
|
+
} = res;
|
|
25
|
+
const location = headers.get('X-Modernjs-Redirect');
|
|
40
26
|
if (location) {
|
|
41
27
|
return redirect(location);
|
|
42
28
|
}
|
|
43
29
|
return res;
|
|
44
30
|
};
|
|
45
|
-
const createRequest = (routeId, method =
|
|
46
|
-
return
|
|
31
|
+
export const createRequest = (routeId, method = 'get') => {
|
|
32
|
+
return async ({
|
|
47
33
|
params,
|
|
48
34
|
request
|
|
49
|
-
}) {
|
|
50
|
-
const url = getRequestUrl({
|
|
51
|
-
|
|
35
|
+
}) => {
|
|
36
|
+
const url = getRequestUrl({
|
|
37
|
+
params,
|
|
38
|
+
request,
|
|
39
|
+
routeId
|
|
40
|
+
});
|
|
41
|
+
const res = await fetch(url, {
|
|
52
42
|
method,
|
|
53
43
|
signal: request.signal
|
|
54
44
|
});
|
|
@@ -56,9 +46,5 @@ const createRequest = (routeId, method = "get") => {
|
|
|
56
46
|
throw res;
|
|
57
47
|
}
|
|
58
48
|
return handleRedirectResponse(res);
|
|
59
|
-
}
|
|
60
|
-
};
|
|
61
|
-
export {
|
|
62
|
-
createRequest,
|
|
63
|
-
getRequestUrl
|
|
64
|
-
};
|
|
49
|
+
};
|
|
50
|
+
};
|
|
@@ -1,18 +1,20 @@
|
|
|
1
|
-
import path from
|
|
2
|
-
const generateClient = ({
|
|
1
|
+
import path from 'path';
|
|
2
|
+
export const generateClient = ({
|
|
3
|
+
mapFile
|
|
4
|
+
}) => {
|
|
3
5
|
const loadersMap = require(mapFile);
|
|
4
|
-
const requestCode = Object.keys(loadersMap).map(
|
|
6
|
+
const requestCode = Object.keys(loadersMap).map(loaderId => {
|
|
5
7
|
const routeId = loadersMap[loaderId];
|
|
6
8
|
return `
|
|
7
9
|
const ${loaderId} = createRequest('${routeId}');
|
|
8
10
|
`;
|
|
9
|
-
}).join(
|
|
11
|
+
}).join('');
|
|
10
12
|
let exportsCode = `export {`;
|
|
11
13
|
for (const loader of Object.keys(loadersMap)) {
|
|
12
14
|
exportsCode += `${loader},`;
|
|
13
15
|
}
|
|
14
|
-
exportsCode +=
|
|
15
|
-
const requestCreatorPath = path.join(__dirname,
|
|
16
|
+
exportsCode += '}';
|
|
17
|
+
const requestCreatorPath = path.join(__dirname, './create-request').replace('node', 'treeshaking').replace(/\\/g, '/');
|
|
16
18
|
const importCode = `
|
|
17
19
|
import { createRequest } from '${requestCreatorPath}';
|
|
18
20
|
`;
|
|
@@ -21,7 +23,4 @@ const generateClient = ({ mapFile }) => {
|
|
|
21
23
|
${requestCode}
|
|
22
24
|
${exportsCode}
|
|
23
25
|
`;
|
|
24
|
-
};
|
|
25
|
-
export {
|
|
26
|
-
generateClient
|
|
27
|
-
};
|
|
26
|
+
};
|
|
@@ -1,39 +1,17 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
try {
|
|
5
|
-
step(generator.next(value));
|
|
6
|
-
} catch (e) {
|
|
7
|
-
reject(e);
|
|
8
|
-
}
|
|
9
|
-
};
|
|
10
|
-
var rejected = (value) => {
|
|
11
|
-
try {
|
|
12
|
-
step(generator.throw(value));
|
|
13
|
-
} catch (e) {
|
|
14
|
-
reject(e);
|
|
15
|
-
}
|
|
16
|
-
};
|
|
17
|
-
var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
|
|
18
|
-
step((generator = generator.apply(__this, __arguments)).next());
|
|
19
|
-
});
|
|
20
|
-
};
|
|
1
|
+
// eslint-disable-next-line eslint-comments/disable-enable-pair
|
|
2
|
+
/* eslint-disable @babel/no-invalid-this */
|
|
3
|
+
|
|
21
4
|
import { generateClient } from "./generate-client";
|
|
22
|
-
function loader(source) {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
mapFile: options.mapFile
|
|
33
|
-
});
|
|
34
|
-
return code;
|
|
5
|
+
export default async function loader(source) {
|
|
6
|
+
var _this$_compiler;
|
|
7
|
+
this.cacheable();
|
|
8
|
+
const target = (_this$_compiler = this._compiler) === null || _this$_compiler === void 0 ? void 0 : _this$_compiler.options.target;
|
|
9
|
+
if (target === 'node') {
|
|
10
|
+
return source;
|
|
11
|
+
}
|
|
12
|
+
const options = this.getOptions();
|
|
13
|
+
const code = generateClient({
|
|
14
|
+
mapFile: options.mapFile
|
|
35
15
|
});
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
loader as default
|
|
39
|
-
};
|
|
16
|
+
return code;
|
|
17
|
+
}
|
|
@@ -1,86 +1,50 @@
|
|
|
1
|
-
var
|
|
2
|
-
var
|
|
3
|
-
|
|
4
|
-
var
|
|
5
|
-
var
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
__defNormalProp(a, prop, b[prop]);
|
|
12
|
-
if (__getOwnPropSymbols)
|
|
13
|
-
for (var prop of __getOwnPropSymbols(b)) {
|
|
14
|
-
if (__propIsEnum.call(b, prop))
|
|
15
|
-
__defNormalProp(a, prop, b[prop]);
|
|
16
|
-
}
|
|
17
|
-
return a;
|
|
18
|
-
};
|
|
19
|
-
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
|
|
20
|
-
var __async = (__this, __arguments, generator) => {
|
|
21
|
-
return new Promise((resolve, reject) => {
|
|
22
|
-
var fulfilled = (value) => {
|
|
23
|
-
try {
|
|
24
|
-
step(generator.next(value));
|
|
25
|
-
} catch (e) {
|
|
26
|
-
reject(e);
|
|
27
|
-
}
|
|
28
|
-
};
|
|
29
|
-
var rejected = (value) => {
|
|
30
|
-
try {
|
|
31
|
-
step(generator.throw(value));
|
|
32
|
-
} catch (e) {
|
|
33
|
-
reject(e);
|
|
34
|
-
}
|
|
35
|
-
};
|
|
36
|
-
var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
|
|
37
|
-
step((generator = generator.apply(__this, __arguments)).next());
|
|
38
|
-
});
|
|
39
|
-
};
|
|
40
|
-
import path from "path";
|
|
41
|
-
import {
|
|
42
|
-
installGlobals,
|
|
43
|
-
writeReadableStreamToWritable,
|
|
44
|
-
Response as NodeResponse
|
|
45
|
-
} from "@remix-run/node";
|
|
46
|
-
import {
|
|
47
|
-
matchRoutes
|
|
48
|
-
} from "react-router-dom";
|
|
49
|
-
import { LOADER_ROUTES_DIR, MAIN_ENTRY_NAME } from "@modern-js/utils";
|
|
1
|
+
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
|
2
|
+
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
|
|
3
|
+
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
4
|
+
function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
|
|
5
|
+
function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
|
|
6
|
+
import path from 'path';
|
|
7
|
+
import { installGlobals, writeReadableStreamToWritable, Response as NodeResponse } from '@remix-run/node';
|
|
8
|
+
import { matchRoutes } from 'react-router-dom';
|
|
9
|
+
import { LOADER_ROUTES_DIR, MAIN_ENTRY_NAME } from '@modern-js/utils';
|
|
10
|
+
// Polyfill Web Fetch API
|
|
50
11
|
installGlobals();
|
|
51
|
-
const LOADER_SEARCH_PARAM =
|
|
52
|
-
const redirectStatusCodes =
|
|
53
|
-
function isRedirectResponse(response) {
|
|
12
|
+
const LOADER_SEARCH_PARAM = '_loader';
|
|
13
|
+
const redirectStatusCodes = new Set([301, 302, 303, 307, 308]);
|
|
14
|
+
export function isRedirectResponse(response) {
|
|
54
15
|
return redirectStatusCodes.has(response.status);
|
|
55
16
|
}
|
|
56
|
-
function isResponse(value) {
|
|
57
|
-
return value != null && typeof value.status ===
|
|
17
|
+
export function isResponse(value) {
|
|
18
|
+
return value != null && typeof value.status === 'number' && typeof value.statusText === 'string' && typeof value.headers === 'object' && typeof value.body !== 'undefined';
|
|
58
19
|
}
|
|
59
20
|
const json = (data, init = {}) => {
|
|
60
|
-
const responseInit = typeof init ===
|
|
21
|
+
const responseInit = typeof init === 'number' ? {
|
|
22
|
+
status: init
|
|
23
|
+
} : init;
|
|
61
24
|
const headers = new Headers(responseInit.headers);
|
|
62
|
-
if (!headers.has(
|
|
63
|
-
headers.set(
|
|
25
|
+
if (!headers.has('Content-Type')) {
|
|
26
|
+
headers.set('Content-Type', 'application/json; charset=utf-8');
|
|
64
27
|
}
|
|
65
|
-
return new NodeResponse(JSON.stringify(data),
|
|
28
|
+
return new NodeResponse(JSON.stringify(data), _objectSpread(_objectSpread({}, responseInit), {}, {
|
|
66
29
|
headers
|
|
67
30
|
}));
|
|
68
31
|
};
|
|
69
|
-
|
|
32
|
+
|
|
33
|
+
// TODO: 添加 context
|
|
34
|
+
const callRouteLoader = async ({
|
|
70
35
|
routeId,
|
|
71
36
|
loader,
|
|
72
37
|
params,
|
|
73
38
|
request,
|
|
39
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
74
40
|
loadContext
|
|
75
|
-
}) {
|
|
41
|
+
}) => {
|
|
76
42
|
if (!loader) {
|
|
77
|
-
throw new Error(
|
|
78
|
-
`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.`
|
|
79
|
-
);
|
|
43
|
+
throw new Error(`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.`);
|
|
80
44
|
}
|
|
81
45
|
let result;
|
|
82
46
|
try {
|
|
83
|
-
result =
|
|
47
|
+
result = await loader({
|
|
84
48
|
request,
|
|
85
49
|
params
|
|
86
50
|
});
|
|
@@ -90,14 +54,12 @@ const callRouteLoader = (_0) => __async(void 0, [_0], function* ({
|
|
|
90
54
|
}
|
|
91
55
|
result = error;
|
|
92
56
|
}
|
|
93
|
-
if (result ===
|
|
94
|
-
throw new Error(
|
|
95
|
-
`You defined a loader for route "${routeId}" but didn't return anything from your \`loader\` function. Please return a value or \`null\`.`
|
|
96
|
-
);
|
|
57
|
+
if (result === undefined) {
|
|
58
|
+
throw new Error(`You defined a loader for route "${routeId}" but didn't return ` + `anything from your \`loader\` function. Please return a value or \`null\`.`);
|
|
97
59
|
}
|
|
98
60
|
return isResponse(result) ? result : json(result);
|
|
99
|
-
}
|
|
100
|
-
const createLoaderHeaders =
|
|
61
|
+
};
|
|
62
|
+
const createLoaderHeaders = requestHeaders => {
|
|
101
63
|
const headers = new Headers();
|
|
102
64
|
for (const [key, values] of Object.entries(requestHeaders)) {
|
|
103
65
|
if (values) {
|
|
@@ -112,8 +74,9 @@ const createLoaderHeaders = (requestHeaders) => {
|
|
|
112
74
|
}
|
|
113
75
|
return headers;
|
|
114
76
|
};
|
|
115
|
-
const createLoaderRequest =
|
|
77
|
+
const createLoaderRequest = context => {
|
|
116
78
|
const origin = `${context.protocol}://${context.host}`;
|
|
79
|
+
// eslint-disable-next-line node/no-unsupported-features/node-builtins, node/prefer-global/url
|
|
117
80
|
const url = new URL(context.url, origin);
|
|
118
81
|
const controller = new AbortController();
|
|
119
82
|
const init = {
|
|
@@ -123,51 +86,54 @@ const createLoaderRequest = (context) => {
|
|
|
123
86
|
};
|
|
124
87
|
return new Request(url.href, init);
|
|
125
88
|
};
|
|
126
|
-
const sendLoaderResponse = (res, nodeResponse) =>
|
|
89
|
+
const sendLoaderResponse = async (res, nodeResponse) => {
|
|
127
90
|
res.statusMessage = nodeResponse.statusText;
|
|
128
91
|
res.statusCode = nodeResponse.status;
|
|
129
92
|
for (const [key, value] of nodeResponse.headers.entries()) {
|
|
130
93
|
res.setHeader(key, value);
|
|
131
94
|
}
|
|
132
95
|
if (nodeResponse.body) {
|
|
133
|
-
|
|
96
|
+
await writeReadableStreamToWritable(nodeResponse.body, res);
|
|
134
97
|
} else {
|
|
135
98
|
res.end();
|
|
136
99
|
}
|
|
137
|
-
}
|
|
138
|
-
const getPathWithoutEntry = (pathname, entryPath) => {
|
|
139
|
-
if (entryPath ===
|
|
100
|
+
};
|
|
101
|
+
export const getPathWithoutEntry = (pathname, entryPath) => {
|
|
102
|
+
if (entryPath === '/') {
|
|
140
103
|
return pathname;
|
|
141
104
|
}
|
|
142
|
-
return pathname.replace(entryPath,
|
|
105
|
+
return pathname.replace(entryPath, '');
|
|
143
106
|
};
|
|
144
107
|
const matchEntry = (pathname, entries) => {
|
|
145
|
-
return entries.find(
|
|
108
|
+
return entries.find(entry => pathname.startsWith(entry.urlPath));
|
|
146
109
|
};
|
|
147
|
-
const handleRequest =
|
|
110
|
+
export const handleRequest = async ({
|
|
148
111
|
context,
|
|
149
112
|
serverRoutes,
|
|
150
113
|
distDir
|
|
151
|
-
}) {
|
|
152
|
-
const {
|
|
114
|
+
}) => {
|
|
115
|
+
const {
|
|
116
|
+
method,
|
|
117
|
+
query
|
|
118
|
+
} = context;
|
|
153
119
|
const routeId = query[LOADER_SEARCH_PARAM];
|
|
154
|
-
if (!routeId || method.toLowerCase() !==
|
|
120
|
+
if (!routeId || method.toLowerCase() !== 'get') {
|
|
155
121
|
return;
|
|
156
122
|
}
|
|
157
123
|
const entry = matchEntry(context.path, serverRoutes);
|
|
158
124
|
if (!entry) {
|
|
159
125
|
return;
|
|
160
126
|
}
|
|
161
|
-
const routesPath = path.join(
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
);
|
|
166
|
-
const { routes } = yield import(routesPath);
|
|
127
|
+
const routesPath = path.join(distDir, LOADER_ROUTES_DIR, entry.entryName || MAIN_ENTRY_NAME);
|
|
128
|
+
const {
|
|
129
|
+
routes
|
|
130
|
+
} = await import(routesPath);
|
|
167
131
|
if (!routes) {
|
|
168
132
|
return;
|
|
169
133
|
}
|
|
170
|
-
const {
|
|
134
|
+
const {
|
|
135
|
+
res
|
|
136
|
+
} = context;
|
|
171
137
|
const pathname = getPathWithoutEntry(context.path, entry.urlPath);
|
|
172
138
|
const matches = matchRoutes(routes, pathname);
|
|
173
139
|
if (!matches) {
|
|
@@ -175,7 +141,7 @@ const handleRequest = (_0) => __async(void 0, [_0], function* ({
|
|
|
175
141
|
res.end(`Route ${pathname} was not matched`);
|
|
176
142
|
return;
|
|
177
143
|
}
|
|
178
|
-
const match = matches
|
|
144
|
+
const match = matches === null || matches === void 0 ? void 0 : matches.find(match => match.route.id === routeId);
|
|
179
145
|
if (!match) {
|
|
180
146
|
res.statusCode = 403;
|
|
181
147
|
res.end(`Route ${routeId} does not match URL ${context.path}`);
|
|
@@ -184,7 +150,7 @@ const handleRequest = (_0) => __async(void 0, [_0], function* ({
|
|
|
184
150
|
const request = createLoaderRequest(context);
|
|
185
151
|
let response;
|
|
186
152
|
try {
|
|
187
|
-
response =
|
|
153
|
+
response = await callRouteLoader({
|
|
188
154
|
loader: match.route.loader,
|
|
189
155
|
routeId: match.route.id,
|
|
190
156
|
params: match.params,
|
|
@@ -193,8 +159,8 @@ const handleRequest = (_0) => __async(void 0, [_0], function* ({
|
|
|
193
159
|
});
|
|
194
160
|
if (isRedirectResponse(response)) {
|
|
195
161
|
const headers = new Headers(response.headers);
|
|
196
|
-
headers.set(
|
|
197
|
-
headers.delete(
|
|
162
|
+
headers.set('X-Modernjs-Redirect', headers.get('Location'));
|
|
163
|
+
headers.delete('Location');
|
|
198
164
|
response = new NodeResponse(null, {
|
|
199
165
|
status: 204,
|
|
200
166
|
headers
|
|
@@ -205,33 +171,26 @@ const handleRequest = (_0) => __async(void 0, [_0], function* ({
|
|
|
205
171
|
response = new NodeResponse(message, {
|
|
206
172
|
status: 500,
|
|
207
173
|
headers: {
|
|
208
|
-
|
|
174
|
+
'Content-Type': 'text/plain'
|
|
209
175
|
}
|
|
210
176
|
});
|
|
211
177
|
}
|
|
212
178
|
sendLoaderResponse(res, response);
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
name:
|
|
179
|
+
};
|
|
180
|
+
export default (() => ({
|
|
181
|
+
name: '@modern-js/plugin-data-loader',
|
|
216
182
|
setup: () => ({
|
|
217
183
|
preparebeforeRouteHandler({
|
|
218
184
|
serverRoutes,
|
|
219
185
|
distDir
|
|
220
186
|
}) {
|
|
221
|
-
return
|
|
187
|
+
return async context => {
|
|
222
188
|
return handleRequest({
|
|
223
189
|
serverRoutes,
|
|
224
190
|
distDir,
|
|
225
191
|
context
|
|
226
192
|
});
|
|
227
|
-
}
|
|
193
|
+
};
|
|
228
194
|
}
|
|
229
195
|
})
|
|
230
|
-
});
|
|
231
|
-
export {
|
|
232
|
-
server_default as default,
|
|
233
|
-
getPathWithoutEntry,
|
|
234
|
-
handleRequest,
|
|
235
|
-
isRedirectResponse,
|
|
236
|
-
isResponse
|
|
237
|
-
};
|
|
196
|
+
}));
|
|
@@ -1,77 +1,52 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
var __export = (target, all) => {
|
|
6
|
-
for (var name in all)
|
|
7
|
-
__defProp(target, name, { get: all[name], enumerable: true });
|
|
8
|
-
};
|
|
9
|
-
var __copyProps = (to, from, except, desc) => {
|
|
10
|
-
if (from && typeof from === "object" || typeof from === "function") {
|
|
11
|
-
for (let key of __getOwnPropNames(from))
|
|
12
|
-
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
13
|
-
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
14
|
-
}
|
|
15
|
-
return to;
|
|
16
|
-
};
|
|
17
|
-
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
18
|
-
var stdin_exports = {};
|
|
19
|
-
__export(stdin_exports, {
|
|
20
|
-
createRequest: () => createRequest,
|
|
21
|
-
getRequestUrl: () => getRequestUrl
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
22
5
|
});
|
|
23
|
-
|
|
24
|
-
var
|
|
25
|
-
var
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
} catch (e) {
|
|
32
|
-
reject(e);
|
|
33
|
-
}
|
|
34
|
-
};
|
|
35
|
-
var rejected = (value) => {
|
|
36
|
-
try {
|
|
37
|
-
step(generator.throw(value));
|
|
38
|
-
} catch (e) {
|
|
39
|
-
reject(e);
|
|
40
|
-
}
|
|
41
|
-
};
|
|
42
|
-
var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
|
|
43
|
-
step((generator = generator.apply(__this, __arguments)).next());
|
|
44
|
-
});
|
|
45
|
-
};
|
|
6
|
+
exports.getRequestUrl = exports.createRequest = void 0;
|
|
7
|
+
var _pathToRegexp = require("path-to-regexp");
|
|
8
|
+
var _reactRouterDom = require("react-router-dom");
|
|
9
|
+
// eslint-disable-next-line eslint-comments/disable-enable-pair
|
|
10
|
+
/* eslint-disable node/prefer-global/url */
|
|
11
|
+
// eslint-disable-next-line eslint-comments/disable-enable-pair
|
|
12
|
+
/* eslint-disable node/no-unsupported-features/node-builtins */
|
|
13
|
+
|
|
46
14
|
const getRequestUrl = ({
|
|
47
15
|
params,
|
|
48
16
|
request,
|
|
49
17
|
routeId
|
|
50
18
|
}) => {
|
|
51
19
|
const url = new URL(request.url);
|
|
52
|
-
const toPath = (0,
|
|
20
|
+
const toPath = (0, _pathToRegexp.compile)(url.pathname, {
|
|
53
21
|
encode: encodeURIComponent
|
|
54
22
|
});
|
|
55
23
|
const newPathName = toPath(params);
|
|
56
24
|
url.pathname = newPathName;
|
|
57
|
-
url.searchParams.append(
|
|
25
|
+
url.searchParams.append('_loader', routeId);
|
|
58
26
|
return url;
|
|
59
27
|
};
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
const
|
|
28
|
+
exports.getRequestUrl = getRequestUrl;
|
|
29
|
+
const handleRedirectResponse = res => {
|
|
30
|
+
const {
|
|
31
|
+
headers
|
|
32
|
+
} = res;
|
|
33
|
+
const location = headers.get('X-Modernjs-Redirect');
|
|
63
34
|
if (location) {
|
|
64
|
-
return (0,
|
|
35
|
+
return (0, _reactRouterDom.redirect)(location);
|
|
65
36
|
}
|
|
66
37
|
return res;
|
|
67
38
|
};
|
|
68
|
-
const createRequest = (routeId, method =
|
|
69
|
-
return
|
|
39
|
+
const createRequest = (routeId, method = 'get') => {
|
|
40
|
+
return async ({
|
|
70
41
|
params,
|
|
71
42
|
request
|
|
72
|
-
}) {
|
|
73
|
-
const url = getRequestUrl({
|
|
74
|
-
|
|
43
|
+
}) => {
|
|
44
|
+
const url = getRequestUrl({
|
|
45
|
+
params,
|
|
46
|
+
request,
|
|
47
|
+
routeId
|
|
48
|
+
});
|
|
49
|
+
const res = await fetch(url, {
|
|
75
50
|
method,
|
|
76
51
|
signal: request.signal
|
|
77
52
|
});
|
|
@@ -79,5 +54,6 @@ const createRequest = (routeId, method = "get") => {
|
|
|
79
54
|
throw res;
|
|
80
55
|
}
|
|
81
56
|
return handleRedirectResponse(res);
|
|
82
|
-
}
|
|
57
|
+
};
|
|
83
58
|
};
|
|
59
|
+
exports.createRequest = createRequest;
|
|
@@ -1,46 +1,27 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
var __getProtoOf = Object.getPrototypeOf;
|
|
6
|
-
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
-
var __export = (target, all) => {
|
|
8
|
-
for (var name in all)
|
|
9
|
-
__defProp(target, name, { get: all[name], enumerable: true });
|
|
10
|
-
};
|
|
11
|
-
var __copyProps = (to, from, except, desc) => {
|
|
12
|
-
if (from && typeof from === "object" || typeof from === "function") {
|
|
13
|
-
for (let key of __getOwnPropNames(from))
|
|
14
|
-
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
15
|
-
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
16
|
-
}
|
|
17
|
-
return to;
|
|
18
|
-
};
|
|
19
|
-
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
20
|
-
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
21
|
-
mod
|
|
22
|
-
));
|
|
23
|
-
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
24
|
-
var stdin_exports = {};
|
|
25
|
-
__export(stdin_exports, {
|
|
26
|
-
generateClient: () => generateClient
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
27
5
|
});
|
|
28
|
-
|
|
29
|
-
var
|
|
30
|
-
|
|
6
|
+
exports.generateClient = void 0;
|
|
7
|
+
var _path = _interopRequireDefault(require("path"));
|
|
8
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
9
|
+
const generateClient = ({
|
|
10
|
+
mapFile
|
|
11
|
+
}) => {
|
|
31
12
|
const loadersMap = require(mapFile);
|
|
32
|
-
const requestCode = Object.keys(loadersMap).map(
|
|
13
|
+
const requestCode = Object.keys(loadersMap).map(loaderId => {
|
|
33
14
|
const routeId = loadersMap[loaderId];
|
|
34
15
|
return `
|
|
35
16
|
const ${loaderId} = createRequest('${routeId}');
|
|
36
17
|
`;
|
|
37
|
-
}).join(
|
|
18
|
+
}).join('');
|
|
38
19
|
let exportsCode = `export {`;
|
|
39
20
|
for (const loader of Object.keys(loadersMap)) {
|
|
40
21
|
exportsCode += `${loader},`;
|
|
41
22
|
}
|
|
42
|
-
exportsCode +=
|
|
43
|
-
const requestCreatorPath =
|
|
23
|
+
exportsCode += '}';
|
|
24
|
+
const requestCreatorPath = _path.default.join(__dirname, './create-request').replace('node', 'treeshaking').replace(/\\/g, '/');
|
|
44
25
|
const importCode = `
|
|
45
26
|
import { createRequest } from '${requestCreatorPath}';
|
|
46
27
|
`;
|
|
@@ -50,3 +31,4 @@ const generateClient = ({ mapFile }) => {
|
|
|
50
31
|
${exportsCode}
|
|
51
32
|
`;
|
|
52
33
|
};
|
|
34
|
+
exports.generateClient = generateClient;
|