@modern-js/prod-server 2.20.0 → 2.21.0

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/CHANGELOG.md CHANGED
@@ -1,5 +1,26 @@
1
1
  # @modern-js/prod-server
2
2
 
3
+ ## 2.21.0
4
+
5
+ ### Patch Changes
6
+
7
+ - cfc5bda: feat: ssr mode support async entry
8
+ feat: ssr 模式支持异步入口
9
+ - 26dcf3a: chore: bump typescript to v5 in devDependencies
10
+
11
+ chore: 升级 devDependencies 中的 typescript 版本到 v5
12
+
13
+ - 43b4e83: feat: support security.nonce for add nonce attribute on script tag
14
+ feat: 支持 security.nonce 配置,为 script 标签添加 nonce 属性
15
+ - Updated dependencies [e81eeaf]
16
+ - Updated dependencies [26dcf3a]
17
+ - Updated dependencies [056627f]
18
+ - Updated dependencies [0fc15ca]
19
+ - Updated dependencies [43b4e83]
20
+ - Updated dependencies [ad78387]
21
+ - @modern-js/utils@2.21.0
22
+ - @modern-js/server-core@2.21.0
23
+
3
24
  ## 2.20.0
4
25
 
5
26
  ### Patch Changes
@@ -15,7 +15,7 @@ const _static = require("./static");
15
15
  const _reader = require("./reader");
16
16
  const _ssr = /* @__PURE__ */ _interop_require_wildcard._(require("./ssr"));
17
17
  const _utils1 = require("./utils");
18
- const createRenderHandler = ({ distDir, staticGenerate, forceCSR }) => async function render({ ctx, route, runner }) {
18
+ const createRenderHandler = ({ distDir, staticGenerate, forceCSR, nonce }) => async function render({ ctx, route, runner }) {
19
19
  if (ctx.resHasHandled()) {
20
20
  return null;
21
21
  }
@@ -42,7 +42,8 @@ const createRenderHandler = ({ distDir, staticGenerate, forceCSR }) => async fun
42
42
  urlPath: route.urlPath,
43
43
  bundle: route.bundle,
44
44
  template: content.toString(),
45
- staticGenerate
45
+ staticGenerate,
46
+ nonce
46
47
  }, runner);
47
48
  return result;
