@umijs/server 4.0.87 → 4.0.89

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,12 +1,16 @@
1
1
  import React from 'react';
2
+ import type { UmiRequest } from './types';
2
3
  interface RouteLoaders {
3
4
  [key: string]: () => Promise<any>;
4
5
  }
5
6
  export declare type ServerInsertedHTMLHook = (callbacks: () => React.ReactNode) => void;
6
- export interface IServerLoaderArgs {
7
- request: Request;
7
+ interface CreateRequestServerlessOptions {
8
+ /**
9
+ * folder path for `build-manifest.json`
10
+ */
11
+ sourceDir?: string;
8
12
  }
9
- interface CreateRequestHandlerOptions {
13
+ interface CreateRequestHandlerOptions extends CreateRequestServerlessOptions {
10
14
  routesWithServerLoader: RouteLoaders;
11
15
  PluginManager: any;
12
16
  manifest: ((sourceDir?: string) => {
@@ -21,11 +25,9 @@ interface CreateRequestHandlerOptions {
21
25
  createHistory: (opts: any) => any;
22
26
  helmetContext?: any;
23
27
  ServerInsertedHTMLContext: React.Context<ServerInsertedHTMLHook | null>;
24
- withoutHTML?: boolean;
25
- sourceDir?: string;
26
28
  }
27
29
  export declare function createMarkupGenerator(opts: CreateRequestHandlerOptions): (url: string) => Promise<unknown>;
28
30
  export default function createRequestHandler(opts: CreateRequestHandlerOptions): (req: any, res: any, next: any) => Promise<any>;
29
- export declare function createUmiHandler(opts: CreateRequestHandlerOptions): (req: Request, params?: CreateRequestHandlerOptions) => Promise<NodeJS.ReadableStream>;
30
- export declare function createUmiServerLoader(opts: CreateRequestHandlerOptions): (req: Request) => Promise<any>;
31
+ export declare function createUmiHandler(opts: CreateRequestHandlerOptions): (req: UmiRequest, params?: CreateRequestHandlerOptions) => Promise<NodeJS.ReadableStream>;
32
+ export declare function createUmiServerLoader(opts: CreateRequestHandlerOptions): (req: UmiRequest) => Promise<any>;
31
33
  export {};
package/dist/ssr.js CHANGED
@@ -84,10 +84,26 @@ function createJSXGenerator(opts) {
84
84
  return;
85
85
  }
86
86
  const loaderData = {};
87
+ const metadata = {};
87
88
  await Promise.all(
88
89
  matches.filter((id) => routes[id].hasServerLoader).map(
89
90
  (id) => new Promise(async (resolve) => {
90
- loaderData[id] = await executeLoader(id, routesWithServerLoader, serverLoaderArgs);
91
+ loaderData[id] = await executeLoader({
92
+ routeKey: id,
93
+ routesWithServerLoader,
94
+ serverLoaderArgs
95
+ });
96
+ if (routes[id].hasMetadataLoader) {
97
+ Object.assign(
98
+ metadata,
99
+ await executeMetadataLoader({
100
+ routesWithServerLoader,
101
+ routeKey: id,
102
+ serverLoaderArgs,
103
+ serverLoaderData: loaderData[id]
104
+ })
105
+ );
106
+ }
91
107
  resolve();
92
108
  })
93
109
  )
@@ -100,7 +116,7 @@ function createJSXGenerator(opts) {
100
116
  location: url,
101
117
  manifest,
102
118
  loaderData,
103
- withoutHTML: opts.withoutHTML
119
+ metadata
104
120
  };
105
121
  const element = await opts.getClientRootComponent(
106
122
  context
@@ -173,15 +189,19 @@ function createRequestHandler(opts) {
173
189
  const jsxGeneratorDeferrer = createJSXGenerator(opts);
174
190
  return async function(req, res, next) {
175
191
  if (req.url.startsWith("/__serverLoader") && req.query.route) {
176
- const data = await executeLoader(
177
- req.query.route,
178
- opts.routesWithServerLoader,
179
- { request: req }
180
- );
192
+ const serverLoaderRequest = new Request(req.query.url, {
193
+ headers: req.headers
194
+ });
195
+ const data = await executeLoader({
196
+ routeKey: req.query.route,
197
+ routesWithServerLoader: opts.routesWithServerLoader,
198
+ serverLoaderArgs: { request: serverLoaderRequest }
199
+ });
181
200
  res.status(200).json(data);
182
201
  return;
183
202
  }
184
- const request = new Request(req.protocol + "://" + req.get("host") + req.originalUrl, {
203
+ const fullUrl = `${req.protocol}://${req.get("host")}${req.originalUrl}`;
204
+ const request = new Request(fullUrl, {
185
205
  headers: req.headers
186
206
  });
187
207
  const jsx = await jsxGeneratorDeferrer(req.url, { request });
@@ -213,7 +233,13 @@ function createUmiHandler(opts) {
213
233
  ...opts,
214
234
  ...params
215
235
  });
216
- const jsx = await jsxGeneratorDeferrer(new URL(req.url).pathname, { request: req });
236
+ const loaderArgs = {
237
+ request: req
238
+ };
239
+ const jsx = await jsxGeneratorDeferrer(
240
+ new URL(req.url).pathname,
241
+ loaderArgs
242
+ );
217
243
  if (!jsx) {
218
244
  throw new Error("no page resource");
219
245
  }
@@ -223,7 +249,14 @@ function createUmiHandler(opts) {
223
249
  function createUmiServerLoader(opts) {
224
250
  return async function(req) {
225
251
  const query = Object.fromEntries(new URL(req.url).searchParams);
226
- return await executeLoader(query.route, opts.routesWithServerLoader, { request: req });
252
+ const serverLoaderRequest = new Request(query.url, {
253
+ headers: req.headers
254
+ });
255
+ return await executeLoader({
256
+ routeKey: query.route,
257
+ routesWithServerLoader: opts.routesWithServerLoader,
258
+ serverLoaderArgs: { request: serverLoaderRequest }
259
+ });
227
260
  };
228
261
  }
229
262
  function matchRoutesForSSR(reqUrl, routesById) {
@@ -254,13 +287,30 @@ function createClientRoute(route) {
254
287
  index
255
288
  };
256
289
  }
257
- async function executeLoader(routeKey, routesWithServerLoader, serverLoaderArgs) {
290
+ async function executeLoader(params) {
291
+ const { routeKey, routesWithServerLoader, serverLoaderArgs } = params;
258
292
  const mod = await routesWithServerLoader[routeKey]();
259
293
  if (!mod.serverLoader || typeof mod.serverLoader !== "function") {
260
294
  return;
261
295
  }
262
296
  return mod.serverLoader(serverLoaderArgs);
263
297
  }
298
+ async function executeMetadataLoader(params) {
299
+ const {
300
+ routesWithServerLoader,
301
+ routeKey,
302
+ serverLoaderArgs,
303
+ serverLoaderData
304
+ } = params;
305
+ const mod = await routesWithServerLoader[routeKey]();
306
+ if (!mod.serverLoader || typeof mod.serverLoader !== "function") {
307
+ return;
308
+ }
309
+ return mod.metadataLoader(
310
+ serverLoaderData,
311
+ serverLoaderArgs
312
+ );
313
+ }
264
314
  // Annotate the CommonJS export names for ESM import in node:
265
315
  0 && (module.exports = {
266
316
  createMarkupGenerator,
package/dist/types.d.ts CHANGED
@@ -10,3 +10,25 @@ export interface IRoutesById {
10
10
  export interface IRouteCustom extends IRoute {
11
11
  [key: string]: any;
12
12
  }
13
+ declare type LoaderReturn<T> = T | Promise<T>;
14
+ export declare type UmiRequest = Partial<Request> & Pick<Request, 'url' | 'headers'>;
15
+ export interface IServerLoaderArgs {
16
+ request: UmiRequest;
17
+ }
18
+ export declare type ServerLoader<T = any> = (req?: IServerLoaderArgs) => LoaderReturn<T>;
19
+ export interface IMetaTag {
20
+ name: string;
21
+ content: string;
22
+ }
23
+ export interface IMetadata {
24
+ title?: string;
25
+ description?: string;
26
+ keywords?: string[];
27
+ /**
28
+ * @default 'en'
29
+ */
30
+ lang?: string;
31
+ metas?: IMetaTag[];
32
+ }
33
+ export declare type MetadataLoader<T = any> = (serverLoaderData: T, req?: IServerLoaderArgs) => LoaderReturn<IMetadata>;
34
+ export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@umijs/server",
3
- "version": "4.0.87",
3
+ "version": "4.0.89",
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.87"
22
+ "@umijs/bundler-utils": "4.0.89"
23
23
  },
24
24
  "publishConfig": {
25
25
  "access": "public"