@eggjs/core 6.5.0 → 6.6.0-beta.3

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 (87) hide show
  1. package/README.md +1 -5
  2. package/dist/base_context_class.d.ts +21 -0
  3. package/dist/base_context_class.js +40 -0
  4. package/dist/egg.d.ts +248 -0
  5. package/dist/egg.js +358 -0
  6. package/dist/index.d.ts +12 -0
  7. package/dist/index.js +12 -0
  8. package/dist/lifecycle.d.ts +84 -0
  9. package/dist/lifecycle.js +280 -0
  10. package/dist/loader/context_loader.d.ts +39 -0
  11. package/dist/loader/context_loader.js +79 -0
  12. package/dist/loader/egg_loader.d.ts +374 -0
  13. package/dist/loader/egg_loader.js +1184 -0
  14. package/dist/loader/file_loader.d.ts +105 -0
  15. package/dist/loader/file_loader.js +198 -0
  16. package/dist/singleton.d.ts +33 -0
  17. package/dist/singleton.js +107 -0
  18. package/{src/types.ts → dist/types.d.ts} +7 -7
  19. package/dist/utils/index.d.ts +19 -0
  20. package/dist/utils/index.js +103 -0
  21. package/dist/utils/sequencify.d.ts +16 -0
  22. package/dist/utils/sequencify.js +46 -0
  23. package/dist/utils/timing.d.ts +24 -0
  24. package/dist/utils/timing.js +85 -0
  25. package/package.json +34 -72
  26. package/dist/commonjs/base_context_class.d.ts +0 -16
  27. package/dist/commonjs/base_context_class.js +0 -41
  28. package/dist/commonjs/egg.d.ts +0 -246
  29. package/dist/commonjs/egg.js +0 -401
  30. package/dist/commonjs/index.d.ts +0 -12
  31. package/dist/commonjs/index.js +0 -32
  32. package/dist/commonjs/lifecycle.d.ts +0 -78
  33. package/dist/commonjs/lifecycle.js +0 -315
  34. package/dist/commonjs/loader/context_loader.d.ts +0 -35
  35. package/dist/commonjs/loader/context_loader.js +0 -110
  36. package/dist/commonjs/loader/egg_loader.d.ts +0 -369
  37. package/dist/commonjs/loader/egg_loader.js +0 -1558
  38. package/dist/commonjs/loader/file_loader.d.ts +0 -100
  39. package/dist/commonjs/loader/file_loader.js +0 -260
  40. package/dist/commonjs/package.json +0 -3
  41. package/dist/commonjs/singleton.d.ts +0 -29
  42. package/dist/commonjs/singleton.js +0 -124
  43. package/dist/commonjs/types.d.ts +0 -53
  44. package/dist/commonjs/types.js +0 -3
  45. package/dist/commonjs/utils/index.d.ts +0 -17
  46. package/dist/commonjs/utils/index.js +0 -117
  47. package/dist/commonjs/utils/sequencify.d.ts +0 -13
  48. package/dist/commonjs/utils/sequencify.js +0 -64
  49. package/dist/commonjs/utils/timing.d.ts +0 -21
  50. package/dist/commonjs/utils/timing.js +0 -106
  51. package/dist/esm/base_context_class.d.ts +0 -16
  52. package/dist/esm/base_context_class.js +0 -37
  53. package/dist/esm/egg.d.ts +0 -246
  54. package/dist/esm/egg.js +0 -388
  55. package/dist/esm/index.d.ts +0 -12
  56. package/dist/esm/index.js +0 -12
  57. package/dist/esm/lifecycle.d.ts +0 -78
  58. package/dist/esm/lifecycle.js +0 -308
  59. package/dist/esm/loader/context_loader.d.ts +0 -35
  60. package/dist/esm/loader/context_loader.js +0 -102
  61. package/dist/esm/loader/egg_loader.d.ts +0 -369
  62. package/dist/esm/loader/egg_loader.js +0 -1551
  63. package/dist/esm/loader/file_loader.d.ts +0 -100
  64. package/dist/esm/loader/file_loader.js +0 -253
  65. package/dist/esm/package.json +0 -3
  66. package/dist/esm/singleton.d.ts +0 -29
  67. package/dist/esm/singleton.js +0 -117
  68. package/dist/esm/types.d.ts +0 -53
  69. package/dist/esm/types.js +0 -2
  70. package/dist/esm/utils/index.d.ts +0 -17
  71. package/dist/esm/utils/index.js +0 -112
  72. package/dist/esm/utils/sequencify.d.ts +0 -13
  73. package/dist/esm/utils/sequencify.js +0 -61
  74. package/dist/esm/utils/timing.d.ts +0 -21
  75. package/dist/esm/utils/timing.js +0 -99
  76. package/dist/package.json +0 -4
  77. package/src/base_context_class.ts +0 -39
  78. package/src/egg.ts +0 -617
  79. package/src/index.ts +0 -14
  80. package/src/lifecycle.ts +0 -438
  81. package/src/loader/context_loader.ts +0 -123
  82. package/src/loader/egg_loader.ts +0 -1984
  83. package/src/loader/file_loader.ts +0 -349
  84. package/src/singleton.ts +0 -187
  85. package/src/utils/index.ts +0 -132
  86. package/src/utils/sequencify.ts +0 -105
  87. package/src/utils/timing.ts +0 -128
