@modern-js/server 1.2.1-beta.2 → 1.3.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.
Files changed (46) hide show
  1. package/CHANGELOG.md +40 -0
  2. package/dist/js/modern/dev-tools/mock/index.js +1 -1
  3. package/dist/js/modern/libs/render/cache/index.js +1 -1
  4. package/dist/js/modern/libs/render/index.js +1 -1
  5. package/dist/js/modern/libs/render/modern/index.js +3 -1
  6. package/dist/js/modern/server/index.js +1 -1
  7. package/dist/js/modern/server/modern-server.js +3 -2
  8. package/dist/js/modern/utils.js +23 -0
  9. package/dist/js/node/dev-tools/mock/index.js +2 -2
  10. package/dist/js/node/libs/render/cache/index.js +2 -2
  11. package/dist/js/node/libs/render/index.js +2 -2
  12. package/dist/js/node/libs/render/modern/index.js +3 -3
  13. package/dist/js/node/server/index.js +2 -2
  14. package/dist/js/node/server/modern-server.js +4 -3
  15. package/dist/js/node/utils.js +28 -2
  16. package/dist/types/libs/metrics.d.ts +1 -1
  17. package/dist/types/libs/render/index.d.ts +1 -2
  18. package/dist/types/libs/render/ssr.d.ts +1 -2
  19. package/dist/types/server/dev-server/dev-server-split.d.ts +3 -3
  20. package/dist/types/server/dev-server/dev-server.d.ts +1 -1
  21. package/dist/types/server/index.d.ts +1 -1
  22. package/dist/types/server/modern-server-split.d.ts +4 -4
  23. package/dist/types/server/modern-server.d.ts +10 -7
  24. package/dist/types/utils.d.ts +10 -1
  25. package/jest.config.js +8 -0
  26. package/package.json +21 -15
  27. package/src/dev-tools/mock/index.ts +1 -1
  28. package/src/dev-tools/socket-server.ts +1 -1
  29. package/src/libs/metrics.ts +1 -1
  30. package/src/libs/render/cache/index.ts +1 -1
  31. package/src/libs/render/index.ts +2 -3
  32. package/src/libs/render/modern/index.ts +2 -1
  33. package/src/libs/render/ssr.ts +1 -2
  34. package/src/server/dev-server/dev-server-split.ts +3 -3
  35. package/src/server/dev-server/dev-server.ts +12 -12
  36. package/src/server/index.ts +2 -2
  37. package/src/server/modern-server-split.ts +4 -4
  38. package/src/server/modern-server.ts +23 -14
  39. package/src/utils.ts +28 -0
  40. package/tests/dev.test.ts +39 -0
  41. package/tests/fixtures/pure/tsconfig.json +1 -1
  42. package/tests/middleware.test.ts +12 -11
  43. package/tests/server.test.ts +13 -1
  44. package/tests/tsconfig.json +1 -3
  45. package/tests/utils.test.ts +31 -0
  46. package/tsconfig.json +1 -3
package/CHANGELOG.md CHANGED
@@ -1,5 +1,45 @@
1
1
  # @modern-js/server
2
2
 
3
+ ## 1.3.0
4
+
5
+ ### Minor Changes
6
+
7
+ - cfe11628: Make Modern.js self bootstraping
8
+
9
+ ### Patch Changes
10
+
11
+ - 146dcd85: modify server framework plugin hook types and hook context
12
+ - c3d46ee4: fix: test config invalid
13
+ - 146dcd85: modify server framework plugin hook types
14
+ - 146dcd85: fix test case in babel compiler
15
+ - 1ebc7ee2: fix: @babel/core version
16
+ - Updated dependencies [2da09c69]
17
+ - Updated dependencies [fc71e36f]
18
+ - Updated dependencies [146dcd85]
19
+ - Updated dependencies [74ce3bb7]
20
+ - Updated dependencies [c3d46ee4]
21
+ - Updated dependencies [cfe11628]
22
+ - Updated dependencies [146dcd85]
23
+ - Updated dependencies [8e7603ee]
24
+ - Updated dependencies [146dcd85]
25
+ - Updated dependencies [1ebc7ee2]
26
+ - @modern-js/utils@1.2.0
27
+ - @modern-js/core@1.3.0
28
+ - @modern-js/server-utils@1.2.0
29
+ - @modern-js/hmr-client@1.2.0
30
+ - @modern-js/bff-utils@1.2.0
31
+ - @modern-js/server-plugin@1.2.0
32
+
33
+ ## 1.2.1
34
+
35
+ ### Patch Changes
36
+
37
+ - e51b1db3: feat: support custom sdk, interceptor, headers for bff request
38
+ - Updated dependencies [e51b1db3]
39
+ - Updated dependencies [b7fb82ec]
40
+ - @modern-js/server-plugin@1.1.4
41
+ - @modern-js/utils@1.1.6
42
+
3
43
  ## 1.2.0
4
44
 
5
45
  ### Minor Changes
@@ -1,8 +1,8 @@
1
1
  import path from 'path';
2
2
  import { fs } from '@modern-js/utils';
3
3
  import { match } from 'path-to-regexp';
4
- import getMockData from "./getMockData";
5
4
  import { AGGRED_DIR } from "../../constants";
5
+ import getMockData from "./getMockData";
6
6
 
