@modern-js/core 1.1.1 → 1.1.4

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,55 @@
1
1
  # @modern-js/core
2
2
 
3
+ ## 1.1.4
4
+
5
+ ### Patch Changes
6
+
7
+ - d73ff455: support multi process product
8
+ - d73ff455: support multi process product
9
+ - d73ff455: support multi process product
10
+ - d73ff455: support multi process product
11
+ - d73ff455: support multi process product
12
+ - Updated dependencies [d927bc83]
13
+ - Updated dependencies [d73ff455]
14
+ - Updated dependencies [9c1ab865]
15
+ - Updated dependencies [d73ff455]
16
+ - Updated dependencies [d73ff455]
17
+ - Updated dependencies [d73ff455]
18
+ - Updated dependencies [d73ff455]
19
+ - @modern-js/utils@1.1.4
20
+
21
+ ## 1.1.3
22
+
23
+ ### Patch Changes
24
+
25
+ - 085a6a58: refactor server plugin
26
+ - 085a6a58: refactor server plugin
27
+ - 085a6a58: refactor server conifg
28
+ - d4fcc73a: add options.plugins:
29
+ - 085a6a58: support server runtime
30
+ - ed1f6b12: feat: support build --analyze
31
+ - a5ebbb00: fix: remove enableUsageBuiltIns config
32
+ - 085a6a58: feat: refactor server plugin
33
+ - Updated dependencies [085a6a58]
34
+ - Updated dependencies [085a6a58]
35
+ - Updated dependencies [085a6a58]
36
+ - Updated dependencies [d280ea33]
37
+ - Updated dependencies [085a6a58]
38
+ - Updated dependencies [085a6a58]
39
+ - @modern-js/utils@1.1.3
40
+
41
+ ## 1.1.2
42
+
43
+ ### Patch Changes
44
+
45
+ - 6f7fe574: modern-js/core support extra options
46
+ - 0fa83663: support more .env files
47
+ - Updated dependencies [0fa83663]
48
+ - Updated dependencies [f594fbc8]
49
+ - @modern-js/load-config@1.1.1
50
+ - @modern-js/plugin@1.1.2
51
+ - @modern-js/utils@1.1.2
52
+
3
53
  ## 1.1.1
4
54
 
5
55
  ### Patch Changes
@@ -1,6 +1,6 @@
1
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
1
+ 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; }
2
2
 
3
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
3
+ 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; }
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
 
@@ -107,9 +107,6 @@ export const output = {
107
107
  enableLatestDecorators: {
108
108
  type: 'boolean'
109
109
  },
110
- enableUsageBuiltIns: {
111
- type: 'boolean'
112
- },
113
110
  enableTsLoader: {
114
111
  type: 'boolean'
115
112
  },
@@ -1,12 +1,12 @@
1
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
1
+ 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; }
2
2
 
3
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
3
+ 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; }
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
7
  import path from 'path';
8
8
  import { compatRequire, pkgUp, ensureAbsolutePath, logger } from '@modern-js/utils';
9
- import { createAsyncManager, createAsyncWorkflow, createParallelWorkflow } from '@modern-js/plugin';
9
+ import { createAsyncManager, createAsyncWorkflow, createParallelWorkflow, createAsyncWaterfall } from '@modern-js/plugin';
10
10
  import { enable } from '@modern-js/plugin/node';
11
11
  import { program } from "./utils/commander";
12
12
  import { resolveConfig, defineConfig, loadUserConfig } from "./config";
@@ -20,6 +20,7 @@ export * from '@modern-js/plugin/node';
20
20
  program.name('modern').usage('<command> [options]').version(process.env.MODERN_JS_VERSION || '0.1.0');
