@umijs/server 4.0.0-canary.20240402.1 → 4.0.0-canary.20240419.1

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.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  /// <reference lib="webworker" />
2
2
  import type { RequestHandler } from '@umijs/bundler-utils/compiled/express';
3
3
  import React from 'react';
4
- import type { ITplOpts, UmiRequest } from './types';
4
+ import type { IhtmlPageOpts, UmiRequest } from './types';
5
5
  interface RouteLoaders {
6
6
  [key: string]: () => Promise<any>;
7
7
  }
@@ -14,20 +14,18 @@ interface CreateRequestServerlessOptions {
14
14
  }
15
15
  interface CreateRequestHandlerOptions extends CreateRequestServerlessOptions {
16
16
  routesWithServerLoader: RouteLoaders;
17
- PluginManager: any;
17
+ pluginManager: any;
18
18
  manifest: ((sourceDir?: string) => {
19
19
  assets: Record<string, string>;
20
20
  }) | {
21
21
  assets: Record<string, string>;
22
22
  };
23
- getPlugins: () => any;
24
- getValidKeys: () => any;
25
23
  getRoutes: (PluginManager: any) => any;
26
24
  getClientRootComponent: (PluginManager: any) => any;
27
25
  createHistory: (opts: any) => any;
28
26
  helmetContext?: any;
29
27
  ServerInsertedHTMLContext: React.Context<ServerInsertedHTMLHook | null>;
30
- tplOpts: ITplOpts;
28
+ htmlPageOpts: IhtmlPageOpts;
31
29
  renderFromRoot: boolean;
32
30
  mountElementId: string;
33
31
  }
