@umijs/server 4.0.86 → 4.0.88

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,9 +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
- interface CreateRequestHandlerOptions {
7
+ interface CreateRequestServerlessOptions {
8
+ /**
9
+ * folder path for `build-manifest.json`
10
+ */
11
+ sourceDir?: string;
12
+ }
13
+ interface CreateRequestHandlerOptions extends CreateRequestServerlessOptions {
7
14
  routesWithServerLoader: RouteLoaders;
8
15
  PluginManager: any;
9
16
  manifest: ((sourceDir?: string) => {
@@ -18,11 +25,9 @@ interface CreateRequestHandlerOptions {
18
25
  createHistory: (opts: any) => any;
19
26
  helmetContext?: any;
20
27
  ServerInsertedHTMLContext: React.Context<ServerInsertedHTMLHook | null>;
21
- withoutHTML?: boolean;
22
- sourceDir?: string;
23
28
  }
24
29
  export declare function createMarkupGenerator(opts: CreateRequestHandlerOptions): (url: string) => Promise<unknown>;
25
30
  export default function createRequestHandler(opts: CreateRequestHandlerOptions): (req: any, res: any, next: any) => Promise<any>;
26
- export declare function createUmiHandler(opts: CreateRequestHandlerOptions): (req: Request, params?: CreateRequestHandlerOptions) => Promise<NodeJS.ReadableStream>;
27
- 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>;
28
33
  export {};
package/dist/ssr.js CHANGED
@@ -55,7 +55,7 @@ var createJSXProvider = (Provider, serverInsertedHTMLCallbacks) => {
55
55
  return JSXProvider;
56
56
  };
57
57
  function createJSXGenerator(opts) {
58
- return async (url) => {
58
+ return async (url, serverLoaderArgs) => {
59
59
  const {
60
60
  routesWithServerLoader,
61
61
  PluginManager,
@@ -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);
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,14 +189,22 @@ 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
- );
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
+ });
180
200
  res.status(200).json(data);
181
201
  return;
182
202
  }
183
- const jsx = await jsxGeneratorDeferrer(req.url);
203
+ const fullUrl = `${req.protocol}://${req.get("host")}${req.originalUrl}`;
204
+ const request = new Request(fullUrl, {
205
+ headers: req.headers
206
+ });
207
+ const jsx = await jsxGeneratorDeferrer(req.url, { request });
184
208
  if (!jsx)
185
209
  return next();
186
210
  const writable = new import_stream.Writable();
@@ -209,7 +233,13 @@ function createUmiHandler(opts) {
209
233
  ...opts,
210
234
  ...params
211
235
  });
212
- const jsx = await jsxGeneratorDeferrer(new URL(req.url).pathname);
236
+ const loaderArgs = {
237
+ request: req
238
+ };
239
+ const jsx = await jsxGeneratorDeferrer(
240
+ new URL(req.url).pathname,
241
+ loaderArgs
242
+ );
213
243
  if (!jsx) {
214
244
  throw new Error("no page resource");
215
245
  }
@@ -219,7 +249,14 @@ function createUmiHandler(opts) {
219
249
  function createUmiServerLoader(opts) {
220
250
  return async function(req) {
221
251
  const query = Object.fromEntries(new URL(req.url).searchParams);
222
- return await executeLoader(query.route, opts.routesWithServerLoader);
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
+ });
223
260
  };
224
261
  }
225
262
  function matchRoutesForSSR(reqUrl, routesById) {
@@ -250,12 +287,29 @@ function createClientRoute(route) {
250
287
  index
251
288
  };
252
289
  }
253
- async function executeLoader(routeKey, routesWithServerLoader) {
290
+ async function executeLoader(params) {
291
+ const { routeKey, routesWithServerLoader, serverLoaderArgs } = params;
292
+ const mod = await routesWithServerLoader[routeKey]();
293
+ if (!mod.serverLoader || typeof mod.serverLoader !== "function") {
294
+ return;
295
+ }
296
+ return mod.serverLoader(serverLoaderArgs);
297
+ }
298
+ async function executeMetadataLoader(params) {
299
+ const {
300
+ routesWithServerLoader,
301
+ routeKey,
302
+ serverLoaderArgs,
303
+ serverLoaderData
304
+ } = params;
254
305
  const mod = await routesWithServerLoader[routeKey]();
255
306
  if (!mod.serverLoader || typeof mod.serverLoader !== "function") {
256
307
  return;
257
308
  }
258
- return await mod.serverLoader();
309
+ return mod.metadataLoader(
310
+ serverLoaderData,
311
+ serverLoaderArgs
312
+ );
259
313
  }
260
314
  // Annotate the CommonJS export names for ESM import in node:
261
315
  0 && (module.exports = {
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.86",
3
+ "version": "4.0.88",
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.86"
22
+ "@umijs/bundler-utils": "4.0.88"
23
23
  },
24
24
  "publishConfig": {
25
25
  "access": "public"