@modern-js/plugin-server 1.21.5 → 2.0.0-beta.1

Sign up to get free protection for your applications and to get access to all the features.
package/CHANGELOG.md CHANGED
@@ -1,28 +1,58 @@
1
1
  # @modern-js/plugin-server
2
2
 
3
- ## 1.21.5
3
+ ## 2.0.0-beta.1
4
4
 
5
- ### Patch Changes
6
-
7
- - @modern-js/server-utils@1.21.5
8
- - @modern-js/babel-compiler@1.21.5
9
- - @modern-js/utils@1.21.5
5
+ ### Major Changes
10
6
 
11
- ## 1.21.4
7
+ - dda38c9: chore: v2
12
8
 
13
9
  ### Patch Changes
14
10
 
15
- - @modern-js/server-utils@1.21.4
16
- - @modern-js/babel-compiler@1.21.4
17
- - @modern-js/utils@1.21.4
18
-
19
- ## 1.21.3
11
+ - 3bbea92b2a: feat: support Hook、Middleware new API
12
+ feat: 支持 Hook、Middleware 的新 API
13
+ - Updated dependencies [9b915e0c10]
14
+ - Updated dependencies [92f0ead]
15
+ - Updated dependencies [edd1cfb1af]
16
+ - Updated dependencies [cc971eabfc]
17
+ - Updated dependencies [5b9049f]
18
+ - Updated dependencies [a8642da]
19
+ - Updated dependencies [92004d1]
20
+ - Updated dependencies [b8bbe036c7]
21
+ - Updated dependencies [d5a31df781]
22
+ - Updated dependencies [dda38c9]
23
+ - Updated dependencies [3bbea92b2a]
24
+ - Updated dependencies [abf3421]
25
+ - Updated dependencies [543be9558e]
26
+ - Updated dependencies [14b712d]
27
+ - @modern-js/server-utils@2.0.0-beta.1
28
+ - @modern-js/utils@2.0.0-beta.1
29
+ - @modern-js/babel-compiler@2.0.0-beta.1
30
+
31
+ ## 2.0.0-beta.0
32
+
33
+ ### Major Changes
34
+
35
+ - dda38c9: chore: v2
20
36
 
21
37
  ### Patch Changes
22
38
 
23
- - @modern-js/server-utils@1.21.3
24
- - @modern-js/babel-compiler@1.21.3
25
- - @modern-js/utils@1.21.3
39
+ - 3bbea92b2: feat: support Hook、Middleware new API
40
+ feat: 支持 Hook、Middleware 的新 API
41
+ - Updated dependencies [9b915e0c1]
42
+ - Updated dependencies [edd1cfb1a]
43
+ - Updated dependencies [cc971eabf]
44
+ - Updated dependencies [5b9049f]
45
+ - Updated dependencies [a8642da]
46
+ - Updated dependencies [b8bbe036c]
47
+ - Updated dependencies [d5a31df78]
48
+ - Updated dependencies [dda38c9]
49
+ - Updated dependencies [3bbea92b2]
50
+ - Updated dependencies [abf3421]
51
+ - Updated dependencies [543be95]
52
+ - Updated dependencies [14b712d]
53
+ - @modern-js/server-utils@2.0.0-beta.0
54
+ - @modern-js/utils@2.0.0-beta.0
55
+ - @modern-js/babel-compiler@2.0.0-beta.0
26
56
 
27
57
  ## 1.21.2
28
58
 
