@eggjs/core 7.0.0-beta.35 → 7.0.0-beta.36

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/dist/egg.js CHANGED
@@ -1,430 +1,398 @@
1
- import assert from 'node:assert';
2
- import { debuglog } from 'node:util';
3
- import { Application as KoaApplication, Context as KoaContext, Request as KoaRequest, Response as KoaResponse, } from '@eggjs/koa';
4
- import { EggRouter as Router } from '@eggjs/router';
5
- import { EggConsoleLogger } from 'egg-logger';
1
+ import utils_default from "./utils/index.js";
6
2
  import { BaseContextClass } from "./base_context_class.js";
7
3
  import { Lifecycle } from "./lifecycle.js";
4
+ import { Timing } from "./utils/timing.js";
8
5
  import { EggLoader } from "./loader/egg_loader.js";
9
6
  import { Singleton } from "./singleton.js";
10
- import utils, {} from "./utils/index.js";
11
- import { Timing } from "./utils/timing.js";
12
- const debug = debuglog('egg/core/egg');
13
- export const EGG_LOADER = Symbol.for('egg#loader');
14
- // export @eggjs/koa classes
15
- export { KoaRequest, KoaResponse, KoaContext, KoaApplication, Router };
16
- // export @eggjs/core classes
17
- export class Request extends KoaRequest {
18
- }
19
- export class Response extends KoaResponse {
20
- }
21
- export class Context extends KoaContext {
22
- // #region router
23
- /**
24
- * Returns map of URL parameters for given `path` and `paramNames`.
25
- * @example
26
- * ##### ctx.params.id {string}
27
- *
28
- * `GET /api/users/1` => `'1'`
29
- *
30
- * ##### ctx.params.per_page {string}
31
- *
32
- * The number of every page, `GET /api/users?per_page=20` => `20`
33
- */
34
- params;
35
- /**
36
- * Returns array of router regexp url path captures.
37
- */
38
- captures;
39
- /**
40
- * Returns the name of the matched router.
41
- */
42
- routerName;
43
- /**
44
- * Returns the path of the matched router.
45
- */
46
- routerPath;
47
- }
48
- export class EggCore extends KoaApplication {
49
- options;
50
- timing;
51
- console;
52
- BaseContextClass;
53
- Controller;
54
- Service;
55
- Helper;
56
- lifecycle;
57
- loader;
58
- #closePromise;
59
- #router;
60
- /** auto inject on loadService() */
61
- serviceClasses = {};
62
- /** auto inject on loadController() */
63
- controller = {};
64
- /** auto inject on loadMiddleware() */
65
- middlewares = {};
66
- /**
67
- * @class
68
- * @param {Object} options - options
69
- * @param {String} [options.baseDir] - the directory of application
70
- * @param {String} [options.type] - whether it's running in app worker or agent worker
71
- * @param {Object} [options.plugins] - custom plugins
72
- * @since 1.0.0
73
- */
74
- constructor(options = {}) {
75
- options.baseDir = options.baseDir ?? process.cwd();
76
- options.type = options.type ?? 'application';
77
- assert(typeof options.baseDir === 'string', 'options.baseDir required, and must be a string');
78
- // assert(fs.existsSync(options.baseDir), `Directory ${options.baseDir} not exists`);
79
- // assert(fs.statSync(options.baseDir).isDirectory(), `Directory ${options.baseDir} is not a directory`);
80
- assert(options.type === 'application' || options.type === 'agent', 'options.type should be application or agent');
81
- super();
82
- this.timing = new Timing();
83
- /**
84
- * @member {Object} EggCore#options
85
- * @private
86
- * @since 1.0.0
87
- */
88
- this.options = options;
89
- /**
90
- * logging for EggCore, avoid using console directly
91
- * @member {Logger} EggCore#console
92
- * @private
93
- * @since 1.0.0
94
- */
95
- this.console = new EggConsoleLogger();
96
- /**
97
- * @member {BaseContextClass} EggCore#BaseContextClass
98
- * @since 1.0.0
99
- */
100
- this.BaseContextClass = BaseContextClass;
101
- /**
102
- * Base controller to be extended by controller in `app.controller`
103
- * @class Controller
104
- * @augments BaseContextClass
105
- * @example
106
- * class UserController extends app.Controller {}
107
- */
108
- const Controller = this.BaseContextClass;
109
- /**
110
- * Retrieve base controller
111
- * @member {Controller} EggCore#Controller
112
- * @since 1.0.0
113
- */
114
- this.Controller = Controller;
115
- /**
116
- * Base service to be extended by services in `app.service`
117
- * @class Service
118
- * @augments BaseContextClass
119
- * @example
120
- * class UserService extends app.Service {}
121
- */
122
- const Service = this.BaseContextClass;
123
- /**
124
- * Retrieve base service
125
- * @member {Service} EggCore#Service
126
- * @since 1.0.0
127
- */
128
- this.Service = Service;
129
- this.lifecycle = new Lifecycle({
130
- baseDir: options.baseDir,
131
- app: this,
132
- logger: this.console,
133
- });
134
- this.lifecycle.on('error', (err) => this.emit('error', err));
135
- this.lifecycle.on('ready_timeout', (id) => this.emit('ready_timeout', id));
136
- this.lifecycle.on('ready_stat', (data) => this.emit('ready_stat', data));
137
- /**
138
- * The loader instance, the default class is {@link EggLoader}.
139
- * If you want define
140
- * @member {EggLoader} EggCore#loader
141
- * @since 1.0.0
142
- */
143
- let Loader;
144
- if (EGG_LOADER in this) {
145
- this.deprecate('Symbol.for("egg#loader") is deprecated, please use "override the `customEggLoader()` method" instead');
146
- Loader = this[EGG_LOADER];
147
- }
148
- else {
149
- Loader = this.customEggLoader();
150
- }
151
- this.loader = new Loader({
152
- baseDir: options.baseDir,
153
- app: this,
154
- plugins: options.plugins,
155
- logger: this.console,
156
- serverScope: options.serverScope,
157
- env: options.env ?? '',
158
- EggCoreClass: EggCore,
159
- });
160
- }
161
- get logger() {
162
- return this.console;
163
- }
164
- get coreLogger() {
165
- return this.console;
166
- }
167
- /**
168
- * create a singleton instance
169
- * @param {String} name - unique name for singleton
170
- * @param {Function|AsyncFunction} create - method will be invoked when singleton instance create
171
- */
172
- addSingleton(name, create) {
173
- const options = {
174
- name,
175
- create,
176
- app: this,
177
- };
178
- const singleton = new Singleton(options);
179
- const initPromise = singleton.init();
180
- if (initPromise) {
181
- this.lifecycle.registerBeforeStart(async () => {
182
- await initPromise;
183
- }, `${name}-singleton-init`);
184
- }
185
- }
186
- /**
187
- * override koa's app.use, support generator function
188
- * @since 1.0.0
189
- */
190
- use(fn) {
191
- assert(typeof fn === 'function', 'app.use() requires a function');
192
- debug('[use] add middleware: %o', fn._name || fn.name || '-');
193
- this.middleware.push(fn);
194
- return this;
195
- }
196
- /**
197
- * Whether `application` or `agent`
198
- * @member {String}
199
- * @since 1.0.0
200
- */
201
- get type() {
202
- return this.options.type;
203
- }
204
- /**
205
- * The current directory of application
206
- * @member {String}
207
- * @see {@link AppInfo#baseDir}
208
- * @since 1.0.0
209
- */
210
- get baseDir() {
211
- return this.options.baseDir;
212
- }
213
- /**
214
- * Alias to {@link https://npmjs.com/package/depd}
215
- * @member {Function}
216
- * @since 1.0.0
217
- */
218
- get deprecate() {
219
- return utils.deprecated;
220
- }
221
- /**
222
- * The name of application
223
- * @member {String}
224
- * @see {@link AppInfo#name}
225
- * @since 1.0.0
226
- */
227
- get name() {
228
- return this.loader ? this.loader.pkg.name : '';
229
- }
230
- /**
231
- * Retrieve enabled plugins
232
- * @member {Object}
233
- * @since 1.0.0
234
- */
235
- get plugins() {
236
- return this.loader ? this.loader.plugins : {};
237
- }
238
- /**
239
- * The configuration of application
240
- * @member {Config}
241
- * @since 1.0.0
242
- */
243
- get config() {
244
- return this.loader ? this.loader.config : {};
245
- }
246
- /**
247
- * Execute scope after loaded and before app start.
248
- *
249
- * Notice:
250
- * This method is now NOT recommended and regarded as a deprecated one,
251
- * For plugin development, we should use `didLoad` instead.
252
- * For application development, we should use `willReady` instead.
253
- *
254
- * @see https://eggjs.org/en/advanced/loader.html#beforestart
255
- *
256
- * @param {Function} scope function will execute before app start
257
- * @param {string} [name] scope name, default is empty string
258
- */
259
- beforeStart(scope, name) {
260
- this.deprecate('`beforeStart` was deprecated, please use "Life Cycles" instead, see https://www.eggjs.org/advanced/loader#life-cycles');
261
- this.lifecycle.registerBeforeStart(scope, name ?? '');
262
- }
263
- ready(flagOrFunction) {
264
- if (flagOrFunction === undefined) {
265
- return this.lifecycle.ready();
266
- }
267
- return this.lifecycle.ready(flagOrFunction);
268
- }
269
- /**
270
- * If a client starts asynchronously, you can register `readyCallback`,
271
- * then the application will wait for the callback to ready
272
- *
273
- * It will log when the callback is not invoked after 10s
274
- *
275
- * Recommend to use {@link EggCore#beforeStart}
276
- * @since 1.0.0
277
- *
278
- * @param {String} name - readyCallback task name
279
- * @param {object} opts -
280
- * - {Number} [timeout=10000] - emit `ready_timeout` when it doesn't finish but reach the timeout
281
- * - {Boolean} [isWeakDep=false] - whether it's a weak dependency
282
- * @returns {Function} - a callback
283
- * @example
284
- * const done = app.readyCallback('mysql');
285
- * mysql.ready(done);
286
- */
287
- readyCallback(name, opts) {
288
- this.deprecate('`readyCallback` was deprecated, please use "Life Cycles" instead, see https://www.eggjs.org/advanced/loader#life-cycles');
289
- return this.lifecycle.legacyReadyCallback(name, opts);
290
- }
291
- /**
292
- * Register a function that will be called when app close.
293
- *
294
- * Notice:
295
- * This method is now NOT recommended directly used,
296
- * Developers SHOULDN'T use app.beforeClose directly now,
297
- * but in the form of class to implement beforeClose instead.
298
- *
299
- * @see https://eggjs.org/en/advanced/loader.html#beforeclose
300
- *
301
- * @param {Function} fn - the function that can be generator function or async function.
302
- */
303
- beforeClose(fn, name) {
304
- this.deprecate('`beforeClose` was deprecated, please use "Life Cycles" instead, see https://www.eggjs.org/advanced/loader#life-cycles');
305
- this.lifecycle.registerBeforeClose(fn, name);
306
- }
307
- /**
308
- * Close all, it will close
309
- * - callbacks registered by beforeClose
310
- * - emit `close` event
311
- * - remove add listeners
312
- *
313
- * If error is thrown when it's closing, the promise will reject.
314
- * It will also reject after following call.
315
- * @returns {Promise} promise
316
- * @since 1.0.0
317
- */
318
- async close() {
319
- if (this.#closePromise)
320
- return this.#closePromise;
321
- this.#closePromise = this.lifecycle.close();
322
- return this.#closePromise;
323
- }
324
- /**
325
- * get router
326
- * @member {Router} EggCore#router
327
- * @since 1.0.0
328
- */
329
- get router() {
330
- if (this.#router) {
331
- return this.#router;
332
- }
333
- this.#router = new Router({ sensitive: true }, this);
334
- return this.#router;
335
- }
336
- /**
337
- * Alias to {@link Router#url}
338
- * @param {String} name - Router name
339
- * @param {Object} params - more parameters
340
- * @returns {String} url
341
- */
342
- url(name, params) {
343
- return this.router.url(name, params);
344
- }
345
- head(...args) {
346
- this.router.head.apply(this.router, args);
347
- return this;
348
- }
349
- get(...args) {
350
- this.router.get.apply(this.router, args);
351
- return this;
352
- }
353
- put(...args) {
354
- this.router.put.apply(this.router, args);
355
- return this;
356
- }
357
- patch(...args) {
358
- this.router.patch.apply(this.router, args);
359
- return this;
360
- }
361
- post(...args) {
362
- this.router.post.apply(this.router, args);
363
- return this;
364
- }
365
- delete(...args) {
366
- this.router.delete.apply(this.router, args);
367
- return this;
368
- }
369
- del(...args) {
370
- this.router.del.apply(this.router, args);
371
- return this;
372
- }
373
- all(...args) {
374
- this.router.all.apply(this.router, args);
375
- return this;
376
- }
377
- resources(...args) {
378
- this.router.resources.apply(this.router, args);
379
- return this;
380
- }
381
- redirect(source, destination, status = 301) {
382
- this.router.redirect(source, destination, status);
383
- return this;
384
- }
385
- register(path, methods, middleware, opts) {
386
- this.router.register(path, methods, middleware, opts);
387
- return this;
388
- }
389
- /**
390
- * Override this method to customize the loader
391
- *
392
- * ```ts
393
- * // src/ExampleApplication.ts
394
- * import { Application } from 'egg';
395
- *
396
- * class ExampleApplication extends Application {
397
- * protected override customEggLoader() {
398
- * return ExampleLoader;
399
- * }
400
- * }
401
- * ```
402
- *
403
- * @since 4.0.0
404
- * @returns {typeof EggLoader}
405
- */
406
- customEggLoader() {
407
- return EggLoader;
408
- }
409
- /**
410
- * Override this method to customize the egg paths
411
- *
412
- * ```ts
413
- * // src/ExampleApplication.ts
414
- * import { Application } from 'egg';
415
- *
416
- * class ExampleApplication extends Application {
417
- * protected override customEggPaths() {
418
- * return [path.dirname(import.meta.dirname), ...super.customEggPaths()];
419
- * }
420
- * }
421
- * ```
422
- *
423
- * @since 4.0.0
424
- * @returns {string[]}
425
- */
426
- customEggPaths() {
427
- return [];
428
- }
429
- }
430
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWdnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2VnZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLE1BQU0sTUFBTSxhQUFhLENBQUM7QUFDakMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUVyQyxPQUFPLEVBQ0wsV0FBVyxJQUFJLGNBQWMsRUFDN0IsT0FBTyxJQUFJLFVBQVUsRUFDckIsT0FBTyxJQUFJLFVBQVUsRUFDckIsUUFBUSxJQUFJLFdBQVcsR0FHeEIsTUFBTSxZQUFZLENBQUM7QUFDcEIsT0FBTyxFQUFFLFNBQVMsSUFBSSxNQUFNLEVBQWtELE1BQU0sZUFBZSxDQUFDO0FBQ3BHLE9BQU8sRUFBRSxnQkFBZ0IsRUFBZSxNQUFNLFlBQVksQ0FBQztBQUczRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ25ELE9BQU8sRUFBRSxTQUFTLEVBQXFELE1BQU0sZ0JBQWdCLENBQUM7QUFFOUYsT0FBTyxLQUFLLEVBQUUsRUFBWSxNQUFNLGtCQUFrQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUUzQyxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDLENBQUM7QUFFdkMsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFXLE1BQU0sQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUM7QUFZM0QsNEJBQTRCO0FBQzVCLE9BQU8sRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLENBQUM7QUFLdkUsNkJBQTZCO0FBQzdCLE1BQU0sT0FBTyxPQUFRLFNBQVEsVUFBVTtDQUl0QztBQUVELE1BQU0sT0FBTyxR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
7
+ import { debuglog } from "node:util";
8
+ import assert from "node:assert";
9
+ import { Application as KoaApplication, Context as KoaContext, Request as KoaRequest, Response as KoaResponse } from "@eggjs/koa";
10
+ import { EggRouter as Router } from "@eggjs/router";
11
+ import { EggConsoleLogger } from "egg-logger";
12
+
13
+ //#region src/egg.ts
14
+ const debug = debuglog("egg/core/egg");
15
+ const EGG_LOADER = Symbol.for("egg#loader");
16
+ var Request$1 = class extends KoaRequest {};
17
+ var Response$1 = class extends KoaResponse {};
18
+ var Context$1 = class extends KoaContext {
19
+ /**
20
+ * Returns map of URL parameters for given `path` and `paramNames`.
21
+ * @example
22
+ * ##### ctx.params.id {string}
23
+ *
24
+ * `GET /api/users/1` => `'1'`
25
+ *
26
+ * ##### ctx.params.per_page {string}
27
+ *
28
+ * The number of every page, `GET /api/users?per_page=20` => `20`
29
+ */
30
+ params;
31
+ /**
32
+ * Returns array of router regexp url path captures.
33
+ */
34
+ captures;
35
+ /**
36
+ * Returns the name of the matched router.
37
+ */
38
+ routerName;
39
+ /**
40
+ * Returns the path of the matched router.
41
+ */
42
+ routerPath;
43
+ };
44
+ var EggCore = class EggCore extends KoaApplication {
45
+ options;
46
+ timing;
47
+ console;
48
+ BaseContextClass;
49
+ Controller;
50
+ Service;
51
+ Helper;
52
+ lifecycle;
53
+ loader;
54
+ #closePromise;
55
+ #router;
56
+ /** auto inject on loadService() */
57
+ serviceClasses = {};
58
+ /** auto inject on loadController() */
59
+ controller = {};
60
+ /** auto inject on loadMiddleware() */
61
+ middlewares = {};
62
+ /**
63
+ * @class
64
+ * @param {Object} options - options
65
+ * @param {String} [options.baseDir] - the directory of application
66
+ * @param {String} [options.type] - whether it's running in app worker or agent worker
67
+ * @param {Object} [options.plugins] - custom plugins
68
+ * @since 1.0.0
69
+ */
70
+ constructor(options = {}) {
71
+ options.baseDir = options.baseDir ?? process.cwd();
72
+ options.type = options.type ?? "application";
73
+ assert(typeof options.baseDir === "string", "options.baseDir required, and must be a string");
74
+ assert(options.type === "application" || options.type === "agent", "options.type should be application or agent");
75
+ super();
76
+ this.timing = new Timing();
77
+ /**
78
+ * @member {Object} EggCore#options
79
+ * @private
80
+ * @since 1.0.0
81
+ */
82
+ this.options = options;
83
+ /**
84
+ * logging for EggCore, avoid using console directly
85
+ * @member {Logger} EggCore#console
86
+ * @private
87
+ * @since 1.0.0
88
+ */
89
+ this.console = new EggConsoleLogger();
90
+ /**
91
+ * @member {BaseContextClass} EggCore#BaseContextClass
92
+ * @since 1.0.0
93
+ */
94
+ this.BaseContextClass = BaseContextClass;
95
+ /**
96
+ * Retrieve base controller
97
+ * @member {Controller} EggCore#Controller
98
+ * @since 1.0.0
99
+ */
100
+ this.Controller = this.BaseContextClass;
101
+ /**
102
+ * Retrieve base service
103
+ * @member {Service} EggCore#Service
104
+ * @since 1.0.0
105
+ */
106
+ this.Service = this.BaseContextClass;
107
+ this.lifecycle = new Lifecycle({
108
+ baseDir: options.baseDir,
109
+ app: this,
110
+ logger: this.console
111
+ });
112
+ this.lifecycle.on("error", (err) => this.emit("error", err));
113
+ this.lifecycle.on("ready_timeout", (id) => this.emit("ready_timeout", id));
114
+ this.lifecycle.on("ready_stat", (data) => this.emit("ready_stat", data));
115
+ /**
116
+ * The loader instance, the default class is {@link EggLoader}.
117
+ * If you want define
118
+ * @member {EggLoader} EggCore#loader
119
+ * @since 1.0.0
120
+ */
121
+ let Loader;
122
+ if (EGG_LOADER in this) {
123
+ this.deprecate("Symbol.for(\"egg#loader\") is deprecated, please use \"override the `customEggLoader()` method\" instead");
124
+ Loader = this[EGG_LOADER];
125
+ } else Loader = this.customEggLoader();
126
+ this.loader = new Loader({
127
+ baseDir: options.baseDir,
128
+ app: this,
129
+ plugins: options.plugins,
130
+ logger: this.console,
131
+ serverScope: options.serverScope,
132
+ env: options.env ?? "",
133
+ EggCoreClass: EggCore
134
+ });
135
+ }
136
+ get logger() {
137
+ return this.console;
138
+ }
139
+ get coreLogger() {
140
+ return this.console;
141
+ }
142
+ /**
143
+ * create a singleton instance
144
+ * @param {String} name - unique name for singleton
145
+ * @param {Function|AsyncFunction} create - method will be invoked when singleton instance create
146
+ */
147
+ addSingleton(name, create) {
148
+ const initPromise = new Singleton({
149
+ name,
150
+ create,
151
+ app: this
152
+ }).init();
153
+ if (initPromise) this.lifecycle.registerBeforeStart(async () => {
154
+ await initPromise;
155
+ }, `${name}-singleton-init`);
156
+ }
157
+ /**
158
+ * override koa's app.use, support generator function
159
+ * @since 1.0.0
160
+ */
161
+ use(fn) {
162
+ assert(typeof fn === "function", "app.use() requires a function");
163
+ debug("[use] add middleware: %o", fn._name || fn.name || "-");
164
+ this.middleware.push(fn);
165
+ return this;
166
+ }
167
+ /**
168
+ * Whether `application` or `agent`
169
+ * @member {String}
170
+ * @since 1.0.0
171
+ */
172
+ get type() {
173
+ return this.options.type;
174
+ }
175
+ /**
176
+ * The current directory of application
177
+ * @member {String}
178
+ * @see {@link AppInfo#baseDir}
179
+ * @since 1.0.0
180
+ */
181
+ get baseDir() {
182
+ return this.options.baseDir;
183
+ }
184
+ /**
185
+ * Alias to {@link https://npmjs.com/package/depd}
186
+ * @member {Function}
187
+ * @since 1.0.0
188
+ */
189
+ get deprecate() {
190
+ return utils_default.deprecated;
191
+ }
192
+ /**
193
+ * The name of application
194
+ * @member {String}
195
+ * @see {@link AppInfo#name}
196
+ * @since 1.0.0
197
+ */
198
+ get name() {
199
+ return this.loader ? this.loader.pkg.name : "";
200
+ }
201
+ /**
202
+ * Retrieve enabled plugins
203
+ * @member {Object}
204
+ * @since 1.0.0
205
+ */
206
+ get plugins() {
207
+ return this.loader ? this.loader.plugins : {};
208
+ }
209
+ /**
210
+ * The configuration of application
211
+ * @member {Config}
212
+ * @since 1.0.0
213
+ */
214
+ get config() {
215
+ return this.loader ? this.loader.config : {};
216
+ }
217
+ /**
218
+ * Execute scope after loaded and before app start.
219
+ *
220
+ * Notice:
221
+ * This method is now NOT recommended and regarded as a deprecated one,
222
+ * For plugin development, we should use `didLoad` instead.
223
+ * For application development, we should use `willReady` instead.
224
+ *
225
+ * @see https://eggjs.org/en/advanced/loader.html#beforestart
226
+ *
227
+ * @param {Function} scope function will execute before app start
228
+ * @param {string} [name] scope name, default is empty string
229
+ */
230
+ beforeStart(scope, name) {
231
+ this.deprecate("`beforeStart` was deprecated, please use \"Life Cycles\" instead, see https://www.eggjs.org/advanced/loader#life-cycles");
232
+ this.lifecycle.registerBeforeStart(scope, name ?? "");
233
+ }
234
+ ready(flagOrFunction) {
235
+ if (flagOrFunction === void 0) return this.lifecycle.ready();
236
+ return this.lifecycle.ready(flagOrFunction);
237
+ }
238
+ /**
239
+ * If a client starts asynchronously, you can register `readyCallback`,
240
+ * then the application will wait for the callback to ready
241
+ *
242
+ * It will log when the callback is not invoked after 10s
243
+ *
244
+ * Recommend to use {@link EggCore#beforeStart}
245
+ * @since 1.0.0
246
+ *
247
+ * @param {String} name - readyCallback task name
248
+ * @param {object} opts -
249
+ * - {Number} [timeout=10000] - emit `ready_timeout` when it doesn't finish but reach the timeout
250
+ * - {Boolean} [isWeakDep=false] - whether it's a weak dependency
251
+ * @returns {Function} - a callback
252
+ * @example
253
+ * const done = app.readyCallback('mysql');
254
+ * mysql.ready(done);
255
+ */
256
+ readyCallback(name, opts) {
257
+ this.deprecate("`readyCallback` was deprecated, please use \"Life Cycles\" instead, see https://www.eggjs.org/advanced/loader#life-cycles");
258
+ return this.lifecycle.legacyReadyCallback(name, opts);
259
+ }
260
+ /**
261
+ * Register a function that will be called when app close.
262
+ *
263
+ * Notice:
264
+ * This method is now NOT recommended directly used,
265
+ * Developers SHOULDN'T use app.beforeClose directly now,
266
+ * but in the form of class to implement beforeClose instead.
267
+ *
268
+ * @see https://eggjs.org/en/advanced/loader.html#beforeclose
269
+ *
270
+ * @param {Function} fn - the function that can be generator function or async function.
271
+ */
272
+ beforeClose(fn, name) {
273
+ this.deprecate("`beforeClose` was deprecated, please use \"Life Cycles\" instead, see https://www.eggjs.org/advanced/loader#life-cycles");
274
+ this.lifecycle.registerBeforeClose(fn, name);
275
+ }
276
+ /**
277
+ * Close all, it will close
278
+ * - callbacks registered by beforeClose
279
+ * - emit `close` event
280
+ * - remove add listeners
281
+ *
282
+ * If error is thrown when it's closing, the promise will reject.
283
+ * It will also reject after following call.
284
+ * @returns {Promise} promise
285
+ * @since 1.0.0
286
+ */
287
+ async close() {
288
+ if (this.#closePromise) return this.#closePromise;
289
+ this.#closePromise = this.lifecycle.close();
290
+ return this.#closePromise;
291
+ }
292
+ /**
293
+ * get router
294
+ * @member {Router} EggCore#router
295
+ * @since 1.0.0
296
+ */
297
+ get router() {
298
+ if (this.#router) return this.#router;
299
+ this.#router = new Router({ sensitive: true }, this);
300
+ return this.#router;
301
+ }
302
+ /**
303
+ * Alias to {@link Router#url}
304
+ * @param {String} name - Router name
305
+ * @param {Object} params - more parameters
306
+ * @returns {String} url
307
+ */
308
+ url(name, params) {
309
+ return this.router.url(name, params);
310
+ }
311
+ head(...args) {
312
+ this.router.head.apply(this.router, args);
313
+ return this;
314
+ }
315
+ get(...args) {
316
+ this.router.get.apply(this.router, args);
317
+ return this;
318
+ }
319
+ put(...args) {
320
+ this.router.put.apply(this.router, args);
321
+ return this;
322
+ }
323
+ patch(...args) {
324
+ this.router.patch.apply(this.router, args);
325
+ return this;
326
+ }
327
+ post(...args) {
328
+ this.router.post.apply(this.router, args);
329
+ return this;
330
+ }
331
+ delete(...args) {
332
+ this.router.delete.apply(this.router, args);
333
+ return this;
334
+ }
335
+ del(...args) {
336
+ this.router.del.apply(this.router, args);
337
+ return this;
338
+ }
339
+ all(...args) {
340
+ this.router.all.apply(this.router, args);
341
+ return this;
342
+ }
343
+ resources(...args) {
344
+ this.router.resources.apply(this.router, args);
345
+ return this;
346
+ }
347
+ redirect(source, destination, status = 301) {
348
+ this.router.redirect(source, destination, status);
349
+ return this;
350
+ }
351
+ register(path, methods, middleware, opts) {
352
+ this.router.register(path, methods, middleware, opts);
353
+ return this;
354
+ }
355
+ /**
356
+ * Override this method to customize the loader
357
+ *
358
+ * ```ts
359
+ * // src/ExampleApplication.ts
360
+ * import { Application } from 'egg';
361
+ *
362
+ * class ExampleApplication extends Application {
363
+ * protected override customEggLoader() {
364
+ * return ExampleLoader;
365
+ * }
366
+ * }
367
+ * ```
368
+ *
369
+ * @since 4.0.0
370
+ * @returns {typeof EggLoader}
371
+ */
372
+ customEggLoader() {
373
+ return EggLoader;
374
+ }
375
+ /**
376
+ * Override this method to customize the egg paths
377
+ *
378
+ * ```ts
379
+ * // src/ExampleApplication.ts
380
+ * import { Application } from 'egg';
381
+ *
382
+ * class ExampleApplication extends Application {
383
+ * protected override customEggPaths() {
384
+ * return [path.dirname(import.meta.dirname), ...super.customEggPaths()];
385
+ * }
386
+ * }
387
+ * ```
388
+ *
389
+ * @since 4.0.0
390
+ * @returns {string[]}
391
+ */
392
+ customEggPaths() {
393
+ return [];
394
+ }
395
+ };
396
+
397
+ //#endregion
398
+ export { Context$1 as Context, EGG_LOADER, EggCore, KoaApplication, KoaContext, KoaRequest, KoaResponse, Request$1 as Request, Response$1 as Response, Router };