@umijs/server 4.0.0-canary.20231019.2 → 4.0.0-canary.20231109.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,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
@@ -138,17 +154,18 @@ function createMarkupGenerator(opts) {
138
154
  next();
139
155
  };
140
156
  writable.on("finish", async () => {
157
+ var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j;
141
158
  let html = Buffer.concat(chunks).toString("utf8");
142
159
  html += await getGenerateStaticHTML(serverInsertedHTMLCallbacks);
143
160
  if (opts.helmetContext) {
144
161
  html = html.replace(
145
162
  /(<\/head>)/,
146
163
  [
147
- opts.helmetContext.helmet.title.toString(),
148
- opts.helmetContext.helmet.priority.toString(),
149
- opts.helmetContext.helmet.meta.toString(),
150
- opts.helmetContext.helmet.link.toString(),
151
- opts.helmetContext.helmet.script.toString(),
164
+ (_b = (_a = opts.helmetContext.helmet) == null ? void 0 : _a.title) == null ? void 0 : _b.toString(),
165
+ (_d = (_c = opts.helmetContext.helmet) == null ? void 0 : _c.priority) == null ? void 0 : _d.toString(),
166
+ (_f = (_e = opts.helmetContext.helmet) == null ? void 0 : _e.meta) == null ? void 0 : _f.toString(),
167
+ (_h = (_g = opts.helmetContext.helmet) == null ? void 0 : _g.link) == null ? void 0 : _h.toString(),
168
+ (_j = (_i = opts.helmetContext.helmet) == null ? void 0 : _i.script) == null ? void 0 : _j.toString(),
152
169
  "$1"
153
170
  ].filter(Boolean).join("\n")
154
171
  );
@@ -173,15 +190,19 @@ function createRequestHandler(opts) {
173
190
  const jsxGeneratorDeferrer = createJSXGenerator(opts);
174
191
  return async function(req, res, next) {
175
192
  if (req.url.startsWith("/__serverLoader") && req.query.route) {
176
- const data = await executeLoader(
177
- req.query.route,
178
- opts.routesWithServerLoader,
179
- { request: req }
180
- );
193
+ const serverLoaderRequest = new Request(req.query.url, {
194
+ headers: req.headers
195
+ });
196
+ const data = await executeLoader({
197
+ routeKey: req.query.route,
198
+ routesWithServerLoader: opts.routesWithServerLoader,
199
+ serverLoaderArgs: { request: serverLoaderRequest }
200
+ });
181
201
  res.status(200).json(data);
182
202
  return;
183
203
  }
184
- const request = new Request(req.protocol + "://" + req.get("host") + req.originalUrl, {
204
+ const fullUrl = `${req.protocol}://${req.get("host")}${req.originalUrl}`;
205
+ const request = new Request(fullUrl, {
185
206
  headers: req.headers
186
207
  });
187
208
  const jsx = await jsxGeneratorDeferrer(req.url, { request });
@@ -213,7 +234,13 @@ function createUmiHandler(opts) {
213
234
  ...opts,
214
235
  ...params
215
236
  });
216
- const jsx = await jsxGeneratorDeferrer(new URL(req.url).pathname, { request: req });
237
+ const loaderArgs = {
238
+ request: req
239
+ };
240
+ const jsx = await jsxGeneratorDeferrer(
241
+ new URL(req.url).pathname,
242
+ loaderArgs
243
+ );
217
244
  if (!jsx) {
218
245
  throw new Error("no page resource");
219
246
  }
@@ -223,7 +250,14 @@ function createUmiHandler(opts) {
223
250
  function createUmiServerLoader(opts) {
224
251
  return async function(req) {
225
252
  const query = Object.fromEntries(new URL(req.url).searchParams);
226
- return await executeLoader(query.route, opts.routesWithServerLoader, { request: req });
253
+ const serverLoaderRequest = new Request(query.url, {
254
+ headers: req.headers
255
+ });
256
+ return await executeLoader({
257
+ routeKey: query.route,
258
+ routesWithServerLoader: opts.routesWithServerLoader,
259
+ serverLoaderArgs: { request: serverLoaderRequest }
260
+ });
227
261
  };
228
262
  }
229
263
  function matchRoutesForSSR(reqUrl, routesById) {
@@ -254,13 +288,30 @@ function createClientRoute(route) {
254
288
  index
255
289
  };
256
290
  }
257
- async function executeLoader(routeKey, routesWithServerLoader, serverLoaderArgs) {
291
+ async function executeLoader(params) {
292
+ const { routeKey, routesWithServerLoader, serverLoaderArgs } = params;
258
293
  const mod = await routesWithServerLoader[routeKey]();
259
294
  if (!mod.serverLoader || typeof mod.serverLoader !== "function") {
260
295
  return;
261
296
  }
262
297
  return mod.serverLoader(serverLoaderArgs);
263
298
  }
299
+ async function executeMetadataLoader(params) {
300
+ const {
301
+ routesWithServerLoader,
302
+ routeKey,
303
+ serverLoaderArgs,
304
+ serverLoaderData
305
+ } = params;
306
+ const mod = await routesWithServerLoader[routeKey]();
307
+ if (!mod.serverLoader || typeof mod.serverLoader !== "function") {
308
+ return;
309
+ }
310
+ return mod.metadataLoader(
311
+ serverLoaderData,
312
+ serverLoaderArgs
313
+ );
314
+ }
264
315
  // Annotate the CommonJS export names for ESM import in node:
265
316
  0 && (module.exports = {
266
317
  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.0-canary.20231019.2",
3
+ "version": "4.0.0-canary.20231109.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.20231019.2"
22
+ "@umijs/bundler-utils": "4.0.0-canary.20231109.1"
23
23
  },
24
24
  "publishConfig": {
25
25
  "access": "public"