@@ -9,7 +9,6 @@ export default (() => ({
9
9
  config() {
10
10
  return {};
11
11
  },
12
-
13
12
  async afterBuild() {
14
13
  const {
15
14
  appDirectory,
@@ -21,15 +20,12 @@ export default (() => ({
21
20
  const sharedDir = path.resolve(appDirectory, SHARED_DIR);
22
21
  const tsconfigPath = path.resolve(appDirectory, TS_CONFIG_FILENAME);
23
22
  const sourceDirs = [];
24
-
25
23
  if (fs.existsSync(serverDir)) {
26
24
  sourceDirs.push(serverDir);
27
25
  }
28
-
29
26
  if (fs.existsSync(sharedDir)) {
30
27
  sourceDirs.push(sharedDir);
31
28
  }
32
-
33
29
  const {
34
30
  server
35
31
  } = modernConfig;
@@ -41,7 +37,6 @@ export default (() => ({
41
37
  const {
42
38
  babel
43
39
  } = modernConfig.tools;
44
-
45
40
  if (sourceDirs.length > 0) {
46
41
  await compile(appDirectory, {
47
42
  server,
@@ -56,6 +51,5 @@ export default (() => ({
56
51
  });
57
52
  }
58
53
  }
59
-
60
54
  })
61
55
  }));
@@ -1,34 +1,50 @@
1
+ const _excluded = ["default", "middleware"];
2
+ function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
3
+ function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
1
4
  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; }
2
-
3
5
  import path from 'path';
4
- import { isProd, requireExistModule, SERVER_DIR } from '@modern-js/utils';
6
+ import { isProd, logger, requireExistModule, SERVER_DIR } from '@modern-js/utils';
5
7
  const WEB_APP_NAME = 'index';
6
-
8
+ var HOOKS;
9
+ (function (HOOKS) {
10
+ HOOKS["AFTER_MATCH"] = "afterMatch";
11
+ HOOKS["AFTER_RENDER"] = "afterRender";
12
+ })(HOOKS || (HOOKS = {}));
7
13
  class Storage {
8
14
  constructor() {
9
15
  _defineProperty(this, "middlewares", []);
10
-
11
16
  _defineProperty(this, "hooks", {});
12
17
  }
13
-
14
18
  reset() {
15
19
  this.middlewares = [];
16
20
  this.hooks = {};
17
21
  }
18
-
19
22
  }
20
-
21
23
  const createTransformAPI = storage => new Proxy({}, {
22
24
  get(target, name) {
23
25
  if (name === 'addMiddleware') {
24
26
  return fn => storage.middlewares.push(fn);
25
27
  }
26
-
27
- return fn => storage.hooks[name] = fn;
28
+ return fn => {
29
+ logger.warn('declare hook in default export is to be deprecated, use named export instead');
30
+ storage.hooks[name] = fn;
31
+ };
28
32
  }
29
-
30
33
  });
31
-
34
+ const compose = middlewares => {
35
+ return (ctx, resolve, reject) => {
36
+ let i = 0;
37
+ const dispatch = () => {
38
+ var _handler, _handler$catch;
39
+ const handler = middlewares[i++];
40
+ if (!handler) {
41
+ return resolve();
42
+ }
43
+ return (_handler = handler(ctx, dispatch)) === null || _handler === void 0 ? void 0 : (_handler$catch = _handler.catch) === null || _handler$catch === void 0 ? void 0 : _handler$catch.call(_handler, reject);
44
+ };
45
+ return dispatch;
46
+ };
47
+ };
32
48
  export default (() => ({
33
49
  name: '@modern-js/plugin-server',
34
50
  setup: api => {
@@ -38,28 +54,40 @@ export default (() => ({
38
54
  } = api.useAppContext();
39
55
  const storage = new Storage();
40
56
  const transformAPI = createTransformAPI(storage);
41
- let webAppPath = '';
42
- return {
43
- prepare() {
44
- const pwd = isProd() ? distDirectory : appDirectory;
45
- const serverPath = path.resolve(pwd, SERVER_DIR);
46
- webAppPath = path.resolve(serverPath, WEB_APP_NAME);
47
- const webMod = requireExistModule(webAppPath);
57
+ const pwd = isProd() ? distDirectory : appDirectory;
58
+ const webAppPath = path.resolve(pwd, SERVER_DIR, WEB_APP_NAME);
59
+ const loadMod = () => {
60
+ const mod = requireExistModule(webAppPath, {
61
+ interop: false
62
+ });
63
+ const {
64
+ default: defaultExports,
65
+ middleware
66
+ } = mod,
67
+ hooks = _objectWithoutProperties(mod, _excluded);
68
+ if (defaultExports) {
69
+ defaultExports(transformAPI);
70
+ }
48
71
 
49
- if (webMod) {
50
- webMod(transformAPI);
72
+ // named export hooks will overrides hooks in default export function
73
+ Object.values(HOOKS).forEach(key => {
74
+ const fn = hooks[key];
75
+ if (fn) {
76
+ storage.hooks[key] = fn;
51
77
  }
78
+ });
79
+ if (middleware) {
80
+ storage.middlewares = [].concat(middleware);
81
+ }
82
+ };
83
+ return {
84
+ prepare() {
85
+ loadMod();
52
86
  },
53
-
54
87
  reset() {
55
88
  storage.reset();
56
- const newWebModule = requireExistModule(webAppPath);
57
-
58
- if (newWebModule) {
59
- newWebModule(transformAPI);
60
- }
89
+ loadMod();
61
90
  },
62
-
63
91
  gather({
64
92
  addWebMiddleware
65
93
  }) {
@@ -67,51 +95,43 @@ export default (() => ({
67
95
  addWebMiddleware(mid);
68
96
  });
69
97
  },
70
-
71
- beforeMatch({
72
- context
73
- }, next) {
74
- if (!storage.hooks.beforeMatch) {
75
- return next();
76
- }
77
-
78
- return storage.hooks.beforeMatch(context, next);
79
- },
80
-
81
- afterMatch({
82
- context,
83
- routeAPI
84
- }, next) {
98
+ afterMatch(context, next) {
85
99
  if (!storage.hooks.afterMatch) {
86
100
  return next();
87
101
  }
88
-
89
- context.router = routeAPI;
90
102
  return storage.hooks.afterMatch(context, next);
91
103
  },
92
-
93
- beforeRender({
94
- context
95
- }, next) {
96
- if (!storage.hooks.beforeRender) {
97
- return next();
98
- }
99
-
100
- return storage.hooks.beforeRender(context, next);
101
- },
102
-
103
- afterRender({
104
- context,
105
- templateAPI
106
- }, next) {
104
+ afterRender(context, next) {
107
105
  if (!storage.hooks.afterRender) {
108
106
  return next();
109
107
  }
110
-
111
- context.template = templateAPI;
112
108
  return storage.hooks.afterRender(context, next);
109
+ },
110
+ prepareWebServer({
111
+ config
112
+ }) {
113
+ const {
114
+ middleware
115
+ } = config;
116
+ const factory = compose(middleware);
117
+ return ctx => {
118
+ const {
119
+ source: {
120
+ res
121
+ }
122
+ } = ctx;
123
+ return new Promise((resolve, reject) => {
124
+ res.on('finish', err => {
125
+ if (err) {
126
+ return reject(err);
127
+ }
128
+ return resolve();
129
+ });
130
+ const dispatch = factory(ctx, resolve, reject);
131
+ dispatch();
132
+ });
133
+ };
113
134
  }
114
-
115
135
  };
116
136
  }
117
137
  }));
@@ -4,51 +4,35 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = void 0;
7
-
8
7
  var _fs = _interopRequireDefault(require("fs"));
9
-
10
8
  var _path = _interopRequireDefault(require("path"));
11
-
12
9
  var _serverUtils = require("@modern-js/server-utils");
13
-
14
10
  var _utils = require("@modern-js/utils");
15
-
16
11
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
17
-
18
12
  const TS_CONFIG_FILENAME = 'tsconfig.json';
19
-
20
13
  var _default = () => ({
21
14
  name: '@modern-js/plugin-server',
22
15
  setup: api => ({
23
16
  config() {
24
17
  return {};
25
18
  },
26
-
27
19
  async afterBuild() {
28
20
  const {
29
21
  appDirectory,
30
22
  distDirectory
31
23
  } = api.useAppContext();
32
24
  const modernConfig = api.useResolvedConfigContext();
33
-
34
25
  const distDir = _path.default.resolve(distDirectory);
35
-
36
26
  const serverDir = _path.default.resolve(appDirectory, _utils.SERVER_DIR);
37
-
38
27
  const sharedDir = _path.default.resolve(appDirectory, _utils.SHARED_DIR);
39
-
40
28
  const tsconfigPath = _path.default.resolve(appDirectory, TS_CONFIG_FILENAME);
41
-
42
29
  const sourceDirs = [];
43
-
44
30
  if (_fs.default.existsSync(serverDir)) {
45
31
  sourceDirs.push(serverDir);
46
32
  }
47
-
48
33
  if (_fs.default.existsSync(sharedDir)) {
49
34
  sourceDirs.push(sharedDir);
50
35
  }
51
-
52
36
  const {
53
37
  server
54
38
  } = modernConfig;
@@ -60,7 +44,6 @@ var _default = () => ({
60
44
  const {
61
45
  babel
62
46
  } = modernConfig.tools;
63
-
64
47
  if (sourceDirs.length > 0) {
65
48
  await (0, _serverUtils.compile)(appDirectory, {
66
49
  server,
@@ -75,8 +58,6 @@ var _default = () => ({
75
58
  });
76
59
  }
77
60
  }
78
-
79
61
  })
80
62
  });
81
-
82
63
  exports.default = _default;
@@ -4,42 +4,54 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = void 0;
7
-
8
7
  var _path = _interopRequireDefault(require("path"));
9
-
10
8
  var _utils = require("@modern-js/utils");
11
-
9
+ const _excluded = ["default", "middleware"];
12
10
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
13
-
11
+ function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
12
+ function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
14
13
  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; }
15
-
16
14
  const WEB_APP_NAME = 'index';
17
-
15
+ var HOOKS;
16
+ (function (HOOKS) {
17
+ HOOKS["AFTER_MATCH"] = "afterMatch";
18
+ HOOKS["AFTER_RENDER"] = "afterRender";
19
+ })(HOOKS || (HOOKS = {}));
18
20
  class Storage {
19
21
  constructor() {
20
22
  _defineProperty(this, "middlewares", []);
21
-
22
23
  _defineProperty(this, "hooks", {});
23
24
  }
24
-
25
25
  reset() {
26
26
  this.middlewares = [];
27
27
  this.hooks = {};
28
28
  }
29
-
30
29
  }
31
-
32
30
  const createTransformAPI = storage => new Proxy({}, {
33
31
  get(target, name) {
34
32
  if (name === 'addMiddleware') {
35
33
  return fn => storage.middlewares.push(fn);
36
34
  }
37
-
38
- return fn => storage.hooks[name] = fn;
35
+ return fn => {
36
+ _utils.logger.warn('declare hook in default export is to be deprecated, use named export instead');
37
+ storage.hooks[name] = fn;
38
+ };
39
39
  }
40
-
41
40
  });
42
-
41
+ const compose = middlewares => {
42
+ return (ctx, resolve, reject) => {
43
+ let i = 0;
44
+ const dispatch = () => {
45
+ var _handler, _handler$catch;
46
+ const handler = middlewares[i++];
47
+ if (!handler) {
48
+ return resolve();
49
+ }
50
+ return (_handler = handler(ctx, dispatch)) === null || _handler === void 0 ? void 0 : (_handler$catch = _handler.catch) === null || _handler$catch === void 0 ? void 0 : _handler$catch.call(_handler, reject);
51
+ };
52
+ return dispatch;
53
+ };
54
+ };
43
55
  var _default = () => ({
44
56
  name: '@modern-js/plugin-server',
45
57
  setup: api => {
@@ -49,30 +61,40 @@ var _default = () => ({
49
61
  } = api.useAppContext();
50
62
  const storage = new Storage();
51
63
  const transformAPI = createTransformAPI(storage);
52
- let webAppPath = '';
53
- return {
54
- prepare() {
55
- const pwd = (0, _utils.isProd)() ? distDirectory : appDirectory;
56
-
57
- const serverPath = _path.default.resolve(pwd, _utils.SERVER_DIR);
58
-
59
- webAppPath = _path.default.resolve(serverPath, WEB_APP_NAME);
60
- const webMod = (0, _utils.requireExistModule)(webAppPath);
64
+ const pwd = (0, _utils.isProd)() ? distDirectory : appDirectory;
65
+ const webAppPath = _path.default.resolve(pwd, _utils.SERVER_DIR, WEB_APP_NAME);
66
+ const loadMod = () => {
67
+ const mod = (0, _utils.requireExistModule)(webAppPath, {
68
+ interop: false
69
+ });
70
+ const {
71
+ default: defaultExports,
72
+ middleware
73
+ } = mod,
74
+ hooks = _objectWithoutProperties(mod, _excluded);
75
+ if (defaultExports) {
76
+ defaultExports(transformAPI);
77
+ }
61
78
 
62
- if (webMod) {
63
- webMod(transformAPI);
79
+ // named export hooks will overrides hooks in default export function
80
+ Object.values(HOOKS).forEach(key => {
81
+ const fn = hooks[key];
82
+ if (fn) {
83
+ storage.hooks[key] = fn;
64
84
  }
85
+ });
86
+ if (middleware) {
87
+ storage.middlewares = [].concat(middleware);
88
+ }
89
+ };
90
+ return {
91
+ prepare() {
92
+ loadMod();
65
93
  },
66
-
67
94
  reset() {
68
95
  storage.reset();
69
- const newWebModule = (0, _utils.requireExistModule)(webAppPath);
70
-
71
- if (newWebModule) {
72
- newWebModule(transformAPI);
73
- }
96
+ loadMod();
74
97
  },
75
-
76
98
  gather({
77
99
  addWebMiddleware
78
100
  }) {
@@ -80,53 +102,44 @@ var _default = () => ({
80
102
  addWebMiddleware(mid);
81
103
  });
82
104
  },
83
-
84
- beforeMatch({
85
- context
86
- }, next) {
87
- if (!storage.hooks.beforeMatch) {
88
- return next();
89
- }
90
-
91
- return storage.hooks.beforeMatch(context, next);
92
- },
93
-
94
- afterMatch({
95
- context,
96
- routeAPI
97
- }, next) {
105
+ afterMatch(context, next) {
98
106
  if (!storage.hooks.afterMatch) {
99
107
  return next();
100
108
  }
101
-
102
- context.router = routeAPI;
103
109
  return storage.hooks.afterMatch(context, next);
104
110
  },
105
-
106
- beforeRender({
107
- context
108
- }, next) {
109
- if (!storage.hooks.beforeRender) {
110
- return next();
111
- }
112
-
113
- return storage.hooks.beforeRender(context, next);
114
- },
115
-
116
- afterRender({
117
- context,
118
- templateAPI
119
- }, next) {
111
+ afterRender(context, next) {
120
112
  if (!storage.hooks.afterRender) {
121
113
  return next();
122
114
  }
123
-
124
- context.template = templateAPI;
125
115
  return storage.hooks.afterRender(context, next);
116
+ },
117
+ prepareWebServer({
118
+ config
119
+ }) {
120
+ const {
121
+ middleware
122
+ } = config;
123
+ const factory = compose(middleware);
124
+ return ctx => {
125
+ const {
126
+ source: {
127
+ res
128
+ }
129
+ } = ctx;
130
+ return new Promise((resolve, reject) => {
131
+ res.on('finish', err => {
132
+ if (err) {
133
+ return reject(err);
134
+ }
135
+ return resolve();
136
+ });
137
+ const dispatch = factory(ctx, resolve, reject);
138
+ dispatch();
139
+ });
140
+ };
126
141
  }
127
-
128
142
  };
129
143
  }
130
144
  });
131
-
132
145
  exports.default = _default;
@@ -16,7 +16,6 @@ export default (function () {
16
16
  afterBuild: function afterBuild() {
17
17
  return _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee() {
18
18
  var _api$useAppContext, appDirectory, distDirectory, modernConfig, distDir, serverDir, sharedDir, tsconfigPath, sourceDirs, server, _modernConfig$source, alias, envVars, globalVars, babel;
19
-
20
19
  return _regeneratorRuntime().wrap(function _callee$(_context) {
21
20
  while (1) {
22
21
  switch (_context.prev = _context.next) {
@@ -28,24 +27,19 @@ export default (function () {
28
27
  sharedDir = path.resolve(appDirectory, SHARED_DIR);
29
28
  tsconfigPath = path.resolve(appDirectory, TS_CONFIG_FILENAME);
30
29
  sourceDirs = [];
31
-
32
30
  if (fs.existsSync(serverDir)) {
33
31
  sourceDirs.push(serverDir);
34
32
  }
35
-
36
33
  if (fs.existsSync(sharedDir)) {
37
34
  sourceDirs.push(sharedDir);
38
35
  }
39
-
40
36
  server = modernConfig.server;
41
37
  _modernConfig$source = modernConfig.source, alias = _modernConfig$source.alias, envVars = _modernConfig$source.envVars, globalVars = _modernConfig$source.globalVars;
42
38
  babel = modernConfig.tools.babel;
43
-
44
39
  if (!(sourceDirs.length > 0)) {
45
40
  _context.next = 15;
46
41
  break;
47
42
  }
48
-
49
43
  _context.next = 15;
50
44
  return compile(appDirectory, {
51
45
  server: server,
@@ -58,7 +52,6 @@ export default (function () {
58
52
  distDir: distDir,
59
53
  tsconfigPath: tsconfigPath
60
54
  });
61
-
62
55
  case 15:
63
56
  case "end":
64
57
  return _context.stop();
@@ -1,19 +1,22 @@
1
+ import _objectWithoutProperties from "@babel/runtime/helpers/esm/objectWithoutProperties";
1
2
  import _classCallCheck from "@babel/runtime/helpers/esm/classCallCheck";
2
3
  import _createClass from "@babel/runtime/helpers/esm/createClass";
3
4
  import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
5
+ var _excluded = ["default", "middleware"];
4
6
  import path from 'path';
5
- import { isProd, requireExistModule, SERVER_DIR } from '@modern-js/utils';
7
+ import { isProd, logger, requireExistModule, SERVER_DIR } from '@modern-js/utils';
6
8
  var WEB_APP_NAME = 'index';
7
-
9
+ var HOOKS;
10
+ (function (HOOKS) {
11
+ HOOKS["AFTER_MATCH"] = "afterMatch";
12
+ HOOKS["AFTER_RENDER"] = "afterRender";
13
+ })(HOOKS || (HOOKS = {}));
8
14
  var Storage = /*#__PURE__*/function () {
9
15
  function Storage() {
10
16
  _classCallCheck(this, Storage);
11
-
12
17
  _defineProperty(this, "middlewares", []);
13
-
14
18
  _defineProperty(this, "hooks", {});
15
19
  }
16
-
17
20
  _createClass(Storage, [{
18
21
  key: "reset",
19
22
  value: function reset() {
@@ -21,10 +24,8 @@ var Storage = /*#__PURE__*/function () {
21
24
  this.hooks = {};
22
25
  }
23
26
  }]);
24
-
25
27
  return Storage;
26
28
  }();
27
-
28
29
  var createTransformAPI = function createTransformAPI(storage) {
29
30
  return new Proxy({}, {
30
31
  get: function get(target, name) {
@@ -33,43 +34,67 @@ var createTransformAPI = function createTransformAPI(storage) {
33
34
  return storage.middlewares.push(fn);
34
35
  };
35
36
  }
36
-
37
37
  return function (fn) {
38
- return storage.hooks[name] = fn;
38
+ logger.warn('declare hook in default export is to be deprecated, use named export instead');
39
+ storage.hooks[name] = fn;
39
40
  };
40
41
  }
41
42
  });
42
43
  };
43
-
44
+ var compose = function compose(middlewares) {
45
+ return function (ctx, resolve, reject) {
46
+ var i = 0;
47
+ var dispatch = function dispatch() {
48
+ var _handler, _handler$catch;
49
+ var handler = middlewares[i++];
50
+ if (!handler) {
51
+ return resolve();
52
+ }
53
+ return (_handler = handler(ctx, dispatch)) === null || _handler === void 0 ? void 0 : (_handler$catch = _handler["catch"]) === null || _handler$catch === void 0 ? void 0 : _handler$catch.call(_handler, reject);
54
+ };
55
+ return dispatch;
56
+ };
57
+ };
44
58
  export default (function () {
45
59
  return {
46
60
  name: '@modern-js/plugin-server',
47
61
  setup: function setup(api) {
48
62
  var _api$useAppContext = api.useAppContext(),
49
- appDirectory = _api$useAppContext.appDirectory,
50
- distDirectory = _api$useAppContext.distDirectory;
51
-
63
+ appDirectory = _api$useAppContext.appDirectory,
64
+ distDirectory = _api$useAppContext.distDirectory;
52
65
  var storage = new Storage();
53
66
  var transformAPI = createTransformAPI(storage);
54
- var webAppPath = '';
55
- return {
56
- prepare: function prepare() {
57
- var pwd = isProd() ? distDirectory : appDirectory;
58
- var serverPath = path.resolve(pwd, SERVER_DIR);
59
- webAppPath = path.resolve(serverPath, WEB_APP_NAME);
60
- var webMod = requireExistModule(webAppPath);
67
+ var pwd = isProd() ? distDirectory : appDirectory;
68
+ var webAppPath = path.resolve(pwd, SERVER_DIR, WEB_APP_NAME);
69
+ var loadMod = function loadMod() {
70
+ var mod = requireExistModule(webAppPath, {
71
+ interop: false
72
+ });
73
+ var defaultExports = mod["default"],
74
+ middleware = mod.middleware,
75
+ hooks = _objectWithoutProperties(mod, _excluded);
76
+ if (defaultExports) {
77
+ defaultExports(transformAPI);
78
+ }
61
79
 
62
- if (webMod) {
63
- webMod(transformAPI);
80
+ // named export hooks will overrides hooks in default export function
81
+ Object.values(HOOKS).forEach(function (key) {
82
+ var fn = hooks[key];
83
+ if (fn) {
84
+ storage.hooks[key] = fn;
64
85
  }
86
+ });
87
+ if (middleware) {
88
+ storage.middlewares = [].concat(middleware);
89
+ }
90
+ };
91
+ return {
92
+ prepare: function prepare() {
93
+ loadMod();
65
94
  },
66
95
  reset: function reset() {
67
96
  storage.reset();
68
- var newWebModule = requireExistModule(webAppPath);
69
-
70
- if (newWebModule) {
71
- newWebModule(transformAPI);
72
- }
97
+ loadMod();
73
98
  },
74
99
  gather: function gather(_ref) {
75
100
  var addWebMiddleware = _ref.addWebMiddleware;
@@ -77,45 +102,35 @@ export default (function () {
77
102
  addWebMiddleware(mid);
78
103
  });
79
104
  },
80
- beforeMatch: function beforeMatch(_ref2, next) {
81
- var context = _ref2.context;
82
-
83
- if (!storage.hooks.beforeMatch) {
84
- return next();
85
- }
86
-
87
- return storage.hooks.beforeMatch(context, next);
88
- },
89
- afterMatch: function afterMatch(_ref3, next) {
90
- var context = _ref3.context,
91
- routeAPI = _ref3.routeAPI;
92
-
105
+ afterMatch: function afterMatch(context, next) {
93
106
  if (!storage.hooks.afterMatch) {
94
107
  return next();
95
108
  }
96
-
97
- context.router = routeAPI;
98
109
  return storage.hooks.afterMatch(context, next);
99
110
  },
100
- beforeRender: function beforeRender(_ref4, next) {
101
- var context = _ref4.context;
102
-
103
- if (!storage.hooks.beforeRender) {
104
- return next();
105
- }
106
-
107
- return storage.hooks.beforeRender(context, next);
108
- },
109
- afterRender: function afterRender(_ref5, next) {
110
- var context = _ref5.context,
111
- templateAPI = _ref5.templateAPI;
112
-
111
+ afterRender: function afterRender(context, next) {
113
112
  if (!storage.hooks.afterRender) {
114
113
  return next();
115
114
  }
116
-
117
- context.template = templateAPI;
118
115
  return storage.hooks.afterRender(context, next);
116
+ },
117
+ prepareWebServer: function prepareWebServer(_ref2) {
118
+ var config = _ref2.config;
119
+ var middleware = config.middleware;
120
+ var factory = compose(middleware);
121
+ return function (ctx) {
122
+ var res = ctx.source.res;
123
+ return new Promise(function (resolve, reject) {
124
+ res.on('finish', function (err) {
125
+ if (err) {
126
+ return reject(err);
127
+ }
128
+ return resolve();
129
+ });
130
+ var dispatch = factory(ctx, resolve, reject);
131
+ dispatch();
132
+ });
133
+ };
119
134
  }
120
135
  };
121
136
  }
@@ -1,5 +1,3 @@
1
1
  import type { CliPlugin } from '@modern-js/core';
2
-
3
2
  declare const _default: () => CliPlugin;
4
-
5
3
  export default _default;
@@ -1,5 +1,3 @@
1
1
  import type { ServerPlugin } from '@modern-js/server-core';
2
-
3
2
  declare const _default: () => ServerPlugin;
4
-
5
3
  export default _default;
package/package.json CHANGED
@@ -11,7 +11,7 @@
11
11
  "modern",
12
12
  "modern.js"
13
13
  ],
14
- "version": "1.21.5",
14
+ "version": "2.0.0-beta.1",
15
15
  "types": "./dist/types/server.d.ts",
16
16
  "jsnext:source": "./src/server.ts",
17
17
  "main": "./dist/js/node/server.js",
@@ -48,20 +48,20 @@
48
48
  },
49
49
  "dependencies": {
50
50
  "@babel/runtime": "^7.18.0",
51
- "@modern-js/babel-compiler": "1.21.5",
52
- "@modern-js/server-utils": "1.21.5",
53
- "@modern-js/utils": "1.21.5"
51
+ "@modern-js/babel-compiler": "2.0.0-beta.1",
52
+ "@modern-js/server-utils": "2.0.0-beta.1",
53
+ "@modern-js/utils": "2.0.0-beta.1"
54
54
  },
55
55
  "devDependencies": {
56
56
  "typescript": "^4",
57
57
  "@types/jest": "^27",
58
58
  "@types/node": "^14",
59
59
  "jest": "^27",
60
- "@modern-js/server-core": "1.21.5",
61
- "@modern-js/core": "1.21.5",
62
- "@scripts/build": "1.21.5",
63
- "@modern-js/types": "1.21.5",
64
- "@scripts/jest-config": "1.21.5"
60
+ "@modern-js/server-core": "2.0.0-beta.1",
61
+ "@modern-js/core": "2.0.0-beta.1",
62
+ "@scripts/build": "2.0.0-beta.1",
63
+ "@modern-js/types": "2.0.0-beta.1",
64
+ "@scripts/jest-config": "2.0.0-beta.1"
65
65
  },
66
66
  "sideEffects": [
67
67
  "*.css",
@@ -73,33 +73,10 @@
73
73
  "access": "public",
74
74
  "registry": "https://registry.npmjs.org/"
75
75
  },
76
- "wireit": {
77
- "build": {
78
- "command": "modern build",
79
- "files": [
80
- "src/**/*",
81
- "tsconfig.json",
82
- "package.json"
83
- ],
84
- "output": [
85
- "dist/**/*"
86
- ]
87
- },
88
- "test": {
89
- "command": "jest --passWithNoTests",
90
- "files": [
91
- "src/**/*",
92
- "tsconfig.json",
93
- "package.json",
94
- "tests/**/*"
95
- ],
96
- "output": []
97
- }
98
- },
99
76
  "scripts": {
100
- "dev": "modern dev",
101
- "build": "wireit",
77
+ "dev": "modern build --watch",
78
+ "build": "modern build",
102
79
  "new": "modern new",
103
- "test": "wireit"
80
+ "test": "jest --passWithNoTests"
104
81
  }
105
82
  }