21
21
  const hooksMap = {
22
22
  config: createParallelWorkflow(),
23
+ resolvedConfig: createAsyncWaterfall(),
23
24
  validateSchema: createParallelWorkflow(),
24
25
  // eslint-disable-next-line @typescript-eslint/no-invalid-void-type
25
26
  prepare: createAsyncWorkflow(),
@@ -36,7 +37,7 @@ export const {
36
37
  useRunner: mountHook
37
38
  } = manager;
38
39
  export const usePlugins = plugins => plugins.forEach(plugin => manager.usePlugin(compatRequire(require.resolve(plugin))));
39
- export { defineConfig, AppContext, useAppContext, useConfigContext, useResolvedConfigContext };
40
+ export { defineConfig, AppContext, ResolvedConfigContext, useAppContext, useConfigContext, useResolvedConfigContext, ConfigContext };
40
41
 
41
42
  const initAppDir = async () => {
42
43
  const pkg = await pkgUp({
@@ -54,13 +55,18 @@ const createCli = () => {
54
55
  let hooksRunner;
55
56
  let isRestart = false;
56
57
 
57
- const init = async (argv = []) => {
58
+ const init = async (argv = [], options) => {
58
59
  enable();
59
60
  manager.clear();
60
61
  const appDirectory = await initAppDir();
61
62
  loadEnv(appDirectory);
62
- const loaded = await loadUserConfig(appDirectory);
63
- const plugins = loadPlugins(appDirectory, loaded.config.plugins || []);
63
+ const loaded = await loadUserConfig(appDirectory, options === null || options === void 0 ? void 0 : options.configFile);
64
+ let plugins = loadPlugins(appDirectory, loaded.config.plugins || [], options === null || options === void 0 ? void 0 : options.plugins);
65
+
66
+ if (options !== null && options !== void 0 && options.beforeUsePlugins) {
67
+ plugins = options.beforeUsePlugins(plugins, loaded.config);
68
+ }
69
+
64
70
  plugins.forEach(plugin => plugin.cli && manager.usePlugin(plugin.cli));
65
71
  const appContext = initAppContext(appDirectory, plugins, loaded.filePath);
66
72
  manager.run(() => {
@@ -84,7 +90,12 @@ const createCli = () => {
84
90
  });
85
91
  const extraConfigs = await hooksRunner.config();
86
92
  const extraSchemas = await hooksRunner.validateSchema();
87
- const resolved = await resolveConfig(loaded, extraConfigs, extraSchemas, isRestart, argv); // update context value
93
+ const config = await resolveConfig(loaded, extraConfigs, extraSchemas, isRestart, argv);
94
+ const {
95
+ resolved
96
+ } = await hooksRunner.resolvedConfig({
97
+ resolved: config
98
+ }); // update context value
88
99
 
89
100
  manager.run(() => {
90
101
  ConfigContext.set(loaded.config);
@@ -102,12 +113,12 @@ const createCli = () => {
102
113
  };
103
114
  };
104
115
 
105
- async function run(argv) {
116
+ async function run(argv, options) {
106
117
  const {
107
118
  loadedConfig,
108
119
  appContext,
109
120
  resolved
110
- } = await init(argv);
121
+ } = await init(argv, options);
111
122
  await hooksRunner.commands({
112
123
  program
113
124
  });
@@ -139,4 +150,5 @@ const createCli = () => {
139
150
  };
140
151
  };
141
152
 
142
- export const cli = createCli();
153
+ export const cli = createCli();
154
+ export { loadUserConfig, initAppDir, initAppContext };
@@ -3,7 +3,9 @@ import path from 'path';
3
3
  import dotenv from 'dotenv';
4
4
  import dotenvExpand from 'dotenv-expand';
5
5
  export const loadEnv = (appDirectory, mode = process.env.NODE_ENV) => {
6
- [`.env.${mode}`, '.env'].map(name => path.resolve(appDirectory, name)).filter(filePath => fs.existsSync(filePath) && !fs.statSync(filePath).isDirectory()).forEach(filePath => {
6
+ // Don't change the order of the filenames, since they are ordered by the priority.
7
+ // Files on the left have more priority than files on the right.
8
+ [`.env.${mode}.local`, '.env.local', `.env.${mode}`, '.env'].map(name => path.resolve(appDirectory, name)).filter(filePath => fs.existsSync(filePath) && !fs.statSync(filePath).isDirectory()).forEach(filePath => {
7
9
  const envConfig = dotenv.config({
8
10
  path: filePath
9
11
  });
@@ -29,8 +29,8 @@ const resolvePlugin = (appDirectory, plugin) => {
29
29
 
30
30
  const resolved = {};
31
31
 
32
- if (plugin.cli) {
33
- resolved.cli = tryResolve(plugin.cli);
32
+ if (typeof plugin === 'string' || plugin.cli) {
33
+ resolved.cli = typeof plugin === 'string' ? tryResolve(plugin) : tryResolve(plugin.cli);
34
34
  }
35
35
 
36
36
  if (plugin.server) {
@@ -47,8 +47,8 @@ const resolvePlugin = (appDirectory, plugin) => {
47
47
  */
48
48
 
49
49
 
50
- export const loadPlugins = (appDirectory, pluginConfig) => {
51
- const plugins = [...Object.keys(INTERNAL_PLUGINS).filter(name => isDepExists(appDirectory, name)).map(name => INTERNAL_PLUGINS[name]), ...pluginConfig];
50
+ export const loadPlugins = (appDirectory, pluginConfig, internalPlugins) => {
51
+ const plugins = [...Object.keys(internalPlugins || INTERNAL_PLUGINS).filter(name => isDepExists(appDirectory, name)).map(name => (internalPlugins || INTERNAL_PLUGINS)[name]), ...pluginConfig];
52
52
  return plugins.map(plugin => {
53
53
  const {
54
54
  cli,
@@ -60,7 +60,9 @@ export const loadPlugins = (appDirectory, pluginConfig) => {
60
60
  });
61
61
  return {
62
62
  cli: cli && compatRequire(cli),
63
- server: server && compatRequire(server)
63
+ cliPath: typeof plugin === 'string' ? plugin : plugin.cli,
64
+ server: server && compatRequire(server),
65
+ serverPath: typeof plugin === 'string' ? undefined : plugin.server
64
66
  };
65
67
  });
66
68
  };
@@ -44,9 +44,9 @@ var _schema = require("./schema");
44
44
 
45
45
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
46
46
 
47
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
47
+ 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; }
48
48
 
49
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
49
+ 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; }
50
50
 
51
51
  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; }
52
52
 
@@ -115,9 +115,6 @@ const output = {
115
115
  enableLatestDecorators: {
116
116
  type: 'boolean'
117
117
  },
118
- enableUsageBuiltIns: {
119
- type: 'boolean'
120
- },
121
118
  enableTsLoader: {
122
119
  type: 'boolean'
123
120
  },
@@ -10,10 +10,15 @@ var _exportNames = {
10
10
  mountHook: true,
11
11
  usePlugins: true,
12
12
  cli: true,
13
+ initAppDir: true,
13
14
  defineConfig: true,
15
+ loadUserConfig: true,
14
16
  defaultsConfig: true,
15
17
  mergeConfig: true,
16
18
  AppContext: true,
19
+ ConfigContext: true,
20
+ initAppContext: true,
21
+ ResolvedConfigContext: true,
17
22
  useAppContext: true,
18
23
  useConfigContext: true,
19
24
  useResolvedConfigContext: true
@@ -24,6 +29,18 @@ Object.defineProperty(exports, "AppContext", {
24
29
  return _context.AppContext;
25
30
  }
26
31
  });
32
+ Object.defineProperty(exports, "ConfigContext", {
33
+ enumerable: true,
34
+ get: function () {
35
+ return _context.ConfigContext;
36
+ }
37
+ });
38
+ Object.defineProperty(exports, "ResolvedConfigContext", {
39
+ enumerable: true,
40
+ get: function () {
41
+ return _context.ResolvedConfigContext;
42
+ }
43
+ });
27
44
  exports.createPlugin = exports.cli = void 0;
28
45
  Object.defineProperty(exports, "defaultsConfig", {
29
46
  enumerable: true,
@@ -37,6 +54,19 @@ Object.defineProperty(exports, "defineConfig", {
37
54
  return _config.defineConfig;
38
55
  }
39
56
  });
57
+ Object.defineProperty(exports, "initAppContext", {
58
+ enumerable: true,
59
+ get: function () {
60
+ return _context.initAppContext;
61
+ }
62
+ });
63
+ exports.initAppDir = void 0;
64
+ Object.defineProperty(exports, "loadUserConfig", {
65
+ enumerable: true,
66
+ get: function () {
67
+ return _config.loadUserConfig;
68
+ }
69
+ });
40
70
  exports.manager = void 0;
41
71
  Object.defineProperty(exports, "mergeConfig", {
42
72
  enumerable: true,
@@ -111,9 +141,9 @@ var _loadEnv = require("./loadEnv");
111
141
 
112
142
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
113
143
 
114
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
144
+ 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; }
115
145
 
116
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
146
+ 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; }
117
147
 
118
148
  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; }
119
149
 
@@ -121,6 +151,7 @@ _commander.program.name('modern').usage('<command> [options]').version(process.e
121
151
 
122
152
  const hooksMap = {
123
153
  config: (0, _plugin.createParallelWorkflow)(),
154
+ resolvedConfig: (0, _plugin.createAsyncWaterfall)(),
124
155
  validateSchema: (0, _plugin.createParallelWorkflow)(),
125
156
  // eslint-disable-next-line @typescript-eslint/no-invalid-void-type
126
157
  prepare: (0, _plugin.createAsyncWorkflow)(),
@@ -157,17 +188,24 @@ const initAppDir = async () => {
157
188
  return _path.default.dirname(pkg);
158
189
  };
159
190
 
191
+ exports.initAppDir = initAppDir;
192
+
160
193
  const createCli = () => {
161
194
  let hooksRunner;
162
195
  let isRestart = false;
163
196
 
164
- const init = async (argv = []) => {
197
+ const init = async (argv = [], options) => {
165
198
  (0, _node.enable)();
166
199
  manager.clear();
167
200
  const appDirectory = await initAppDir();
168
201
  (0, _loadEnv.loadEnv)(appDirectory);
169
- const loaded = await (0, _config.loadUserConfig)(appDirectory);
170
- const plugins = (0, _loadPlugins.loadPlugins)(appDirectory, loaded.config.plugins || []);
202
+ const loaded = await (0, _config.loadUserConfig)(appDirectory, options === null || options === void 0 ? void 0 : options.configFile);
203
+ let plugins = (0, _loadPlugins.loadPlugins)(appDirectory, loaded.config.plugins || [], options === null || options === void 0 ? void 0 : options.plugins);
204
+
205
+ if (options !== null && options !== void 0 && options.beforeUsePlugins) {
206
+ plugins = options.beforeUsePlugins(plugins, loaded.config);
207
+ }
208
+
171
209
  plugins.forEach(plugin => plugin.cli && manager.usePlugin(plugin.cli));
172
210
  const appContext = (0, _context.initAppContext)(appDirectory, plugins, loaded.filePath);
173
211
  manager.run(() => {
@@ -192,7 +230,12 @@ const createCli = () => {
192
230
  });
193
231
  const extraConfigs = await hooksRunner.config();
194
232
  const extraSchemas = await hooksRunner.validateSchema();
195
- const resolved = await (0, _config.resolveConfig)(loaded, extraConfigs, extraSchemas, isRestart, argv); // update context value
233
+ const config = await (0, _config.resolveConfig)(loaded, extraConfigs, extraSchemas, isRestart, argv);
234
+ const {
235
+ resolved
236
+ } = await hooksRunner.resolvedConfig({
237
+ resolved: config
238
+ }); // update context value
196
239
 
197
240
  manager.run(() => {
198
241
  _context.ConfigContext.set(loaded.config);
@@ -212,12 +255,12 @@ const createCli = () => {
212
255
  };
213
256
  };
214
257
 
215
- async function run(argv) {
258
+ async function run(argv, options) {
216
259
  const {
217
260
  loadedConfig,
218
261
  appContext,
219
262
  resolved
220
- } = await init(argv);
263
+ } = await init(argv, options);
221
264
  await hooksRunner.commands({
222
265
  program: _commander.program
223
266
  });
@@ -16,7 +16,9 @@ var _dotenvExpand = _interopRequireDefault(require("dotenv-expand"));
16
16
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
17
17
 
18
18
  const loadEnv = (appDirectory, mode = process.env.NODE_ENV) => {
19
- [`.env.${mode}`, '.env'].map(name => _path.default.resolve(appDirectory, name)).filter(filePath => _fs.default.existsSync(filePath) && !_fs.default.statSync(filePath).isDirectory()).forEach(filePath => {
19
+ // Don't change the order of the filenames, since they are ordered by the priority.
20
+ // Files on the left have more priority than files on the right.
21
+ [`.env.${mode}.local`, '.env.local', `.env.${mode}`, '.env'].map(name => _path.default.resolve(appDirectory, name)).filter(filePath => _fs.default.existsSync(filePath) && !_fs.default.statSync(filePath).isDirectory()).forEach(filePath => {
20
22
  const envConfig = _dotenv.default.config({
21
23
  path: filePath
22
24
  });
@@ -37,8 +37,8 @@ const resolvePlugin = (appDirectory, plugin) => {
37
37
 
38
38
  const resolved = {};
39
39
 
40
- if (plugin.cli) {
41
- resolved.cli = tryResolve(plugin.cli);
40
+ if (typeof plugin === 'string' || plugin.cli) {
41
+ resolved.cli = typeof plugin === 'string' ? tryResolve(plugin) : tryResolve(plugin.cli);
42
42
  }
43
43
 
44
44
  if (plugin.server) {
@@ -55,8 +55,8 @@ const resolvePlugin = (appDirectory, plugin) => {
55
55
  */
56
56
 
57
57
 
58
- const loadPlugins = (appDirectory, pluginConfig) => {
59
- const plugins = [...Object.keys(_utils.INTERNAL_PLUGINS).filter(name => (0, _utils.isDepExists)(appDirectory, name)).map(name => _utils.INTERNAL_PLUGINS[name]), ...pluginConfig];
58
+ const loadPlugins = (appDirectory, pluginConfig, internalPlugins) => {
59
+ const plugins = [...Object.keys(internalPlugins || _utils.INTERNAL_PLUGINS).filter(name => (0, _utils.isDepExists)(appDirectory, name)).map(name => (internalPlugins || _utils.INTERNAL_PLUGINS)[name]), ...pluginConfig];
60
60
  return plugins.map(plugin => {
61
61
  const {
62
62
  cli,
@@ -68,7 +68,9 @@ const loadPlugins = (appDirectory, pluginConfig) => {
68
68
  });
69
69
  return {
70
70
  cli: cli && (0, _utils.compatRequire)(cli),
71
- server: server && (0, _utils.compatRequire)(server)
71
+ cliPath: typeof plugin === 'string' ? plugin : plugin.cli,
72
+ server: server && (0, _utils.compatRequire)(server),
73
+ serverPath: typeof plugin === 'string' ? undefined : plugin.server
72
74
  };
73
75
  });
74
76
  };
@@ -17,6 +17,7 @@ export interface NormalizedToolsConfig extends Omit<ToolsConfig, 'webpack' | 'ba
17
17
  export interface NormalizedConfig extends Omit<Required<UserConfig>, 'source' | 'tools'> {
18
18
  source: NormalizedSourceConfig;
19
19
  tools: NormalizedToolsConfig;
20
+ cliOptions?: Record<string, any>;
20
21
  _raw: UserConfig;
21
22
  }
22
23
  /**
@@ -173,9 +173,6 @@ export declare const patchSchema: (pluginSchemas: Array<PluginValidateSchema | P
173
173
  enableLatestDecorators: {
174
174
  type: string;
175
175
  };
176
- enableUsageBuiltIns: {
177
- type: string;
178
- };
179
176
  enableTsLoader: {
180
177
  type: string;
181
178
  };
@@ -106,9 +106,6 @@ export declare const output: {
106
106
  enableLatestDecorators: {
107
107
  type: string;
108
108
  };
109
- enableUsageBuiltIns: {
110
- type: string;
111
- };
112
109
  enableTsLoader: {
113
110
  type: string;
114
111
  };
@@ -1,8 +1,9 @@
1
- import { ParallelWorkflow, AsyncWorkflow, Progresses2Runners } from '@modern-js/plugin';
1
+ import { INTERNAL_PLUGINS } from '@modern-js/utils';
2
+ import { ParallelWorkflow, AsyncWorkflow, Progresses2Runners, AsyncWaterfall } from '@modern-js/plugin';
2
3
  import type { Hooks } from '@modern-js/types';
3
4
  import { Command } from './utils/commander';
4
- import { defineConfig, UserConfig, ToolsConfig } from './config';
5
- import { AppContext, IAppContext, useAppContext, useConfigContext, useResolvedConfigContext } from './context';
5
+ import { defineConfig, loadUserConfig, UserConfig, ToolsConfig } from './config';
6
+ import { AppContext, ConfigContext, IAppContext, initAppContext, ResolvedConfigContext, useAppContext, useConfigContext, useResolvedConfigContext } from './context';
6
7
  import { NormalizedConfig } from './config/mergeConfig';
7
8
  export type { Hooks };
8
9
  export { defaultsConfig, mergeConfig } from './config';
@@ -10,6 +11,9 @@ export * from '@modern-js/plugin';
10
11
  export * from '@modern-js/plugin/node';
11
12
  export declare type HooksRunner = Progresses2Runners<{
12
13
  config: ParallelWorkflow<void>;
14
+ resolvedConfig: AsyncWaterfall<{
15
+ resolved: NormalizedConfig;
16
+ }>;
13
17
  validateSchema: ParallelWorkflow<void>;
14
18
  prepare: AsyncWorkflow<void, void>;
15
19
  commands: AsyncWorkflow<{
@@ -23,6 +27,9 @@ export declare type HooksRunner = Progresses2Runners<{
23
27
  }>;
24
28
  export declare const manager: import("@modern-js/plugin").AsyncManager<Hooks, {
25
29
  config: ParallelWorkflow<void, unknown>;
30
+ resolvedConfig: AsyncWaterfall<{
31
+ resolved: NormalizedConfig;
32
+ }>;
26
33
  validateSchema: ParallelWorkflow<void, unknown>;
27
34
  prepare: AsyncWorkflow<void, void>;
28
35
  commands: AsyncWorkflow<{
@@ -36,6 +43,9 @@ export declare const manager: import("@modern-js/plugin").AsyncManager<Hooks, {
36
43
  }>;
37
44
  export declare const createPlugin: (initializer: import("@modern-js/plugin").AsyncInitializer<Partial<import("@modern-js/plugin").Progresses2Threads<{
38
45
  config: ParallelWorkflow<void, unknown>;
46
+ resolvedConfig: AsyncWaterfall<{
47
+ resolved: NormalizedConfig;
48
+ }>;
39
49
  validateSchema: ParallelWorkflow<void, unknown>;
40
50
  prepare: AsyncWorkflow<void, void>;
41
51
  commands: AsyncWorkflow<{
@@ -48,6 +58,9 @@ export declare const createPlugin: (initializer: import("@modern-js/plugin").Asy
48
58
  beforeExit: AsyncWorkflow<void, void>;
49
59
  } & import("@modern-js/plugin").ClearDraftProgress<Hooks>>>>, options?: import("@modern-js/plugin").PluginOptions | undefined) => import("@modern-js/plugin").AsyncPlugin<Partial<import("@modern-js/plugin").Progresses2Threads<{
50
60
  config: ParallelWorkflow<void, unknown>;
61
+ resolvedConfig: AsyncWaterfall<{
62
+ resolved: NormalizedConfig;
63
+ }>;
51
64
  validateSchema: ParallelWorkflow<void, unknown>;
52
65
  prepare: AsyncWorkflow<void, void>;
53
66
  commands: AsyncWorkflow<{
@@ -60,6 +73,9 @@ export declare const createPlugin: (initializer: import("@modern-js/plugin").Asy
60
73
  beforeExit: AsyncWorkflow<void, void>;
61
74
  } & import("@modern-js/plugin").ClearDraftProgress<Hooks>>>>, registerHook: (newShape: Partial<Hooks>) => void, mountHook: () => Progresses2Runners<{
62
75
  config: ParallelWorkflow<void, unknown>;
76
+ resolvedConfig: AsyncWaterfall<{
77
+ resolved: NormalizedConfig;
78
+ }>;
63
79
  validateSchema: ParallelWorkflow<void, unknown>;
64
80
  prepare: AsyncWorkflow<void, void>;
65
81
  commands: AsyncWorkflow<{
@@ -72,17 +88,26 @@ export declare const createPlugin: (initializer: import("@modern-js/plugin").Asy
72
88
  beforeExit: AsyncWorkflow<void, void>;
73
89
  } & import("@modern-js/plugin").ClearDraftProgress<Hooks>>;
74
90
  export declare const usePlugins: (plugins: string[]) => void;
75
- export { defineConfig, AppContext, useAppContext, useConfigContext, useResolvedConfigContext };
91
+ export { defineConfig, AppContext, ResolvedConfigContext, useAppContext, useConfigContext, useResolvedConfigContext, ConfigContext };
76
92
  export type { NormalizedConfig, IAppContext, UserConfig, ToolsConfig };
77
- export interface CoreOption {
78
- dryRun?: boolean;
93
+ declare const initAppDir: () => Promise<string>;
94
+ export interface CoreOptions {
95
+ configFile?: string;
96
+ plugins?: typeof INTERNAL_PLUGINS;
97
+ beforeUsePlugins: (plugins: any, config: any) => {
98
+ cli: any;
99
+ cliPath: any;
100
+ server: any;
101
+ serverPath: any;
102
+ }[];
79
103
  }
80
104
  export declare const cli: {
81
- init: (argv?: string[]) => Promise<{
105
+ init: (argv?: string[], options?: CoreOptions | undefined) => Promise<{
82
106
  loadedConfig: import("./config").LoadedConfig;
83
107
  appContext: IAppContext;
84
108
  resolved: NormalizedConfig;
85
109
  }>;
86
- run: (argv: string[]) => Promise<void>;
110
+ run: (argv: string[], options?: CoreOptions | undefined) => Promise<void>;
87
111
  restart: () => Promise<void>;
88
- };
112
+ };
113
+ export { loadUserConfig, initAppDir, initAppContext };
@@ -10,7 +10,14 @@ export declare type PluginConfig = Array<PluginConfigItem>;
10
10
  * @returns Plugin Objects has been required.
11
11
  */
12
12
 
13
- export declare const loadPlugins: (appDirectory: string, pluginConfig: PluginConfig) => {
13
+ export declare const loadPlugins: (appDirectory: string, pluginConfig: PluginConfig, internalPlugins?: {
14
+ [name: string]: {
15
+ cli?: string | undefined;
16
+ server?: string | undefined;
17
+ };
18
+ } | undefined) => {
14
19
  cli: any;
20
+ cliPath: string | undefined;
15
21
  server: any;
22
+ serverPath: string | undefined;
16
23
  }[];
package/package.json CHANGED
@@ -11,7 +11,7 @@
11
11
  "modern",
12
12
  "modern.js"
13
13
  ],
14
- "version": "1.1.1",
14
+ "version": "1.1.4",
15
15
  "jsnext:source": "./src/index.ts",
16
16
  "types": "./dist/types/index.d.ts",
17
17
  "main": "./dist/js/node/index.js",
@@ -38,9 +38,9 @@
38
38
  "dependencies": {
39
39
  "@babel/code-frame": "^7.14.5",
40
40
  "@babel/runtime": "^7",
41
- "@modern-js/load-config": "^1.1.0",
42
- "@modern-js/plugin": "^1.1.1",
43
- "@modern-js/utils": "^1.1.1",
41
+ "@modern-js/load-config": "^1.1.1",
42
+ "@modern-js/plugin": "^1.1.2",
43
+ "@modern-js/utils": "^1.1.4",
44
44
  "address": "^1.1.2",
45
45
  "ajv": "^8.6.2",
46
46
  "ajv-keywords": "^5.0.0",
@@ -57,7 +57,7 @@
57
57
  },
58
58
  "devDependencies": {
59
59
  "@types/babel__code-frame": "^7.0.3",
60
- "@modern-js/types": "^1.1.1",
60
+ "@modern-js/types": "^1.1.3",
61
61
  "@types/jest": "^26",
62
62
  "@types/lodash.clonedeep": "^4.5.6",
63
63
  "@types/lodash.mergewith": "^4.6.6",
@@ -66,8 +66,8 @@
66
66
  "@types/react-dom": "^17",
67
67
  "@types/signale": "^1.4.2",
68
68
  "typescript": "^4",
69
- "@modern-js/plugin-testing": "^1.1.0",
70
- "@modern-js/module-tools": "^1.1.0"
69
+ "@modern-js/plugin-testing": "^1.1.1",
70
+ "@modern-js/module-tools": "^1.1.1"
71
71
  },
72
72
  "sideEffects": false,
73
73
  "modernConfig": {
@@ -84,5 +84,6 @@
84
84
  "build": "modern build",
85
85
  "dev": "modern build --watch",
86
86
  "test": "modern test --passWithNoTests"
87
- }
87
+ },
88
+ "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"
88
89
  }
@@ -43,6 +43,7 @@ export interface NormalizedConfig
43
43
  extends Omit<Required<UserConfig>, 'source' | 'tools'> {
44
44
  source: NormalizedSourceConfig;
45
45
  tools: NormalizedToolsConfig;
46
+ cliOptions?: Record<string, any>;
46
47
  _raw: UserConfig;
47
48
  }
48
49
 
@@ -46,7 +46,6 @@ export const output = {
46
46
  disableInlineRuntimeChunk: { type: 'boolean' },
47
47
  disableAssetsCache: { type: 'boolean' },
48
48
  enableLatestDecorators: { type: 'boolean' },
49
- enableUsageBuiltIns: { type: 'boolean' },
50
49
  enableTsLoader: { type: 'boolean' },
51
50
  dataUriLimit: { type: 'number' },
52
51
  templateParameters: { type: 'object' },
package/src/index.ts CHANGED
@@ -4,6 +4,7 @@ import {
4
4
  pkgUp,
5
5
  ensureAbsolutePath,
6
6
  logger,
7
+ INTERNAL_PLUGINS,
7
8
  } from '@modern-js/utils';
8
9
  import {
9
10
  createAsyncManager,
@@ -12,6 +13,8 @@ import {
12
13
  ParallelWorkflow,
13
14
  AsyncWorkflow,
14
15
  Progresses2Runners,
16
+ createAsyncWaterfall,
17
+ AsyncWaterfall,
15
18
  } from '@modern-js/plugin';
16
19
  import { enable } from '@modern-js/plugin/node';
17
20
 
@@ -52,6 +55,9 @@ program
52
55
 
53
56
  export type HooksRunner = Progresses2Runners<{
54
57
  config: ParallelWorkflow<void>;
58
+ resolvedConfig: AsyncWaterfall<{
59
+ resolved: NormalizedConfig;
60
+ }>;
55
61
  validateSchema: ParallelWorkflow<void>;
56
62
  prepare: AsyncWorkflow<void, void>;
57
63
  commands: AsyncWorkflow<
@@ -72,6 +78,9 @@ export type HooksRunner = Progresses2Runners<{
72
78
 
73
79
  const hooksMap = {
74
80
  config: createParallelWorkflow(),
81
+ resolvedConfig: createAsyncWaterfall<{
82
+ resolved: NormalizedConfig;
83
+ }>(),
75
84
  validateSchema: createParallelWorkflow(),
76
85
  // eslint-disable-next-line @typescript-eslint/no-invalid-void-type
77
86
  prepare: createAsyncWorkflow<void, void>(),
@@ -110,9 +119,11 @@ export const usePlugins = (plugins: string[]) =>
110
119
  export {
111
120
  defineConfig,
112
121
  AppContext,
122
+ ResolvedConfigContext,
113
123
  useAppContext,
114
124
  useConfigContext,
115
125
  useResolvedConfigContext,
126
+ ConfigContext,
116
127
  };
117
128
 
118
129
  export type { NormalizedConfig, IAppContext, UserConfig, ToolsConfig };
@@ -129,15 +140,20 @@ const initAppDir = async (): Promise<string> => {
129
140
  return path.dirname(pkg);
130
141
  };
131
142
 
132
- export interface CoreOption {
133
- dryRun?: boolean;
143
+ export interface CoreOptions {
144
+ configFile?: string;
145
+ plugins?: typeof INTERNAL_PLUGINS;
146
+ beforeUsePlugins: (
147
+ plugins: any,
148
+ config: any,
149
+ ) => { cli: any; cliPath: any; server: any; serverPath: any }[];
134
150
  }
135
151
 
136
152
  const createCli = () => {
137
153
  let hooksRunner: HooksRunner;
138
154
  let isRestart = false;
139
155
 
140
- const init = async (argv: string[] = []) => {
156
+ const init = async (argv: string[] = [], options?: CoreOptions) => {
141
157
  enable();
142
158
 
143
159
  manager.clear();
@@ -146,9 +162,17 @@ const createCli = () => {
146
162
 
147
163
  loadEnv(appDirectory);
148
164
 
149
- const loaded = await loadUserConfig(appDirectory);
165
+ const loaded = await loadUserConfig(appDirectory, options?.configFile);
166
+
167
+ let plugins = loadPlugins(
168
+ appDirectory,
169
+ loaded.config.plugins || [],
170
+ options?.plugins,
171
+ );
150
172
 
151
- const plugins = loadPlugins(appDirectory, loaded.config.plugins || []);
173
+ if (options?.beforeUsePlugins) {
174
+ plugins = options.beforeUsePlugins(plugins, loaded.config);
175
+ }
152
176
 
153
177
  plugins.forEach(plugin => plugin.cli && manager.usePlugin(plugin.cli));
154
178
 
@@ -180,7 +204,7 @@ const createCli = () => {
180
204
 
181
205
  const extraSchemas = await hooksRunner.validateSchema();
182
206
 
183
- const resolved = await resolveConfig(
207
+ const config = await resolveConfig(
184
208
  loaded,
185
209
  extraConfigs as any,
186
210
  extraSchemas as any,
@@ -188,6 +212,10 @@ const createCli = () => {
188
212
  argv,
189
213
  );
190
214
 
215
+ const { resolved } = await hooksRunner.resolvedConfig({
216
+ resolved: config,
217
+ });
218
+
191
219
  // update context value
192
220
  manager.run(() => {
193
221
  ConfigContext.set(loaded.config);
@@ -204,8 +232,8 @@ const createCli = () => {
204
232
  return { loadedConfig: loaded, appContext, resolved };
205
233
  };
206
234
 
207
- async function run(argv: string[]) {
208
- const { loadedConfig, appContext, resolved } = await init(argv);
235
+ async function run(argv: string[], options?: CoreOptions) {
236
+ const { loadedConfig, appContext, resolved } = await init(argv, options);
209
237
 
210
238
  await hooksRunner.commands({ program });
211
239
 
@@ -245,3 +273,5 @@ const createCli = () => {
245
273
  };
246
274
 
247
275
  export const cli = createCli();
276
+
277
+ export { loadUserConfig, initAppDir, initAppContext };
package/src/loadEnv.ts CHANGED
@@ -7,7 +7,9 @@ export const loadEnv = (
7
7
  appDirectory: string,
8
8
  mode: string = process.env.NODE_ENV as string,
9
9
  ) => {
10
- [`.env.${mode}`, '.env']
10
+ // Don't change the order of the filenames, since they are ordered by the priority.
11
+ // Files on the left have more priority than files on the right.
12
+ [`.env.${mode}.local`, '.env.local', `.env.${mode}`, '.env']
11
13
  .map(name => path.resolve(appDirectory, name))
12
14
  .filter(
13
15
  filePath =>
@@ -37,8 +37,9 @@ const resolvePlugin = (appDirectory: string, plugin: PluginConfigItem) => {
37
37
 
38
38
  const resolved: PluginConfigItem = {};
39
39
 
40
- if (plugin.cli) {
41
- resolved.cli = tryResolve(plugin.cli);
40
+ if (typeof plugin === 'string' || plugin.cli) {
41
+ resolved.cli =
42
+ typeof plugin === 'string' ? tryResolve(plugin) : tryResolve(plugin.cli!);
42
43
  }
43
44
 
44
45
  if (plugin.server) {
@@ -57,11 +58,12 @@ const resolvePlugin = (appDirectory: string, plugin: PluginConfigItem) => {
57
58
  export const loadPlugins = (
58
59
  appDirectory: string,
59
60
  pluginConfig: PluginConfig,
61
+ internalPlugins?: typeof INTERNAL_PLUGINS,
60
62
  ) => {
61
63
  const plugins = [
62
- ...Object.keys(INTERNAL_PLUGINS)
64
+ ...Object.keys(internalPlugins || INTERNAL_PLUGINS)
63
65
  .filter(name => isDepExists(appDirectory, name))
64
- .map(name => INTERNAL_PLUGINS[name]),
66
+ .map(name => (internalPlugins || INTERNAL_PLUGINS)[name]),
65
67
  ...pluginConfig,
66
68
  ];
67
69
 
@@ -75,7 +77,9 @@ export const loadPlugins = (
75
77
 
76
78
  return {
77
79
  cli: cli && compatRequire(cli),
80
+ cliPath: typeof plugin === 'string' ? plugin : plugin.cli,
78
81
  server: server && compatRequire(server),
82
+ serverPath: typeof plugin === 'string' ? undefined : plugin.server,
79
83
  };
80
84
  });
81
85
  };
@@ -26,7 +26,7 @@ describe('load environment variables', () => {
26
26
 
27
27
  afterAll(() => {
28
28
  process.env = { ...defaultEnv };
29
- fs.rmSync(fixture, {force: true, recursive: true})
29
+ fs.rmSync(fixture, { force: true, recursive: true });
30
30
  });
31
31
 
32
32
  test(`support .env file`, () => {
@@ -78,6 +78,52 @@ describe('load environment variables', () => {
78
78
  delete process.env.NODE_ENV;
79
79
  });
80
80
 
81
+ test(`should have correct priority`, () => {
82
+ createFixtures('priority', [
83
+ {
84
+ name: '.env',
85
+ content: `DB_HOST=localhost
86
+ DB_USER=user
87
+ DB_PASS=pass
88
+ `,
89
+ },
90
+ {
91
+ name: '.env.production',
92
+ content: `DB_USER=user_production
93
+ DB_PASS=pass_production
94
+ FOO=foo
95
+ BAR=bar
96
+ `,
97
+ },
98
+ {
99
+ name: '.env.local',
100
+ content: `FOO=foo_local
101
+ BAR=bar_local
102
+ `,
103
+ },
104
+ {
105
+ name: '.env.production.local',
106
+ content: `BAR=bar_production_local`,
107
+ },
108
+ ]);
109
+
110
+ process.env.NODE_ENV = 'production';
111
+
112
+ loadEnv(path.join(fixture, 'priority'));
113
+
114
+ expect(process.env.DB_HOST).toBe('localhost');
115
+
116
+ expect(process.env.DB_USER).toBe('user_production');
117
+
118
+ expect(process.env.DB_PASS).toBe('pass_production');
119
+
120
+ expect(process.env.FOO).toBe('foo_local');
121
+
122
+ expect(process.env.BAR).toBe('bar_production_local');
123
+
124
+ delete process.env.NODE_ENV;
125
+ });
126
+
81
127
  test(`support dotenv-expand`, () => {
82
128
  createFixtures('expand', [
83
129
  {
@@ -14,8 +14,8 @@ describe('load plugins', () => {
14
14
  ]);
15
15
 
16
16
  expect(plugins).toEqual([
17
- { cli: { name: 'a' } },
18
- { server: { name: 'b' } },
17
+ { cli: { name: 'a' }, cliPath: path.join(fixture, './test-plugin-a.js') },
18
+ { server: { name: 'b' }, serverPath: './test-plugin-b' },
19
19
  ]);
20
20
  });
21
21