@umijs/server 4.0.0-canary.20231019.1 → 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,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
@@ -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,14 +190,22 @@ 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
- );
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
+ });
180
201
  res.status(200).json(data);
181
202
  return;
182
203
  }
183
- const jsx = await jsxGeneratorDeferrer(req.url);
204
+ const fullUrl = `${req.protocol}://${req.get("host")}${req.originalUrl}`;
205
+ const request = new Request(fullUrl, {
206
+ headers: req.headers
207
+ });
208
+ const jsx = await jsxGeneratorDeferrer(req.url, { request });
184
209
  if (!jsx)
185
210
  return next();
186
211
  const writable = new import_stream.Writable();
@@ -209,7 +234,13 @@ function createUmiHandler(opts) {
209
234
  ...opts,
210
235
  ...params
211
236
  });
212
- const jsx = await jsxGeneratorDeferrer(new URL(req.url).pathname);
237
+ const loaderArgs = {
238
+ request: req
239
+ };
240
+ const jsx = await jsxGeneratorDeferrer(
241
+ new URL(req.url).pathname,
242
+ loaderArgs
243
+ );
213
244
  if (!jsx) {
214
245
  throw new Error("no page resource");
215
246
  }
@@ -219,7 +250,14 @@ function createUmiHandler(opts) {
219
250
  function createUmiServerLoader(opts) {
220
251
  return async function(req) {
221
252
  const query = Object.fromEntries(new URL(req.url).searchParams);
222
- return await executeLoader(query.route, opts.routesWithServerLoader);
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
+ });
223
261
  };
224
262
  }
225
263
  function matchRoutesForSSR(reqUrl, routesById) {
@@ -250,12 +288,29 @@ function createClientRoute(route) {
250
288
  index
251
289
  };
252
290
  }
253
- async function executeLoader(routeKey, routesWithServerLoader) {
291
+ async function executeLoader(params) {
292
+ const { routeKey, routesWithServerLoader, serverLoaderArgs } = params;
293
+ const mod = await routesWithServerLoader[routeKey]();
294
+ if (!mod.serverLoader || typeof mod.serverLoader !== "function") {
295
+ return;
296
+ }
297
+ return mod.serverLoader(serverLoaderArgs);
298
+ }
299
+ async function executeMetadataLoader(params) {
300
+ const {
301
+ routesWithServerLoader,
302
+ routeKey,
303
+ serverLoaderArgs,
304
+ serverLoaderData
305
+ } = params;
254
306
  const mod = await routesWithServerLoader[routeKey]();
255
307
  if (!mod.serverLoader || typeof mod.serverLoader !== "function") {
256
308
  return;
257
309
  }
258
- return await mod.serverLoader();
310
+ return mod.metadataLoader(
311
+ serverLoaderData,
312
+ serverLoaderArgs
313
+ );
259
314
  }
260
315
  // Annotate the CommonJS export names for ESM import in node:
261
316
  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.0-canary.20231019.1",
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.1"
22
+ "@umijs/bundler-utils": "4.0.0-canary.20231109.1"
23
23
  },
24
24
  "publishConfig": {
25
25
  "access": "public"