@@ -1,1558 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.EggLoader = void 0;
7
- const node_fs_1 = __importDefault(require("node:fs"));
8
- const node_path_1 = __importDefault(require("node:path"));
9
- const node_assert_1 = __importDefault(require("node:assert"));
10
- const node_util_1 = require("node:util");
11
- const node_homedir_1 = require("node-homedir");
12
- const is_type_of_1 = require("is-type-of");
13
- const utility_1 = require("utility");
14
- const extend2_1 = require("extend2");
15
- const koa_1 = require("@eggjs/koa");
16
- const tsconfig_paths_1 = require("tsconfig-paths");
17
- const utils_1 = require("@eggjs/utils");
18
- const egg_path_matching_1 = require("egg-path-matching");
19
- const performance_ms_1 = require("performance-ms");
20
- const file_loader_js_1 = require("./file_loader.js");
21
- const context_loader_js_1 = require("./context_loader.js");
22
- const index_js_1 = __importDefault(require("../utils/index.js"));
23
- const sequencify_js_1 = require("../utils/sequencify.js");
24
- const timing_js_1 = require("../utils/timing.js");
25
- const debug = (0, node_util_1.debuglog)('@eggjs/core/loader/egg_loader');
26
- const originalPrototypes = {
27
- request: koa_1.Request.prototype,
28
- response: koa_1.Response.prototype,
29
- context: koa_1.Context.prototype,
30
- application: koa_1.Application.prototype,
31
- };
32
- class EggLoader {
33
- #requiredCount = 0;
34
- options;
35
- timing;
36
- pkg;
37
- eggPaths;
38
- serverEnv;
39
- serverScope;
40
- appInfo;
41
- dirs;
42
- /**
43
- * @class
44
- * @param {Object} options - options
45
- * @param {String} options.baseDir - the directory of application
46
- * @param {EggCore} options.app - Application instance
47
- * @param {Logger} options.logger - logger
48
- * @param {Object} [options.plugins] - custom plugins
49
- * @since 1.0.0
50
- */
51
- constructor(options) {
52
- this.options = options;
53
- (0, node_assert_1.default)(node_fs_1.default.existsSync(this.options.baseDir), `${this.options.baseDir} not exists`);
54
- (0, node_assert_1.default)(this.options.app, 'options.app is required');
55
- (0, node_assert_1.default)(this.options.logger, 'options.logger is required');
56
- this.timing = this.app.timing || new timing_js_1.Timing();
57
- /**
58
- * @member {Object} EggLoader#pkg
59
- * @see {@link AppInfo#pkg}
60
- * @since 1.0.0
61
- */
62
- this.pkg = (0, utility_1.readJSONSync)(node_path_1.default.join(this.options.baseDir, 'package.json'));
63
- // auto require('tsconfig-paths/register') on typescript app
64
- // support env.EGG_TYPESCRIPT = true or { "egg": { "typescript": true } } on package.json
65
- if (process.env.EGG_TYPESCRIPT === 'true' ||
66
- (this.pkg.egg && this.pkg.egg.typescript)) {
67
- // skip require tsconfig-paths if tsconfig.json not exists
68
- const tsConfigFile = node_path_1.default.join(this.options.baseDir, 'tsconfig.json');
69
- if (node_fs_1.default.existsSync(tsConfigFile)) {
70
- // @ts-expect-error only cwd is required
71
- (0, tsconfig_paths_1.register)({ cwd: this.options.baseDir });
72
- }
73
- else {
74
- this.logger.info('[@eggjs/core/egg_loader] skip register "tsconfig-paths" because tsconfig.json not exists at %s', tsConfigFile);
75
- }
76
- }
77
- /**
78
- * All framework directories.
79
- *
80
- * You can extend Application of egg, the entry point is options.app,
81
- *
82
- * loader will find all directories from the prototype of Application,
83
- * you should define `Symbol.for('egg#eggPath')` property.
84
- *
85
- * ```ts
86
- * // src/example.ts
87
- * import { Application } from 'egg';
88
- * class ExampleApplication extends Application {
89
- * get [Symbol.for('egg#eggPath')]() {
90
- * return baseDir;
91
- * }
92
- * }
93
- * ```
94
- * @member {Array} EggLoader#eggPaths
95
- * @see EggLoader#getEggPaths
96
- * @since 1.0.0
97
- */
98
- this.eggPaths = this.getEggPaths();
99
- debug('Loaded eggPaths %j', this.eggPaths);
100
- /**
101
- * @member {String} EggLoader#serverEnv
102
- * @see AppInfo#env
103
- * @since 1.0.0
104
- */
105
- this.serverEnv = this.getServerEnv();
106
- debug('Loaded serverEnv %j', this.serverEnv);
107
- /**
108
- * @member {String} EggLoader#serverScope
109
- * @see AppInfo#serverScope
110
- */
111
- this.serverScope = options.serverScope ?? this.getServerScope();
112
- /**
113
- * @member {AppInfo} EggLoader#appInfo
114
- * @since 1.0.0
115
- */
116
- this.appInfo = this.getAppInfo();
117
- }
118
- get app() {
119
- return this.options.app;
120
- }
121
- get lifecycle() {
122
- return this.app.lifecycle;
123
- }
124
- get logger() {
125
- return this.options.logger;
126
- }
127
- /**
128
- * Get {@link AppInfo#env}
129
- * @returns {String} env
130
- * @see AppInfo#env
131
- * @private
132
- * @since 1.0.0
133
- */
134
- getServerEnv() {
135
- let serverEnv = this.options.env;
136
- const envPath = node_path_1.default.join(this.options.baseDir, 'config/env');
137
- if (!serverEnv && node_fs_1.default.existsSync(envPath)) {
138
- serverEnv = node_fs_1.default.readFileSync(envPath, 'utf8').trim();
139
- }
140
- if (!serverEnv && process.env.EGG_SERVER_ENV) {
141
- serverEnv = process.env.EGG_SERVER_ENV;
142
- }
143
- if (serverEnv) {
144
- serverEnv = serverEnv.trim();
145
- }
146
- else {
147
- // oxlint-disable-next-line eslint/no-lonely-if
148
- if (process.env.NODE_ENV === 'test') {
149
- serverEnv = 'unittest';
150
- }
151
- else if (process.env.NODE_ENV === 'production') {
152
- serverEnv = 'prod';
153
- }
154
- else {
155
- serverEnv = 'local';
156
- }
157
- }
158
- return serverEnv;
159
- }
160
- /**
161
- * Get {@link AppInfo#scope}
162
- * @returns {String} serverScope
163
- * @private
164
- */
165
- getServerScope() {
166
- return process.env.EGG_SERVER_SCOPE ?? '';
167
- }
168
- /**
169
- * Get {@link AppInfo#name}
170
- * @returns {String} appname
171
- * @private
172
- * @since 1.0.0
173
- */
174
- getAppname() {
175
- if (this.pkg.name) {
176
- debug('Loaded appname(%s) from package.json', this.pkg.name);
177
- return this.pkg.name;
178
- }
179
- const pkg = node_path_1.default.join(this.options.baseDir, 'package.json');
180
- throw new Error(`name is required from ${pkg}`);
181
- }
182
- /**
183
- * Get home directory
184
- * @returns {String} home directory
185
- * @since 3.4.0
186
- */
187
- getHomedir() {
188
- // EGG_HOME for test
189
- return process.env.EGG_HOME || (0, node_homedir_1.homedir)() || '/home/admin';
190
- }
191
- /**
192
- * Get app info
193
- * @returns {AppInfo} appInfo
194
- * @since 1.0.0
195
- */
196
- getAppInfo() {
197
- const env = this.serverEnv;
198
- const scope = this.serverScope;
199
- const home = this.getHomedir();
200
- const baseDir = this.options.baseDir;
201
- /**
202
- * Meta information of the application
203
- * @class AppInfo
204
- */
205
- return {
206
- /**
207
- * The name of the application, retrieve from the name property in `package.json`.
208
- * @member {String} AppInfo#name
209
- */
210
- name: this.getAppname(),
211
- /**
212
- * The current directory, where the application code is.
213
- * @member {String} AppInfo#baseDir
214
- */
215
- baseDir,
216
- /**
217
- * The environment of the application, **it's not NODE_ENV**
218
- *
219
- * 1. from `$baseDir/config/env`
220
- * 2. from EGG_SERVER_ENV
221
- * 3. from NODE_ENV
222
- *
223
- * env | description
224
- * --- | ---
225
- * test | system integration testing
226
- * prod | production
227
- * local | local on your own computer
228
- * unittest | unit test
229
- *
230
- * @member {String} AppInfo#env
231
- * @see https://eggjs.org/zh-cn/basics/env.html
232
- */
233
- env,
234
- /**
235
- * @member {String} AppInfo#scope
236
- */
237
- scope,
238
- /**
239
- * The use directory, same as `process.env.HOME`
240
- * @member {String} AppInfo#HOME
241
- */
242
- HOME: home,
243
- /**
244
- * parsed from `package.json`
245
- * @member {Object} AppInfo#pkg
246
- */
247
- pkg: this.pkg,
248
- /**
249
- * The directory whether is baseDir or HOME depend on env.
250
- * it's good for test when you want to write some file to HOME,
251
- * but don't want to write to the real directory,
252
- * so use root to write file to baseDir instead of HOME when unittest.
253
- * keep root directory in baseDir when local and unittest
254
- * @member {String} AppInfo#root
255
- */
256
- root: env === 'local' || env === 'unittest' ? baseDir : home,
257
- };
258
- }
259
- /**
260
- * Get {@link EggLoader#eggPaths}
261
- * @returns {Array} framework directories
262
- * @see {@link EggLoader#eggPaths}
263
- * @private
264
- * @since 1.0.0
265
- */
266
- getEggPaths() {
267
- // avoid require recursively
268
- const EggCore = this.options.EggCoreClass;
269
- const eggPaths = [];
270
- let proto = this.app;
271
- // Loop for the prototype chain
272
- while (proto) {
273
- proto = Object.getPrototypeOf(proto);
274
- // stop the loop if
275
- // - object extends Object
276
- // - object extends EggCore
277
- if (proto === Object.prototype || proto === EggCore?.prototype) {
278
- break;
279
- }
280
- const eggPath = Reflect.get(proto, Symbol.for('egg#eggPath'));
281
- if (!eggPath) {
282
- // if (EggCore) {
283
- // throw new TypeError('Symbol.for(\'egg#eggPath\') is required on Application');
284
- // }
285
- continue;
286
- }
287
- (0, node_assert_1.default)(typeof eggPath === 'string', "Symbol.for('egg#eggPath') should be string");
288
- (0, node_assert_1.default)(node_fs_1.default.existsSync(eggPath), `${eggPath} not exists`);
289
- const realpath = node_fs_1.default.realpathSync(eggPath);
290
- if (!eggPaths.includes(realpath)) {
291
- eggPaths.unshift(realpath);
292
- }
293
- }
294
- return eggPaths;
295
- }
296
- /** start Plugin loader */
297
- lookupDirs;
298
- eggPlugins;
299
- appPlugins;
300
- customPlugins;
301
- allPlugins;
302
- orderPlugins;
303
- /** enable plugins */
304
- plugins;
305
- /**
306
- * Load config/plugin.js from {EggLoader#loadUnits}
307
- *
308
- * plugin.js is written below
309
- *
310
- * ```js
311
- * {
312
- * 'xxx-client': {
313
- * enable: true,
314
- * package: 'xxx-client',
315
- * dep: [],
316
- * env: [],
317
- * },
318
- * // short hand
319
- * 'rds': false,
320
- * 'depd': {
321
- * enable: true,
322
- * path: 'path/to/depd'
323
- * }
324
- * }
325
- * ```
326
- *
327
- * If the plugin has path, Loader will find the module from it.
328
- *
329
- * Otherwise Loader will lookup follow the order by packageName
330
- *
331
- * 1. $APP_BASE/node_modules/${package}
332
- * 2. $EGG_BASE/node_modules/${package}
333
- *
334
- * You can call `loader.plugins` that retrieve enabled plugins.
335
- *
336
- * ```js
337
- * loader.plugins['xxx-client'] = {
338
- * name: 'xxx-client', // the plugin name, it can be used in `dep`
339
- * package: 'xxx-client', // the package name of plugin
340
- * enable: true, // whether enabled
341
- * path: 'path/to/xxx-client', // the directory of the plugin package
342
- * dep: [], // the dependent plugins, you can use the plugin name
343
- * env: [ 'local', 'unittest' ], // specify the serverEnv that only enable the plugin in it
344
- * }
345
- * ```
346
- *
347
- * `loader.allPlugins` can be used when retrieve all plugins.
348
- * @function EggLoader#loadPlugin
349
- * @since 1.0.0
350
- */
351
- async loadPlugin() {
352
- this.timing.start('Load Plugin');
353
- this.lookupDirs = this.getLookupDirs();
354
- this.allPlugins = {};
355
- this.eggPlugins = await this.loadEggPlugins();
356
- this.appPlugins = await this.loadAppPlugins();
357
- this.customPlugins = this.loadCustomPlugins();
358
- this.#extendPlugins(this.allPlugins, this.eggPlugins);
359
- this.#extendPlugins(this.allPlugins, this.appPlugins);
360
- this.#extendPlugins(this.allPlugins, this.customPlugins);
361
- const enabledPluginNames = []; // enabled plugins that configured explicitly
362
- const plugins = {};
363
- const env = this.serverEnv;
364
- for (const name in this.allPlugins) {
365
- const plugin = this.allPlugins[name];
366
- // resolve the real plugin.path based on plugin or package
367
- plugin.path = this.getPluginPath(plugin);
368
- // read plugin information from ${plugin.path}/package.json
369
- await this.#mergePluginConfig(plugin);
370
- // disable the plugin that not match the serverEnv
371
- if (env && plugin.env.length > 0 && !plugin.env.includes(env)) {
372
- this.logger.info('[@eggjs/core] Plugin %o is disabled by env unmatched, require env(%o) but got env is %o', name, plugin.env, env);
373
- plugin.enable = false;
374
- continue;
375
- }
376
- plugins[name] = plugin;
377
- if (plugin.enable) {
378
- enabledPluginNames.push(name);
379
- }
380
- }
381
- // retrieve the ordered plugins
382
- this.orderPlugins = this.getOrderPlugins(plugins, enabledPluginNames, this.appPlugins);
383
- const enablePlugins = {};
384
- for (const plugin of this.orderPlugins) {
385
- enablePlugins[plugin.name] = plugin;
386
- }
387
- debug('Loaded enable plugins: %j', Object.keys(enablePlugins));
388
- /**
389
- * Retrieve enabled plugins
390
- * @member {Object} EggLoader#plugins
391
- * @since 1.0.0
392
- */
393
- this.plugins = enablePlugins;
394
- this.timing.end('Load Plugin');
395
- }
396
- async loadAppPlugins() {
397
- // loader plugins from application
398
- const appPlugins = await this.readPluginConfigs(node_path_1.default.join(this.options.baseDir, 'config/plugin.default'));
399
- debug('Loaded app plugins: %j', Object.keys(appPlugins).map(k => `${k}:${appPlugins[k].enable}`));
400
- return appPlugins;
401
- }
402
- async loadEggPlugins() {
403
- // loader plugins from framework
404
- const eggPluginConfigPaths = this.eggPaths.map(eggPath => node_path_1.default.join(eggPath, 'config/plugin.default'));
405
- const eggPlugins = await this.readPluginConfigs(eggPluginConfigPaths);
406
- debug('Loaded egg plugins: %j', Object.keys(eggPlugins).map(k => `${k}:${eggPlugins[k].enable}`));
407
- return eggPlugins;
408
- }
409
- loadCustomPlugins() {
410
- // loader plugins from process.env.EGG_PLUGINS
411
- let customPlugins = {};
412
- const configPaths = [];
413
- if (process.env.EGG_PLUGINS) {
414
- try {
415
- customPlugins = JSON.parse(process.env.EGG_PLUGINS);
416
- configPaths.push('<process.env.EGG_PLUGINS>');
417
- }
418
- catch (e) {
419
- debug('parse EGG_PLUGINS failed, %s', e);
420
- }
421
- }
422
- // loader plugins from options.plugins
423
- if (this.options.plugins) {
424
- customPlugins = {
425
- ...customPlugins,
426
- ...this.options.plugins,
427
- };
428
- configPaths.push('<options.plugins>');
429
- }
430
- if (customPlugins) {
431
- const configPath = configPaths.join(' or ');
432
- for (const name in customPlugins) {
433
- this.#normalizePluginConfig(customPlugins, name, configPath);
434
- }
435
- debug('Loaded custom plugins: %o', customPlugins);
436
- }
437
- return customPlugins;
438
- }
439
- /*
440
- * Read plugin.js from multiple directory
441
- */
442
- async readPluginConfigs(configPaths) {
443
- if (!Array.isArray(configPaths)) {
444
- configPaths = [configPaths];
445
- }
446
- // Get all plugin configurations
447
- // plugin.default.js
448
- // plugin.${scope}.js
449
- // plugin.${env}.js
450
- // plugin.${scope}_${env}.js
451
- const newConfigPaths = [];
452
- for (const filename of this.getTypeFiles('plugin')) {
453
- for (let configPath of configPaths) {
454
- configPath = node_path_1.default.join(node_path_1.default.dirname(configPath), filename);
455
- newConfigPaths.push(configPath);
456
- }
457
- }
458
- const plugins = {};
459
- for (const configPath of newConfigPaths) {
460
- let filepath = this.resolveModule(configPath);
461
- // let plugin.js compatible
462
- if (configPath.endsWith('plugin.default') && !filepath) {
463
- filepath = this.resolveModule(configPath.replace(/plugin\.default$/, 'plugin'));
464
- }
465
- if (!filepath) {
466
- continue;
467
- }
468
- const config = (await index_js_1.default.loadFile(filepath));
469
- for (const name in config) {
470
- this.#normalizePluginConfig(config, name, filepath);
471
- }
472
- this.#extendPlugins(plugins, config);
473
- }
474
- return plugins;
475
- }
476
- #normalizePluginConfig(plugins, name, configPath) {
477
- const plugin = plugins[name];
478
- // plugin_name: false
479
- if (typeof plugin === 'boolean') {
480
- plugins[name] = {
481
- name,
482
- enable: plugin,
483
- dependencies: [],
484
- optionalDependencies: [],
485
- env: [],
486
- from: configPath,
487
- };
488
- return;
489
- }
490
- if (!('enable' in plugin)) {
491
- Reflect.set(plugin, 'enable', true);
492
- }
493
- plugin.name = name;
494
- plugin.dependencies = plugin.dependencies || [];
495
- plugin.optionalDependencies = plugin.optionalDependencies || [];
496
- plugin.env = plugin.env || [];
497
- plugin.from = plugin.from || configPath;
498
- depCompatible(plugin);
499
- }
500
- // Read plugin information from package.json and merge
501
- // {
502
- // eggPlugin: {
503
- // "name": "", plugin name, must be same as name in config/plugin.js
504
- // "dep": [], dependent plugins
505
- // "env": "" env
506
- // "strict": true, whether check plugin name, default to true.
507
- // }
508
- // }
509
- async #mergePluginConfig(plugin) {
510
- let pkg;
511
- let config;
512
- const pluginPackage = node_path_1.default.join(plugin.path, 'package.json');
513
- if (await index_js_1.default.existsPath(pluginPackage)) {
514
- pkg = await (0, utility_1.readJSON)(pluginPackage);
515
- config = pkg.eggPlugin;
516
- if (pkg.version) {
517
- plugin.version = pkg.version;
518
- }
519
- // support commonjs and esm dist files
520
- plugin.path = await this.#formatPluginPathFromPackageJSON(plugin.path, pkg);
521
- }
522
- const logger = this.options.logger;
523
- if (!config) {
524
- logger.warn(`[@eggjs/core/egg_loader] pkg.eggPlugin is missing in ${pluginPackage}`);
525
- return;
526
- }
527
- if (config.name && config.strict !== false && config.name !== plugin.name) {
528
- // pluginName is configured in config/plugin.js
529
- // pluginConfigName is pkg.eggPlugin.name
530
- logger.warn(`[@eggjs/core/egg_loader] pluginName(${plugin.name}) is different from pluginConfigName(${config.name})`);
531
- }
532
- // dep compatible
533
- depCompatible(config);
534
- for (const key of ['dependencies', 'optionalDependencies', 'env']) {
535
- const values = config[key];
536
- const existsValues = Reflect.get(plugin, key);
537
- if (Array.isArray(values) && !existsValues?.length) {
538
- Reflect.set(plugin, key, values);
539
- }
540
- }
541
- }
542
- getOrderPlugins(allPlugins, enabledPluginNames, appPlugins) {
543
- // no plugins enabled
544
- if (enabledPluginNames.length === 0) {
545
- return [];
546
- }
547
- const result = (0, sequencify_js_1.sequencify)(allPlugins, enabledPluginNames);
548
- debug('Got plugins %j after sequencify', result);
549
- // catch error when result.sequence is empty
550
- if (result.sequence.length === 0) {
551
- const err = new Error(`sequencify plugins has problem, missing: [${result.missingTasks}], recursive: [${result.recursiveDependencies}]`);
552
- // find plugins which is required by the missing plugin
553
- for (const missName of result.missingTasks) {
554
- const requires = [];
555
- for (const name in allPlugins) {
556
- if (allPlugins[name].dependencies.includes(missName)) {
557
- requires.push(name);
558
- }
559
- }
560
- err.message += `\n\t>> Plugin [${missName}] is disabled or missed, but is required by [${requires}]`;
561
- }
562
- err.name = 'PluginSequencifyError';
563
- throw err;
564
- }
565
- // log the plugins that be enabled implicitly
566
- const implicitEnabledPlugins = [];
567
- const requireMap = {};
568
- for (const name of result.sequence) {
569
- for (const depName of allPlugins[name].dependencies) {
570
- if (!requireMap[depName]) {
571
- requireMap[depName] = [];
572
- }
573
- requireMap[depName].push(name);
574
- }
575
- if (!allPlugins[name].enable) {
576
- implicitEnabledPlugins.push(name);
577
- allPlugins[name].enable = true;
578
- allPlugins[name].implicitEnable = true;
579
- }
580
- }
581
- for (const [name, dependents] of Object.entries(requireMap)) {
582
- // note:`dependents` will not includes `optionalDependencies`
583
- allPlugins[name].dependents = dependents;
584
- }
585
- // Following plugins will be enabled implicitly.
586
- // - configclient required by [rpcClient]
587
- // - monitor required by [rpcClient]
588
- // - diamond required by [rpcClient]
589
- if (implicitEnabledPlugins.length > 0) {
590
- let message = implicitEnabledPlugins
591
- .map(name => ` - ${name} required by [${requireMap[name]}]`)
592
- .join('\n');
593
- this.options.logger.info(`Following plugins will be enabled implicitly.\n${message}`);
594
- // should warn when the plugin is disabled by app
595
- const disabledPlugins = implicitEnabledPlugins.filter(name => appPlugins[name] && appPlugins[name].enable === false);
596
- if (disabledPlugins.length > 0) {
597
- message = disabledPlugins
598
- .map(name => ` - ${name} required by [${requireMap[name]}]`)
599
- .join('\n');
600
- this.options.logger.warn(`Following plugins will be enabled implicitly that is disabled by application.\n${message}`);
601
- }
602
- }
603
- return result.sequence.map(name => allPlugins[name]);
604
- }
605
- getLookupDirs() {
606
- const lookupDirs = new Set();
607
- // try to locate the plugin in the following directories's node_modules
608
- // -> {APP_PATH} -> {EGG_PATH} -> $CWD
609
- lookupDirs.add(this.options.baseDir);
610
- // try to locate the plugin at framework from upper to lower
611
- for (let i = this.eggPaths.length - 1; i >= 0; i--) {
612
- const eggPath = this.eggPaths[i];
613
- lookupDirs.add(eggPath);
614
- }
615
- // should find the $cwd when test the plugins under npm3
616
- lookupDirs.add(process.cwd());
617
- return lookupDirs;
618
- }
619
- // Get the real plugin path
620
- getPluginPath(plugin) {
621
- if (plugin.path) {
622
- return plugin.path;
623
- }
624
- if (plugin.package) {
625
- (0, node_assert_1.default)(isValidatePackageName(plugin.package), `plugin ${plugin.name} invalid, use 'path' instead of package: "${plugin.package}"`);
626
- }
627
- return this.#resolvePluginPath(plugin);
628
- }
629
- #resolvePluginPath(plugin) {
630
- const name = plugin.package || plugin.name;
631
- try {
632
- // should find the plugin directory
633
- // pnpm will lift the node_modules to the sibling directory
634
- // 'node_modules/.pnpm/yadan@2.0.0/node_modules/yadan/node_modules',
635
- // 'node_modules/.pnpm/yadan@2.0.0/node_modules', <- this is the sibling directory
636
- // 'node_modules/.pnpm/egg@2.33.1/node_modules/egg/node_modules',
637
- // 'node_modules/.pnpm/egg@2.33.1/node_modules', <- this is the sibling directory
638
- const pluginPkgFile = index_js_1.default.resolvePath(`${name}/package.json`, {
639
- paths: [...this.lookupDirs],
640
- });
641
- return node_path_1.default.dirname(pluginPkgFile);
642
- }
643
- catch (err) {
644
- debug('[resolvePluginPath] error: %o, plugin info: %o', err, plugin);
645
- throw new Error(`Can not find plugin ${name} in "${[...this.lookupDirs].join(', ')}"`, {
646
- cause: err,
647
- });
648
- }
649
- }
650
- async #formatPluginPathFromPackageJSON(pluginPath, pluginPkg) {
651
- let realPluginPath = pluginPath;
652
- const exports = pluginPkg.eggPlugin?.exports;
653
- if (exports) {
654
- if (utils_1.isESM) {
655
- if (exports.import) {
656
- realPluginPath = node_path_1.default.join(pluginPath, exports.import);
657
- }
658
- }
659
- else if (exports.require) {
660
- realPluginPath = node_path_1.default.join(pluginPath, exports.require);
661
- }
662
- if (exports.typescript &&
663
- (0, utils_1.isSupportTypeScript)() &&
664
- !(await (0, utility_1.exists)(realPluginPath))) {
665
- // if require/import path not exists, use typescript path for development stage
666
- realPluginPath = node_path_1.default.join(pluginPath, exports.typescript);
667
- debug('[formatPluginPathFromPackageJSON] use typescript path %o', realPluginPath);
668
- }
669
- }
670
- return realPluginPath;
671
- }
672
- #extendPlugins(targets, plugins) {
673
- if (!plugins) {
674
- return;
675
- }
676
- for (const name in plugins) {
677
- const plugin = plugins[name];
678
- let targetPlugin = targets[name];
679
- if (!targetPlugin) {
680
- targetPlugin = {};
681
- targets[name] = targetPlugin;
682
- }
683
- if (targetPlugin.package && targetPlugin.package === plugin.package) {
684
- this.logger.warn('[@eggjs/core] plugin %s has been defined that is %j, but you define again in %s', name, targetPlugin, plugin.from);
685
- }
686
- if (plugin.path || plugin.package) {
687
- delete targetPlugin.path;
688
- delete targetPlugin.package;
689
- }
690
- for (const [prop, value] of Object.entries(plugin)) {
691
- if (value === undefined) {
692
- continue;
693
- }
694
- if (Reflect.get(targetPlugin, prop) &&
695
- Array.isArray(value) &&
696
- value.length === 0) {
697
- continue;
698
- }
699
- Reflect.set(targetPlugin, prop, value);
700
- }
701
- }
702
- }
703
- /** end Plugin loader */
704
- /** start Config loader */
705
- configMeta;
706
- config;
707
- /**
708
- * Load config/config.js
709
- *
710
- * Will merge config.default.js 和 config.${env}.js
711
- *
712
- * @function EggLoader#loadConfig
713
- * @since 1.0.0
714
- */
715
- async loadConfig() {
716
- this.timing.start('Load Config');
717
- this.configMeta = {};
718
- const target = {
719
- middleware: [],
720
- coreMiddleware: [],
721
- };
722
- // Load Application config first
723
- const appConfig = await this.#preloadAppConfig();
724
- // plugin config.default
725
- // framework config.default
726
- // app config.default
727
- // plugin config.{env}
728
- // framework config.{env}
729
- // app config.{env}
730
- for (const filename of this.getTypeFiles('config')) {
731
- for (const unit of this.getLoadUnits()) {
732
- const isApp = unit.type === 'app';
733
- const config = await this.#loadConfig(unit.path, filename, isApp ? undefined : appConfig, unit.type);
734
- if (!config) {
735
- continue;
736
- }
737
- debug('[loadConfig] Loaded config %s/%s, %j', unit.path, filename, config);
738
- (0, extend2_1.extend)(true, target, config);
739
- }
740
- }
741
- // load env from process.env.EGG_APP_CONFIG
742
- const envConfig = this.#loadConfigFromEnv();
743
- debug('[loadConfig] Loaded config from env, %j', envConfig);
744
- (0, extend2_1.extend)(true, target, envConfig);
745
- // You can manipulate the order of app.config.coreMiddleware and app.config.appMiddleware in app.js
746
- target.coreMiddleware = target.coreMiddleware || [];
747
- // alias for coreMiddleware
748
- target.coreMiddlewares = target.coreMiddleware;
749
- target.appMiddleware = target.middleware || [];
750
- // alias for appMiddleware
751
- target.appMiddlewares = target.appMiddleware;
752
- this.config = target;
753
- debug('[loadConfig] all config: %o', this.config);
754
- this.timing.end('Load Config');
755
- }
756
- async #preloadAppConfig() {
757
- const names = ['config.default', `config.${this.serverEnv}`];
758
- const target = {};
759
- for (const filename of names) {
760
- const config = await this.#loadConfig(this.options.baseDir, filename, undefined, 'app');
761
- if (!config) {
762
- continue;
763
- }
764
- (0, extend2_1.extend)(true, target, config);
765
- }
766
- return target;
767
- }
768
- async #loadConfig(dirpath, filename, extraInject, type) {
769
- const isPlugin = type === 'plugin';
770
- const isApp = type === 'app';
771
- let filepath = this.resolveModule(node_path_1.default.join(dirpath, 'config', filename));
772
- // let config.js compatible
773
- if (filename === 'config.default' && !filepath) {
774
- filepath = this.resolveModule(node_path_1.default.join(dirpath, 'config/config'));
775
- }
776
- if (!filepath) {
777
- return;
778
- }
779
- const config = await this.loadFile(filepath, this.appInfo, extraInject);
780
- if (!config)
781
- return;
782
- if (isPlugin || isApp) {
783
- (0, node_assert_1.default)(!config.coreMiddleware, 'Can not define coreMiddleware in app or plugin');
784
- }
785
- if (!isApp) {
786
- (0, node_assert_1.default)(!config.middleware, 'Can not define middleware in ' + filepath);
787
- }
788
- // store config meta, check where is the property of config come from.
789
- this.#setConfigMeta(config, filepath);
790
- return config;
791
- }
792
- #loadConfigFromEnv() {
793
- const envConfigStr = process.env.EGG_APP_CONFIG;
794
- if (!envConfigStr)
795
- return;
796
- try {
797
- const envConfig = JSON.parse(envConfigStr);
798
- this.#setConfigMeta(envConfig, '<process.env.EGG_APP_CONFIG>');
799
- return envConfig;
800
- }
801
- catch {
802
- this.options.logger.warn('[egg-loader] process.env.EGG_APP_CONFIG is not invalid JSON: %s', envConfigStr);
803
- }
804
- }
805
- #setConfigMeta(config, filepath) {
806
- config = (0, extend2_1.extend)(true, {}, config);
807
- this.#setConfig(config, filepath);
808
- (0, extend2_1.extend)(true, this.configMeta, config);
809
- }
810
- #setConfig(obj, filepath) {
811
- for (const key of Object.keys(obj)) {
812
- const val = obj[key];
813
- // ignore console
814
- if (key === 'console' &&
815
- val &&
816
- typeof val.Console === 'function' &&
817
- val.Console === console.Console) {
818
- obj[key] = filepath;
819
- continue;
820
- }
821
- if (val &&
822
- Object.getPrototypeOf(val) === Object.prototype &&
823
- Object.keys(val).length > 0) {
824
- this.#setConfig(val, filepath);
825
- continue;
826
- }
827
- obj[key] = filepath;
828
- }
829
- }
830
- /** end Config loader */
831
- /** start Extend loader */
832
- /**
833
- * mixin Agent.prototype
834
- * @function EggLoader#loadAgentExtend
835
- * @since 1.0.0
836
- */
837
- async loadAgentExtend() {
838
- await this.loadExtend('agent', this.app);
839
- }
840
- /**
841
- * mixin Application.prototype
842
- * @function EggLoader#loadApplicationExtend
843
- * @since 1.0.0
844
- */
845
- async loadApplicationExtend() {
846
- await this.loadExtend('application', this.app);
847
- }
848
- /**
849
- * mixin Request.prototype
850
- * @function EggLoader#loadRequestExtend
851
- * @since 1.0.0
852
- */
853
- async loadRequestExtend() {
854
- await this.loadExtend('request', this.app.request);
855
- }
856
- /**
857
- * mixin Response.prototype
858
- * @function EggLoader#loadResponseExtend
859
- * @since 1.0.0
860
- */
861
- async loadResponseExtend() {
862
- await this.loadExtend('response', this.app.response);
863
- }
864
- /**
865
- * mixin Context.prototype
866
- * @function EggLoader#loadContextExtend
867
- * @since 1.0.0
868
- */
869
- async loadContextExtend() {
870
- await this.loadExtend('context', this.app.context);
871
- }
872
- /**
873
- * mixin app.Helper.prototype
874
- * @function EggLoader#loadHelperExtend
875
- * @since 1.0.0
876
- */
877
- async loadHelperExtend() {
878
- if (this.app.Helper) {
879
- await this.loadExtend('helper', this.app.Helper.prototype);
880
- }
881
- }
882
- /**
883
- * Find all extend file paths by name
884
- * can be override in top level framework to support load `app/extends/{name}.js`
885
- *
886
- * @param {String} name - filename which may be `app/extend/{name}.js`
887
- * @returns {Array} filepaths extend file paths
888
- * @private
889
- */
890
- getExtendFilePaths(name) {
891
- return this.getLoadUnits().map(unit => node_path_1.default.join(unit.path, 'app/extend', name));
892
- }
893
- /**
894
- * Loader app/extend/xx.js to `prototype`,
895
- * @function loadExtend
896
- * @param {String} name - filename which may be `app/extend/{name}.js`
897
- * @param {Object} proto - prototype that mixed
898
- * @since 1.0.0
899
- */
900
- async loadExtend(name, proto) {
901
- this.timing.start(`Load extend/${name}.js`);
902
- // All extend files
903
- const filepaths = this.getExtendFilePaths(name);
904
- // if use mm.env and serverEnv is not unittest
905
- const needUnittest = 'EGG_MOCK_SERVER_ENV' in process.env && this.serverEnv !== 'unittest';
906
- const length = filepaths.length;
907
- for (let i = 0; i < length; i++) {
908
- const filepath = filepaths[i];
909
- filepaths.push(filepath + `.${this.serverEnv}`);
910
- if (needUnittest) {
911
- filepaths.push(filepath + '.unittest');
912
- }
913
- }
914
- debug('loadExtend %s, filepaths: %j', name, filepaths);
915
- const mergeRecord = new Map();
916
- for (const rawFilepath of filepaths) {
917
- const filepath = this.resolveModule(rawFilepath);
918
- if (!filepath) {
919
- // debug('loadExtend %o not found', rawFilepath);
920
- continue;
921
- }
922
- if (filepath.endsWith('/index.js')) {
923
- this.app.deprecate(`app/extend/${name}/index.js is deprecated, use app/extend/${name}.js instead`);
924
- }
925
- else if (filepath.endsWith('/index.ts')) {
926
- this.app.deprecate(`app/extend/${name}/index.ts is deprecated, use app/extend/${name}.ts instead`);
927
- }
928
- let ext = await this.requireFile(filepath);
929
- // if extend object is Class, should use Class.prototype instead
930
- if ((0, is_type_of_1.isClass)(ext)) {
931
- ext = ext.prototype;
932
- }
933
- const properties = Object.getOwnPropertyNames(ext)
934
- .concat(Object.getOwnPropertySymbols(ext))
935
- .filter(name => name !== 'constructor'); // ignore class constructor for extend
936
- for (const property of properties) {
937
- if (mergeRecord.has(property)) {
938
- debug('Property: "%s" already exists in "%s",it will be redefined by "%s"', property, mergeRecord.get(property), filepath);
939
- }
940
- // Copy descriptor
941
- let descriptor = Object.getOwnPropertyDescriptor(ext, property);
942
- let originalDescriptor = Object.getOwnPropertyDescriptor(proto, property);
943
- if (!originalDescriptor) {
944
- // try to get descriptor from originalPrototypes
945
- const originalProto = originalPrototypes[name];
946
- if (originalProto) {
947
- originalDescriptor = Object.getOwnPropertyDescriptor(originalProto, property);
948
- }
949
- }
950
- if (originalDescriptor) {
951
- // don't override descriptor
952
- descriptor = {
953
- ...descriptor,
954
- };
955
- if (!descriptor.set && originalDescriptor.set) {
956
- descriptor.set = originalDescriptor.set;
957
- }
958
- if (!descriptor.get && originalDescriptor.get) {
959
- descriptor.get = originalDescriptor.get;
960
- }
961
- }
962
- Object.defineProperty(proto, property, descriptor);
963
- mergeRecord.set(property, filepath);
964
- }
965
- debug('merge %j to %s from %s', properties, name, filepath);
966
- }
967
- this.timing.end(`Load extend/${name}.js`);
968
- }
969
- /** end Extend loader */
970
- /** start Custom loader */
971
- /**
972
- * load app.js
973
- *
974
- * @example
975
- * - old:
976
- *
977
- * ```js
978
- * module.exports = function(app) {
979
- * doSomething();
980
- * }
981
- * ```
982
- *
983
- * - new:
984
- *
985
- * ```js
986
- * module.exports = class Boot {
987
- * constructor(app) {
988
- * this.app = app;
989
- * }
990
- * configDidLoad() {
991
- * doSomething();
992
- * }
993
- * }
994
- * @since 1.0.0
995
- */
996
- async loadCustomApp() {
997
- await this.#loadBootHook('app');
998
- this.lifecycle.triggerConfigWillLoad();
999
- }
1000
- /**
1001
- * Load agent.js, same as {@link EggLoader#loadCustomApp}
1002
- */
1003
- async loadCustomAgent() {
1004
- await this.#loadBootHook('agent');
1005
- this.lifecycle.triggerConfigWillLoad();
1006
- }
1007
- // FIXME: no logger used after egg removed
1008
- loadBootHook() {
1009
- // do nothing
1010
- }
1011
- async #loadBootHook(fileName) {
1012
- this.timing.start(`Load ${fileName}.js`);
1013
- for (const unit of this.getLoadUnits()) {
1014
- const bootFile = node_path_1.default.join(unit.path, fileName);
1015
- const bootFilePath = this.resolveModule(bootFile);
1016
- if (!bootFilePath) {
1017
- // debug('[loadBootHook] %o not found', bootFile);
1018
- continue;
1019
- }
1020
- const bootHook = await this.requireFile(bootFilePath);
1021
- if ((0, is_type_of_1.isClass)(bootHook)) {
1022
- bootHook.prototype.fullPath = bootFilePath;
1023
- // if is boot class, add to lifecycle
1024
- this.lifecycle.addBootHook(bootHook);
1025
- debug('[loadBootHook] add BootHookClass from %o', bootFilePath);
1026
- }
1027
- else if (typeof bootHook === 'function') {
1028
- // if is boot function, wrap to class
1029
- // for compatibility
1030
- this.lifecycle.addFunctionAsBootHook(bootHook, bootFilePath);
1031
- debug('[loadBootHook] add bootHookFunction from %o', bootFilePath);
1032
- }
1033
- else {
1034
- this.options.logger.warn('[@eggjs/core/egg_loader] %s must exports a boot class', bootFilePath);
1035
- }
1036
- }
1037
- // init boots
1038
- this.lifecycle.init();
1039
- this.timing.end(`Load ${fileName}.js`);
1040
- }
1041
- /** end Custom loader */
1042
- /** start Service loader */
1043
- /**
1044
- * Load app/service
1045
- * @function EggLoader#loadService
1046
- * @param {Object} options - LoaderOptions
1047
- * @since 1.0.0
1048
- */
1049
- async loadService(options) {
1050
- this.timing.start('Load Service');
1051
- // 载入到 app.serviceClasses
1052
- const servicePaths = this.getLoadUnits().map(unit => node_path_1.default.join(unit.path, 'app/service'));
1053
- options = {
1054
- call: true,
1055
- caseStyle: file_loader_js_1.CaseStyle.lower,
1056
- fieldClass: 'serviceClasses',
1057
- directory: servicePaths,
1058
- ...options,
1059
- };
1060
- debug('[loadService] options: %o', options);
1061
- await this.loadToContext(servicePaths, 'service', options);
1062
- this.timing.end('Load Service');
1063
- }
1064
- /** end Service loader */
1065
- /** start Middleware loader */
1066
- /**
1067
- * Load app/middleware
1068
- *
1069
- * app.config.xx is the options of the middleware xx that has same name as config
1070
- *
1071
- * @function EggLoader#loadMiddleware
1072
- * @param {Object} opt - LoaderOptions
1073
- * @example
1074
- * ```js
1075
- * // app/middleware/status.js
1076
- * module.exports = function(options, app) {
1077
- * // options == app.config.status
1078
- * return async next => {
1079
- * await next();
1080
- * }
1081
- * }
1082
- * ```
1083
- * @since 1.0.0
1084
- */
1085
- async loadMiddleware(opt) {
1086
- this.timing.start('Load Middleware');
1087
- const app = this.app;
1088
- // load middleware to app.middleware
1089
- const middlewarePaths = this.getLoadUnits().map(unit => node_path_1.default.join(unit.path, 'app/middleware'));
1090
- opt = {
1091
- call: false,
1092
- override: true,
1093
- caseStyle: file_loader_js_1.CaseStyle.lower,
1094
- directory: middlewarePaths,
1095
- ...opt,
1096
- };
1097
- await this.loadToApp(middlewarePaths, 'middlewares', opt);
1098
- for (const name in app.middlewares) {
1099
- Object.defineProperty(app.middleware, name, {
1100
- get() {
1101
- return app.middlewares[name];
1102
- },
1103
- enumerable: false,
1104
- configurable: false,
1105
- });
1106
- }
1107
- this.options.logger.info('Use coreMiddleware order: %j', this.config.coreMiddleware);
1108
- this.options.logger.info('Use appMiddleware order: %j', this.config.appMiddleware);
1109
- // use middleware ordered by app.config.coreMiddleware and app.config.appMiddleware
1110
- const middlewareNames = this.config.coreMiddleware.concat(this.config.appMiddleware);
1111
- debug('[loadMiddleware] middlewareNames: %j', middlewareNames);
1112
- const middlewaresMap = new Map();
1113
- for (const name of middlewareNames) {
1114
- const createMiddleware = app.middlewares[name];
1115
- if (!createMiddleware) {
1116
- throw new TypeError(`Middleware ${name} not found`);
1117
- }
1118
- if (middlewaresMap.has(name)) {
1119
- throw new TypeError(`Middleware ${name} redefined`);
1120
- }
1121
- middlewaresMap.set(name, true);
1122
- const options = this.config[name] || {};
1123
- let mw = createMiddleware(options, app);
1124
- (0, node_assert_1.default)(typeof mw === 'function', `Middleware ${name} must be a function, but actual is ${(0, node_util_1.inspect)(mw)}`);
1125
- if ((0, is_type_of_1.isGeneratorFunction)(mw)) {
1126
- const fullpath = Reflect.get(createMiddleware, file_loader_js_1.FULLPATH);
1127
- throw new TypeError(`Support for generators was removed, middleware: ${name}, fullpath: ${fullpath}`);
1128
- }
1129
- mw._name = name;
1130
- // middlewares support options.enable, options.ignore and options.match
1131
- mw = wrapMiddleware(mw, options);
1132
- if (mw) {
1133
- if (debug.enabled) {
1134
- // show mw debug log on every request
1135
- mw = debugMiddlewareWrapper(mw);
1136
- }
1137
- app.use(mw);
1138
- debug('[loadMiddleware] Use middleware: %s with options: %j', name, options);
1139
- this.options.logger.info('[@eggjs/core/egg_loader] Use middleware: %s', name);
1140
- }
1141
- else {
1142
- this.options.logger.info('[@eggjs/core/egg_loader] Disable middleware: %s', name);
1143
- }
1144
- }
1145
- this.options.logger.info('[@eggjs/core/egg_loader] Loaded middleware from %j', middlewarePaths);
1146
- this.timing.end('Load Middleware');
1147
- // add router middleware, make sure router is the last middleware
1148
- const mw = this.app.router.middleware();
1149
- Reflect.set(mw, '_name', 'routerMiddleware');
1150
- this.app.use(mw);
1151
- }
1152
- /** end Middleware loader */
1153
- /** start Controller loader */
1154
- /**
1155
- * Load app/controller
1156
- * @param {Object} opt - LoaderOptions
1157
- * @since 1.0.0
1158
- */
1159
- async loadController(opt) {
1160
- this.timing.start('Load Controller');
1161
- const controllerBase = node_path_1.default.join(this.options.baseDir, 'app/controller');
1162
- opt = {
1163
- caseStyle: file_loader_js_1.CaseStyle.lower,
1164
- directory: controllerBase,
1165
- initializer: (obj, opt) => {
1166
- // return class if it exports a function
1167
- // ```js
1168
- // module.exports = app => {
1169
- // return class HomeController extends app.Controller {};
1170
- // }
1171
- // ```
1172
- if ((0, is_type_of_1.isGeneratorFunction)(obj)) {
1173
- throw new TypeError(`Support for generators was removed, fullpath: ${opt.path}`);
1174
- }
1175
- if (!(0, is_type_of_1.isClass)(obj) &&
1176
- !(0, is_type_of_1.isAsyncFunction)(obj) &&
1177
- typeof obj === 'function') {
1178
- obj = obj(this.app);
1179
- debug('[loadController] after init(app) => %o, meta: %j', obj, opt);
1180
- if ((0, is_type_of_1.isGeneratorFunction)(obj)) {
1181
- throw new TypeError(`Support for generators was removed, fullpath: ${opt.path}`);
1182
- }
1183
- }
1184
- if ((0, is_type_of_1.isClass)(obj)) {
1185
- obj.prototype.pathName = opt.pathName;
1186
- obj.prototype.fullPath = opt.path;
1187
- return wrapControllerClass(obj, opt.path);
1188
- }
1189
- if ((0, is_type_of_1.isObject)(obj)) {
1190
- return wrapObject(obj, opt.path);
1191
- }
1192
- if ((0, is_type_of_1.isAsyncFunction)(obj)) {
1193
- return wrapObject({ 'module.exports': obj }, opt.path)['module.exports'];
1194
- }
1195
- return obj;
1196
- },
1197
- ...opt,
1198
- };
1199
- await this.loadToApp(controllerBase, 'controller', opt);
1200
- debug('[loadController] app.controller => %o', this.app.controller);
1201
- this.options.logger.info('[@eggjs/core/egg_loader] Controller loaded: %s', controllerBase);
1202
- this.timing.end('Load Controller');
1203
- }
1204
- /** end Controller loader */
1205
- /** start Router loader */
1206
- /**
1207
- * Load app/router.js
1208
- * @function EggLoader#loadRouter
1209
- * @since 1.0.0
1210
- */
1211
- async loadRouter() {
1212
- this.timing.start('Load Router');
1213
- await this.loadFile(node_path_1.default.join(this.options.baseDir, 'app/router'));
1214
- this.timing.end('Load Router');
1215
- }
1216
- /** end Router loader */
1217
- /** start CustomLoader loader */
1218
- async loadCustomLoader() {
1219
- (0, node_assert_1.default)(this.config, 'should loadConfig first');
1220
- const customLoader = this.config.customLoader || {};
1221
- for (const property of Object.keys(customLoader)) {
1222
- const loaderConfig = {
1223
- ...customLoader[property],
1224
- };
1225
- (0, node_assert_1.default)(loaderConfig.directory, `directory is required for config.customLoader.${property}`);
1226
- let directory;
1227
- if (loaderConfig.loadunit === true) {
1228
- directory = this.getLoadUnits().map(unit => node_path_1.default.join(unit.path, loaderConfig.directory));
1229
- }
1230
- else {
1231
- directory = node_path_1.default.join(this.appInfo.baseDir, loaderConfig.directory);
1232
- }
1233
- const inject = loaderConfig.inject || 'app';
1234
- debug('[loadCustomLoader] loaderConfig: %o, inject: %o, directory: %o', loaderConfig, inject, directory);
1235
- switch (inject) {
1236
- case 'ctx': {
1237
- (0, node_assert_1.default)(!(property in this.app.context), `customLoader should not override ctx.${property}`);
1238
- const options = {
1239
- caseStyle: file_loader_js_1.CaseStyle.lower,
1240
- fieldClass: `${property}Classes`,
1241
- ...loaderConfig,
1242
- directory,
1243
- };
1244
- await this.loadToContext(directory, property, options);
1245
- break;
1246
- }
1247
- case 'app': {
1248
- (0, node_assert_1.default)(!(property in this.app), `customLoader should not override app.${property}`);
1249
- const options = {
1250
- caseStyle: file_loader_js_1.CaseStyle.lower,
1251
- initializer: (Clazz) => {
1252
- return (0, is_type_of_1.isClass)(Clazz) ? new Clazz(this.app) : Clazz;
1253
- },
1254
- ...loaderConfig,
1255
- directory,
1256
- };
1257
- await this.loadToApp(directory, property, options);
1258
- break;
1259
- }
1260
- default:
1261
- throw new Error('inject only support app or ctx');
1262
- }
1263
- }
1264
- }
1265
- /** end CustomLoader loader */
1266
- // Low Level API
1267
- /**
1268
- * Load single file, will invoke when export is function
1269
- *
1270
- * @param {String} filepath - fullpath
1271
- * @param {Array} inject - pass rest arguments into the function when invoke
1272
- * @returns {Object} exports
1273
- * @example
1274
- * ```js
1275
- * app.loader.loadFile(path.join(app.options.baseDir, 'config/router.js'));
1276
- * ```
1277
- * @since 1.0.0
1278
- */
1279
- async loadFile(filepath, ...inject) {
1280
- const fullpath = filepath && this.resolveModule(filepath);
1281
- if (!fullpath) {
1282
- return null;
1283
- }
1284
- // function(arg1, args, ...) {}
1285
- if (inject.length === 0) {
1286
- inject = [this.app];
1287
- }
1288
- let mod = await this.requireFile(fullpath);
1289
- if (typeof mod === 'function' && !(0, is_type_of_1.isClass)(mod)) {
1290
- mod = mod(...inject);
1291
- if ((0, is_type_of_1.isPromise)(mod)) {
1292
- mod = await mod;
1293
- }
1294
- }
1295
- return mod;
1296
- }
1297
- /**
1298
- * @param {String} filepath - fullpath
1299
- * @returns {Object} exports
1300
- * @private
1301
- */
1302
- async requireFile(filepath) {
1303
- const timingKey = `Require(${this.#requiredCount++}) ${index_js_1.default.getResolvedFilename(filepath, this.options.baseDir)}`;
1304
- this.timing.start(timingKey);
1305
- const mod = await index_js_1.default.loadFile(filepath);
1306
- this.timing.end(timingKey);
1307
- return mod;
1308
- }
1309
- /**
1310
- * Get all loadUnit
1311
- *
1312
- * loadUnit is a directory that can be loaded by EggLoader, it has the same structure.
1313
- * loadUnit has a path and a type(app, framework, plugin).
1314
- *
1315
- * The order of the loadUnits:
1316
- *
1317
- * 1. plugin
1318
- * 2. framework
1319
- * 3. app
1320
- *
1321
- * @returns {Array} loadUnits
1322
- * @since 1.0.0
1323
- */
1324
- getLoadUnits() {
1325
- if (this.dirs) {
1326
- return this.dirs;
1327
- }
1328
- this.dirs = [];
1329
- if (this.orderPlugins) {
1330
- for (const plugin of this.orderPlugins) {
1331
- this.dirs.push({
1332
- path: plugin.path,
1333
- type: 'plugin',
1334
- });
1335
- }
1336
- }
1337
- // framework or egg path
1338
- for (const eggPath of this.eggPaths) {
1339
- this.dirs.push({
1340
- path: eggPath,
1341
- type: 'framework',
1342
- });
1343
- }
1344
- // application
1345
- this.dirs.push({
1346
- path: this.options.baseDir,
1347
- type: 'app',
1348
- });
1349
- debug('Loaded dirs %j', this.dirs);
1350
- return this.dirs;
1351
- }
1352
- /**
1353
- * Load files using {@link FileLoader}, inject to {@link Application}
1354
- * @param {String|Array} directory - see {@link FileLoader}
1355
- * @param {String} property - see {@link FileLoader}
1356
- * @param {Object} options - see {@link FileLoader}
1357
- * @since 1.0.0
1358
- */
1359
- async loadToApp(directory, property, options) {
1360
- const target = {};
1361
- Reflect.set(this.app, property, target);
1362
- const loadOptions = {
1363
- ...options,
1364
- directory: options?.directory ?? directory,
1365
- target,
1366
- inject: this.app,
1367
- };
1368
- const timingKey = `Load "${String(property)}" to Application`;
1369
- this.timing.start(timingKey);
1370
- await new file_loader_js_1.FileLoader(loadOptions).load();
1371
- this.timing.end(timingKey);
1372
- }
1373
- /**
1374
- * Load files using {@link ContextLoader}
1375
- * @param {String|Array} directory - see {@link ContextLoader}
1376
- * @param {String} property - see {@link ContextLoader}
1377
- * @param {Object} options - see {@link ContextLoader}
1378
- * @since 1.0.0
1379
- */
1380
- async loadToContext(directory, property, options) {
1381
- const loadOptions = {
1382
- ...options,
1383
- directory: options?.directory || directory,
1384
- property,
1385
- inject: this.app,
1386
- };
1387
- const timingKey = `Load "${String(property)}" to Context`;
1388
- this.timing.start(timingKey);
1389
- await new context_loader_js_1.ContextLoader(loadOptions).load();
1390
- this.timing.end(timingKey);
1391
- }
1392
- /**
1393
- * @member {FileLoader} EggLoader#FileLoader
1394
- * @since 1.0.0
1395
- */
1396
- get FileLoader() {
1397
- return file_loader_js_1.FileLoader;
1398
- }
1399
- /**
1400
- * @member {ContextLoader} EggLoader#ContextLoader
1401
- * @since 1.0.0
1402
- */
1403
- get ContextLoader() {
1404
- return context_loader_js_1.ContextLoader;
1405
- }
1406
- getTypeFiles(filename) {
1407
- const files = [`${filename}.default`];
1408
- if (this.serverScope)
1409
- files.push(`${filename}.${this.serverScope}`);
1410
- if (this.serverEnv === 'default')
1411
- return files;
1412
- files.push(`${filename}.${this.serverEnv}`);
1413
- if (this.serverScope) {
1414
- files.push(`${filename}.${this.serverScope}_${this.serverEnv}`);
1415
- }
1416
- return files;
1417
- }
1418
- resolveModule(filepath) {
1419
- let fullPath;
1420
- try {
1421
- fullPath = index_js_1.default.resolvePath(filepath);
1422
- }
1423
- catch {
1424
- // debug('[resolveModule] Module %o resolve error: %s', filepath, err.stack);
1425
- return undefined;
1426
- }
1427
- // if (process.env.EGG_TYPESCRIPT !== 'true' && fullPath.endsWith('.ts')) {
1428
- // return undefined;
1429
- // }
1430
- return fullPath;
1431
- }
1432
- }
1433
- exports.EggLoader = EggLoader;
1434
- function depCompatible(plugin) {
1435
- if (plugin.dep &&
1436
- !(Array.isArray(plugin.dependencies) && plugin.dependencies.length > 0)) {
1437
- plugin.dependencies = plugin.dep;
1438
- delete plugin.dep;
1439
- }
1440
- }
1441
- function isValidatePackageName(name) {
1442
- // only check file path style
1443
- if (name.startsWith('.'))
1444
- return false;
1445
- if (name.startsWith('/'))
1446
- return false;
1447
- if (name.includes(':'))
1448
- return false;
1449
- return true;
1450
- }
1451
- // support pathMatching on middleware
1452
- function wrapMiddleware(mw, options) {
1453
- // support options.enable
1454
- if (options.enable === false) {
1455
- return null;
1456
- }
1457
- // support options.match and options.ignore
1458
- if (!options.match && !options.ignore) {
1459
- return mw;
1460
- }
1461
- const match = (0, egg_path_matching_1.pathMatching)(options);
1462
- const fn = (ctx, next) => {
1463
- if (!match(ctx))
1464
- return next();
1465
- return mw(ctx, next);
1466
- };
1467
- fn._name = `${mw._name}middlewareWrapper`;
1468
- return fn;
1469
- }
1470
- function debugMiddlewareWrapper(mw) {
1471
- const fn = async (ctx, next) => {
1472
- const startTime = (0, performance_ms_1.now)();
1473
- debug('[debugMiddlewareWrapper] [%s %s] enter middleware: %s', ctx.method, ctx.url, mw._name);
1474
- await mw(ctx, next);
1475
- const rt = (0, performance_ms_1.diff)(startTime);
1476
- debug('[debugMiddlewareWrapper] [%s %s] after middleware: %s [%sms]', ctx.method, ctx.url, mw._name, rt);
1477
- };
1478
- fn._name = `${mw._name}DebugWrapper`;
1479
- return fn;
1480
- }
1481
- // wrap the controller class, yield a object with middlewares
1482
- function wrapControllerClass(Controller, fullPath) {
1483
- let proto = Controller.prototype;
1484
- const ret = {};
1485
- // tracing the prototype chain
1486
- while (proto !== Object.prototype) {
1487
- const keys = Object.getOwnPropertyNames(proto);
1488
- for (const key of keys) {
1489
- // getOwnPropertyNames will return constructor
1490
- // that should be ignored
1491
- if (key === 'constructor') {
1492
- continue;
1493
- }
1494
- // skip getter, setter & non-function properties
1495
- const d = Object.getOwnPropertyDescriptor(proto, key);
1496
- // prevent to override sub method
1497
- if (typeof d?.value === 'function' && !Object.hasOwn(ret, key)) {
1498
- const controllerMethodName = `${Controller.name}.${key}`;
1499
- if ((0, is_type_of_1.isGeneratorFunction)(d.value)) {
1500
- throw new TypeError(`Support for generators was removed, controller \`${controllerMethodName}\`, fullpath: ${fullPath}`);
1501
- }
1502
- ret[key] = controllerMethodToMiddleware(Controller, key);
1503
- ret[key][file_loader_js_1.FULLPATH] = `${fullPath}#${controllerMethodName}()`;
1504
- }
1505
- }
1506
- proto = Object.getPrototypeOf(proto);
1507
- }
1508
- return ret;
1509
- }
1510
- function controllerMethodToMiddleware(Controller, key) {
1511
- return function classControllerMiddleware(...args) {
1512
- const controller = new Controller(this);
1513
- if (!this.app.config.controller?.supportParams) {
1514
- args = [this];
1515
- }
1516
- // @ts-expect-error key exists
1517
- return controller[key](...args);
1518
- };
1519
- }
1520
- // wrap the method of the object, method can receive ctx as it's first argument
1521
- function wrapObject(obj, fullPath, prefix) {
1522
- const keys = Object.keys(obj);
1523
- const ret = {};
1524
- prefix = prefix ?? '';
1525
- for (const key of keys) {
1526
- const controllerMethodName = `${prefix}${key}`;
1527
- const item = obj[key];
1528
- if ((0, is_type_of_1.isGeneratorFunction)(item)) {
1529
- throw new TypeError(`Support for generators was removed, controller \`${controllerMethodName}\`, fullpath: ${fullPath}`);
1530
- }
1531
- if (typeof item === 'function') {
1532
- const names = (0, utility_1.getParamNames)(item);
1533
- if (names[0] === 'next') {
1534
- throw new Error(`controller \`${controllerMethodName}\` should not use next as argument from file ${fullPath}`);
1535
- }
1536
- ret[key] = objectFunctionToMiddleware(item);
1537
- ret[key][file_loader_js_1.FULLPATH] = `${fullPath}#${controllerMethodName}()`;
1538
- }
1539
- else if ((0, is_type_of_1.isObject)(item)) {
1540
- ret[key] = wrapObject(item, fullPath, `${controllerMethodName}.`);
1541
- }
1542
- }
1543
- debug('[wrapObject] fullPath: %s, prefix: %s => %o', fullPath, prefix, ret);
1544
- return ret;
1545
- }
1546
- function objectFunctionToMiddleware(func) {
1547
- async function objectControllerMiddleware(...args) {
1548
- if (!this.app.config.controller?.supportParams) {
1549
- args = [this];
1550
- }
1551
- return await func.apply(this, args);
1552
- }
1553
- for (const key in func) {
1554
- Reflect.set(objectControllerMiddleware, key, Reflect.get(func, key));
1555
- }
1556
- return objectControllerMiddleware;
1557
- }
1558
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWdnX2xvYWRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9sb2FkZXIvZWdnX2xvYWRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxzREFBeUI7QUFDekIsMERBQTZCO0FBQzdCLDhEQUFpQztBQUNqQyx5Q0FBOEM7QUFFOUMsK0NBQXVDO0FBQ3ZDLDJDQU1vQjtBQUVwQixxQ0FBd0U7QUFDeEUscUNBQWlDO0FBQ2pDLG9DQUtvQjtBQUNwQixtREFBbUU7QUFDbkUsd0NBQTBEO0FBQzFELHlEQUEyRTtBQUMzRSxtREFBMkM7QUFFM0MscURBSzBCO0FBQzFCLDJEQUErRTtBQUMvRSxpRUFBb0Q7QUFDcEQsMERBQW9EO0FBQ3BELGtEQUE0QztBQUs1QyxNQUFNLEtBQUssR0FBRyxJQUFBLG9CQUFRLEVBQUMsK0JBQStCLENBQUMsQ0FBQztBQUV4RCxNQUFNLGtCQUFrQixHQUE0QjtJQUNsRCxPQUFPLEVBQUUsYUFBTyxDQUFDLFNBQVM7SUFDMUIsUUFBUSxFQUFFLGNBQVEsQ0FBQyxTQUFTO0lBQzVCLE9BQU8sRUFBRSxhQUFVLENBQUMsU0FBUztJQUM3QixXQUFXLEVBQUUsaUJBQVcsQ0FBQyxTQUFTO0NBQ25DLENBQUM7QUF5QkYsTUFBYSxTQUFTO0lBQ3BCLGNBQWMsR0FBRyxDQUFDLENBQUM7SUFDVixPQUFPLENBQW1CO0lBQzFCLE1BQU0sQ0FBUztJQUNmLEdBQUcsQ0FBc0I7SUFDekIsUUFBUSxDQUFXO0lBQ25CLFNBQVMsQ0FBUztJQUNsQixXQUFXLENBQVM7SUFDcEIsT0FBTyxDQUFhO0lBQzdCLElBQUksQ0FBZ0I7SUFFcEI7Ozs7Ozs7O09BUUc7SUFDSCxZQUFZLE9BQXlCO1FBQ25DLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1FBQ3ZCLElBQUEscUJBQU0sRUFDSixpQkFBRSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUNuQyxHQUFH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