@modern-js/plugin-data-loader 0.0.0-next-20230927182220 → 0.0.0-next-20231009011430
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 +38 -0
- package/dist/cjs/cli/generateClient.js +13 -20
- package/dist/cjs/cli/loader.js +8 -10
- package/dist/cjs/runtime/index.js +16 -8
- package/dist/esm/cli/createRequest.js +114 -0
- package/dist/esm/cli/generateClient.js +9 -35
- package/dist/esm/cli/loader.js +8 -10
- package/dist/esm/runtime/index.js +17 -9
- package/dist/esm-node/cli/createRequest.js +37 -0
- package/dist/esm-node/cli/generateClient.js +13 -20
- package/dist/esm-node/cli/loader.js +8 -10
- package/dist/esm-node/runtime/index.js +16 -8
- package/dist/types/cli/createRequest.d.ts +8 -1
- package/dist/types/cli/generateClient.d.ts +6 -4
- package/dist/types/cli/loader.d.ts +4 -1
- package/package.json +8 -8
|
@@ -18,6 +18,7 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
18
18
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
19
|
var createRequest_exports = {};
|
|
20
20
|
__export(createRequest_exports, {
|
|
21
|
+
createActionRequest: () => createActionRequest,
|
|
21
22
|
createRequest: () => createRequest,
|
|
22
23
|
getRequestUrl: () => getRequestUrl
|
|
23
24
|
});
|
|
@@ -72,8 +73,45 @@ const createRequest = (routeId, method = "get") => {
|
|
|
72
73
|
return res;
|
|
73
74
|
};
|
|
74
75
|
};
|
|
76
|
+
const createActionRequest = (routeId) => {
|
|
77
|
+
return async ({ params, request }) => {
|
|
78
|
+
const url = getRequestUrl({
|
|
79
|
+
params,
|
|
80
|
+
request,
|
|
81
|
+
routeId
|
|
82
|
+
});
|
|
83
|
+
const init = {
|
|
84
|
+
signal: request.signal
|
|
85
|
+
};
|
|
86
|
+
if (request.method !== "GET") {
|
|
87
|
+
init.method = request.method;
|
|
88
|
+
const contentType = request.headers.get("Content-Type");
|
|
89
|
+
if (contentType && /\bapplication\/json\b/.test(contentType)) {
|
|
90
|
+
init.headers = {
|
|
91
|
+
"Content-Type": contentType
|
|
92
|
+
};
|
|
93
|
+
init.body = JSON.stringify(await request.json());
|
|
94
|
+
} else if (contentType && /\btext\/plain\b/.test(contentType)) {
|
|
95
|
+
init.headers = {
|
|
96
|
+
"Content-Type": contentType
|
|
97
|
+
};
|
|
98
|
+
init.body = await request.text();
|
|
99
|
+
} else if (contentType && /\bapplication\/x-www-form-urlencoded\b/.test(contentType)) {
|
|
100
|
+
init.body = new URLSearchParams(await request.text());
|
|
101
|
+
} else {
|
|
102
|
+
init.body = await request.formData();
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
const res = await fetch(url, init);
|
|
106
|
+
if (!res.ok) {
|
|
107
|
+
throw res;
|
|
108
|
+
}
|
|
109
|
+
return res;
|
|
110
|
+
};
|
|
111
|
+
};
|
|
75
112
|
// Annotate the CommonJS export names for ESM import in node:
|
|
76
113
|
0 && (module.exports = {
|
|
114
|
+
createActionRequest,
|
|
77
115
|
createRequest,
|
|
78
116
|
getRequestUrl
|
|
79
117
|
});
|
|
@@ -32,38 +32,31 @@ __export(generateClient_exports, {
|
|
|
32
32
|
});
|
|
33
33
|
module.exports = __toCommonJS(generateClient_exports);
|
|
34
34
|
var import_path = __toESM(require("path"));
|
|
35
|
-
const generateClient = ({
|
|
36
|
-
delete require.cache[mapFile];
|
|
37
|
-
const loadersMap = require(mapFile);
|
|
35
|
+
const generateClient = ({ inline, action, routeId }) => {
|
|
38
36
|
let requestCode = ``;
|
|
39
|
-
let exportsCode = ``;
|
|
40
37
|
const requestCreatorPath = import_path.default.join(__dirname, "./createRequest").replace("/cjs/cli/", "/esm/cli/").replace(/\\/g, "/");
|
|
41
38
|
const importCode = `
|
|
42
|
-
import { createRequest } from '${requestCreatorPath}';
|
|
39
|
+
import { createRequest, createActionRequest } from '${requestCreatorPath}';
|
|
43
40
|
`;
|
|
44
|
-
if (
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
const
|
|
41
|
+
if (inline) {
|
|
42
|
+
if (action) {
|
|
43
|
+
requestCode = `
|
|
44
|
+
export const loader = createRequest('${routeId}');
|
|
45
|
+
export const action = createActionRequest('${routeId}')
|
|
46
|
+
`;
|
|
47
|
+
} else {
|
|
48
|
+
requestCode = `
|
|
49
|
+
export const loader = createRequest('${routeId}');
|
|
49
50
|
`;
|
|
50
|
-
}).join("");
|
|
51
|
-
exportsCode = `export {`;
|
|
52
|
-
for (const loader of Object.keys(loadersMap)) {
|
|
53
|
-
exportsCode += `${loader},`;
|
|
54
51
|
}
|
|
55
|
-
exportsCode += "}";
|
|
56
52
|
} else {
|
|
57
|
-
const loader = loadersMap[loaderId];
|
|
58
53
|
requestCode = `
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
exportsCode = `export default loader;`;
|
|
54
|
+
export default createRequest('${routeId}');
|
|
55
|
+
`;
|
|
62
56
|
}
|
|
63
57
|
const generatedCode = `
|
|
64
58
|
${importCode}
|
|
65
59
|
${requestCode}
|
|
66
|
-
${exportsCode}
|
|
67
60
|
`;
|
|
68
61
|
return generatedCode;
|
|
69
62
|
};
|
package/dist/cjs/cli/loader.js
CHANGED
|
@@ -35,17 +35,14 @@ async function loader(source) {
|
|
|
35
35
|
return source;
|
|
36
36
|
}
|
|
37
37
|
const { resourceQuery } = this;
|
|
38
|
-
const options = resourceQuery.slice(1).split("&").
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
if (!key || !value) {
|
|
43
|
-
return pre;
|
|
38
|
+
const options = resourceQuery.slice(1).split("&").reduce((pre, cur) => {
|
|
39
|
+
const [key, value] = cur.split("=");
|
|
40
|
+
if (key && value) {
|
|
41
|
+
pre[key] = value === "true" ? true : value === "false" ? false : value;
|
|
44
42
|
}
|
|
45
|
-
pre[key] = value;
|
|
46
43
|
return pre;
|
|
47
44
|
}, {});
|
|
48
|
-
if (!options.
|
|
45
|
+
if (!options.loaderId) {
|
|
49
46
|
return source;
|
|
50
47
|
}
|
|
51
48
|
if (options.clientData) {
|
|
@@ -61,8 +58,9 @@ async function loader(source) {
|
|
|
61
58
|
}
|
|
62
59
|
}
|
|
63
60
|
const code = (0, import_generateClient.generateClient)({
|
|
64
|
-
|
|
65
|
-
|
|
61
|
+
inline: options.inline,
|
|
62
|
+
action: options.action,
|
|
63
|
+
routeId: options.routeId
|
|
66
64
|
});
|
|
67
65
|
return code;
|
|
68
66
|
}
|
|
@@ -74,7 +74,7 @@ const createLoaderHeaders = (requestHeaders) => {
|
|
|
74
74
|
}
|
|
75
75
|
return headers;
|
|
76
76
|
};
|
|
77
|
-
const
|
|
77
|
+
const createRequest = (context) => {
|
|
78
78
|
const origin = `${context.protocol}://${context.host}`;
|
|
79
79
|
const url = new URL(context.url, origin);
|
|
80
80
|
const controller = new AbortController();
|
|
@@ -83,7 +83,14 @@ const createLoaderRequest = (context) => {
|
|
|
83
83
|
headers: createLoaderHeaders(context.headers),
|
|
84
84
|
signal: controller.signal
|
|
85
85
|
};
|
|
86
|
-
|
|
86
|
+
if (![
|
|
87
|
+
"GET",
|
|
88
|
+
"HEAD"
|
|
89
|
+
].includes(context.method.toUpperCase())) {
|
|
90
|
+
init.body = context.req;
|
|
91
|
+
}
|
|
92
|
+
const request = new Request(url.href, init);
|
|
93
|
+
return request;
|
|
87
94
|
};
|
|
88
95
|
const sendLoaderResponse = async (res, nodeResponse) => {
|
|
89
96
|
res.statusMessage = nodeResponse.statusText;
|
|
@@ -98,15 +105,12 @@ const sendLoaderResponse = async (res, nodeResponse) => {
|
|
|
98
105
|
}
|
|
99
106
|
};
|
|
100
107
|
const handleRequest = async ({ context, serverRoutes, routes: routesConfig }) => {
|
|
101
|
-
const {
|
|
108
|
+
const { query } = context;
|
|
102
109
|
const routeId = query[import_constants2.LOADER_ID_PARAM];
|
|
103
110
|
const entry = (0, import_node2.matchEntry)(context.path, serverRoutes);
|
|
104
111
|
if (!routeId || !entry) {
|
|
105
112
|
return;
|
|
106
113
|
}
|
|
107
|
-
if (method.toLowerCase() !== "get") {
|
|
108
|
-
throw new Error("CSR data loader request only support http GET method");
|
|
109
|
-
}
|
|
110
114
|
const basename = entry.urlPath;
|
|
111
115
|
const end = (0, import_time.time)();
|
|
112
116
|
const { res, logger, reporter } = context;
|
|
@@ -114,7 +118,7 @@ const handleRequest = async ({ context, serverRoutes, routes: routesConfig }) =>
|
|
|
114
118
|
const { queryRoute } = (0, import_remix_router.createStaticHandler)(routes, {
|
|
115
119
|
basename
|
|
116
120
|
});
|
|
117
|
-
const request =
|
|
121
|
+
const request = createRequest(context);
|
|
118
122
|
const requestContext = (0, import_node2.createRequestContext)();
|
|
119
123
|
requestContext.set(import_node2.reporterCtx, reporter);
|
|
120
124
|
let response;
|
|
@@ -149,7 +153,11 @@ const handleRequest = async ({ context, serverRoutes, routes: routesConfig }) =>
|
|
|
149
153
|
}
|
|
150
154
|
} catch (error) {
|
|
151
155
|
const message = error instanceof import_remix_router.ErrorResponse ? error.data : String(error);
|
|
152
|
-
|
|
156
|
+
if (error instanceof Error) {
|
|
157
|
+
logger === null || logger === void 0 ? void 0 : logger.error(error);
|
|
158
|
+
} else {
|
|
159
|
+
logger === null || logger === void 0 ? void 0 : logger.error(message);
|
|
160
|
+
}
|
|
153
161
|
response = new import_node.Response(message, {
|
|
154
162
|
status: 500,
|
|
155
163
|
headers: {
|
|
@@ -101,7 +101,121 @@ var createRequest = function(routeId) {
|
|
|
101
101
|
};
|
|
102
102
|
}();
|
|
103
103
|
};
|
|
104
|
+
var createActionRequest = function(routeId) {
|
|
105
|
+
return function() {
|
|
106
|
+
var _ref = _async_to_generator(function(param) {
|
|
107
|
+
var params, request, url, init, contentType, _, _1, res;
|
|
108
|
+
return _ts_generator(this, function(_state) {
|
|
109
|
+
switch (_state.label) {
|
|
110
|
+
case 0:
|
|
111
|
+
params = param.params, request = param.request;
|
|
112
|
+
url = getRequestUrl({
|
|
113
|
+
params,
|
|
114
|
+
request,
|
|
115
|
+
routeId
|
|
116
|
+
});
|
|
117
|
+
init = {
|
|
118
|
+
signal: request.signal
|
|
119
|
+
};
|
|
120
|
+
if (!(request.method !== "GET"))
|
|
121
|
+
return [
|
|
122
|
+
3,
|
|
123
|
+
8
|
|
124
|
+
];
|
|
125
|
+
init.method = request.method;
|
|
126
|
+
contentType = request.headers.get("Content-Type");
|
|
127
|
+
if (!(contentType && /\bapplication\/json\b/.test(contentType)))
|
|
128
|
+
return [
|
|
129
|
+
3,
|
|
130
|
+
2
|
|
131
|
+
];
|
|
132
|
+
init.headers = {
|
|
133
|
+
"Content-Type": contentType
|
|
134
|
+
};
|
|
135
|
+
_ = JSON.stringify;
|
|
136
|
+
return [
|
|
137
|
+
4,
|
|
138
|
+
request.json()
|
|
139
|
+
];
|
|
140
|
+
case 1:
|
|
141
|
+
init.body = _.apply(JSON, [
|
|
142
|
+
_state.sent()
|
|
143
|
+
]);
|
|
144
|
+
return [
|
|
145
|
+
3,
|
|
146
|
+
8
|
|
147
|
+
];
|
|
148
|
+
case 2:
|
|
149
|
+
if (!(contentType && /\btext\/plain\b/.test(contentType)))
|
|
150
|
+
return [
|
|
151
|
+
3,
|
|
152
|
+
4
|
|
153
|
+
];
|
|
154
|
+
init.headers = {
|
|
155
|
+
"Content-Type": contentType
|
|
156
|
+
};
|
|
157
|
+
return [
|
|
158
|
+
4,
|
|
159
|
+
request.text()
|
|
160
|
+
];
|
|
161
|
+
case 3:
|
|
162
|
+
init.body = _state.sent();
|
|
163
|
+
return [
|
|
164
|
+
3,
|
|
165
|
+
8
|
|
166
|
+
];
|
|
167
|
+
case 4:
|
|
168
|
+
if (!(contentType && /\bapplication\/x-www-form-urlencoded\b/.test(contentType)))
|
|
169
|
+
return [
|
|
170
|
+
3,
|
|
171
|
+
6
|
|
172
|
+
];
|
|
173
|
+
_1 = URLSearchParams.bind;
|
|
174
|
+
return [
|
|
175
|
+
4,
|
|
176
|
+
request.text()
|
|
177
|
+
];
|
|
178
|
+
case 5:
|
|
179
|
+
init.body = new (_1.apply(URLSearchParams, [
|
|
180
|
+
void 0,
|
|
181
|
+
_state.sent()
|
|
182
|
+
]))();
|
|
183
|
+
return [
|
|
184
|
+
3,
|
|
185
|
+
8
|
|
186
|
+
];
|
|
187
|
+
case 6:
|
|
188
|
+
return [
|
|
189
|
+
4,
|
|
190
|
+
request.formData()
|
|
191
|
+
];
|
|
192
|
+
case 7:
|
|
193
|
+
init.body = _state.sent();
|
|
194
|
+
_state.label = 8;
|
|
195
|
+
case 8:
|
|
196
|
+
return [
|
|
197
|
+
4,
|
|
198
|
+
fetch(url, init)
|
|
199
|
+
];
|
|
200
|
+
case 9:
|
|
201
|
+
res = _state.sent();
|
|
202
|
+
if (!res.ok) {
|
|
203
|
+
throw res;
|
|
204
|
+
}
|
|
205
|
+
return [
|
|
206
|
+
2,
|
|
207
|
+
res
|
|
208
|
+
];
|
|
209
|
+
}
|
|
210
|
+
});
|
|
211
|
+
});
|
|
212
|
+
return function(_) {
|
|
213
|
+
return _ref.apply(this, arguments);
|
|
214
|
+
};
|
|
215
|
+
}();
|
|
216
|
+
};
|
|
104
217
|
export {
|
|
218
|
+
createActionRequest,
|
|
105
219
|
createRequest,
|
|
106
220
|
getRequestUrl
|
|
107
221
|
};
|
|
@@ -1,45 +1,19 @@
|
|
|
1
1
|
import path from "path";
|
|
2
2
|
var generateClient = function(param) {
|
|
3
|
-
var
|
|
4
|
-
delete require.cache[mapFile];
|
|
5
|
-
var loadersMap = require(mapFile);
|
|
3
|
+
var inline = param.inline, action = param.action, routeId = param.routeId;
|
|
6
4
|
var requestCode = "";
|
|
7
|
-
var exportsCode = "";
|
|
8
5
|
var requestCreatorPath = path.join(__dirname, "./createRequest").replace("/cjs/cli/", "/esm/cli/").replace(/\\/g, "/");
|
|
9
|
-
var importCode = "\n import { createRequest } from '".concat(requestCreatorPath, "';\n ");
|
|
10
|
-
if (
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
exportsCode = "export {";
|
|
16
|
-
var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = void 0;
|
|
17
|
-
try {
|
|
18
|
-
for (var _iterator = Object.keys(loadersMap)[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
|
|
19
|
-
var loader = _step.value;
|
|
20
|
-
exportsCode += "".concat(loader, ",");
|
|
21
|
-
}
|
|
22
|
-
} catch (err) {
|
|
23
|
-
_didIteratorError = true;
|
|
24
|
-
_iteratorError = err;
|
|
25
|
-
} finally {
|
|
26
|
-
try {
|
|
27
|
-
if (!_iteratorNormalCompletion && _iterator.return != null) {
|
|
28
|
-
_iterator.return();
|
|
29
|
-
}
|
|
30
|
-
} finally {
|
|
31
|
-
if (_didIteratorError) {
|
|
32
|
-
throw _iteratorError;
|
|
33
|
-
}
|
|
34
|
-
}
|
|
6
|
+
var importCode = "\n import { createRequest, createActionRequest } from '".concat(requestCreatorPath, "';\n ");
|
|
7
|
+
if (inline) {
|
|
8
|
+
if (action) {
|
|
9
|
+
requestCode = "\n export const loader = createRequest('".concat(routeId, "');\n export const action = createActionRequest('").concat(routeId, "')\n ");
|
|
10
|
+
} else {
|
|
11
|
+
requestCode = "\n export const loader = createRequest('".concat(routeId, "');\n ");
|
|
35
12
|
}
|
|
36
|
-
exportsCode += "}";
|
|
37
13
|
} else {
|
|
38
|
-
|
|
39
|
-
requestCode = "\n const loader = createRequest('".concat(loader1.routeId, "');\n ");
|
|
40
|
-
exportsCode = "export default loader;";
|
|
14
|
+
requestCode = "\n export default createRequest('".concat(routeId, "');\n ");
|
|
41
15
|
}
|
|
42
|
-
var generatedCode = "\n ".concat(importCode, "\n ").concat(requestCode, "\n
|
|
16
|
+
var generatedCode = "\n ".concat(importCode, "\n ").concat(requestCode, "\n ");
|
|
43
17
|
return generatedCode;
|
|
44
18
|
};
|
|
45
19
|
export {
|
package/dist/esm/cli/loader.js
CHANGED
|
@@ -28,17 +28,14 @@ function _loader() {
|
|
|
28
28
|
];
|
|
29
29
|
}
|
|
30
30
|
resourceQuery = this.resourceQuery;
|
|
31
|
-
options = resourceQuery.slice(1).split("&").
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
if (!key || !value) {
|
|
36
|
-
return pre;
|
|
31
|
+
options = resourceQuery.slice(1).split("&").reduce(function(pre, cur) {
|
|
32
|
+
var _cur_split = _sliced_to_array(cur.split("="), 2), key = _cur_split[0], value = _cur_split[1];
|
|
33
|
+
if (key && value) {
|
|
34
|
+
pre[key] = value === "true" ? true : value === "false" ? false : value;
|
|
37
35
|
}
|
|
38
|
-
pre[key] = value;
|
|
39
36
|
return pre;
|
|
40
37
|
}, {});
|
|
41
|
-
if (!options.
|
|
38
|
+
if (!options.loaderId) {
|
|
42
39
|
return [
|
|
43
40
|
2,
|
|
44
41
|
source
|
|
@@ -80,8 +77,9 @@ function _loader() {
|
|
|
80
77
|
];
|
|
81
78
|
case 4:
|
|
82
79
|
code = generateClient({
|
|
83
|
-
|
|
84
|
-
|
|
80
|
+
inline: options.inline,
|
|
81
|
+
action: options.action,
|
|
82
|
+
routeId: options.routeId
|
|
85
83
|
});
|
|
86
84
|
return [
|
|
87
85
|
2,
|
|
@@ -87,7 +87,7 @@ var createLoaderHeaders = function(requestHeaders) {
|
|
|
87
87
|
}
|
|
88
88
|
return headers;
|
|
89
89
|
};
|
|
90
|
-
var
|
|
90
|
+
var createRequest = function(context) {
|
|
91
91
|
var origin = "".concat(context.protocol, "://").concat(context.host);
|
|
92
92
|
var url = new URL(context.url, origin);
|
|
93
93
|
var controller = new AbortController();
|
|
@@ -96,7 +96,14 @@ var createLoaderRequest = function(context) {
|
|
|
96
96
|
headers: createLoaderHeaders(context.headers),
|
|
97
97
|
signal: controller.signal
|
|
98
98
|
};
|
|
99
|
-
|
|
99
|
+
if (![
|
|
100
|
+
"GET",
|
|
101
|
+
"HEAD"
|
|
102
|
+
].includes(context.method.toUpperCase())) {
|
|
103
|
+
init.body = context.req;
|
|
104
|
+
}
|
|
105
|
+
var request = new Request(url.href, init);
|
|
106
|
+
return request;
|
|
100
107
|
};
|
|
101
108
|
var sendLoaderResponse = function() {
|
|
102
109
|
var _ref = _async_to_generator(function(res, nodeResponse) {
|
|
@@ -157,12 +164,12 @@ var sendLoaderResponse = function() {
|
|
|
157
164
|
}();
|
|
158
165
|
var handleRequest = function() {
|
|
159
166
|
var _ref = _async_to_generator(function(param) {
|
|
160
|
-
var context, serverRoutes, routesConfig,
|
|
167
|
+
var context, serverRoutes, routesConfig, query, routeId, entry, basename, end, res, logger, reporter, routes, queryRoute, request, requestContext, response, deferredData, body, init, headers, error, message, cost;
|
|
161
168
|
return _ts_generator(this, function(_state) {
|
|
162
169
|
switch (_state.label) {
|
|
163
170
|
case 0:
|
|
164
171
|
context = param.context, serverRoutes = param.serverRoutes, routesConfig = param.routes;
|
|
165
|
-
|
|
172
|
+
query = context.query;
|
|
166
173
|
routeId = query[LOADER_ID_PARAM];
|
|
167
174
|
entry = matchEntry(context.path, serverRoutes);
|
|
168
175
|
if (!routeId || !entry) {
|
|
@@ -170,9 +177,6 @@ var handleRequest = function() {
|
|
|
170
177
|
2
|
|
171
178
|
];
|
|
172
179
|
}
|
|
173
|
-
if (method.toLowerCase() !== "get") {
|
|
174
|
-
throw new Error("CSR data loader request only support http GET method");
|
|
175
|
-
}
|
|
176
180
|
basename = entry.urlPath;
|
|
177
181
|
end = time();
|
|
178
182
|
res = context.res, logger = context.logger, reporter = context.reporter;
|
|
@@ -180,7 +184,7 @@ var handleRequest = function() {
|
|
|
180
184
|
queryRoute = createStaticHandler(routes, {
|
|
181
185
|
basename
|
|
182
186
|
}).queryRoute;
|
|
183
|
-
request =
|
|
187
|
+
request = createRequest(context);
|
|
184
188
|
requestContext = createRequestContext();
|
|
185
189
|
requestContext.set(reporterCtx, reporter);
|
|
186
190
|
_state.label = 1;
|
|
@@ -231,7 +235,11 @@ var handleRequest = function() {
|
|
|
231
235
|
case 3:
|
|
232
236
|
error = _state.sent();
|
|
233
237
|
message = _instanceof(error, ErrorResponse) ? error.data : String(error);
|
|
234
|
-
|
|
238
|
+
if (_instanceof(error, Error)) {
|
|
239
|
+
logger === null || logger === void 0 ? void 0 : logger.error(error);
|
|
240
|
+
} else {
|
|
241
|
+
logger === null || logger === void 0 ? void 0 : logger.error(message);
|
|
242
|
+
}
|
|
235
243
|
response = new NodeResponse(message, {
|
|
236
244
|
status: 500,
|
|
237
245
|
headers: {
|
|
@@ -48,7 +48,44 @@ const createRequest = (routeId, method = "get") => {
|
|
|
48
48
|
return res;
|
|
49
49
|
};
|
|
50
50
|
};
|
|
51
|
+
const createActionRequest = (routeId) => {
|
|
52
|
+
return async ({ params, request }) => {
|
|
53
|
+
const url = getRequestUrl({
|
|
54
|
+
params,
|
|
55
|
+
request,
|
|
56
|
+
routeId
|
|
57
|
+
});
|
|
58
|
+
const init = {
|
|
59
|
+
signal: request.signal
|
|
60
|
+
};
|
|
61
|
+
if (request.method !== "GET") {
|
|
62
|
+
init.method = request.method;
|
|
63
|
+
const contentType = request.headers.get("Content-Type");
|
|
64
|
+
if (contentType && /\bapplication\/json\b/.test(contentType)) {
|
|
65
|
+
init.headers = {
|
|
66
|
+
"Content-Type": contentType
|
|
67
|
+
};
|
|
68
|
+
init.body = JSON.stringify(await request.json());
|
|
69
|
+
} else if (contentType && /\btext\/plain\b/.test(contentType)) {
|
|
70
|
+
init.headers = {
|
|
71
|
+
"Content-Type": contentType
|
|
72
|
+
};
|
|
73
|
+
init.body = await request.text();
|
|
74
|
+
} else if (contentType && /\bapplication\/x-www-form-urlencoded\b/.test(contentType)) {
|
|
75
|
+
init.body = new URLSearchParams(await request.text());
|
|
76
|
+
} else {
|
|
77
|
+
init.body = await request.formData();
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
const res = await fetch(url, init);
|
|
81
|
+
if (!res.ok) {
|
|
82
|
+
throw res;
|
|
83
|
+
}
|
|
84
|
+
return res;
|
|
85
|
+
};
|
|
86
|
+
};
|
|
51
87
|
export {
|
|
88
|
+
createActionRequest,
|
|
52
89
|
createRequest,
|
|
53
90
|
getRequestUrl
|
|
54
91
|
};
|
|
@@ -1,36 +1,29 @@
|
|
|
1
1
|
import path from "path";
|
|
2
|
-
const generateClient = ({
|
|
3
|
-
delete require.cache[mapFile];
|
|
4
|
-
const loadersMap = require(mapFile);
|
|
2
|
+
const generateClient = ({ inline, action, routeId }) => {
|
|
5
3
|
let requestCode = ``;
|
|
6
|
-
let exportsCode = ``;
|
|
7
4
|
const requestCreatorPath = path.join(__dirname, "./createRequest").replace("/cjs/cli/", "/esm/cli/").replace(/\\/g, "/");
|
|
8
5
|
const importCode = `
|
|
9
|
-
import { createRequest } from '${requestCreatorPath}';
|
|
6
|
+
import { createRequest, createActionRequest } from '${requestCreatorPath}';
|
|
10
7
|
`;
|
|
11
|
-
if (
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
const
|
|
8
|
+
if (inline) {
|
|
9
|
+
if (action) {
|
|
10
|
+
requestCode = `
|
|
11
|
+
export const loader = createRequest('${routeId}');
|
|
12
|
+
export const action = createActionRequest('${routeId}')
|
|
13
|
+
`;
|
|
14
|
+
} else {
|
|
15
|
+
requestCode = `
|
|
16
|
+
export const loader = createRequest('${routeId}');
|
|
16
17
|
`;
|
|
17
|
-
}).join("");
|
|
18
|
-
exportsCode = `export {`;
|
|
19
|
-
for (const loader of Object.keys(loadersMap)) {
|
|
20
|
-
exportsCode += `${loader},`;
|
|
21
18
|
}
|
|
22
|
-
exportsCode += "}";
|
|
23
19
|
} else {
|
|
24
|
-
const loader = loadersMap[loaderId];
|
|
25
20
|
requestCode = `
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
exportsCode = `export default loader;`;
|
|
21
|
+
export default createRequest('${routeId}');
|
|
22
|
+
`;
|
|
29
23
|
}
|
|
30
24
|
const generatedCode = `
|
|
31
25
|
${importCode}
|
|
32
26
|
${requestCode}
|
|
33
|
-
${exportsCode}
|
|
34
27
|
`;
|
|
35
28
|
return generatedCode;
|
|
36
29
|
};
|
|
@@ -12,17 +12,14 @@ async function loader(source) {
|
|
|
12
12
|
return source;
|
|
13
13
|
}
|
|
14
14
|
const { resourceQuery } = this;
|
|
15
|
-
const options = resourceQuery.slice(1).split("&").
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
if (!key || !value) {
|
|
20
|
-
return pre;
|
|
15
|
+
const options = resourceQuery.slice(1).split("&").reduce((pre, cur) => {
|
|
16
|
+
const [key, value] = cur.split("=");
|
|
17
|
+
if (key && value) {
|
|
18
|
+
pre[key] = value === "true" ? true : value === "false" ? false : value;
|
|
21
19
|
}
|
|
22
|
-
pre[key] = value;
|
|
23
20
|
return pre;
|
|
24
21
|
}, {});
|
|
25
|
-
if (!options.
|
|
22
|
+
if (!options.loaderId) {
|
|
26
23
|
return source;
|
|
27
24
|
}
|
|
28
25
|
if (options.clientData) {
|
|
@@ -38,8 +35,9 @@ async function loader(source) {
|
|
|
38
35
|
}
|
|
39
36
|
}
|
|
40
37
|
const code = generateClient({
|
|
41
|
-
|
|
42
|
-
|
|
38
|
+
inline: options.inline,
|
|
39
|
+
action: options.action,
|
|
40
|
+
routeId: options.routeId
|
|
43
41
|
});
|
|
44
42
|
return code;
|
|
45
43
|
}
|
|
@@ -49,7 +49,7 @@ const createLoaderHeaders = (requestHeaders) => {
|
|
|
49
49
|
}
|
|
50
50
|
return headers;
|
|
51
51
|
};
|
|
52
|
-
const
|
|
52
|
+
const createRequest = (context) => {
|
|
53
53
|
const origin = `${context.protocol}://${context.host}`;
|
|
54
54
|
const url = new URL(context.url, origin);
|
|
55
55
|
const controller = new AbortController();
|
|
@@ -58,7 +58,14 @@ const createLoaderRequest = (context) => {
|
|
|
58
58
|
headers: createLoaderHeaders(context.headers),
|
|
59
59
|
signal: controller.signal
|
|
60
60
|
};
|
|
61
|
-
|
|
61
|
+
if (![
|
|
62
|
+
"GET",
|
|
63
|
+
"HEAD"
|
|
64
|
+
].includes(context.method.toUpperCase())) {
|
|
65
|
+
init.body = context.req;
|
|
66
|
+
}
|
|
67
|
+
const request = new Request(url.href, init);
|
|
68
|
+
return request;
|
|
62
69
|
};
|
|
63
70
|
const sendLoaderResponse = async (res, nodeResponse) => {
|
|
64
71
|
res.statusMessage = nodeResponse.statusText;
|
|
@@ -73,15 +80,12 @@ const sendLoaderResponse = async (res, nodeResponse) => {
|
|
|
73
80
|
}
|
|
74
81
|
};
|
|
75
82
|
const handleRequest = async ({ context, serverRoutes, routes: routesConfig }) => {
|
|
76
|
-
const {
|
|
83
|
+
const { query } = context;
|
|
77
84
|
const routeId = query[LOADER_ID_PARAM];
|
|
78
85
|
const entry = matchEntry(context.path, serverRoutes);
|
|
79
86
|
if (!routeId || !entry) {
|
|
80
87
|
return;
|
|
81
88
|
}
|
|
82
|
-
if (method.toLowerCase() !== "get") {
|
|
83
|
-
throw new Error("CSR data loader request only support http GET method");
|
|
84
|
-
}
|
|
85
89
|
const basename = entry.urlPath;
|
|
86
90
|
const end = time();
|
|
87
91
|
const { res, logger, reporter } = context;
|
|
@@ -89,7 +93,7 @@ const handleRequest = async ({ context, serverRoutes, routes: routesConfig }) =>
|
|
|
89
93
|
const { queryRoute } = createStaticHandler(routes, {
|
|
90
94
|
basename
|
|
91
95
|
});
|
|
92
|
-
const request =
|
|
96
|
+
const request = createRequest(context);
|
|
93
97
|
const requestContext = createRequestContext();
|
|
94
98
|
requestContext.set(reporterCtx, reporter);
|
|
95
99
|
let response;
|
|
@@ -124,7 +128,11 @@ const handleRequest = async ({ context, serverRoutes, routes: routesConfig }) =>
|
|
|
124
128
|
}
|
|
125
129
|
} catch (error) {
|
|
126
130
|
const message = error instanceof ErrorResponse ? error.data : String(error);
|
|
127
|
-
|
|
131
|
+
if (error instanceof Error) {
|
|
132
|
+
logger === null || logger === void 0 ? void 0 : logger.error(error);
|
|
133
|
+
} else {
|
|
134
|
+
logger === null || logger === void 0 ? void 0 : logger.error(message);
|
|
135
|
+
}
|
|
128
136
|
response = new NodeResponse(message, {
|
|
129
137
|
status: 500,
|
|
130
138
|
headers: {
|
|
@@ -14,4 +14,11 @@ export declare const createRequest: (routeId: string, method?: string) => ({
|
|
|
14
14
|
}: {
|
|
15
15
|
params: Record<string, string>;
|
|
16
16
|
request: Request;
|
|
17
|
-
}) => Promise<DeferredData | Response>;
|
|
17
|
+
}) => Promise<DeferredData | Response>;
|
|
18
|
+
export declare const createActionRequest: (routeId: string) => ({
|
|
19
|
+
params,
|
|
20
|
+
request
|
|
21
|
+
}: {
|
|
22
|
+
params: Record<string, string>;
|
|
23
|
+
request: Request;
|
|
24
|
+
}) => Promise<Response>;
|
|
@@ -2,8 +2,11 @@
|
|
|
2
2
|
import type { LoaderContext } from 'webpack';
|
|
3
3
|
type Context = {
|
|
4
4
|
mapFile: string;
|
|
5
|
-
loaderId
|
|
5
|
+
loaderId: string;
|
|
6
6
|
clientData?: boolean;
|
|
7
|
+
action: boolean;
|
|
8
|
+
inline: boolean;
|
|
9
|
+
routeId: string;
|
|
7
10
|
};
|
|
8
11
|
export default function loader(this: LoaderContext<Context>, source: string): Promise<string | Buffer | undefined>;
|
|
9
12
|
export {};
|
package/package.json
CHANGED
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
"modern",
|
|
16
16
|
"modern.js"
|
|
17
17
|
],
|
|
18
|
-
"version": "0.0.0-next-
|
|
18
|
+
"version": "0.0.0-next-20231009011430",
|
|
19
19
|
"engines": {
|
|
20
20
|
"node": ">=14.17.6"
|
|
21
21
|
},
|
|
@@ -58,8 +58,8 @@
|
|
|
58
58
|
"@remix-run/node": "^1.12.0",
|
|
59
59
|
"path-to-regexp": "^6.2.0",
|
|
60
60
|
"@swc/helpers": "0.5.1",
|
|
61
|
-
"@modern-js/utils": "0.0.0-next-
|
|
62
|
-
"@modern-js/runtime-utils": "0.0.0-next-
|
|
61
|
+
"@modern-js/utils": "0.0.0-next-20231009011430",
|
|
62
|
+
"@modern-js/runtime-utils": "0.0.0-next-20231009011430"
|
|
63
63
|
},
|
|
64
64
|
"devDependencies": {
|
|
65
65
|
"@types/babel__core": "^7.20.0",
|
|
@@ -75,11 +75,11 @@
|
|
|
75
75
|
"webpack": "^5.88.1",
|
|
76
76
|
"react": "^18",
|
|
77
77
|
"react-dom": "^18",
|
|
78
|
-
"@modern-js/core": "0.0.0-next-
|
|
79
|
-
"@modern-js/server-core": "0.0.0-next-
|
|
80
|
-
"@
|
|
81
|
-
"@
|
|
82
|
-
"@scripts/jest-config": "0.0.0-next-
|
|
78
|
+
"@modern-js/core": "0.0.0-next-20231009011430",
|
|
79
|
+
"@modern-js/server-core": "0.0.0-next-20231009011430",
|
|
80
|
+
"@scripts/build": "0.0.0-next-20231009011430",
|
|
81
|
+
"@modern-js/types": "0.0.0-next-20231009011430",
|
|
82
|
+
"@scripts/jest-config": "0.0.0-next-20231009011430"
|
|
83
83
|
},
|
|
84
84
|
"peerDependencies": {
|
|
85
85
|
"react": ">=17.0.0"
|