@umijs/server 4.0.0-beta.8 → 4.0.0-canary-20240513.3
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/LICENSE +21 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +31 -12
- package/dist/routes.d.ts +6 -3
- package/dist/routes.js +50 -27
- package/dist/scripts.js +56 -28
- package/dist/server.d.ts +7 -4
- package/dist/server.js +146 -106
- package/dist/ssr.d.ts +45 -0
- package/dist/ssr.js +503 -0
- package/dist/styles.js +56 -28
- package/dist/types.d.ts +59 -0
- package/dist/types.js +17 -2
- package/package.json +21 -23
package/dist/ssr.js
ADDED
|
@@ -0,0 +1,503 @@
|
|
|
1
|
+
var __create = Object.create;
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
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
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
21
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
22
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
23
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
24
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
25
|
+
mod
|
|
26
|
+
));
|
|
27
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
28
|
+
|
|
29
|
+
// src/ssr.ts
|
|
30
|
+
var ssr_exports = {};
|
|
31
|
+
__export(ssr_exports, {
|
|
32
|
+
createAppRootElement: () => createAppRootElement,
|
|
33
|
+
createMarkupGenerator: () => createMarkupGenerator,
|
|
34
|
+
createUmiHandler: () => createUmiHandler,
|
|
35
|
+
createUmiServerLoader: () => createUmiServerLoader,
|
|
36
|
+
default: () => createRequestHandler
|
|
37
|
+
});
|
|
38
|
+
module.exports = __toCommonJS(ssr_exports);
|
|
39
|
+
var import_react = __toESM(require("react"));
|
|
40
|
+
var ReactDomServer = __toESM(require("react-dom/server"));
|
|
41
|
+
var import_react_router_dom = require("react-router-dom");
|
|
42
|
+
var import_stream = require("stream");
|
|
43
|
+
var MetaLoaderResultKeys = /* @__PURE__ */ ((MetaLoaderResultKeys2) => {
|
|
44
|
+
MetaLoaderResultKeys2["Title"] = "title";
|
|
45
|
+
MetaLoaderResultKeys2["Description"] = "description";
|
|
46
|
+
MetaLoaderResultKeys2["Keywords"] = "keywords";
|
|
47
|
+
MetaLoaderResultKeys2["Lang"] = "lang";
|
|
48
|
+
MetaLoaderResultKeys2["Metas"] = "metas";
|
|
49
|
+
return MetaLoaderResultKeys2;
|
|
50
|
+
})(MetaLoaderResultKeys || {});
|
|
51
|
+
var createJSXProvider = (Provider) => {
|
|
52
|
+
const serverInsertedHTMLCallbacks = /* @__PURE__ */ new Set();
|
|
53
|
+
const JSXProvider = (props) => {
|
|
54
|
+
const addInsertedHtml = import_react.default.useCallback(
|
|
55
|
+
(handler) => {
|
|
56
|
+
serverInsertedHTMLCallbacks.add(handler);
|
|
57
|
+
},
|
|
58
|
+
[]
|
|
59
|
+
);
|
|
60
|
+
return import_react.default.createElement(Provider, {
|
|
61
|
+
children: props.children,
|
|
62
|
+
value: addInsertedHtml
|
|
63
|
+
});
|
|
64
|
+
};
|
|
65
|
+
return [JSXProvider, serverInsertedHTMLCallbacks];
|
|
66
|
+
};
|
|
67
|
+
function createJSXGenerator(opts) {
|
|
68
|
+
return async (url, serverLoaderArgs) => {
|
|
69
|
+
const {
|
|
70
|
+
routesWithServerLoader,
|
|
71
|
+
pluginManager,
|
|
72
|
+
getRoutes,
|
|
73
|
+
createHistory,
|
|
74
|
+
sourceDir
|
|
75
|
+
} = opts;
|
|
76
|
+
createHistory({ type: "memory", initialEntries: [url], initialIndex: 1 });
|
|
77
|
+
const { routes, routeComponents } = await getRoutes(pluginManager);
|
|
78
|
+
pluginManager.applyPlugins({
|
|
79
|
+
key: "patchRoutes",
|
|
80
|
+
type: "event",
|
|
81
|
+
args: {
|
|
82
|
+
routes,
|
|
83
|
+
routeComponents
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
const matches = matchRoutesForSSR(url, routes);
|
|
87
|
+
if (matches.length === 0) {
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
const loaderData = {};
|
|
91
|
+
await Promise.all(
|
|
92
|
+
matches.filter((id) => routes[id].hasServerLoader).map(
|
|
93
|
+
(id) => new Promise(async (resolve) => {
|
|
94
|
+
loaderData[id] = await executeLoader({
|
|
95
|
+
routeKey: id,
|
|
96
|
+
routesWithServerLoader,
|
|
97
|
+
serverLoaderArgs
|
|
98
|
+
});
|
|
99
|
+
if (routes[id].hasMetadataLoader) {
|
|
100
|
+
const metadataLoaderData = await executeMetadataLoader({
|
|
101
|
+
routesWithServerLoader,
|
|
102
|
+
routeKey: id,
|
|
103
|
+
serverLoaderArgs,
|
|
104
|
+
serverLoaderData: loaderData[id]
|
|
105
|
+
});
|
|
106
|
+
metadataLoaderData && Object.entries(metadataLoaderData).forEach(([k, v]) => {
|
|
107
|
+
if (Array.isArray(v)) {
|
|
108
|
+
opts.htmlPageOpts[k] = (opts.htmlPageOpts[k] || []).concat(v);
|
|
109
|
+
} else {
|
|
110
|
+
opts.htmlPageOpts[k] = v;
|
|
111
|
+
}
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
resolve();
|
|
115
|
+
})
|
|
116
|
+
)
|
|
117
|
+
);
|
|
118
|
+
const manifest = typeof opts.manifest === "function" ? opts.manifest(sourceDir) : opts.manifest;
|
|
119
|
+
const context = {
|
|
120
|
+
routes,
|
|
121
|
+
routeComponents,
|
|
122
|
+
pluginManager,
|
|
123
|
+
location: url,
|
|
124
|
+
manifest,
|
|
125
|
+
loaderData,
|
|
126
|
+
htmlPageOpts: opts.htmlPageOpts,
|
|
127
|
+
renderFromRoot: opts.renderFromRoot,
|
|
128
|
+
__SPECIAL_HTML_DO_NOT_USE_OR_YOU_WILL_BE_FIRED: opts.__SPECIAL_HTML_DO_NOT_USE_OR_YOU_WILL_BE_FIRED,
|
|
129
|
+
mountElementId: opts.mountElementId
|
|
130
|
+
};
|
|
131
|
+
const element = await opts.getClientRootComponent(
|
|
132
|
+
context
|
|
133
|
+
);
|
|
134
|
+
return {
|
|
135
|
+
element,
|
|
136
|
+
manifest
|
|
137
|
+
};
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
var SERVER_INSERTED_HTML = "umi-server-inserted-html";
|
|
141
|
+
var getGenerateStaticHTML = (serverInsertedHTMLCallbacks, opts) => {
|
|
142
|
+
const children = import_react.default.createElement(import_react.default.Fragment, {
|
|
143
|
+
children: Array.from(serverInsertedHTMLCallbacks || []).map(
|
|
144
|
+
(callback) => callback()
|
|
145
|
+
)
|
|
146
|
+
});
|
|
147
|
+
return ReactDomServer.renderToString(
|
|
148
|
+
(opts == null ? void 0 : opts.wrapper) ? import_react.default.createElement(
|
|
149
|
+
"div",
|
|
150
|
+
{ id: SERVER_INSERTED_HTML, hidden: true },
|
|
151
|
+
children
|
|
152
|
+
) : children
|
|
153
|
+
) || "";
|
|
154
|
+
};
|
|
155
|
+
function createMarkupGenerator(opts) {
|
|
156
|
+
const jsxGeneratorDeferrer = createJSXGenerator(opts);
|
|
157
|
+
return async (url) => {
|
|
158
|
+
const jsx = await jsxGeneratorDeferrer(url);
|
|
159
|
+
if (jsx) {
|
|
160
|
+
return new Promise(async (resolve, reject) => {
|
|
161
|
+
const [JSXProvider, serverInsertedHTMLCallbacks] = createJSXProvider(
|
|
162
|
+
opts.ServerInsertedHTMLContext.Provider
|
|
163
|
+
);
|
|
164
|
+
let chunks = [];
|
|
165
|
+
const writable = new import_stream.Writable();
|
|
166
|
+
writable._write = (chunk, _encoding, next) => {
|
|
167
|
+
chunks.push(Buffer.from(chunk));
|
|
168
|
+
next();
|
|
169
|
+
};
|
|
170
|
+
writable.on("finish", async () => {
|
|
171
|
+
let html = Buffer.concat(chunks).toString("utf8");
|
|
172
|
+
const serverHTML = getGenerateStaticHTML(serverInsertedHTMLCallbacks);
|
|
173
|
+
if (serverHTML) {
|
|
174
|
+
html = html.replace(/<\/head>/, `${serverHTML}</head>`);
|
|
175
|
+
}
|
|
176
|
+
if (opts.helmetContext) {
|
|
177
|
+
html = html.replace(
|
|
178
|
+
/(<\/head>)/,
|
|
179
|
+
[
|
|
180
|
+
opts.helmetContext.helmet.title.toString(),
|
|
181
|
+
opts.helmetContext.helmet.priority.toString(),
|
|
182
|
+
opts.helmetContext.helmet.meta.toString(),
|
|
183
|
+
opts.helmetContext.helmet.link.toString(),
|
|
184
|
+
opts.helmetContext.helmet.script.toString(),
|
|
185
|
+
"$1"
|
|
186
|
+
].filter(Boolean).join("\n")
|
|
187
|
+
);
|
|
188
|
+
}
|
|
189
|
+
resolve(html);
|
|
190
|
+
});
|
|
191
|
+
const stream = ReactDomServer.renderToPipeableStream(
|
|
192
|
+
import_react.default.createElement(JSXProvider, { children: jsx.element }),
|
|
193
|
+
{
|
|
194
|
+
onShellReady() {
|
|
195
|
+
stream.pipe(writable);
|
|
196
|
+
},
|
|
197
|
+
bootstrapScripts: [jsx.manifest.assets["umi.js"] || "/umi.js"],
|
|
198
|
+
onError: reject
|
|
199
|
+
}
|
|
200
|
+
);
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
return "";
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
var normalizeRequest = (...args) => {
|
|
207
|
+
var _a, _b;
|
|
208
|
+
let request;
|
|
209
|
+
let serverLoaderRequest;
|
|
210
|
+
let serverLoaderArgs;
|
|
211
|
+
if (process.env.SSR_BUILD_TARGET === "worker") {
|
|
212
|
+
const [ev] = args;
|
|
213
|
+
const { pathname, searchParams } = new URL(ev.request.url);
|
|
214
|
+
request = {
|
|
215
|
+
url: ev.request.url,
|
|
216
|
+
pathname,
|
|
217
|
+
headers: ev.request.headers,
|
|
218
|
+
query: {
|
|
219
|
+
route: searchParams.get("route"),
|
|
220
|
+
url: searchParams.get("url")
|
|
221
|
+
}
|
|
222
|
+
};
|
|
223
|
+
} else {
|
|
224
|
+
const [req] = args;
|
|
225
|
+
request = {
|
|
226
|
+
url: `${req.protocol}://${req.get("host")}${req.originalUrl}`,
|
|
227
|
+
pathname: req.url,
|
|
228
|
+
headers: req.headers,
|
|
229
|
+
query: {
|
|
230
|
+
route: (_a = req.query.route) == null ? void 0 : _a.toString(),
|
|
231
|
+
url: (_b = req.query.url) == null ? void 0 : _b.toString()
|
|
232
|
+
}
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
if (request.pathname.startsWith("/__serverLoader") && request.query.route && request.query.url) {
|
|
236
|
+
serverLoaderRequest = new Request(request.query.url, {
|
|
237
|
+
headers: request.headers
|
|
238
|
+
});
|
|
239
|
+
serverLoaderArgs = {
|
|
240
|
+
request: serverLoaderRequest
|
|
241
|
+
};
|
|
242
|
+
}
|
|
243
|
+
return {
|
|
244
|
+
request,
|
|
245
|
+
serverLoaderArgs
|
|
246
|
+
};
|
|
247
|
+
};
|
|
248
|
+
function createRequestHandler(opts) {
|
|
249
|
+
const jsxGeneratorDeferrer = createJSXGenerator(opts);
|
|
250
|
+
const normalizeHandlerArgs = (...args) => {
|
|
251
|
+
let ret;
|
|
252
|
+
const { request } = normalizeRequest(...args);
|
|
253
|
+
const replaceServerHTMLScript = `<script>!function(){var e=document.getElementById("${SERVER_INSERTED_HTML}");e&&(Array.from(e.children).forEach(e=>{document.head.appendChild(e)}),e.remove())}();</script>`;
|
|
254
|
+
if (process.env.SSR_BUILD_TARGET === "worker") {
|
|
255
|
+
const [ev, workerOpts] = args;
|
|
256
|
+
let asyncRespondWith;
|
|
257
|
+
ev.respondWith(new Promise((r) => asyncRespondWith = r));
|
|
258
|
+
ret = {
|
|
259
|
+
req: request,
|
|
260
|
+
async sendServerLoader(data) {
|
|
261
|
+
let res = new Response(JSON.stringify(data), {
|
|
262
|
+
headers: {
|
|
263
|
+
"content-type": "application/json; charset=utf-8"
|
|
264
|
+
},
|
|
265
|
+
status: 200
|
|
266
|
+
});
|
|
267
|
+
if (workerOpts == null ? void 0 : workerOpts.modifyResponse) {
|
|
268
|
+
res = await workerOpts.modifyResponse(res);
|
|
269
|
+
}
|
|
270
|
+
asyncRespondWith(res);
|
|
271
|
+
},
|
|
272
|
+
async sendPage(jsx) {
|
|
273
|
+
const [JSXProvider, serverInsertedHTMLCallbacks] = createJSXProvider(
|
|
274
|
+
opts.ServerInsertedHTMLContext.Provider
|
|
275
|
+
);
|
|
276
|
+
const stream = await ReactDomServer.renderToReadableStream(
|
|
277
|
+
import_react.default.createElement(JSXProvider, void 0, jsx.element),
|
|
278
|
+
{
|
|
279
|
+
// why not bootstrap umi.js
|
|
280
|
+
// ER will auto inject
|
|
281
|
+
// bootstrapScripts: [jsx.manifest.assets['umi.js'] || '/umi.js'],
|
|
282
|
+
onError(x) {
|
|
283
|
+
console.error(x);
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
);
|
|
287
|
+
const transformStream = new TransformStream({
|
|
288
|
+
flush(controller) {
|
|
289
|
+
if (serverInsertedHTMLCallbacks.size) {
|
|
290
|
+
const serverHTML = getGenerateStaticHTML(
|
|
291
|
+
serverInsertedHTMLCallbacks,
|
|
292
|
+
{ wrapper: true }
|
|
293
|
+
);
|
|
294
|
+
controller.enqueue(serverHTML);
|
|
295
|
+
controller.enqueue(replaceServerHTMLScript);
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
});
|
|
299
|
+
let res = new Response(stream.pipeThrough(transformStream), {
|
|
300
|
+
headers: {
|
|
301
|
+
"content-type": "text/html; charset=utf-8"
|
|
302
|
+
},
|
|
303
|
+
status: 200
|
|
304
|
+
});
|
|
305
|
+
if (workerOpts == null ? void 0 : workerOpts.modifyResponse) {
|
|
306
|
+
res = await workerOpts.modifyResponse(res);
|
|
307
|
+
}
|
|
308
|
+
asyncRespondWith(res);
|
|
309
|
+
},
|
|
310
|
+
otherwise() {
|
|
311
|
+
throw new Error("no page resource");
|
|
312
|
+
}
|
|
313
|
+
};
|
|
314
|
+
} else {
|
|
315
|
+
const [_, res, next] = args;
|
|
316
|
+
ret = {
|
|
317
|
+
req: request,
|
|
318
|
+
sendServerLoader(data) {
|
|
319
|
+
res.status(200).json(data);
|
|
320
|
+
},
|
|
321
|
+
async sendPage(jsx) {
|
|
322
|
+
const [JSXProvider, serverInsertedHTMLCallbacks] = createJSXProvider(
|
|
323
|
+
opts.ServerInsertedHTMLContext.Provider
|
|
324
|
+
);
|
|
325
|
+
const writable = new import_stream.Writable();
|
|
326
|
+
res.type("html");
|
|
327
|
+
writable._write = (chunk, _encoding, cb) => {
|
|
328
|
+
res.write(chunk);
|
|
329
|
+
cb();
|
|
330
|
+
};
|
|
331
|
+
writable.on("finish", async () => {
|
|
332
|
+
if (serverInsertedHTMLCallbacks.size) {
|
|
333
|
+
res.write(
|
|
334
|
+
getGenerateStaticHTML(serverInsertedHTMLCallbacks, {
|
|
335
|
+
wrapper: true
|
|
336
|
+
})
|
|
337
|
+
);
|
|
338
|
+
res.write(replaceServerHTMLScript);
|
|
339
|
+
}
|
|
340
|
+
res.end();
|
|
341
|
+
});
|
|
342
|
+
const stream = ReactDomServer.renderToPipeableStream(
|
|
343
|
+
import_react.default.createElement(JSXProvider, void 0, jsx.element),
|
|
344
|
+
{
|
|
345
|
+
bootstrapScripts: [jsx.manifest.assets["umi.js"] || "/umi.js"],
|
|
346
|
+
onShellReady() {
|
|
347
|
+
stream.pipe(writable);
|
|
348
|
+
},
|
|
349
|
+
onError(x) {
|
|
350
|
+
console.error(x);
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
);
|
|
354
|
+
},
|
|
355
|
+
otherwise: next
|
|
356
|
+
};
|
|
357
|
+
}
|
|
358
|
+
return ret;
|
|
359
|
+
};
|
|
360
|
+
return async function unifiedRequestHandler(...args) {
|
|
361
|
+
const { req, sendServerLoader, sendPage, otherwise } = normalizeHandlerArgs(
|
|
362
|
+
...args
|
|
363
|
+
);
|
|
364
|
+
if (req.pathname.startsWith("/__serverLoader") && req.query.route && req.query.url) {
|
|
365
|
+
const { serverLoaderArgs } = normalizeRequest(...args);
|
|
366
|
+
const data = await executeLoader({
|
|
367
|
+
routeKey: req.query.route,
|
|
368
|
+
routesWithServerLoader: opts.routesWithServerLoader,
|
|
369
|
+
serverLoaderArgs
|
|
370
|
+
});
|
|
371
|
+
await sendServerLoader(data);
|
|
372
|
+
} else {
|
|
373
|
+
const render = opts.pluginManager.applyPlugins({
|
|
374
|
+
key: "render",
|
|
375
|
+
type: "compose",
|
|
376
|
+
initialValue: () => jsxGeneratorDeferrer(req.pathname, {
|
|
377
|
+
request: new Request(req.url, {
|
|
378
|
+
headers: req.headers
|
|
379
|
+
})
|
|
380
|
+
})
|
|
381
|
+
});
|
|
382
|
+
const jsx = await render();
|
|
383
|
+
if (jsx) {
|
|
384
|
+
await sendPage(jsx);
|
|
385
|
+
} else {
|
|
386
|
+
await otherwise();
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
};
|
|
390
|
+
}
|
|
391
|
+
function createUmiHandler(opts) {
|
|
392
|
+
let isWarned = false;
|
|
393
|
+
return async function(req, params) {
|
|
394
|
+
if (!isWarned) {
|
|
395
|
+
console.warn(
|
|
396
|
+
"[umi] `renderRoot` is deprecated, please use `requestHandler` instead"
|
|
397
|
+
);
|
|
398
|
+
isWarned = true;
|
|
399
|
+
}
|
|
400
|
+
const jsxGeneratorDeferrer = createJSXGenerator({
|
|
401
|
+
...opts,
|
|
402
|
+
...params
|
|
403
|
+
});
|
|
404
|
+
const loaderArgs = {
|
|
405
|
+
request: req
|
|
406
|
+
};
|
|
407
|
+
const jsx = await jsxGeneratorDeferrer(
|
|
408
|
+
new URL(req.url).pathname,
|
|
409
|
+
loaderArgs
|
|
410
|
+
);
|
|
411
|
+
if (!jsx) {
|
|
412
|
+
throw new Error("no page resource");
|
|
413
|
+
}
|
|
414
|
+
return ReactDomServer.renderToNodeStream(jsx.element);
|
|
415
|
+
};
|
|
416
|
+
}
|
|
417
|
+
function createUmiServerLoader(opts) {
|
|
418
|
+
let isWarned = false;
|
|
419
|
+
return async function(req) {
|
|
420
|
+
if (!isWarned) {
|
|
421
|
+
console.warn(
|
|
422
|
+
"[umi] `serverLoader` is deprecated, please use `requestHandler` instead"
|
|
423
|
+
);
|
|
424
|
+
isWarned = true;
|
|
425
|
+
}
|
|
426
|
+
const query = Object.fromEntries(new URL(req.url).searchParams);
|
|
427
|
+
const serverLoaderRequest = new Request(query.url, {
|
|
428
|
+
headers: req.headers
|
|
429
|
+
});
|
|
430
|
+
return await executeLoader({
|
|
431
|
+
routeKey: query.route,
|
|
432
|
+
routesWithServerLoader: opts.routesWithServerLoader,
|
|
433
|
+
serverLoaderArgs: { request: serverLoaderRequest }
|
|
434
|
+
});
|
|
435
|
+
};
|
|
436
|
+
}
|
|
437
|
+
function createAppRootElement(opts) {
|
|
438
|
+
return async (...args) => {
|
|
439
|
+
const jsxGeneratorDeferrer = createJSXGenerator(opts);
|
|
440
|
+
const { request, serverLoaderArgs } = normalizeRequest(...args);
|
|
441
|
+
const jsx = await jsxGeneratorDeferrer(request.pathname, serverLoaderArgs);
|
|
442
|
+
return () => jsx == null ? void 0 : jsx.element;
|
|
443
|
+
};
|
|
444
|
+
}
|
|
445
|
+
function matchRoutesForSSR(reqUrl, routesById) {
|
|
446
|
+
var _a;
|
|
447
|
+
return ((_a = (0, import_react_router_dom.matchRoutes)(createClientRoutes({ routesById }), reqUrl)) == null ? void 0 : _a.map(
|
|
448
|
+
(route) => route.route.id
|
|
449
|
+
)) || [];
|
|
450
|
+
}
|
|
451
|
+
function createClientRoutes(opts) {
|
|
452
|
+
const { routesById, parentId } = opts;
|
|
453
|
+
return Object.keys(routesById).filter((id) => routesById[id].parentId === parentId).map((id) => {
|
|
454
|
+
const route = createClientRoute(routesById[id]);
|
|
455
|
+
const children = createClientRoutes({
|
|
456
|
+
routesById,
|
|
457
|
+
parentId: route.id
|
|
458
|
+
});
|
|
459
|
+
if (children.length > 0) {
|
|
460
|
+
route.children = children;
|
|
461
|
+
}
|
|
462
|
+
return route;
|
|
463
|
+
});
|
|
464
|
+
}
|
|
465
|
+
function createClientRoute(route) {
|
|
466
|
+
const { id, path, index } = route;
|
|
467
|
+
return {
|
|
468
|
+
id,
|
|
469
|
+
path,
|
|
470
|
+
index
|
|
471
|
+
};
|
|
472
|
+
}
|
|
473
|
+
async function executeLoader(params) {
|
|
474
|
+
const { routeKey, routesWithServerLoader, serverLoaderArgs } = params;
|
|
475
|
+
const mod = await routesWithServerLoader[routeKey]();
|
|
476
|
+
if (!mod.serverLoader || typeof mod.serverLoader !== "function") {
|
|
477
|
+
return;
|
|
478
|
+
}
|
|
479
|
+
return mod.serverLoader(serverLoaderArgs);
|
|
480
|
+
}
|
|
481
|
+
async function executeMetadataLoader(params) {
|
|
482
|
+
const { routesWithServerLoader, routeKey, serverLoaderData } = params;
|
|
483
|
+
const mod = await routesWithServerLoader[routeKey]();
|
|
484
|
+
if (!mod.serverLoader || typeof mod.serverLoader !== "function") {
|
|
485
|
+
return;
|
|
486
|
+
}
|
|
487
|
+
const loaderDatas = mod.metadataLoader(
|
|
488
|
+
serverLoaderData
|
|
489
|
+
);
|
|
490
|
+
const result = {};
|
|
491
|
+
Object.values(MetaLoaderResultKeys).forEach((key) => {
|
|
492
|
+
if (loaderDatas == null ? void 0 : loaderDatas[key])
|
|
493
|
+
result[key] = loaderDatas[key];
|
|
494
|
+
});
|
|
495
|
+
return result;
|
|
496
|
+
}
|
|
497
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
498
|
+
0 && (module.exports = {
|
|
499
|
+
createAppRootElement,
|
|
500
|
+
createMarkupGenerator,
|
|
501
|
+
createUmiHandler,
|
|
502
|
+
createUmiServerLoader
|
|
503
|
+
});
|
package/dist/styles.js
CHANGED
|
@@ -1,33 +1,61 @@
|
|
|
1
|
-
|
|
2
|
-
var
|
|
3
|
-
|
|
1
|
+
var __create = Object.create;
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
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 });
|
|
4
10
|
};
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
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
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
21
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
22
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
23
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
24
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
25
|
+
mod
|
|
26
|
+
));
|
|
27
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
28
|
+
|
|
29
|
+
// src/styles.ts
|
|
30
|
+
var styles_exports = {};
|
|
31
|
+
__export(styles_exports, {
|
|
32
|
+
normalizeStyle: () => normalizeStyle,
|
|
33
|
+
normalizeStyles: () => normalizeStyles
|
|
34
|
+
});
|
|
35
|
+
module.exports = __toCommonJS(styles_exports);
|
|
36
|
+
var import_assert = __toESM(require("assert"));
|
|
8
37
|
function normalizeStyles(scripts) {
|
|
9
|
-
|
|
38
|
+
return scripts.map(normalizeStyle);
|
|
10
39
|
}
|
|
11
|
-
|
|
12
|
-
const RE_URL = /^(http:|https:)?\/\//;
|
|
40
|
+
var RE_URL = /^(http:|https:)?\/\//;
|
|
13
41
|
function normalizeStyle(style) {
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
}
|
|
29
|
-
else {
|
|
30
|
-
throw new Error(`Invalid style type: ${typeof style}`);
|
|
31
|
-
}
|
|
42
|
+
if (typeof style === "string") {
|
|
43
|
+
const isUrl = RE_URL.test(style) || style.startsWith("/") && !style.startsWith("/*") || style.startsWith("./") || style.startsWith("../");
|
|
44
|
+
return isUrl ? {
|
|
45
|
+
src: style
|
|
46
|
+
} : { content: style };
|
|
47
|
+
} else if (typeof style === "object") {
|
|
48
|
+
(0, import_assert.default)(
|
|
49
|
+
typeof style.src === "string" || typeof style.content === "string",
|
|
50
|
+
`Style must have either a "src" or a "content" property.`
|
|
51
|
+
);
|
|
52
|
+
return style;
|
|
53
|
+
} else {
|
|
54
|
+
throw new Error(`Invalid style type: ${typeof style}`);
|
|
55
|
+
}
|
|
32
56
|
}
|
|
33
|
-
|
|
57
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
58
|
+
0 && (module.exports = {
|
|
59
|
+
normalizeStyle,
|
|
60
|
+
normalizeStyles
|
|
61
|
+
});
|
package/dist/types.d.ts
CHANGED
|
@@ -1,3 +1,29 @@
|
|
|
1
|
+
export interface IOpts {
|
|
2
|
+
base: string;
|
|
3
|
+
routes: Record<string, {
|
|
4
|
+
path: string;
|
|
5
|
+
file: string;
|
|
6
|
+
id: string;
|
|
7
|
+
parentId?: string;
|
|
8
|
+
}>;
|
|
9
|
+
links?: Record<string, string>[];
|
|
10
|
+
metas?: Record<string, string>[];
|
|
11
|
+
styles?: (Record<string, string> | string)[];
|
|
12
|
+
favicons?: string[];
|
|
13
|
+
title?: string;
|
|
14
|
+
headScripts?: (Record<string, string> | string)[];
|
|
15
|
+
scripts?: (Record<string, string> | string)[];
|
|
16
|
+
mountElementId?: string;
|
|
17
|
+
esmScript?: boolean;
|
|
18
|
+
modifyHTML?: (html: string, args: {
|
|
19
|
+
path?: string;
|
|
20
|
+
}) => Promise<string>;
|
|
21
|
+
historyType?: 'hash' | 'browser';
|
|
22
|
+
}
|
|
23
|
+
export declare type IUserExtraRoute = string | {
|
|
24
|
+
path: string;
|
|
25
|
+
prerender: boolean;
|
|
26
|
+
};
|
|
1
27
|
export interface IRoute {
|
|
2
28
|
id: string;
|
|
3
29
|
path?: string;
|
|
@@ -7,3 +33,36 @@ export interface IRoute {
|
|
|
7
33
|
export interface IRoutesById {
|
|
8
34
|
[id: string]: IRoute;
|
|
9
35
|
}
|
|
36
|
+
export interface IRouteCustom extends IRoute {
|
|
37
|
+
[key: string]: any;
|
|
38
|
+
}
|
|
39
|
+
declare type LoaderReturn<T> = T | Promise<T>;
|
|
40
|
+
export declare type UmiRequest = Partial<Request> & Pick<Request, 'url' | 'headers'>;
|
|
41
|
+
export interface IServerLoaderArgs {
|
|
42
|
+
request: UmiRequest;
|
|
43
|
+
}
|
|
44
|
+
export declare type ServerLoader<T = any> = (req?: IServerLoaderArgs) => LoaderReturn<T>;
|
|
45
|
+
export interface IMetaTag {
|
|
46
|
+
name: string;
|
|
47
|
+
content: string;
|
|
48
|
+
}
|
|
49
|
+
export interface IMetadata {
|
|
50
|
+
title?: string;
|
|
51
|
+
description?: string;
|
|
52
|
+
keywords?: string[];
|
|
53
|
+
/**
|
|
54
|
+
* @default 'en'
|
|
55
|
+
*/
|
|
56
|
+
lang?: string;
|
|
57
|
+
metas?: IMetaTag[];
|
|
58
|
+
}
|
|
59
|
+
export interface IhtmlPageOpts extends IMetadata {
|
|
60
|
+
headScripts?: (Record<string, string> | string)[];
|
|
61
|
+
links?: Record<string, string>[];
|
|
62
|
+
styles?: string[];
|
|
63
|
+
favicons?: string[];
|
|
64
|
+
scripts?: (Record<string, string> | string)[];
|
|
65
|
+
[key: string]: any;
|
|
66
|
+
}
|
|
67
|
+
export declare type MetadataLoader<T = any> = (serverLoaderData: T, req?: IServerLoaderArgs) => LoaderReturn<IMetadata>;
|
|
68
|
+
export {};
|
package/dist/types.js
CHANGED
|
@@ -1,2 +1,17 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
3
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
4
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
5
|
+
var __copyProps = (to, from, except, desc) => {
|
|
6
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
7
|
+
for (let key of __getOwnPropNames(from))
|
|
8
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
9
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
10
|
+
}
|
|
11
|
+
return to;
|
|
12
|
+
};
|
|
13
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
14
|
+
|
|
15
|
+
// src/types.ts
|
|
16
|
+
var types_exports = {};
|
|
17
|
+
module.exports = __toCommonJS(types_exports);
|