@umijs/server 4.0.0-canary.20240402.1 → 4.0.0-canary.20240423.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
  };
@@ -190,6 +193,7 @@ function createMarkupGenerator(opts) {
190
193
  onShellReady() {
191
194
  stream.pipe(writable);
192
195
  },
196
+ bootstrapScripts: [jsx.manifest.assets["umi.js"] || "/umi.js"],
193
197
  onError: reject
194
198
  }
195
199
  );
@@ -198,25 +202,60 @@ function createMarkupGenerator(opts) {
198
202
  return "";
199
203
  };
200
204
  }
205
+ var normalizeRequest = (...args) => {
206
+ var _a, _b;
207
+ let request;
208
+ let serverLoaderRequest;
209
+ let serverLoaderArgs;
210
+ if (process.env.SSR_BUILD_TARGET === "worker") {
211
+ const [ev] = args;
212
+ const { pathname, searchParams } = new URL(ev.request.url);
213
+ request = {
214
+ url: ev.request.url,
215
+ pathname,
216
+ headers: ev.request.headers,
217
+ query: {
218
+ route: searchParams.get("route"),
219
+ url: searchParams.get("url")
220
+ }
221
+ };
222
+ } else {
223
+ const [req] = args;
224
+ request = {
225
+ url: `${req.protocol}://${req.get("host")}${req.originalUrl}`,
226
+ pathname: req.url,
227
+ headers: req.headers,
228
+ query: {
229
+ route: (_a = req.query.route) == null ? void 0 : _a.toString(),
230
+ url: (_b = req.query.url) == null ? void 0 : _b.toString()
231
+ }
232
+ };
233
+ }
234
+ if (request.pathname.startsWith("/__serverLoader") && request.query.route && request.query.url) {
235
+ serverLoaderRequest = new Request(request.query.url, {
236
+ headers: request.headers
237
+ });
238
+ serverLoaderArgs = {
239
+ request: serverLoaderRequest
240
+ };
241
+ }
242
+ return {
243
+ request,
244
+ serverLoaderArgs
245
+ };
246
+ };
201
247
  function createRequestHandler(opts) {
202
248
  const jsxGeneratorDeferrer = createJSXGenerator(opts);
203
249
  const normalizeHandlerArgs = (...args) => {
204
- var _a, _b;
205
250
  let ret;
251
+ const { request } = normalizeRequest(...args);
206
252
  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) {
253
+ if (process.env.SSR_BUILD_TARGET === "worker") {
208
254
  const [ev, workerOpts] = args;
209
- const { pathname, searchParams } = new URL(ev.request.url);
255
+ let asyncRespondWith;
256
+ ev.respondWith(new Promise((r) => asyncRespondWith = r));
210
257
  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
- },
258
+ req: request,
220
259
  async sendServerLoader(data) {
221
260
  let res = new Response(JSON.stringify(data), {
222
261
  headers: {
@@ -227,7 +266,7 @@ function createRequestHandler(opts) {
227
266
  if (workerOpts == null ? void 0 : workerOpts.modifyResponse) {
228
267
  res = await workerOpts.modifyResponse(res);
229
268
  }
230
- ev.respondWith(res);
269
+ asyncRespondWith(res);
231
270
  },
232
271
  async sendPage(jsx) {
233
272
  const [JSXProvider, serverInsertedHTMLCallbacks] = createJSXProvider(
@@ -254,8 +293,7 @@ function createRequestHandler(opts) {
254
293
  }
255
294
  }
256
295
  });
257
- stream.pipeThrough(transformStream);
258
- let res = new Response(stream, {
296
+ let res = new Response(stream.pipeThrough(transformStream), {
259
297
  headers: {
260
298
  "content-type": "text/html; charset=utf-8"
261
299
  },
@@ -264,24 +302,16 @@ function createRequestHandler(opts) {
264
302
  if (workerOpts == null ? void 0 : workerOpts.modifyResponse) {
265
303
  res = await workerOpts.modifyResponse(res);
266
304
  }
267
- ev.respondWith(res);
305
+ asyncRespondWith(res);
268
306
  },
269
307
  otherwise() {
270
308
  throw new Error("no page resource");
271
309
  }
272
310
  };
273
311
  } else {
274
- const [req, res, next] = args;
312
+ const [_, res, next] = args;
275
313
  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
- },
314
+ req: request,
285
315
  sendServerLoader(data) {
286
316
  res.status(200).json(data);
287
317
  },
@@ -325,28 +355,33 @@ function createRequestHandler(opts) {
325
355
  return ret;
326
356
  };
327
357
  return async function unifiedRequestHandler(...args) {
328
- let jsx;
329
358
  const { req, sendServerLoader, sendPage, otherwise } = normalizeHandlerArgs(
330
359
  ...args
331
360
  );
332
361
  if (req.pathname.startsWith("/__serverLoader") && req.query.route && req.query.url) {
333
- const serverLoaderRequest = new Request(req.query.url, {
334
- headers: req.headers
335
- });
362
+ const { serverLoaderArgs } = normalizeRequest(...args);
336
363
  const data = await executeLoader({
337
364
  routeKey: req.query.route,
338
365
  routesWithServerLoader: opts.routesWithServerLoader,
339
- serverLoaderArgs: { request: serverLoaderRequest }
366
+ serverLoaderArgs
340
367
  });
341
368
  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
369
  } else {
349
- await otherwise();
370
+ const render = opts.pluginManager.applyPlugins({
371
+ key: "render",
372
+ type: "compose",
373
+ initialValue: () => jsxGeneratorDeferrer(req.pathname, {
374
+ request: new Request(req.url, {
375
+ headers: req.headers
376
+ })
377
+ })
378
+ });
379
+ const jsx = await render();
380
+ if (jsx) {
381
+ await sendPage(jsx);
382
+ } else {
383
+ await otherwise();
384
+ }
350
385
  }
351
386
  };
352
387
  }
@@ -396,6 +431,14 @@ function createUmiServerLoader(opts) {
396
431
  });
397
432
  };
398
433
  }
434
+ function createAppRootElement(opts) {
435
+ return async (...args) => {
436
+ const jsxGeneratorDeferrer = createJSXGenerator(opts);
437
+ const { request, serverLoaderArgs } = normalizeRequest(...args);
438
+ const jsx = await jsxGeneratorDeferrer(request.pathname, serverLoaderArgs);
439
+ return () => jsx == null ? void 0 : jsx.element;
440
+ };
441
+ }
399
442
  function matchRoutesForSSR(reqUrl, routesById) {
400
443
  var _a;
401
444
  return ((_a = (0, import_react_router_dom.matchRoutes)(createClientRoutes({ routesById }), reqUrl)) == null ? void 0 : _a.map(
@@ -438,20 +481,19 @@ async function executeMetadataLoader(params) {
438
481
  if (!mod.serverLoader || typeof mod.serverLoader !== "function") {
439
482
  return;
440
483
  }
441
- const result = mod.metadataLoader(
484
+ const loaderDatas = mod.metadataLoader(
442
485
  serverLoaderData
443
486
  );
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
- );
487
+ const result = {};
488
+ Object.values(MetaLoaderResultKeys).forEach((key) => {
489
+ if (loaderDatas == null ? void 0 : loaderDatas[key])
490
+ result[key] = loaderDatas[key];
491
+ });
492
+ return result;
452
493
  }
453
494
  // Annotate the CommonJS export names for ESM import in node:
454
495
  0 && (module.exports = {
496
+ createAppRootElement,
455
497
  createMarkupGenerator,
456
498
  createUmiHandler,
457
499
  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.20240423.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.20240423.1"
23
23
  },
24
24
  "publishConfig": {
25
25
  "access": "public"