@@ -42,4 +40,5 @@ declare type IWorkerRequestHandlerArgs = [
42
40
  export default function createRequestHandler(opts: CreateRequestHandlerOptions): (...args: IExpressRequestHandlerArgs | IWorkerRequestHandlerArgs) => Promise<void>;
43
41
  export declare function createUmiHandler(opts: CreateRequestHandlerOptions): (req: UmiRequest, params?: CreateRequestHandlerOptions) => Promise<NodeJS.ReadableStream>;
44
42
  export declare function createUmiServerLoader(opts: CreateRequestHandlerOptions): (req: UmiRequest) => Promise<any>;
43
+ export declare function createAppRootElement(opts: CreateRequestHandlerOptions): (...args: IExpressRequestHandlerArgs | IWorkerRequestHandlerArgs) => Promise<() => React.ReactElement<any, string | React.JSXElementConstructor<any>> | undefined>;
45
44
  export {};
package/dist/ssr.js CHANGED
@@ -29,6 +29,7 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
29
29
  // src/ssr.ts
30
30
  var ssr_exports = {};
31
31
  __export(ssr_exports, {
32
+ createAppRootElement: () => createAppRootElement,
32
33
  createMarkupGenerator: () => createMarkupGenerator,
33
34
  createUmiHandler: () => createUmiHandler,
34
35
  createUmiServerLoader: () => createUmiServerLoader,
@@ -39,6 +40,14 @@ var import_react = __toESM(require("react"));
39
40
  var ReactDomServer = __toESM(require("react-dom/server"));
40
41
  var import_react_router_dom = require("react-router-dom");
41
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 || {});
42
51
  var createJSXProvider = (Provider) => {
43
52
  const serverInsertedHTMLCallbacks = /* @__PURE__ */ new Set();
44
53
  const JSXProvider = (props) => {
@@ -59,20 +68,14 @@ function createJSXGenerator(opts) {
59
68
  return async (url, serverLoaderArgs) => {
60
69
  const {
61
70
  routesWithServerLoader,
62
- PluginManager,
63
- getPlugins,
64
- getValidKeys,
71
+ pluginManager,
65
72
  getRoutes,
66
73
  createHistory,
67
74
  sourceDir
68
75
  } = opts;
69
76
  createHistory({ type: "memory", initialEntries: [url], initialIndex: 1 });
70
- const pluginManager = PluginManager.create({
71
- plugins: getPlugins(),
72
- validKeys: getValidKeys()
73
- });
74
77
  const { routes, routeComponents } = await getRoutes(pluginManager);
75
- await pluginManager.applyPlugins({
78
+ pluginManager.applyPlugins({
76
79
  key: "patchRoutes",
77
80
  type: "event",
78
81
  args: {
@@ -100,11 +103,11 @@ function createJSXGenerator(opts) {
100
103
  serverLoaderArgs,
101
104
  serverLoaderData: loaderData[id]
102
105
  });
103
- Object.entries(metadataLoaderData).forEach(([k, v]) => {
106
+ metadataLoaderData && Object.entries(metadataLoaderData).forEach(([k, v]) => {
104
107
  if (Array.isArray(v)) {
105
- opts.tplOpts[k] = (opts.tplOpts[k] || []).concat(v);
108
+ opts.htmlPageOpts[k] = (opts.htmlPageOpts[k] || []).concat(v);
106
109
  } else {
107
- opts.tplOpts[k] = v;
110
+ opts.htmlPageOpts[k] = v;
108
111
  }
109
112
  });
110
113
  }
@@ -120,7 +123,7 @@ function createJSXGenerator(opts) {
120
123
  location: url,
121
124
  manifest,
122
125
  loaderData,
123
- tplOpts: opts.tplOpts,
126
+ htmlPageOpts: opts.htmlPageOpts,
124
127
  renderFromRoot: opts.renderFromRoot,
125
128
  mountElementId: opts.mountElementId
126
129
  };
@@ -198,25 +201,60 @@ function createMarkupGenerator(opts) {
198
201
  return "";
199
202
  };
200
203
  }
204
+ var normalizeRequest = (...args) => {
205
+ var _a, _b;
206
+ let request;
207
+ let serverLoaderRequest;
208
+ let serverLoaderArgs;
209
+ if (process.env.SSR_BUILD_TARGET === "worker") {
210
+ const [ev] = args;
211
+ const { pathname, searchParams } = new URL(ev.request.url);
212
+ request = {
213
+ url: ev.request.url,
214
+ pathname,
215
+ headers: ev.request.headers,
216
+ query: {
217
+ route: searchParams.get("route"),
218
+ url: searchParams.get("url")
219
+ }
220
+ };
221
+ } else {
222
+ const [req] = args;
223
+ request = {
224
+ url: `${req.protocol}://${req.get("host")}${req.originalUrl}`,
225
+ pathname: req.url,
226
+ headers: req.headers,
227
+ query: {
228
+ route: (_a = req.query.route) == null ? void 0 : _a.toString(),
229
+ url: (_b = req.query.url) == null ? void 0 : _b.toString()
230
+ }
231
+ };
232
+ }
233
+ if (request.pathname.startsWith("/__serverLoader") && request.query.route && request.query.url) {
234
+ serverLoaderRequest = new Request(request.query.url, {
235
+ headers: request.headers
236
+ });
237
+ serverLoaderArgs = {
238
+ request: serverLoaderRequest
239
+ };
240
+ }
241
+ return {
242
+ request,
243
+ serverLoaderArgs
244
+ };
245
+ };
201
246
  function createRequestHandler(opts) {
202
247
  const jsxGeneratorDeferrer = createJSXGenerator(opts);
203
248
  const normalizeHandlerArgs = (...args) => {
204
- var _a, _b;
205
249
  let ret;
250
+ const { request } = normalizeRequest(...args);
206
251
  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>`;
207
- if (typeof FetchEvent !== "undefined" && args[0] instanceof FetchEvent) {
252
+ if (process.env.SSR_BUILD_TARGET === "worker") {
208
253
  const [ev, workerOpts] = args;
209
- const { pathname, searchParams } = new URL(ev.request.url);
254
+ let asyncRespondWith;
255
+ ev.respondWith(new Promise((r) => asyncRespondWith = r));
210
256
  ret = {
211
- req: {
212
- url: ev.request.url,
213
- pathname,
214
- headers: ev.request.headers,
215
- query: {
216
- route: searchParams.get("route"),
217
- url: searchParams.get("url")
218
- }
219
- },
257
+ req: request,
220
258
  async sendServerLoader(data) {
221
259
  let res = new Response(JSON.stringify(data), {
222
260
  headers: {
@@ -227,7 +265,7 @@ function createRequestHandler(opts) {
227
265
  if (workerOpts == null ? void 0 : workerOpts.modifyResponse) {
228
266
  res = await workerOpts.modifyResponse(res);
229
267
  }
230
- ev.respondWith(res);
268
+ asyncRespondWith(res);
231
269
  },
232
270
  async sendPage(jsx) {
233
271
  const [JSXProvider, serverInsertedHTMLCallbacks] = createJSXProvider(
@@ -254,8 +292,7 @@ function createRequestHandler(opts) {
254
292
  }
255
293
  }
256
294
  });
257
- stream.pipeThrough(transformStream);
258
- let res = new Response(stream, {
295
+ let res = new Response(stream.pipeThrough(transformStream), {
259
296
  headers: {
260
297
  "content-type": "text/html; charset=utf-8"
261
298
  },
@@ -264,24 +301,16 @@ function createRequestHandler(opts) {
264
301
  if (workerOpts == null ? void 0 : workerOpts.modifyResponse) {
265
302
  res = await workerOpts.modifyResponse(res);
266
303
  }
267
- ev.respondWith(res);
304
+ asyncRespondWith(res);
268
305
  },
269
306
  otherwise() {
270
307
  throw new Error("no page resource");
271
308
  }
272
309
  };
273
310
  } else {
274
- const [req, res, next] = args;
311
+ const [_, res, next] = args;
275
312
  ret = {
276
- req: {
277
- url: `${req.protocol}://${req.get("host")}${req.originalUrl}`,
278
- pathname: req.url,
279
- headers: req.headers,
280
- query: {
281
- route: (_a = req.query.route) == null ? void 0 : _a.toString(),
282
- url: (_b = req.query.url) == null ? void 0 : _b.toString()
283
- }
284
- },
313
+ req: request,
285
314
  sendServerLoader(data) {
286
315
  res.status(200).json(data);
287
316
  },
@@ -325,28 +354,33 @@ function createRequestHandler(opts) {
325
354
  return ret;
326
355
  };
327
356
  return async function unifiedRequestHandler(...args) {
328
- let jsx;
329
357
  const { req, sendServerLoader, sendPage, otherwise } = normalizeHandlerArgs(
330
358
  ...args
331
359
  );
332
360
  if (req.pathname.startsWith("/__serverLoader") && req.query.route && req.query.url) {
333
- const serverLoaderRequest = new Request(req.query.url, {
334
- headers: req.headers
335
- });
361
+ const { serverLoaderArgs } = normalizeRequest(...args);
336
362
  const data = await executeLoader({
337
363
  routeKey: req.query.route,
338
364
  routesWithServerLoader: opts.routesWithServerLoader,
339
- serverLoaderArgs: { request: serverLoaderRequest }
365
+ serverLoaderArgs
340
366
  });
341
367
  await sendServerLoader(data);
342
- } else if (jsx = await jsxGeneratorDeferrer(req.pathname, {
343
- request: new Request(req.url, {
344
- headers: req.headers
345
- })
346
- })) {
347
- await sendPage(jsx);
348
368
  } else {
349
- await otherwise();
369
+ const render = opts.pluginManager.applyPlugins({
370
+ key: "render",
371
+ type: "compose",
372
+ initialValue: () => jsxGeneratorDeferrer(req.pathname, {
373
+ request: new Request(req.url, {
374
+ headers: req.headers
375
+ })
376
+ })
377
+ });
378
+ const jsx = await render();
379
+ if (jsx) {
380
+ await sendPage(jsx);
381
+ } else {
382
+ await otherwise();
383
+ }
350
384
  }
351
385
  };
352
386
  }
@@ -396,6 +430,14 @@ function createUmiServerLoader(opts) {
396
430
  });
397
431
  };
398
432
  }
433
+ function createAppRootElement(opts) {
434
+ return async (...args) => {
435
+ const jsxGeneratorDeferrer = createJSXGenerator(opts);
436
+ const { request, serverLoaderArgs } = normalizeRequest(...args);
437
+ const jsx = await jsxGeneratorDeferrer(request.pathname, serverLoaderArgs);
438
+ return () => jsx == null ? void 0 : jsx.element;
439
+ };
440
+ }
399
441
  function matchRoutesForSSR(reqUrl, routesById) {
400
442
  var _a;
401
443
  return ((_a = (0, import_react_router_dom.matchRoutes)(createClientRoutes({ routesById }), reqUrl)) == null ? void 0 : _a.map(
@@ -438,20 +480,19 @@ async function executeMetadataLoader(params) {
438
480
  if (!mod.serverLoader || typeof mod.serverLoader !== "function") {
439
481
  return;
440
482
  }
441
- const result = mod.metadataLoader(
483
+ const loaderDatas = mod.metadataLoader(
442
484
  serverLoaderData
443
485
  );
444
- return ["title", "description", "keywords", "lang", "metas"].reduce(
445
- (acc, key) => {
446
- if (Object.prototype.hasOwnProperty.call(result, key))
447
- acc[key] = result[key];
448
- return acc;
449
- },
450
- {}
451
- );
486
+ const result = {};
487
+ Object.values(MetaLoaderResultKeys).forEach((key) => {
488
+ if (loaderDatas == null ? void 0 : loaderDatas[key])
489
+ result[key] = loaderDatas[key];
490
+ });
491
+ return result;
452
492
  }
453
493
  // Annotate the CommonJS export names for ESM import in node:
454
494
  0 && (module.exports = {
495
+ createAppRootElement,
455
496
  createMarkupGenerator,
456
497
  createUmiHandler,
457
498
  createUmiServerLoader
package/dist/types.d.ts CHANGED
@@ -55,18 +55,8 @@ export interface IMetadata {
55
55
  */
56
56
  lang?: string;
57
57
  metas?: IMetaTag[];
58
- headScripts?: (Record<string, string> | string)[];
59
- links?: Record<string, string>[];
60
- styles?: string[];
61
- favicons?: string[];
62
- scripts?: (Record<string, string> | string)[];
63
- [key: string]: any;
64
58
  }
65
- export interface ITplOpts {
66
- title?: string;
67
- description?: string;
68
- keywords?: string[];
69
- metas?: IMetaTag[];
59
+ export interface IhtmlPageOpts extends IMetadata {
70
60
  headScripts?: (Record<string, string> | string)[];
71
61
  links?: Record<string, string>[];
72
62
  styles?: string[];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@umijs/server",
3
- "version": "4.0.0-canary.20240402.1",
3
+ "version": "4.0.0-canary.20240419.1",
4
4
  "description": "@umijs/server",
5
5
  "homepage": "https://github.com/umijs/umi/tree/master/packages/server#readme",
6
6
  "bugs": "https://github.com/umijs/umi/issues",
@@ -19,7 +19,7 @@
19
19
  "react": "18.1.0",
20
20
  "react-dom": "18.1.0",
21
21
  "react-router-dom": "6.3.0",
22
- "@umijs/bundler-utils": "4.0.0-canary.20240402.1"
22
+ "@umijs/bundler-utils": "4.0.0-canary.20240419.1"
23
23
  },
24
24
  "publishConfig": {
25
25
  "access": "public"