@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/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
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
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
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.normalizeStyle = exports.normalizeStyles = void 0;
7
- const assert_1 = __importDefault(require("assert"));
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
- return scripts.map(normalizeStyle);
38
+ return scripts.map(normalizeStyle);
10
39
  }
11
- exports.normalizeStyles = normalizeStyles;
12
- const RE_URL = /^(http:|https:)?\/\//;
40
+ var RE_URL = /^(http:|https:)?\/\//;
13
41
  function normalizeStyle(style) {
14
- if (typeof style === 'string') {
15
- const isUrl = RE_URL.test(style) ||
16
- style.startsWith('/') ||
17
- style.startsWith('./') ||
18
- style.startsWith('../');
19
- return isUrl
20
- ? {
21
- src: style,
22
- }
23
- : { content: style };
24
- }
25
- else if (typeof style === 'object') {
26
- (0, assert_1.default)(typeof style.src === 'string' || typeof style.content === 'string', `Style must have either a "src" or a "content" property.`);
27
- return style;
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
- exports.normalizeStyle = normalizeStyle;
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
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
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);