48
49
  } catch (err) {
@@ -14,7 +14,7 @@ const _measure = require("./measure");
14
14
  const _utils1 = require("./utils");
15
15
  const render = async (ctx, renderOptions, runner) => {
16
16
  var _ctx_res;
17
- const { urlPath, bundle, distDir, template, entryName, staticGenerate, enableUnsafeCtx = false } = renderOptions;
17
+ const { urlPath, bundle, distDir, template, entryName, staticGenerate, enableUnsafeCtx = false, nonce } = renderOptions;
18
18
  const bundleJS = _path.default.join(distDir, bundle);
19
19
  const loadableUri = _path.default.join(distDir, _utils.LOADABLE_STATS_FILE);
20
20
  const loadableStats = _utils.fs.existsSync(loadableUri) ? require(loadableUri) : "";
@@ -49,12 +49,14 @@ const render = async (ctx, renderOptions, runner) => {
49
49
  metrics: void 0,
50
50
  req: ctx.req,
51
51
  res: ctx.res,
52
- enableUnsafeCtx
52
+ enableUnsafeCtx,
53
+ nonce
53
54
  };
54
55
  context.logger = (0, _measure.createLogger)(context, ctx.logger);
55
56
  context.metrics = (0, _measure.createMetrics)(context, ctx.metrics);
56
57
  runner.extendSSRContext(context);
57
- const serverRender = require(bundleJS)[_utils.SERVER_RENDER_FUNCTION_NAME];
58
+ const bundleJSContent = await Promise.resolve(require(bundleJS));
59
+ const serverRender = bundleJSContent[_utils.SERVER_RENDER_FUNCTION_NAME];
58
60
  const content = await (0, _cache.default)(serverRender, ctx)(context);
59
61
  const { url, status = 302 } = context.redirection;
60
62
  if (url) {
@@ -25,7 +25,7 @@ const SERVER_DIR = "./server";
25
25
  class ModernServer {
26
26
  // server prepare
27
27
  async onInit(runner, app) {
28
- var _conf_bff, _this_conf_server, _this_conf_output;
28
+ var _conf_bff, _this_conf_server, _conf_security, _this_conf_output;
29
29
  this.runner = runner;
30
30
  const { distDir, staticGenerate, conf } = this;
31
31
  (0, _utils1.debug)("final server conf", this.conf);
@@ -49,7 +49,8 @@ class ModernServer {
49
49
  this.routeRenderHandler = (0, _render.createRenderHandler)({
50
50
  distDir,
51
51
  staticGenerate,
52
- forceCSR
52
+ forceCSR,
53
+ nonce: (_conf_security = conf.security) === null || _conf_security === void 0 ? void 0 : _conf_security.nonce
53
54
  });
54
55
  await this.setupBeforeProdMiddleware();
55
56
  this.addHandler(this.setupStaticMiddleware((_this_conf_output = this.conf.output) === null || _this_conf_output === void 0 ? void 0 : _this_conf_output.assetPrefix));
@@ -8,7 +8,7 @@ import { readFile } from "./reader";
8
8
  import * as ssr from "./ssr";
9
9
  import { injectServerData } from "./utils";
10
10
  export var createRenderHandler = function(param) {
11
- var distDir = param.distDir, staticGenerate = param.staticGenerate, forceCSR = param.forceCSR;
11
+ var distDir = param.distDir, staticGenerate = param.staticGenerate, forceCSR = param.forceCSR, nonce = param.nonce;
12
12
  return function() {
13
13
  var _render = _async_to_generator(function(param2) {
14
14
  var ctx, route, runner, entryPath, urlPath, entry, result, templatePath, content, useCSR, result1, err;
@@ -78,7 +78,8 @@ export var createRenderHandler = function(param) {
78
78
  urlPath: route.urlPath,
79
79
  bundle: route.bundle,
80
80
  template: content.toString(),
81
- staticGenerate: staticGenerate
81
+ staticGenerate: staticGenerate,
82
+ nonce: nonce
82
83
  }, runner)
83
84
  ];
84
85
  case 5:
@@ -7,11 +7,11 @@ import { createLogger, createMetrics } from "./measure";
7
7
  import { injectServerDataStream, injectServerData } from "./utils";
8
8
  export var render = function() {
9
9
  var _ref = _async_to_generator(function(ctx, renderOptions, runner) {
10
- var _ctx_res, urlPath, bundle, distDir, template, entryName, staticGenerate, _renderOptions_enableUnsafeCtx, enableUnsafeCtx, bundleJS, loadableUri, loadableStats, routesManifestUri, routeManifest, context, serverRender, content, _context_redirection, url, _context_redirection_status, status;
10
+ var _ctx_res, urlPath, bundle, distDir, template, entryName, staticGenerate, _renderOptions_enableUnsafeCtx, enableUnsafeCtx, nonce, bundleJS, loadableUri, loadableStats, routesManifestUri, routeManifest, context, bundleJSContent, serverRender, content, _context_redirection, url, _context_redirection_status, status;
11
11
  return _ts_generator(this, function(_state) {
12
12
  switch (_state.label) {
13
13
  case 0:
14
- urlPath = renderOptions.urlPath, bundle = renderOptions.bundle, distDir = renderOptions.distDir, template = renderOptions.template, entryName = renderOptions.entryName, staticGenerate = renderOptions.staticGenerate, _renderOptions_enableUnsafeCtx = renderOptions.enableUnsafeCtx, enableUnsafeCtx = _renderOptions_enableUnsafeCtx === void 0 ? false : _renderOptions_enableUnsafeCtx;
14
+ urlPath = renderOptions.urlPath, bundle = renderOptions.bundle, distDir = renderOptions.distDir, template = renderOptions.template, entryName = renderOptions.entryName, staticGenerate = renderOptions.staticGenerate, _renderOptions_enableUnsafeCtx = renderOptions.enableUnsafeCtx, enableUnsafeCtx = _renderOptions_enableUnsafeCtx === void 0 ? false : _renderOptions_enableUnsafeCtx, nonce = renderOptions.nonce;
15
15
  bundleJS = path.join(distDir, bundle);
16
16
  loadableUri = path.join(distDir, LOADABLE_STATS_FILE);
17
17
  loadableStats = fs.existsSync(loadableUri) ? require(loadableUri) : "";
@@ -46,17 +46,24 @@ export var render = function() {
46
46
  metrics: void 0,
47
47
  req: ctx.req,
48
48
  res: ctx.res,
49
- enableUnsafeCtx: enableUnsafeCtx
49
+ enableUnsafeCtx: enableUnsafeCtx,
50
+ nonce: nonce
50
51
  };
51
52
  context.logger = createLogger(context, ctx.logger);
52
53
  context.metrics = createMetrics(context, ctx.metrics);
53
54
  runner.extendSSRContext(context);
54
- serverRender = require(bundleJS)[SERVER_RENDER_FUNCTION_NAME];
55
55
  return [
56
56
  4,
57
- cache(serverRender, ctx)(context)
57
+ Promise.resolve(require(bundleJS))
58
58
  ];
59
59
  case 1:
60
+ bundleJSContent = _state.sent();
61
+ serverRender = bundleJSContent[SERVER_RENDER_FUNCTION_NAME];
62
+ return [
63
+ 4,
64
+ cache(serverRender, ctx)(context)
65
+ ];
66
+ case 2:
60
67
  content = _state.sent();
61
68
  _context_redirection = context.redirection, url = _context_redirection.url, _context_redirection_status = _context_redirection.status, status = _context_redirection_status === void 0 ? 302 : _context_redirection_status;
62
69
  if (url) {
@@ -65,7 +65,7 @@ export var ModernServer = /* @__PURE__ */ function() {
65
65
  function onInit(runner, app) {
66
66
  var _this = this;
67
67
  return _async_to_generator(function() {
68
- var _conf_bff, _this_conf_server, _this_conf_output, distDir, staticGenerate, conf, usageRoutes, ssrConfig, forceCSR;
68
+ var _conf_bff, _this_conf_server, _conf_security, _this_conf_output, distDir, staticGenerate, conf, usageRoutes, ssrConfig, forceCSR;
69
69
  return _ts_generator(this, function(_state) {
70
70
  switch (_state.label) {
71
71
  case 0:
@@ -102,7 +102,8 @@ export var ModernServer = /* @__PURE__ */ function() {
102
102
  _this.routeRenderHandler = createRenderHandler({
103
103
  distDir: distDir,
104
104
  staticGenerate: staticGenerate,
105
- forceCSR: forceCSR
105
+ forceCSR: forceCSR,
106
+ nonce: (_conf_security = conf.security) === null || _conf_security === void 0 ? void 0 : _conf_security.nonce
106
107
  });
107
108
  return [
108
109
  4,
@@ -5,7 +5,7 @@ import { handleDirectory } from "./static";
5
5
  import { readFile } from "./reader";
6
6
  import * as ssr from "./ssr";
7
7
  import { injectServerData } from "./utils";
8
- export const createRenderHandler = ({ distDir, staticGenerate, forceCSR }) => async function render({ ctx, route, runner }) {
8
+ export const createRenderHandler = ({ distDir, staticGenerate, forceCSR, nonce }) => async function render({ ctx, route, runner }) {
9
9
  if (ctx.resHasHandled()) {
10
10
  return null;
11
11
  }
@@ -32,7 +32,8 @@ export const createRenderHandler = ({ distDir, staticGenerate, forceCSR }) => as
32
32
  urlPath: route.urlPath,
33
33
  bundle: route.bundle,
34
34
  template: content.toString(),
35
- staticGenerate
35
+ staticGenerate,
36
+ nonce
36
37
  }, runner);
37
38
  return result;
38
39
  } catch (err) {
@@ -5,7 +5,7 @@ import { createLogger, createMetrics } from "./measure";
5
5
  import { injectServerDataStream, injectServerData } from "./utils";
6
6
  export const render = async (ctx, renderOptions, runner) => {
7
7
  var _ctx_res;
8
- const { urlPath, bundle, distDir, template, entryName, staticGenerate, enableUnsafeCtx = false } = renderOptions;
8
+ const { urlPath, bundle, distDir, template, entryName, staticGenerate, enableUnsafeCtx = false, nonce } = renderOptions;
9
9
  const bundleJS = path.join(distDir, bundle);
10
10
  const loadableUri = path.join(distDir, LOADABLE_STATS_FILE);
11
11
  const loadableStats = fs.existsSync(loadableUri) ? require(loadableUri) : "";
@@ -40,12 +40,14 @@ export const render = async (ctx, renderOptions, runner) => {
40
40
  metrics: void 0,
41
41
  req: ctx.req,
42
42
  res: ctx.res,
43
- enableUnsafeCtx
43
+ enableUnsafeCtx,
44
+ nonce
44
45
  };
45
46
  context.logger = createLogger(context, ctx.logger);
46
47
  context.metrics = createMetrics(context, ctx.metrics);
47
48
  runner.extendSSRContext(context);
48
- const serverRender = require(bundleJS)[SERVER_RENDER_FUNCTION_NAME];
49
+ const bundleJSContent = await Promise.resolve(require(bundleJS));
50
+ const serverRender = bundleJSContent[SERVER_RENDER_FUNCTION_NAME];
49
51
  const content = await cache(serverRender, ctx)(context);
50
52
  const { url, status = 302 } = context.redirection;
51
53
  if (url) {
@@ -15,7 +15,7 @@ const SERVER_DIR = "./server";
15
15
  export class ModernServer {
16
16
  // server prepare
17
17
  async onInit(runner, app) {
18
- var _conf_bff, _this_conf_server, _this_conf_output;
18
+ var _conf_bff, _this_conf_server, _conf_security, _this_conf_output;
19
19
  this.runner = runner;
20
20
  const { distDir, staticGenerate, conf } = this;
21
21
  debug("final server conf", this.conf);
@@ -39,7 +39,8 @@ export class ModernServer {
39
39
  this.routeRenderHandler = createRenderHandler({
40
40
  distDir,
41
41
  staticGenerate,
42
- forceCSR
42
+ forceCSR,
43
+ nonce: (_conf_security = conf.security) === null || _conf_security === void 0 ? void 0 : _conf_security.nonce
43
44
  });
44
45
  await this.setupBeforeProdMiddleware();
45
46
  this.addHandler(this.setupStaticMiddleware((_this_conf_output = this.conf.output) === null || _this_conf_output === void 0 ? void 0 : _this_conf_output.assetPrefix));
@@ -6,7 +6,5 @@ export { ModernServer } from './server/modernServer';
6
6
  export { createProxyHandler } from './libs/proxy';
7
7
  export * from './type';
8
8
  export * from './constants';
9
-
10
9
  declare const _default: (options: ModernServerOptions) => Promise<Server>;
11
-
12
10
  export default _default;
@@ -2,7 +2,7 @@
2
2
  /// <reference types="node" />
3
3
  /// <reference types="node" />
4
4
  /// <reference types="node/http" />
5
- /// <reference types=".dts-temp/fH4DiwP0xq-KSokd2lFla/src/type" />
5
+ /// <reference types=".dts-temp/dQl0PkddbjYymDTKBgvwm/src/type" />
6
6
  import { IncomingMessage, ServerResponse } from 'http';
7
7
  import qs from 'querystring';
8
8
  import type { ModernServerContext as ModernServerContextInterface } from '@modern-js/types';
@@ -18,12 +18,10 @@ export declare class ModernServerContext implements ModernServerContextInterface
18
18
  /**
19
19
  * http response
20
20
  */
21
-
22
21
  res: ServerResponse;
23
22
  /**
24
23
  * url params
25
24
  */
26
-
27
25
  params: Record<string, string>;
28
26
  get logger(): import("@modern-js/types").Logger;
29
27
  get metrics(): import("@modern-js/types").Metrics;
@@ -54,7 +52,6 @@ export declare class ModernServerContext implements ModernServerContextInterface
54
52
  /**
55
53
  * 判断链接是否已经关闭
56
54
  */
57
-
58
55
  resHasHandled(): boolean;
59
56
  error(dig: string, e?: Error | string): void;
60
57
  }
@@ -6,7 +6,6 @@ export declare const requireConfig: (serverConfigPath: string) => any;
6
6
  * 生产环境下,resolvedConfig 与 serverConfig 进行深合并
7
7
  * resolvedConfigPath: 构建序列化后的 modern.config.js 文件路径
8
8
  */
9
-
10
9
  export declare const loadConfig: ({
11
10
  cliConfig,
12
11
  serverConfig,
@@ -44,7 +44,6 @@ declare const LOG_TYPES: {
44
44
  level: string;
45
45
  };
46
46
  };
47
-
48
47
  declare class Logger {
49
48
  private readonly level;
50
49
  private readonly config;
@@ -55,7 +54,6 @@ declare class Logger {
55
54
  private _log;
56
55
  private getLongestLabel;
57
56
  }
58
-
59
57
  type LoggerInterface = { [key in keyof typeof LOG_TYPES]: LoggerFunction };
60
58
  declare const logger: Logger & LoggerInterface;
61
59
  export { Logger };
@@ -2,7 +2,5 @@
2
2
  import { Readable } from 'stream';
3
3
  import type { ModernServerContext } from '@modern-js/types';
4
4
  import { RenderFunction, SSRServerContext } from '../type';
5
-
6
5
  declare const _default: (renderFn: RenderFunction, ctx: ModernServerContext) => (context: SSRServerContext) => Promise<string | Readable>;
7
-
8
6
  export default _default;
@@ -1,6 +1,5 @@
1
1
  import LRUCache from 'lru-cache';
2
2
  import { CacheContent, CacheManagerOptions, CacheResult, CacheContext, CacheConfig } from './type';
3
-
4
3
  declare class CacheManager {
5
4
  cache: LRUCache<string, CacheContent>;
6
5
  cacheOptions: CacheManagerOptions;
@@ -18,7 +17,6 @@ declare class CacheManager {
18
17
  set(context: CacheContext, html: string, cacheConfig: CacheConfig, sync?: boolean): Promise<any>;
19
18
  del(context: CacheContext, cacheHash: string): Promise<void>;
20
19
  }
21
-
22
20
  export declare function createCache(): CacheManager;
23
21
  export declare function destroyCache(): void;
24
22
  export {};
@@ -4,11 +4,13 @@ import { ModernRoute } from '../route';
4
4
  export declare const createRenderHandler: ({
5
5
  distDir,
6
6
  staticGenerate,
7
- forceCSR
7
+ forceCSR,
8
+ nonce
8
9
  }: {
9
10
  distDir: string;
10
11
  staticGenerate: boolean;
11
12
  forceCSR?: boolean | undefined;
13
+ nonce?: string | undefined;
12
14
  }) => ({
13
15
  ctx,
14
16
  route,
@@ -8,4 +8,5 @@ export declare const render: (ctx: ModernServerContext, renderOptions: {
8
8
  entryName: string;
9
9
  staticGenerate: boolean;
10
10
  enableUnsafeCtx?: boolean;
11
+ nonce?: string;
11
12
  }, runner: ServerHookRunner) => Promise<RenderResult>;
@@ -26,14 +26,12 @@ export declare class Server {
26
26
  * - 执行 prepare hook
27
27
  * - 执行 server init
28
28
  */
29
-
30
29
  init(): Promise<this>;
31
30
  /**
32
31
  * Execute config hooks
33
32
  * @param runner
34
33
  * @param options
35
34
  */
36
-
37
35
  private runConfigHook;
38
36
  private runPrepareHook;
39
37
  private initServerConfig;
@@ -41,7 +39,6 @@ export declare class Server {
41
39
  *
42
40
  * merge cliConfig and serverConfig
43
41
  */
44
-
45
42
  private initConfig;
46
43
  close(): Promise<void>;
47
44
  listen<T extends number | ListenOptions | undefined>(options: T, listener: any): void;
@@ -1,6 +1,6 @@
1
1
  /// <reference types="node" />
2
2
  /// <reference types="node/http" />
3
- /// <reference types=".dts-temp/fH4DiwP0xq-KSokd2lFla/src/type" />
3
+ /// <reference types=".dts-temp/dQl0PkddbjYymDTKBgvwm/src/type" />
4
4
  import { IncomingMessage } from 'http';
5
5
  import type { OutputNormalizedConfig, HtmlNormalizedConfig } from '@modern-js/server-core';
6
6
  export declare const debug: any;
@@ -19,7 +19,6 @@ export declare class ReturnResponse {
19
19
  * @param headers
20
20
  * @returns
21
21
  */
22
-
23
22
  appendHeaders(headers: Record<string, any>): this;
24
23
  /**
25
24
  * Iterate a Object
@@ -30,11 +29,11 @@ export declare class ReturnResponse {
30
29
  * @param headers
31
30
  * @returns
32
31
  */
33
-
34
32
  setHeaders(headers: Record<string, any>): this;
35
33
  }
36
34
  export type Manifest = {
37
- pages: Record<string, // path
35
+ pages: Record<string,
36
+ // path
38
37
  {
39
38
  entryName: string;
40
39
  template: string;
package/package.json CHANGED
@@ -15,7 +15,7 @@
15
15
  "modern",
16
16
  "modern.js"
17
17
  ],
18
- "version": "2.20.0",
18
+ "version": "2.21.0",
19
19
  "jsnext:source": "./src/index.ts",
20
20
  "types": "./dist/types/index.d.ts",
21
21
  "main": "./dist/cjs/index.js",
@@ -61,8 +61,8 @@
61
61
  "path-to-regexp": "^6.2.0",
62
62
  "serve-static": "^1.14.1",
63
63
  "@swc/helpers": "0.5.1",
64
- "@modern-js/utils": "2.20.0",
65
- "@modern-js/server-core": "2.20.0"
64
+ "@modern-js/utils": "2.21.0",
65
+ "@modern-js/server-core": "2.21.0"
66
66
  },
67
67
  "devDependencies": {
68
68
  "@types/cookie": "^0.4.1",
@@ -77,11 +77,11 @@
77
77
  "jest": "^29",
78
78
  "node-mocks-http": "^1.11.0",
79
79
  "portfinder": "^1.0.28",
80
- "typescript": "^4",
81
- "@modern-js/types": "2.20.0",
82
- "@modern-js/server-core": "2.20.0",
83
- "@scripts/jest-config": "2.20.0",
84
- "@scripts/build": "2.20.0"
80
+ "typescript": "^5",
81
+ "@modern-js/types": "2.21.0",
82
+ "@modern-js/server-core": "2.21.0",
83
+ "@scripts/jest-config": "2.21.0",
84
+ "@scripts/build": "2.21.0"
85
85
  },
86
86
  "sideEffects": false,
87
87
  "publishConfig": {