7
7
  const getMatched = (context, mockApiList) => {
8
8
  const {
@@ -4,9 +4,9 @@ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { va
4
4
 
5
5
  function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
6
6
 
7
+ import { ERROR_DIGEST } from "../../../constants";
7
8
  import { createCache } from "./spr";
8
9
  import { namespaceHash, withCoalescedInvoke } from "./util";
9
- import { ERROR_DIGEST } from "../../../constants";
10
10
  export default ((renderFn, ctx) => {
11
11
  const sprCache = createCache();
12
12
 
@@ -1,11 +1,11 @@
1
1
  import path from 'path';
2
2
  import { fs } from '@modern-js/utils';
3
3
  import mime from 'mime-types';
4
+ import { ERROR_DIGEST } from "../../constants";
4
5
  import { handleDirectory } from "./static";
5
6
  import { readFile } from "./reader";
6
7
  import * as ssr from "./ssr";
7
8
  import { supportModern, getModernEntry } from "./modern";
8
- import { ERROR_DIGEST } from "../../constants";
9
9
  export const createRenderHandler = ({
10
10
  distDir,
11
11
  staticGenerate
@@ -1,7 +1,9 @@
1
1
  import Parser from 'ua-parser-js';
2
- import nativeModules from '@babel/compat-data/native-modules';
3
2
  import compareVersions from 'compare-versions';
4
3
  import { NativeModuleNameMap } from "./browser-list";
4
+
5
+ const nativeModules = require('@babel/compat-data/native-modules');
6
+
5
7
  export const supportModern = context => {
6
8
  if (context.query.modern_es6) {
7
9
  return true;
@@ -8,9 +8,9 @@ import path from 'path';
8
8
  import { serverManager } from '@modern-js/server-plugin';
9
9
  import { logger as defaultLogger } from '@modern-js/utils';
10
10
  import { AppContext, initAppContext, initAppDir, loadUserConfig, ConfigContext } from '@modern-js/core';
11
+ import { metrics as defaultMetrics } from "../libs/metrics";
11
12
  import { ModernServer } from "./modern-server";
12
13
  import { ModernAPIServer, ModernSSRServer, ModernWebServer } from "./modern-server-split";
13
- import { metrics as defaultMetrics } from "../libs/metrics";
14
14
  export class Server {
15
15
  constructor(options) {
16
16
  this.options = void 0;
@@ -15,13 +15,13 @@ import { createServer } from 'http';
15
15
  import util from 'util';
16
16
  import path from 'path';
17
17
  import { fs, ROUTE_SPEC_FILE } from '@modern-js/utils';
18
- import { createMiddlewareCollecter } from '@modern-js/server-utils';
19
18
  import mime from 'mime-types';
20
19
  import axios from 'axios';
20
+ import clone from 'lodash.clone';
21
21
  import { RouteMatchManager } from "../libs/route";
22
22
  import { createRenderHandler } from "../libs/render";
23
23
  import { createStaticFileHandler } from "../libs/serve-file";
24
- import { createErrorDocument, mergeExtension, noop } from "../utils";
24
+ import { createErrorDocument, createMiddlewareCollecter, mergeExtension, noop } from "../utils";
25
25
  import * as reader from "../libs/render/reader";
26
26
  import { createProxyHandler } from "../libs/proxy";
27
27
  import { createContext } from "../libs/context";
@@ -273,6 +273,7 @@ export class ModernServer {
273
273
  }
274
274
 
275
275
  async emitRouteHook(eventName, input) {
276
+ input.context = clone(input.context);
276
277
  return this.runner[eventName](input, {
277
278
  onLast: noop
278
279
  });
@@ -47,4 +47,27 @@ export const createErrorDocument = (status, text) => {
47
47
  </body>
48
48
  </html>
49
49
  `;
50
+ };
51
+ export const createMiddlewareCollecter = () => {
52
+ const webMiddlewares = [];
53
+ const apiMiddlewares = [];
54
+
55
+ const addWebMiddleware = input => {
56
+ webMiddlewares.push(input);
57
+ };
58
+
59
+ const addAPIMiddleware = input => {
60
+ apiMiddlewares.push(input);
61
+ };
62
+
63
+ const getMiddlewares = () => ({
64
+ web: webMiddlewares,
65
+ api: apiMiddlewares
66
+ });
67
+
68
+ return {
69
+ getMiddlewares,
70
+ addWebMiddleware,
71
+ addAPIMiddleware
72
+ };
50
73
  };
@@ -11,10 +11,10 @@ var _utils = require("@modern-js/utils");
11
11
 
12
12
  var _pathToRegexp = require("path-to-regexp");
13
13
 
14
- var _getMockData = _interopRequireDefault(require("./getMockData"));
15
-
16
14
  var _constants = require("../../constants");
17
15
 
16
+ var _getMockData = _interopRequireDefault(require("./getMockData"));
17
+
18
18
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
19
19
 
20
20
  const getMatched = (context, mockApiList) => {
@@ -5,12 +5,12 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.default = void 0;
7
7
 
8
+ var _constants = require("../../../constants");
9
+
8
10
  var _spr = require("./spr");
9
11
 
10
12
  var _util = require("./util");
11
13
 
12
- var _constants = require("../../../constants");
13
-
14
14
  function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
15
15
 
16
16
  function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
@@ -11,6 +11,8 @@ var _utils = require("@modern-js/utils");
11
11
 
12
12
  var _mimeTypes = _interopRequireDefault(require("mime-types"));
13
13
 
14
+ var _constants = require("../../constants");
15
+
14
16
  var _static = require("./static");
15
17
 
16
18
  var _reader = require("./reader");
@@ -19,8 +21,6 @@ var ssr = _interopRequireWildcard(require("./ssr"));
19
21
 
20
22
  var _modern = require("./modern");
21
23
 
22
- var _constants = require("../../constants");
23
-
24
24
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
25
25
 
26
26
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
@@ -7,14 +7,14 @@ exports.supportModern = exports.getModernEntry = void 0;
7
7
 
8
8
  var _uaParserJs = _interopRequireDefault(require("ua-parser-js"));
9
9
 
10
- var _nativeModules = _interopRequireDefault(require("@babel/compat-data/native-modules"));
11
-
12
10
  var _compareVersions = _interopRequireDefault(require("compare-versions"));
13
11
 
14
12
  var _browserList = require("./browser-list");
15
13
 
16
14
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
17
15
 
16
+ const nativeModules = require('@babel/compat-data/native-modules');
17
+
18
18
  const supportModern = context => {
19
19
  if (context.query.modern_es6) {
20
20
  return true;
@@ -41,7 +41,7 @@ const supportModern = context => {
41
41
  return false;
42
42
  }
43
43
 
44
- const version = _nativeModules.default['es6.module'][nativeUAName];
44
+ const version = nativeModules['es6.module'][nativeUAName];
45
45
 
46
46
  if (!version) {
47
47
  return false;
@@ -13,12 +13,12 @@ var _utils = require("@modern-js/utils");
13
13
 
14
14
  var _core = require("@modern-js/core");
15
15
 
16
+ var _metrics = require("../libs/metrics");
17
+
16
18
  var _modernServer = require("./modern-server");
17
19
 
18
20
  var _modernServerSplit = require("./modern-server-split");
19
21
 
20
- var _metrics = require("../libs/metrics");
21
-
22
22
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
23
23
 
24
24
  function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
@@ -13,12 +13,12 @@ var _path = _interopRequireDefault(require("path"));
13
13
 
14
14
  var _utils = require("@modern-js/utils");
15
15
 
16
- var _serverUtils = require("@modern-js/server-utils");
17
-
18
16
  var _mimeTypes = _interopRequireDefault(require("mime-types"));
19
17
 
20
18
  var _axios = _interopRequireDefault(require("axios"));
21
19
 
20
+ var _lodash = _interopRequireDefault(require("lodash.clone"));
21
+
22
22
  var _route = require("../libs/route");
23
23
 
24
24
  var _render = require("../libs/render");
@@ -232,7 +232,7 @@ class ModernServer {
232
232
  runner
233
233
  } = this; // server hook, gather plugin inject
234
234
 
235
- const _createMiddlewareColl = (0, _serverUtils.createMiddlewareCollecter)(),
235
+ const _createMiddlewareColl = (0, _utils2.createMiddlewareCollecter)(),
236
236
  {
237
237
  getMiddlewares
238
238
  } = _createMiddlewareColl,
@@ -307,6 +307,7 @@ class ModernServer {
307
307
  }
308
308
 
309
309
  async emitRouteHook(eventName, input) {
310
+ input.context = (0, _lodash.default)(input.context);
310
311
  return this.runner[eventName](input, {
311
312
  onLast: _utils2.noop
312
313
  });
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.toMessage = exports.noop = exports.mergeExtension = exports.createErrorDocument = void 0;
6
+ exports.toMessage = exports.noop = exports.mergeExtension = exports.createMiddlewareCollecter = exports.createErrorDocument = void 0;
7
7
 
8
8
  const mergeExtension = users => {
9
9
  const output = [];
@@ -65,4 +65,30 @@ const createErrorDocument = (status, text) => {
65
65
  `;
66
66
  };
67
67
 
68
- exports.createErrorDocument = createErrorDocument;
68
+ exports.createErrorDocument = createErrorDocument;
69
+
70
+ const createMiddlewareCollecter = () => {
71
+ const webMiddlewares = [];
72
+ const apiMiddlewares = [];
73
+
74
+ const addWebMiddleware = input => {
75
+ webMiddlewares.push(input);
76
+ };
77
+
78
+ const addAPIMiddleware = input => {
79
+ apiMiddlewares.push(input);
80
+ };
81
+
82
+ const getMiddlewares = () => ({
83
+ web: webMiddlewares,
84
+ api: apiMiddlewares
85
+ });
86
+
87
+ return {
88
+ getMiddlewares,
89
+ addWebMiddleware,
90
+ addAPIMiddleware
91
+ };
92
+ };
93
+
94
+ exports.createMiddlewareCollecter = createMiddlewareCollecter;
@@ -1,3 +1,3 @@
1
- import { Metrics } from "../type.d";
1
+ import { Metrics } from '../type';
2
2
  declare const metrics: Metrics;
3
3
  export { metrics };
@@ -1,7 +1,6 @@
1
- import { RenderResult } from '../../type';
1
+ import { RenderResult, ServerHookRunner } from '../../type';
2
2
  import { ModernRoute } from '../route';
3
3
  import { ModernServerContext } from '../context';
4
- import { ServerHookRunner } from "../../type.d";
5
4
  export declare const createRenderHandler: ({
6
5
  distDir,
7
6
  staticGenerate
@@ -1,6 +1,5 @@
1
1
  import { ModernServerContext } from '../context';
2
- import { RenderResult } from '../../type';
3
- import { ServerHookRunner } from "../../type.d";
2
+ import { RenderResult, ServerHookRunner } from '../../type';
4
3
  export declare const render: (ctx: ModernServerContext, renderOptions: {
5
4
  distDir: string;
6
5
  bundle: string;
@@ -1,8 +1,8 @@
1
1
  import type { APIServerStartInput } from '@modern-js/server-plugin';
2
+ import { mergeExtension } from '../../utils';
3
+ import { ModernRouteInterface } from '../../libs/route';
4
+ import { ApiServerMode } from '../../constants';
2
5
  import { ModernDevServer } from './dev-server';
3
- import { mergeExtension } from "../../utils.d";
4
- import { ModernRouteInterface } from "../../libs/route";
5
- import { ApiServerMode } from "../../constants.d";
6
6
  export declare class ModernSSRDevServer extends ModernDevServer {
7
7
  protected prepareAPIHandler(_m: ApiServerMode, _: APIServerStartInput['config']): any;
8
8
  protected prepareWebHandler(extension: ReturnType<typeof mergeExtension>): Promise<import("@modern-js/server-plugin").Adapter>;
@@ -1,7 +1,7 @@
1
1
  /// <reference types="node" />
2
2
  import http, { Server, IncomingMessage, ServerResponse } from 'http';
3
3
  import { ModernServer } from '../modern-server';
4
- import { ModernServerOptions, ServerHookRunner, ReadyOptions } from "../../type.d";
4
+ import { ModernServerOptions, ServerHookRunner, ReadyOptions } from '../../type';
5
5
  export declare class ModernDevServer extends ModernServer {
6
6
  private devProxyHandler;
7
7
  private mockHandler;
@@ -1,6 +1,6 @@
1
1
  /// <reference types="node" />
2
2
  import { IncomingMessage, ServerResponse, Server as httpServer } from 'http';
3
- import { ModernServerOptions, ReadyOptions } from "../type.d";
3
+ import { ModernServerOptions, ReadyOptions } from '../type';
4
4
  export declare class Server {
5
5
  options: ModernServerOptions;
6
6
  private server;
@@ -1,9 +1,9 @@
1
1
  import { APIServerStartInput } from '@modern-js/server-plugin';
2
+ import { mergeExtension } from '../utils';
3
+ import { ModernRoute, ModernRouteInterface, RouteMatcher } from '../libs/route';
4
+ import { ApiServerMode } from '../constants';
5
+ import { ModernServerContext } from '../libs/context';
2
6
  import { ModernServer } from './modern-server';
3
- import { mergeExtension } from "../utils.d";
4
- import { ModernRoute, ModernRouteInterface, RouteMatcher } from "../libs/route";
5
- import { ApiServerMode } from "../constants.d";
6
- import { ModernServerContext } from "../libs/context";
7
7
  export declare class ModernSSRServer extends ModernServer {
8
8
  protected warmupSSRBundle(): Promise<void>;
9
9
  protected verifyMatch(context: ModernServerContext, matched: RouteMatcher): void;
@@ -2,11 +2,11 @@
2
2
  import { IncomingMessage, ServerResponse, Server } from 'http';
3
3
  import { Adapter, APIServerStartInput } from '@modern-js/server-plugin';
4
4
  import type { NormalizedConfig } from '@modern-js/core';
5
- import { ModernServerOptions, NextFunction, ServerHookRunner, Metrics, Logger, ReadyOptions } from "../type.d";
6
- import { RouteMatchManager, ModernRouteInterface, ModernRoute, RouteMatcher } from "../libs/route";
7
- import { mergeExtension } from "../utils.d";
8
- import { ModernServerContext } from "../libs/context";
9
- import { ApiServerMode } from "../constants.d";
5
+ import { ModernServerOptions, NextFunction, ServerHookRunner, Metrics, Logger, ReadyOptions } from '../type';
6
+ import { RouteMatchManager, ModernRouteInterface, ModernRoute, RouteMatcher } from '../libs/route';
7
+ import { mergeExtension } from '../utils';
8
+ import { ModernServerContext } from '../libs/context';
9
+ import { ApiServerMode } from '../constants';
10
10
  declare type ModernServerHandler = (context: ModernServerContext, next: NextFunction) => Promise<void> | void;
11
11
  declare type ModernServerAsyncHandler = (context: ModernServerContext, next: NextFunction) => Promise<void>;
12
12
  export declare class ModernServer {
@@ -53,11 +53,14 @@ export declare class ModernServer {
53
53
  protected prepareWebHandler(extension: ReturnType<typeof mergeExtension>): Promise<Adapter>;
54
54
  protected prepareAPIHandler(mode: ApiServerMode, extension: APIServerStartInput['config']): Promise<Adapter>;
55
55
  protected filterRoutes(routes: ModernRouteInterface[]): ModernRouteInterface[];
56
- protected emitRouteHook(eventName: 'beforeMatch' | 'afterMatch' | 'beforeRender' | 'afterRender', input: any): Promise<any>;
56
+ protected emitRouteHook(eventName: 'beforeMatch' | 'afterMatch' | 'beforeRender' | 'afterRender', input: {
57
+ context: ModernServerContext;
58
+ [propsName: string]: any;
59
+ }): Promise<any>;
57
60
  protected warmupSSRBundle(): void;
58
61
  protected preServerInit(): Promise<void>;
59
62
  protected handleAPI(context: ModernServerContext): Promise<void>;
60
- protected handleWeb(context: ModernServerContext, route: ModernRoute): Promise<import("@/type").RenderResult | null>;
63
+ protected handleWeb(context: ModernServerContext, route: ModernRoute): Promise<import("../type").RenderResult | null>;
61
64
  protected verifyMatch(_c: ModernServerContext, _m: RouteMatcher): void;
62
65
  private routeHandler;
63
66
  private injectMicroFE;
@@ -3,4 +3,13 @@ export declare const mergeExtension: (users: any[]) => {
3
3
  };
4
4
  export declare const toMessage: (dig: string, e: Error | string) => string;
5
5
  export declare const noop: () => void;
6
- export declare const createErrorDocument: (status: number, text: string) => string;
6
+ export declare const createErrorDocument: (status: number, text: string) => string;
7
+ export declare type CollectMiddlewaresResult = {
8
+ web: any[];
9
+ api: any[];
10
+ };
11
+ export declare const createMiddlewareCollecter: () => {
12
+ getMiddlewares: () => CollectMiddlewaresResult;
13
+ addWebMiddleware: (input: any) => void;
14
+ addAPIMiddleware: (input: any) => void;
15
+ };
package/jest.config.js ADDED
@@ -0,0 +1,8 @@
1
+ const sharedConfig = require('@scripts/jest-config');
2
+
3
+ /** @type {import('@jest/types').Config.InitialOptions} */
4
+ module.exports = {
5
+ // eslint-disable-next-line node/no-unsupported-features/es-syntax
6
+ ...sharedConfig,
7
+ rootDir: __dirname,
8
+ };
package/package.json CHANGED
@@ -11,7 +11,7 @@
11
11
  "modern",
12
12
  "modern.js"
13
13
  ],
14
- "version": "1.2.1-beta.2",
14
+ "version": "1.3.0",
15
15
  "jsnext:source": "./src/index.ts",
16
16
  "types": "./dist/types/index.d.ts",
17
17
  "main": "./dist/js/node/index.js",
@@ -20,6 +20,7 @@
20
20
  "exports": {
21
21
  ".": {
22
22
  "node": {
23
+ "jsnext:source": "./src/index.ts",
23
24
  "import": "./dist/js/modern/index.js",
24
25
  "require": "./dist/js/node/index.js"
25
26
  },
@@ -27,18 +28,18 @@
27
28
  }
28
29
  },
29
30
  "dependencies": {
30
- "@babel/core": "^7.15.0",
31
+ "@babel/core": "7.16.7",
31
32
  "@babel/compat-data": "^7.15.0",
32
33
  "@babel/preset-env": "^7.15.0",
33
34
  "@babel/preset-typescript": "^7.15.0",
34
35
  "@babel/register": "^7.15.3",
35
36
  "@babel/runtime": "^7",
36
- "@modern-js/core": "^1.2.0",
37
- "@modern-js/hmr-client": "^1.1.1",
38
- "@modern-js/server-plugin": "^1.1.3",
39
- "@modern-js/server-utils": "^1.1.2",
40
- "@modern-js/bff-utils": "^1.1.1",
41
- "@modern-js/utils": "^1.1.5",
37
+ "@modern-js/core": "^1.3.0",
38
+ "@modern-js/hmr-client": "^1.2.0",
39
+ "@modern-js/server-plugin": "^1.2.0",
40
+ "@modern-js/server-utils": "^1.2.0",
41
+ "@modern-js/bff-utils": "^1.2.0",
42
+ "@modern-js/utils": "^1.2.0",
42
43
  "axios": "^0.21.4",
43
44
  "babel-plugin-module-resolver": "^4.1.0",
44
45
  "chokidar": "^3.5.2",
@@ -58,12 +59,12 @@
58
59
  "tsconfig-paths": "^3.11.0",
59
60
  "ua-parser-js": "^0.7.28",
60
61
  "webpack-dev-middleware": "^5.0.0",
61
- "ws": "^8.2.0"
62
+ "ws": "^8.2.0",
63
+ "lodash.clone": "^4.5.0"
62
64
  },
63
65
  "devDependencies": {
64
- "@modern-js/module-tools": "^1.1.3",
65
- "@modern-js/plugin-testing": "^1.2.0",
66
- "@modern-js/types": "^1.1.4",
66
+ "@scripts/build": "0.0.0",
67
+ "@modern-js/types": "^1.2.0",
67
68
  "@types/jest": "^26",
68
69
  "@types/lru-cache": "^5.1.1",
69
70
  "@types/mime-types": "^2.1.0",
@@ -77,10 +78,14 @@
77
78
  "@types/ua-parser-js": "^0.7.36",
78
79
  "@types/webpack-dev-middleware": "^5.0.2",
79
80
  "@types/ws": "^7.4.7",
81
+ "@types/lodash.clone": "^4",
80
82
  "typescript": "^4",
81
83
  "webpack": "^5.54.0",
82
84
  "node-mocks-http": "^1.11.0",
83
- "portfinder": "^1.0.28"
85
+ "portfinder": "^1.0.28",
86
+ "jest": "^27",
87
+ "@scripts/jest-config": "0.0.0",
88
+ "websocket": "^1"
84
89
  },
85
90
  "peerDependencies": {
86
91
  "webpack": "^5.54.0"
@@ -93,13 +98,14 @@
93
98
  },
94
99
  "publishConfig": {
95
100
  "registry": "https://registry.npmjs.org/",
96
- "access": "public"
101
+ "access": "public",
102
+ "types": "./dist/types/index.d.ts"
97
103
  },
98
104
  "scripts": {
99
105
  "new": "modern new",
100
106
  "build": "modern build",
101
107
  "dev": "modern build --watch",
102
- "test": "modern test"
108
+ "test": "jest --passWithNoTests"
103
109
  },
104
110
  "readme": "\n<p align=\"center\">\n <a href=\"https://modernjs.dev\" target=\"blank\"><img src=\"https://lf3-static.bytednsdoc.com/obj/eden-cn/ylaelkeh7nuhfnuhf/modernjs-cover.png\" width=\"300\" alt=\"Modern.js Logo\" /></a>\n</p>\n<p align=\"center\">\n现代 Web 工程体系\n <br/>\n <a href=\"https://modernjs.dev\" target=\"blank\">\n modernjs.dev\n </a>\n</p>\n<p align=\"center\">\n The meta-framework suite designed from scratch for frontend-focused modern web development\n</p>\n\n# Introduction\n\n> The doc site ([modernjs.dev](https://modernjs.dev)) and articles are only available in Chinese for now, we are planning to add English versions soon.\n\n- [Modern.js: Hello, World!](https://zhuanlan.zhihu.com/p/426707646)\n\n## Getting Started\n\n- [Quick Start](https://modernjs.dev/docs/start)\n- [Guides](https://modernjs.dev/docs/guides)\n- [API References](https://modernjs.dev/docs/apis)\n\n## Contributing\n\n- [Contributing Guide](https://github.com/modern-js-dev/modern.js/blob/main/CONTRIBUTING.md)\n"
105
111
  }
@@ -3,8 +3,8 @@ import { fs } from '@modern-js/utils';
3
3
  import { match } from 'path-to-regexp';
4
4
  import { NextFunction } from '../../type';
5
5
  import { ModernServerContext } from '../../libs/context';
6
+ import { AGGRED_DIR } from '../../constants';
6
7
  import getMockData, { MockApi } from './getMockData';
7
- import { AGGRED_DIR } from '@/constants';
8
8
 
9
9
  const getMatched = (context: ModernServerContext, mockApiList: MockApi[]) => {
10
10
  const { path: targetPathname, method: targetMethod } = context;
@@ -4,7 +4,7 @@ import ws from 'ws';
4
4
  import type { Stats } from 'webpack';
5
5
  import { logger } from '@modern-js/utils';
6
6
  import { DevServerOptions } from '../type';
7
- import { noop } from '@/utils';
7
+ import { noop } from '../utils';
8
8
 
9
9
  interface ExtWebSocket extends ws {
10
10
  isAlive: boolean;
@@ -1,4 +1,4 @@
1
- import { Metrics } from '@/type';
1
+ import { Metrics } from '../type';
2
2
 
3
3
  const metrics: Metrics = {
4
4
  gauges() {
@@ -1,9 +1,9 @@
1
1
  import { ModernServerContext } from '../../context';
2
2
  import { RenderFunction, SSRServerContext } from '../type';
3
+ import { ERROR_DIGEST } from '../../../constants';
3
4
  import { createCache } from './spr';
4
5
  import { namespaceHash, withCoalescedInvoke } from './util';
5
6
  import { CacheContext } from './type';
6
- import { ERROR_DIGEST } from '@/constants';
7
7
 
8
8
  export default (renderFn: RenderFunction, ctx: ModernServerContext) => {
9
9
  const sprCache = createCache();
@@ -1,15 +1,14 @@
1
1
  import path from 'path';
2
2
  import { fs } from '@modern-js/utils';
3
3
  import mime from 'mime-types';
4
- import { RenderResult } from '../../type';
4
+ import { RenderResult, ServerHookRunner } from '../../type';
5
5
  import { ModernRoute } from '../route';
6
6
  import { ModernServerContext } from '../context';
7
+ import { ERROR_DIGEST } from '../../constants';
7
8
  import { handleDirectory } from './static';
8
9
  import { readFile } from './reader';
9
10
  import * as ssr from './ssr';
10
11
  import { supportModern, getModernEntry } from './modern';
11
- import { ERROR_DIGEST } from '@/constants';
12
- import { ServerHookRunner } from '@/type';
13
12
 
14
13
  export const createRenderHandler = ({
15
14
  distDir,
@@ -1,9 +1,10 @@
1
1
  import Parser from 'ua-parser-js';
2
- import nativeModules from '@babel/compat-data/native-modules';
3
2
  import compareVersions from 'compare-versions';
4
3
  import { ModernServerContext } from '../../context';
5
4
  import { NativeModuleNameMap } from './browser-list';
6
5
 
6
+ const nativeModules = require('@babel/compat-data/native-modules');
7
+
7
8
  export const supportModern = (context: ModernServerContext) => {
8
9
  if (context.query.modern_es6) {
9
10
  return true;
@@ -2,10 +2,9 @@ import path from 'path';
2
2
  import { SERVER_RENDER_FUNCTION_NAME } from '@modern-js/utils';
3
3
  import mime from 'mime-types';
4
4
  import { ModernServerContext } from '../context';
5
- import { RenderResult } from '../../type';
5
+ import { RenderResult, ServerHookRunner } from '../../type';
6
6
  import cache from './cache';
7
7
  import { SSRServerContext } from './type';
8
- import { ServerHookRunner } from '@/type';
9
8
 
10
9
  export const render = async (
11
10
  ctx: ModernServerContext,
@@ -1,8 +1,8 @@
1
1
  import type { APIServerStartInput } from '@modern-js/server-plugin';
2
+ import { mergeExtension } from '../../utils';
3
+ import { ModernRouteInterface } from '../../libs/route';
4
+ import { ApiServerMode } from '../../constants';
2
5
  import { ModernDevServer } from './dev-server';
3
- import { mergeExtension } from '@/utils';
4
- import { ModernRouteInterface } from '@/libs/route';
5
- import { ApiServerMode } from '@/constants';
6
6
 
7
7
  export class ModernSSRDevServer extends ModernDevServer {
8
8
  protected prepareAPIHandler(
@@ -15,23 +15,23 @@ import {
15
15
  import type { MultiCompiler, Compiler } from 'webpack';
16
16
  import webpackDevMiddleware from 'webpack-dev-middleware';
17
17
  import { ModernServer } from '../modern-server';
18
- import { createMockHandler } from '@/dev-tools/mock';
19
- import { createProxyHandler, ProxyOptions } from '@/libs/proxy';
18
+ import { createMockHandler } from '../../dev-tools/mock';
19
+ import { createProxyHandler, ProxyOptions } from '../../libs/proxy';
20
20
  import {
21
21
  DevServerOptions,
22
22
  ModernServerOptions,
23
23
  NextFunction,
24
24
  ServerHookRunner,
25
25
  ReadyOptions,
26
- } from '@/type';
27
- import SocketServer from '@/dev-tools/socket-server';
28
- import DevServerPlugin from '@/dev-tools/dev-server-plugin';
29
- import { ModernServerContext } from '@/libs/context';
30
- import { createLaunchEditorHandler } from '@/dev-tools/launch-editor';
31
- import { enableRegister } from '@/dev-tools/babel/register';
32
- import * as reader from '@/libs/render/reader';
33
- import Watcher from '@/dev-tools/watcher';
34
- import { AGGRED_DIR } from '@/constants';
26
+ } from '../../type';
27
+ import SocketServer from '../../dev-tools/socket-server';
28
+ import DevServerPlugin from '../../dev-tools/dev-server-plugin';
29
+ import { ModernServerContext } from '../../libs/context';
30
+ import { createLaunchEditorHandler } from '../../dev-tools/launch-editor';
31
+ import { enableRegister } from '../../dev-tools/babel/register';
32
+ import * as reader from '../../libs/render/reader';
33
+ import Watcher from '../../dev-tools/watcher';
34
+ import { AGGRED_DIR } from '../../constants';
35
35
 
36
36
  const DEFAULT_DEV_OPTIONS: DevServerOptions = {
37
37
  client: {
@@ -166,7 +166,7 @@ export class ModernDevServer extends ModernServer {
166
166
  const { dev } = this;
167
167
  const devHttpsOption = typeof dev === 'object' && dev.https;
168
168
  if (devHttpsOption) {
169
- const { genHttpsOptions } = require('@/dev-tools/https');
169
+ const { genHttpsOptions } = require('../../dev-tools/https');
170
170
  const httpsOptions = await genHttpsOptions(devHttpsOption);
171
171
  return createHttpsServer(httpsOptions, handler);
172
172
  } else {
@@ -10,6 +10,8 @@ import {
10
10
  ConfigContext,
11
11
  UserConfig,
12
12
  } from '@modern-js/core';
13
+ import { ModernServerOptions, ServerHookRunner, ReadyOptions } from '../type';
14
+ import { metrics as defaultMetrics } from '../libs/metrics';
13
15
  import { ModernServer } from './modern-server';
14
16
  import type { ModernDevServer } from './dev-server';
15
17
  import {
@@ -17,8 +19,6 @@ import {
17
19
  ModernSSRServer,
18
20
  ModernWebServer,
19
21
  } from './modern-server-split';
20
- import { ModernServerOptions, ServerHookRunner, ReadyOptions } from '@/type';
21
- import { metrics as defaultMetrics } from '@/libs/metrics';
22
22
 
23
23
  export class Server {
24
24
  public options: ModernServerOptions;
@@ -1,9 +1,9 @@
1
1
  import { APIServerStartInput } from '@modern-js/server-plugin';
2
+ import { mergeExtension } from '../utils';
3
+ import { ModernRoute, ModernRouteInterface, RouteMatcher } from '../libs/route';
4
+ import { ApiServerMode } from '../constants';
5
+ import { ModernServerContext } from '../libs/context';
2
6
  import { ModernServer } from './modern-server';
3
- import { mergeExtension } from '@/utils';
4
- import { ModernRoute, ModernRouteInterface, RouteMatcher } from '@/libs/route';
5
- import { ApiServerMode } from '@/constants';
6
- import { ModernServerContext } from '@/libs/context';
7
7
 
8
8
  export class ModernSSRServer extends ModernServer {
9
9
  // Todo should not invoke any route hook in modernSSRServer
@@ -4,10 +4,10 @@ import util from 'util';
4
4
  import path from 'path';
5
5
  import { fs, ROUTE_SPEC_FILE } from '@modern-js/utils';
6
6
  import { Adapter, APIServerStartInput } from '@modern-js/server-plugin';
7
- import { createMiddlewareCollecter } from '@modern-js/server-utils';
8
7
  import type { NormalizedConfig } from '@modern-js/core';
9
8
  import mime from 'mime-types';
10
9
  import axios from 'axios';
10
+ import clone from 'lodash.clone';
11
11
  import {
12
12
  ModernServerOptions,
13
13
  NextFunction,
@@ -16,27 +16,32 @@ import {
16
16
  Logger,
17
17
  ReadyOptions,
18
18
  ConfWithBFF,
19
- } from '@/type';
19
+ } from '../type';
20
20
  import {
21
21
  RouteMatchManager,
22
22
  ModernRouteInterface,
23
23
  ModernRoute,
24
24
  RouteMatcher,
25
- } from '@/libs/route';
26
- import { createRenderHandler } from '@/libs/render';
27
- import { createStaticFileHandler } from '@/libs/serve-file';
28
- import { createErrorDocument, mergeExtension, noop } from '@/utils';
29
- import * as reader from '@/libs/render/reader';
30
- import { createProxyHandler, ProxyOptions } from '@/libs/proxy';
31
- import { createContext, ModernServerContext } from '@/libs/context';
25
+ } from '../libs/route';
26
+ import { createRenderHandler } from '../libs/render';
27
+ import { createStaticFileHandler } from '../libs/serve-file';
28
+ import {
29
+ createErrorDocument,
30
+ createMiddlewareCollecter,
31
+ mergeExtension,
32
+ noop,
33
+ } from '../utils';
34
+ import * as reader from '../libs/render/reader';
35
+ import { createProxyHandler, ProxyOptions } from '../libs/proxy';
36
+ import { createContext, ModernServerContext } from '../libs/context';
32
37
  import {
33
38
  AGGRED_DIR,
34
39
  ApiServerMode,
35
40
  ERROR_DIGEST,
36
41
  ERROR_PAGE_TEXT,
37
- } from '@/constants';
38
- import { createTemplateAPI } from '@/libs/hook-api/template';
39
- import { createRouteAPI } from '@/libs/hook-api/route';
42
+ } from '../constants';
43
+ import { createTemplateAPI } from '../libs/hook-api/template';
44
+ import { createRouteAPI } from '../libs/hook-api/route';
40
45
 
41
46
  type ModernServerHandler = (
42
47
  context: ModernServerContext,
@@ -319,9 +324,13 @@ export class ModernServer {
319
324
 
320
325
  protected async emitRouteHook(
321
326
  eventName: 'beforeMatch' | 'afterMatch' | 'beforeRender' | 'afterRender',
322
- input: any,
327
+ input: {
328
+ context: ModernServerContext;
329
+ [propsName: string]: any;
330
+ },
323
331
  ) {
324
- return this.runner[eventName](input, { onLast: noop as any });
332
+ input.context = clone(input.context);
333
+ return this.runner[eventName](input as any, { onLast: noop as any });
325
334
  }
326
335
 
327
336
  // warmup ssr function
package/src/utils.ts CHANGED
@@ -49,3 +49,31 @@ export const createErrorDocument = (status: number, text: string) => {
49
49
  </html>
50
50
  `;
51
51
  };
52
+
53
+ export type CollectMiddlewaresResult = {
54
+ web: any[];
55
+ api: any[];
56
+ };
57
+
58
+ export const createMiddlewareCollecter = () => {
59
+ const webMiddlewares: any[] = [];
60
+ const apiMiddlewares: any[] = [];
61
+
62
+ const addWebMiddleware = (input: any) => {
63
+ webMiddlewares.push(input);
64
+ };
65
+
66
+ const addAPIMiddleware = (input: any) => {
67
+ apiMiddlewares.push(input);
68
+ };
69
+
70
+ const getMiddlewares = (): CollectMiddlewaresResult => ({
71
+ web: webMiddlewares,
72
+ api: apiMiddlewares,
73
+ });
74
+ return {
75
+ getMiddlewares,
76
+ addWebMiddleware,
77
+ addAPIMiddleware,
78
+ };
79
+ };
@@ -0,0 +1,39 @@
1
+ import http from 'http';
2
+ import SocketServer from '../src/dev-tools/socket-server';
3
+
4
+ describe('test dev tools', () => {
5
+ test('should socket server work correctly', () => {
6
+ const socketServer: any = new SocketServer({
7
+ client: {
8
+ port: '8080',
9
+ overlay: false,
10
+ logging: 'error',
11
+ path: '/',
12
+ host: '127.0.0.1',
13
+ },
14
+ dev: {
15
+ writeToDisk: false,
16
+ },
17
+ watch: true,
18
+ hot: true,
19
+ liveReload: true,
20
+ });
21
+ const app = http
22
+ .createServer((req, res) => {
23
+ res.end();
24
+ })
25
+ .listen(8080);
26
+
27
+ socketServer.prepare(app);
28
+ expect(socketServer.app).toBe(app);
29
+ expect(socketServer.stats).toBeUndefined();
30
+
31
+ const mockStats = {
32
+ toJson: () => ({}),
33
+ };
34
+ socketServer.updateStats(mockStats);
35
+ expect(socketServer.stats).toBe(mockStats);
36
+
37
+ app.close();
38
+ });
39
+ });
@@ -5,7 +5,7 @@
5
5
  "jsx": "preserve",
6
6
  "baseUrl": "./",
7
7
  "paths": {
8
- "@/*": ["./src/*"],
8
+ ,
9
9
  "@shared/*": ["./shared/*"]
10
10
  }
11
11
  },
@@ -1,4 +1,3 @@
1
- /* eslint-disable max-nested-callbacks */
2
1
  import path from 'path';
3
2
  import EventEmitter from 'events';
4
3
  import { Readable } from 'stream';
@@ -66,12 +65,15 @@ describe('test middleware create factory', () => {
66
65
  let sourceServerPort = 8080;
67
66
  let sourceServer: Server | null = null;
68
67
  beforeAll(async () => {
68
+ let done: any;
69
+ const promise = new Promise(resolve => (done = resolve));
69
70
  sourceServerPort = await portfinder.getPortPromise();
70
71
  sourceServer = createServer((req, res) => {
71
72
  res.setHeader('Access-Control-Allow-Origin', '*');
72
73
  res.write(req.url?.slice(1));
73
74
  res.end();
74
- }).listen(sourceServerPort);
75
+ }).listen(sourceServerPort, done);
76
+ return promise;
75
77
  });
76
78
 
77
79
  afterAll(() => {
@@ -83,7 +85,7 @@ describe('test middleware create factory', () => {
83
85
  test('should proxy correctly use simply options', async () => {
84
86
  const port = await portfinder.getPortPromise();
85
87
  const middlewares = createProxyHandler({
86
- '/simple': `http://127.0.0.1:${sourceServerPort}`,
88
+ '/simple': `http://localhost:${sourceServerPort}`,
87
89
  });
88
90
  const proxyHandler = middlewares![0];
89
91
 
@@ -95,7 +97,7 @@ describe('test middleware create factory', () => {
95
97
  }).listen(port);
96
98
 
97
99
  try {
98
- const { data } = await axios.get(`http://127.0.0.1:${port}/simple`);
100
+ const { data } = await axios.get(`http://localhost:${port}/simple`);
99
101
  expect(data).toBe('simple');
100
102
  } finally {
101
103
  server.close();
@@ -106,7 +108,7 @@ describe('test middleware create factory', () => {
106
108
  const port = await portfinder.getPortPromise();
107
109
  const middlewares = createProxyHandler({
108
110
  '/simple-obj': {
109
- target: `http://127.0.0.1:${sourceServerPort}`,
111
+ target: `http://localhost:${sourceServerPort}`,
110
112
  },
111
113
  });
112
114
  const proxyHandler = middlewares![0];
@@ -119,7 +121,7 @@ describe('test middleware create factory', () => {
119
121
  }).listen(port);
120
122
 
121
123
  try {
122
- const { data } = await axios.get(`http://127.0.0.1:${port}/simple-obj`);
124
+ const { data } = await axios.get(`http://localhost:${port}/simple-obj`);
123
125
  expect(data).toBe('simple-obj');
124
126
  } finally {
125
127
  server.close();
@@ -130,7 +132,7 @@ describe('test middleware create factory', () => {
130
132
  const port = await portfinder.getPortPromise();
131
133
  const middlewares = createProxyHandler({
132
134
  context: '/context',
133
- target: `http://127.0.0.1:${sourceServerPort}`,
135
+ target: `http://localhost:${sourceServerPort}`,
134
136
  });
135
137
  const proxyHandler = middlewares![0];
136
138
 
@@ -142,7 +144,7 @@ describe('test middleware create factory', () => {
142
144
  }).listen(port);
143
145
 
144
146
  try {
145
- const { data } = await axios.get(`http://127.0.0.1:${port}/context`);
147
+ const { data } = await axios.get(`http://localhost:${port}/context`);
146
148
  expect(data).toBe('context');
147
149
  } finally {
148
150
  server.close();
@@ -154,7 +156,7 @@ describe('test middleware create factory', () => {
154
156
  const middlewares = createProxyHandler([
155
157
  {
156
158
  context: '/array',
157
- target: `http://127.0.0.1:${sourceServerPort}`,
159
+ target: `http://localhost:${sourceServerPort}`,
158
160
  },
159
161
  ]);
160
162
  const proxyHandler = middlewares![0];
@@ -167,7 +169,7 @@ describe('test middleware create factory', () => {
167
169
  }).listen(port);
168
170
 
169
171
  try {
170
- const { data } = await axios.get(`http://127.0.0.1:${port}/array`);
172
+ const { data } = await axios.get(`http://localhost:${port}/array`);
171
173
  expect(data).toBe('array');
172
174
  } finally {
173
175
  server.close();
@@ -175,4 +177,3 @@ describe('test middleware create factory', () => {
175
177
  });
176
178
  });
177
179
  });
178
- /* eslint-enable max-nested-callbacks */
@@ -2,6 +2,7 @@ import path from 'path';
2
2
  import { defaultsConfig, NormalizedConfig } from '@modern-js/core';
3
3
  import { ModernServerContext, NextFunction } from '@modern-js/types';
4
4
  import createServer, { Server } from '../src';
5
+ import { ModernServer } from '../src/server/modern-server';
5
6
 
6
7
  describe('test server', () => {
7
8
  test('should throw error when ', resolve => {
@@ -58,7 +59,7 @@ describe('test server', () => {
58
59
  config: defaultsConfig as NormalizedConfig,
59
60
  pwd: appDirectory,
60
61
  });
61
- const modernServer = server.server as any;
62
+ const modernServer = (server as any).server;
62
63
 
63
64
  const len = modernServer.handlers.length;
64
65
 
@@ -85,5 +86,16 @@ describe('test server', () => {
85
86
  expect(newLen + 1).toBe(nextLen);
86
87
  expect(modernServer.handlers[nextLen - 1]).toBe(asyncHandler);
87
88
  });
89
+
90
+ test('should get request handler correctly', async () => {
91
+ const server = await createServer({
92
+ config: defaultsConfig as NormalizedConfig,
93
+ pwd: appDirectory,
94
+ });
95
+
96
+ const modernServer: ModernServer = (server as any).server;
97
+ const handler = modernServer.getRequestHandler();
98
+ expect(typeof handler === 'function').toBeTruthy();
99
+ });
88
100
  });
89
101
  });
@@ -7,8 +7,6 @@
7
7
  "isolatedModules": true,
8
8
  "sourceMap": true
9
9
  },
10
- "paths": {
11
- "@/*": ["../src/*"]
12
- },
10
+ "paths": {},
13
11
  "exclude": ["src/__test__/fixtures/**"]
14
12
  }
@@ -3,6 +3,7 @@ import {
3
3
  mergeExtension,
4
4
  toMessage,
5
5
  createErrorDocument,
6
+ createMiddlewareCollecter,
6
7
  } from '../src/utils';
7
8
 
8
9
  describe('test server utils', () => {
@@ -37,4 +38,34 @@ describe('test server utils', () => {
37
38
  expect(doc).toMatch('redirect');
38
39
  expect(doc).toMatch('302: redirect');
39
40
  });
41
+
42
+ describe('test middleware collector', () => {
43
+ test('shoule return web middleware correctly', () => {
44
+ const { addWebMiddleware, getMiddlewares } = createMiddlewareCollecter();
45
+
46
+ const before = getMiddlewares();
47
+ expect(before.web).toEqual([]);
48
+
49
+ const middleware = async () => {
50
+ // empty
51
+ };
52
+ addWebMiddleware(middleware);
53
+ const after = getMiddlewares();
54
+ expect(after.web).toEqual([middleware]);
55
+ });
56
+
57
+ test('shoule return api middleware correctly', () => {
58
+ const { addAPIMiddleware, getMiddlewares } = createMiddlewareCollecter();
59
+
60
+ const before = getMiddlewares();
61
+ expect(before.web).toEqual([]);
62
+
63
+ const middleware = async () => {
64
+ // empty
65
+ };
66
+ addAPIMiddleware(middleware);
67
+ const after = getMiddlewares();
68
+ expect(after.api).toEqual([middleware]);
69
+ });
70
+ });
40
71
  });
package/tsconfig.json CHANGED
@@ -5,9 +5,7 @@
5
5
  "jsx": "preserve",
6
6
  "baseUrl": "./",
7
7
  "esModuleInterop": true,
8
- "paths": {
9
- "@/*": ["./src/*"]
10
- }
8
+ "paths": {}
11
9
  },
12
10
  "include": ["src"]
13
11
  }