@eggjs/core 6.3.0-beta.1 → 6.3.1
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/commonjs/base_context_class.d.ts +3 -3
- package/dist/commonjs/base_context_class.js +1 -1
- package/dist/commonjs/egg.d.ts +16 -9
- package/dist/commonjs/egg.js +28 -2
- package/dist/commonjs/index.d.ts +2 -0
- package/dist/commonjs/index.js +2 -1
- package/dist/commonjs/lifecycle.js +5 -1
- package/dist/commonjs/loader/context_loader.d.ts +3 -3
- package/dist/commonjs/loader/context_loader.js +1 -1
- package/dist/commonjs/loader/egg_loader.d.ts +4 -40
- package/dist/commonjs/loader/egg_loader.js +44 -32
- package/dist/commonjs/loader/file_loader.d.ts +5 -1
- package/dist/commonjs/loader/file_loader.js +18 -5
- package/dist/commonjs/singleton.d.ts +29 -0
- package/dist/commonjs/singleton.js +125 -0
- package/dist/commonjs/types.d.ts +53 -0
- package/dist/commonjs/types.js +3 -0
- package/dist/commonjs/utils/index.js +10 -5
- package/dist/commonjs/utils/sequencify.js +1 -1
- package/dist/commonjs/utils/timing.js +1 -1
- package/dist/esm/base_context_class.d.ts +3 -3
- package/dist/esm/base_context_class.js +1 -1
- package/dist/esm/egg.d.ts +16 -9
- package/dist/esm/egg.js +28 -2
- package/dist/esm/index.d.ts +2 -0
- package/dist/esm/index.js +2 -1
- package/dist/esm/lifecycle.js +6 -2
- package/dist/esm/loader/context_loader.d.ts +3 -3
- package/dist/esm/loader/context_loader.js +1 -1
- package/dist/esm/loader/egg_loader.d.ts +4 -40
- package/dist/esm/loader/egg_loader.js +48 -36
- package/dist/esm/loader/file_loader.d.ts +5 -1
- package/dist/esm/loader/file_loader.js +17 -4
- package/dist/esm/singleton.d.ts +29 -0
- package/dist/esm/singleton.js +118 -0
- package/dist/esm/types.d.ts +53 -0
- package/dist/esm/types.js +2 -0
- package/dist/esm/utils/index.js +10 -5
- package/dist/esm/utils/sequencify.js +1 -1
- package/dist/esm/utils/timing.js +1 -1
- package/dist/package.json +1 -1
- package/package.json +11 -13
- package/src/base_context_class.ts +3 -3
- package/src/egg.ts +38 -10
- package/src/index.ts +2 -0
- package/src/lifecycle.ts +5 -1
- package/src/loader/context_loader.ts +4 -4
- package/src/loader/egg_loader.ts +64 -82
- package/src/loader/file_loader.ts +16 -4
- package/src/singleton.ts +149 -0
- package/src/types.ts +56 -0
- package/src/utils/index.ts +9 -4
- package/src/utils/sequencify.ts +1 -1
- package/src/utils/timing.ts +1 -1
|
@@ -5,9 +5,15 @@ import path from 'node:path';
|
|
|
5
5
|
import globby from 'globby';
|
|
6
6
|
import { isClass, isGeneratorFunction, isAsyncFunction, isPrimitive } from 'is-type-of';
|
|
7
7
|
import utils from '../utils/index.js';
|
|
8
|
-
const debug = debuglog('@eggjs/core
|
|
8
|
+
const debug = debuglog('@eggjs/core/file_loader');
|
|
9
9
|
export const FULLPATH = Symbol('EGG_LOADER_ITEM_FULLPATH');
|
|
10
10
|
export const EXPORTS = Symbol('EGG_LOADER_ITEM_EXPORTS');
|
|
11
|
+
export var CaseStyle;
|
|
12
|
+
(function (CaseStyle) {
|
|
13
|
+
CaseStyle["camel"] = "camel";
|
|
14
|
+
CaseStyle["lower"] = "lower";
|
|
15
|
+
CaseStyle["upper"] = "upper";
|
|
16
|
+
})(CaseStyle || (CaseStyle = {}));
|
|
11
17
|
/**
|
|
12
18
|
* Load files from directory to target object.
|
|
13
19
|
* @since 1.0.0
|
|
@@ -38,7 +44,7 @@ export class FileLoader {
|
|
|
38
44
|
assert(options.directory, 'options.directory is required');
|
|
39
45
|
assert(options.target, 'options.target is required');
|
|
40
46
|
this.options = {
|
|
41
|
-
caseStyle:
|
|
47
|
+
caseStyle: CaseStyle.camel,
|
|
42
48
|
call: true,
|
|
43
49
|
override: false,
|
|
44
50
|
...options,
|
|
@@ -46,7 +52,7 @@ export class FileLoader {
|
|
|
46
52
|
// compatible old options _lowercaseFirst_
|
|
47
53
|
if (this.options.lowercaseFirst === true) {
|
|
48
54
|
utils.deprecated('lowercaseFirst is deprecated, use caseStyle instead');
|
|
49
|
-
this.options.caseStyle =
|
|
55
|
+
this.options.caseStyle = CaseStyle.lower;
|
|
50
56
|
}
|
|
51
57
|
}
|
|
52
58
|
/**
|
|
@@ -142,6 +148,13 @@ export class FileLoader {
|
|
|
142
148
|
const fullpath = path.join(directory, filepath);
|
|
143
149
|
if (!fs.statSync(fullpath).isFile())
|
|
144
150
|
continue;
|
|
151
|
+
if (filepath.endsWith('.js')) {
|
|
152
|
+
const filepathTs = filepath.replace(/\.js$/, '.ts');
|
|
153
|
+
if (filepaths.includes(filepathTs)) {
|
|
154
|
+
debug('[parse] ignore %s, because %s exists', fullpath, filepathTs);
|
|
155
|
+
continue;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
145
158
|
// get properties
|
|
146
159
|
// app/service/foo/bar.js => [ 'foo', 'bar' ]
|
|
147
160
|
const properties = getProperties(filepath, this.options.caseStyle);
|
|
@@ -238,4 +251,4 @@ function defaultCamelize(filepath, caseStyle) {
|
|
|
238
251
|
return first + property.substring(1);
|
|
239
252
|
});
|
|
240
253
|
}
|
|
241
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
254
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZV9sb2FkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbG9hZGVyL2ZpbGVfbG9hZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sTUFBTSxNQUFNLGFBQWEsQ0FBQztBQUNqQyxPQUFPLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDekIsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNyQyxPQUFPLElBQUksTUFBTSxXQUFXLENBQUM7QUFDN0IsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBQzVCLE9BQU8sRUFBRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsZUFBZSxFQUFFLFdBQVcsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUN4RixPQUFPLEtBQWMsTUFBTSxtQkFBbUIsQ0FBQztBQUUvQyxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMseUJBQXlCLENBQUMsQ0FBQztBQUVsRCxNQUFNLENBQUMsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLDBCQUEwQixDQUFDLENBQUM7QUFDM0QsTUFBTSxDQUFDLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO0FBRXpELE1BQU0sQ0FBTixJQUFZLFNBSVg7QUFKRCxXQUFZLFNBQVM7SUFDbkIsNEJBQWUsQ0FBQTtJQUNmLDRCQUFlLENBQUE7SUFDZiw0QkFBZSxDQUFBO0FBQ2pCLENBQUMsRUFKVyxTQUFTLEtBQVQsU0FBUyxRQUlwQjtBQW9DRDs7O0dBR0c7QUFDSCxNQUFNLE9BQU8sVUFBVTtJQUNyQixNQUFNLEtBQUssUUFBUTtRQUNqQixPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0lBRUQsTUFBTSxLQUFLLE9BQU87UUFDaEIsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVRLE9BQU8sQ0FBcUU7SUFFckY7Ozs7Ozs7Ozs7Ozs7T0FhRztJQUNILFlBQVksT0FBMEI7UUFDcEMsTUFBTSxDQUFDLE9BQU8s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
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { EggCore } from './egg.js';
|
|
2
|
+
export type SingletonCreateMethod = (config: Record<string, any>, app: EggCore, clientName: string) => unknown | Promise<unknown>;
|
|
3
|
+
export interface SingletonOptions {
|
|
4
|
+
name: string;
|
|
5
|
+
app: EggCore;
|
|
6
|
+
create: SingletonCreateMethod;
|
|
7
|
+
}
|
|
8
|
+
export declare class Singleton<T = any> {
|
|
9
|
+
#private;
|
|
10
|
+
readonly clients: Map<string, T>;
|
|
11
|
+
readonly app: EggCore;
|
|
12
|
+
readonly create: SingletonCreateMethod;
|
|
13
|
+
readonly name: string;
|
|
14
|
+
readonly options: Record<string, any>;
|
|
15
|
+
constructor(options: SingletonOptions);
|
|
16
|
+
init(): void | Promise<void>;
|
|
17
|
+
initSync(): void;
|
|
18
|
+
initAsync(): Promise<void>;
|
|
19
|
+
/**
|
|
20
|
+
* @deprecated please use `getSingletonInstance(id)` instead
|
|
21
|
+
*/
|
|
22
|
+
get(id: string): NonNullable<T>;
|
|
23
|
+
/**
|
|
24
|
+
* Get singleton instance by id
|
|
25
|
+
*/
|
|
26
|
+
getSingletonInstance(id: string): NonNullable<T>;
|
|
27
|
+
createInstance(config: Record<string, any>, clientName: string): T;
|
|
28
|
+
createInstanceAsync(config: Record<string, any>, clientName: string): Promise<T>;
|
|
29
|
+
}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import assert from 'node:assert';
|
|
2
|
+
import { isAsyncFunction } from 'is-type-of';
|
|
3
|
+
export class Singleton {
|
|
4
|
+
clients = new Map();
|
|
5
|
+
app;
|
|
6
|
+
create;
|
|
7
|
+
name;
|
|
8
|
+
options;
|
|
9
|
+
constructor(options) {
|
|
10
|
+
assert(options.name, '[@eggjs/core/singleton] Singleton#constructor options.name is required');
|
|
11
|
+
assert(options.app, '[@eggjs/core/singleton] Singleton#constructor options.app is required');
|
|
12
|
+
assert(options.create, '[@eggjs/core/singleton] Singleton#constructor options.create is required');
|
|
13
|
+
assert(!(options.name in options.app), `[@eggjs/core/singleton] ${options.name} is already exists in app`);
|
|
14
|
+
this.app = options.app;
|
|
15
|
+
this.name = options.name;
|
|
16
|
+
this.create = options.create;
|
|
17
|
+
this.options = options.app.config[this.name] ?? {};
|
|
18
|
+
}
|
|
19
|
+
init() {
|
|
20
|
+
return isAsyncFunction(this.create) ? this.initAsync() : this.initSync();
|
|
21
|
+
}
|
|
22
|
+
initSync() {
|
|
23
|
+
const options = this.options;
|
|
24
|
+
assert(!(options.client && options.clients), `[@eggjs/core/singleton] ${this.name} can not set options.client and options.clients both`);
|
|
25
|
+
// alias app[name] as client, but still support createInstance method
|
|
26
|
+
if (options.client) {
|
|
27
|
+
const client = this.createInstance(options.client, options.name);
|
|
28
|
+
this.#setClientToApp(client);
|
|
29
|
+
this.#extendDynamicMethods(client);
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
// multi client, use app[name].getSingletonInstance(id)
|
|
33
|
+
if (options.clients) {
|
|
34
|
+
Object.keys(options.clients).forEach(id => {
|
|
35
|
+
const client = this.createInstance(options.clients[id], id);
|
|
36
|
+
this.clients.set(id, client);
|
|
37
|
+
});
|
|
38
|
+
this.#setClientToApp(this);
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
// no config.clients and config.client
|
|
42
|
+
this.#setClientToApp(this);
|
|
43
|
+
}
|
|
44
|
+
async initAsync() {
|
|
45
|
+
const options = this.options;
|
|
46
|
+
assert(!(options.client && options.clients), `[@eggjs/core/singleton] ${this.name} can not set options.client and options.clients both`);
|
|
47
|
+
// alias app[name] as client, but still support createInstance method
|
|
48
|
+
if (options.client) {
|
|
49
|
+
const client = await this.createInstanceAsync(options.client, options.name);
|
|
50
|
+
this.#setClientToApp(client);
|
|
51
|
+
this.#extendDynamicMethods(client);
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
// multi client, use app[name].getInstance(id)
|
|
55
|
+
if (options.clients) {
|
|
56
|
+
await Promise.all(Object.keys(options.clients).map((id) => {
|
|
57
|
+
return this.createInstanceAsync(options.clients[id], id)
|
|
58
|
+
.then(client => this.clients.set(id, client));
|
|
59
|
+
}));
|
|
60
|
+
this.#setClientToApp(this);
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
// no config.clients and config.client
|
|
64
|
+
this.#setClientToApp(this);
|
|
65
|
+
}
|
|
66
|
+
#setClientToApp(client) {
|
|
67
|
+
Reflect.set(this.app, this.name, client);
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* @deprecated please use `getSingletonInstance(id)` instead
|
|
71
|
+
*/
|
|
72
|
+
get(id) {
|
|
73
|
+
return this.clients.get(id);
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Get singleton instance by id
|
|
77
|
+
*/
|
|
78
|
+
getSingletonInstance(id) {
|
|
79
|
+
return this.clients.get(id);
|
|
80
|
+
}
|
|
81
|
+
createInstance(config, clientName) {
|
|
82
|
+
// async creator only support createInstanceAsync
|
|
83
|
+
assert(!isAsyncFunction(this.create), `[@eggjs/core/singleton] ${this.name} only support synchronous creation, please use createInstanceAsync`);
|
|
84
|
+
// options.default will be merge in to options.clients[id]
|
|
85
|
+
config = {
|
|
86
|
+
...this.options.default,
|
|
87
|
+
...config,
|
|
88
|
+
};
|
|
89
|
+
return this.create(config, this.app, clientName);
|
|
90
|
+
}
|
|
91
|
+
async createInstanceAsync(config, clientName) {
|
|
92
|
+
// options.default will be merge in to options.clients[id]
|
|
93
|
+
config = {
|
|
94
|
+
...this.options.default,
|
|
95
|
+
...config,
|
|
96
|
+
};
|
|
97
|
+
return await this.create(config, this.app, clientName);
|
|
98
|
+
}
|
|
99
|
+
#extendDynamicMethods(client) {
|
|
100
|
+
assert(!client.createInstance, '[@eggjs/core/singleton] singleton instance should not have createInstance method');
|
|
101
|
+
assert(!client.createInstanceAsync, '[@eggjs/core/singleton] singleton instance should not have createInstanceAsync method');
|
|
102
|
+
try {
|
|
103
|
+
let extendable = client;
|
|
104
|
+
// Object.preventExtensions() or Object.freeze()
|
|
105
|
+
if (!Object.isExtensible(client) || Object.isFrozen(client)) {
|
|
106
|
+
// eslint-disable-next-line no-proto
|
|
107
|
+
extendable = client.__proto__ || client;
|
|
108
|
+
}
|
|
109
|
+
extendable.createInstance = this.createInstance.bind(this);
|
|
110
|
+
extendable.createInstanceAsync = this.createInstanceAsync.bind(this);
|
|
111
|
+
}
|
|
112
|
+
catch (err) {
|
|
113
|
+
this.app.coreLogger.warn('[@eggjs/core/singleton] %s dynamic create is disabled because of client is un-extendable', this.name);
|
|
114
|
+
this.app.coreLogger.warn(err);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2luZ2xldG9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NpbmdsZXRvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLE1BQU0sTUFBTSxhQUFhLENBQUM7QUFDakMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLFlBQVksQ0FBQztBQVk3QyxNQUFNLE9BQU8sU0FBUztJQUNYLE9BQU8sR0FBRyxJQUFJLEdBQUcsRUFBYSxDQUFDO0lBQy9CLEdBQUcsQ0FBVTtJQUNiLE1BQU0sQ0FBd0I7SUFDOUIsSUFBSSxDQUFTO0lBQ2IsT0FBTyxDQUFzQjtJQUV0QyxZQUFZLE9BQXlCO1FBQ25DLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLHdFQUF3RSxDQUFDLENBQUM7UUFDL0YsTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsdUVBQXVFLENBQUMsQ0FBQztRQUM3RixNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSwwRUFBMEUsQ0FBQyxDQUFDO1FBQ25HLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsMkJBQTJCLE9BQU8sQ0FBQyxJQUFJLDJCQUEyQixDQUFDLENBQUM7UUFDM0csSUFBSSxDQUFDLEdBQUcsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQztRQUN6QixJQUFJLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUM7UUFDN0IsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3JELENBQUM7SUFFRCxJQUFJO1FBQ0YsT0FBTyxlQUFlLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENB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
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
export interface EggAppInfo {
|
|
2
|
+
/** package.json */
|
|
3
|
+
pkg: Record<string, any>;
|
|
4
|
+
/** the application name from package.json */
|
|
5
|
+
name: string;
|
|
6
|
+
/** current directory of application */
|
|
7
|
+
baseDir: string;
|
|
8
|
+
/** equals to serverEnv */
|
|
9
|
+
env: string;
|
|
10
|
+
/** equals to serverScope */
|
|
11
|
+
scope: string;
|
|
12
|
+
/** home directory of the OS */
|
|
13
|
+
HOME: string;
|
|
14
|
+
/** baseDir when local and unittest, HOME when other environment */
|
|
15
|
+
root: string;
|
|
16
|
+
}
|
|
17
|
+
export interface EggPluginInfo {
|
|
18
|
+
/** the plugin name, it can be used in `dep` */
|
|
19
|
+
name: string;
|
|
20
|
+
/** the package name of plugin */
|
|
21
|
+
package?: string;
|
|
22
|
+
version?: string;
|
|
23
|
+
/** whether enabled */
|
|
24
|
+
enable: boolean;
|
|
25
|
+
implicitEnable?: boolean;
|
|
26
|
+
/** the directory of the plugin package */
|
|
27
|
+
path?: string;
|
|
28
|
+
/** the dependent plugins, you can use the plugin name */
|
|
29
|
+
dependencies: string[];
|
|
30
|
+
/** the optional dependent plugins. */
|
|
31
|
+
optionalDependencies: string[];
|
|
32
|
+
dependents?: string[];
|
|
33
|
+
/** specify the serverEnv that only enable the plugin in it */
|
|
34
|
+
env: string[];
|
|
35
|
+
/** the file plugin config in. */
|
|
36
|
+
from: string;
|
|
37
|
+
}
|
|
38
|
+
export interface CustomLoaderConfigItem {
|
|
39
|
+
/** the directory of the custom loader */
|
|
40
|
+
directory: string;
|
|
41
|
+
/** the inject object, it can be app or ctx */
|
|
42
|
+
inject: string;
|
|
43
|
+
/** whether load unit files */
|
|
44
|
+
loadunit?: boolean;
|
|
45
|
+
}
|
|
46
|
+
export interface EggAppConfig extends Record<string, any> {
|
|
47
|
+
coreMiddleware: string[];
|
|
48
|
+
middleware: string[];
|
|
49
|
+
customLoader?: Record<string, CustomLoaderConfigItem>;
|
|
50
|
+
controller?: {
|
|
51
|
+
supportParams?: boolean;
|
|
52
|
+
};
|
|
53
|
+
}
|
package/dist/esm/utils/index.js
CHANGED
|
@@ -4,7 +4,7 @@ import fs from 'node:fs';
|
|
|
4
4
|
import { stat } from 'node:fs/promises';
|
|
5
5
|
import BuiltinModule from 'node:module';
|
|
6
6
|
import { importResolve, importModule } from '@eggjs/utils';
|
|
7
|
-
const debug = debuglog('@eggjs/core
|
|
7
|
+
const debug = debuglog('@eggjs/core/utils');
|
|
8
8
|
// Guard against poorly mocked module constructors.
|
|
9
9
|
const Module = typeof module !== 'undefined' && module.constructor.length > 1
|
|
10
10
|
? module.constructor
|
|
@@ -46,11 +46,11 @@ function getCalleeFromStack(withLine, stackIndex) {
|
|
|
46
46
|
export default {
|
|
47
47
|
deprecated(message) {
|
|
48
48
|
if (debug.enabled) {
|
|
49
|
-
console.trace('[@eggjs/core
|
|
49
|
+
console.trace('[@eggjs/core/deprecated] %s', message);
|
|
50
50
|
}
|
|
51
51
|
else {
|
|
52
|
-
console.
|
|
53
|
-
console.
|
|
52
|
+
console.log('[@eggjs/core/deprecated] %s', message);
|
|
53
|
+
console.log('[@eggjs/core/deprecated] set NODE_DEBUG=@eggjs/core/utils can show call stack');
|
|
54
54
|
}
|
|
55
55
|
},
|
|
56
56
|
extensions,
|
|
@@ -75,6 +75,11 @@ export default {
|
|
|
75
75
|
return obj;
|
|
76
76
|
}
|
|
77
77
|
catch (e) {
|
|
78
|
+
if (!e.message && typeof e !== 'string') {
|
|
79
|
+
// ts error: test/fixtures/apps/app-ts/app/extend/context.ts(5,17): error TS2339: Property 'url' does not exist on type 'Context'
|
|
80
|
+
console.trace(e);
|
|
81
|
+
throw e;
|
|
82
|
+
}
|
|
78
83
|
const err = new Error(`[@eggjs/core] load file: ${filepath}, error: ${e.message}`);
|
|
79
84
|
err.cause = e;
|
|
80
85
|
debug('[loadFile] handle %s error: %s', filepath, e);
|
|
@@ -104,4 +109,4 @@ export default {
|
|
|
104
109
|
function prepareObjectStackTrace(_obj, stack) {
|
|
105
110
|
return stack;
|
|
106
111
|
}
|
|
107
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
112
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdXRpbHMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNyQyxPQUFPLElBQUksTUFBTSxXQUFXLENBQUM7QUFDN0IsT0FBTyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ3pCLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUN4QyxPQUFPLGFBQWEsTUFBTSxhQUFhLENBQUM7QUFDeEMsT0FBTyxFQUFFLGFBQWEsRUFBRSxZQUFZLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFM0QsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLG1CQUFtQixDQUFDLENBQUM7QUFJNUMsbURBQW1EO0FBQ25ELE1BQU0sTUFBTSxHQUFHLE9BQU8sTUFBTSxLQUFLLFdBQVcsSUFBSSxNQUFNLENBQUMsV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDO0lBQzNFLENBQUMsQ0FBQyxNQUFNLENBQUMsV0FBVztJQUNwQiwwQkFBMEI7SUFDMUIsQ0FBQyxDQUFDLGFBQWEsQ0FBQztBQUVsQixNQUFNLFVBQVUsR0FBSSxNQUFjLENBQUMsV0FBVyxDQUFDO0FBQy9DLE1BQU0sY0FBYyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBRSxDQUFDLENBQUM7QUFDMUUsS0FBSyxDQUFDLHVCQUF1QixFQUFFLGNBQWMsQ0FBQyxDQUFDO0FBRS9DLFNBQVMsa0JBQWtCLENBQUMsUUFBa0IsRUFBRSxVQUFtQjtJQUNqRSxVQUFVLEdBQUcsVUFBVSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUM7SUFDdkQsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLGVBQWUsQ0FBQztJQUNwQyxN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
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { debuglog } from 'node:util';
|
|
2
|
-
const debug = debuglog('@eggjs/core
|
|
2
|
+
const debug = debuglog('@eggjs/core/utils/sequencify');
|
|
3
3
|
function sequence(tasks, names, result, missing, recursive, nest, optional, parent) {
|
|
4
4
|
names.forEach(function (name) {
|
|
5
5
|
if (result.requires[name])
|
package/dist/esm/utils/timing.js
CHANGED
package/dist/package.json
CHANGED
package/package.json
CHANGED
|
@@ -1,24 +1,23 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@eggjs/core",
|
|
3
|
-
"version": "6.3.
|
|
3
|
+
"version": "6.3.1",
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"access": "public"
|
|
6
6
|
},
|
|
7
7
|
"engines": {
|
|
8
8
|
"node": ">= 18.19.0"
|
|
9
9
|
},
|
|
10
|
-
"tnpm": {
|
|
11
|
-
"mode": "npm"
|
|
12
|
-
},
|
|
13
10
|
"description": "A core plugin framework based on @eggjs/koa",
|
|
14
11
|
"scripts": {
|
|
15
12
|
"clean": "rimraf dist",
|
|
16
13
|
"lint": "eslint src test --ext ts",
|
|
17
14
|
"pretest": "npm run clean && npm run lint -- --fix && npm run prepublishOnly",
|
|
18
|
-
"test": "
|
|
15
|
+
"test": "egg-bin test",
|
|
16
|
+
"posttest": "npm run clean",
|
|
19
17
|
"test-local": "egg-bin test",
|
|
20
18
|
"preci": "npm run clean && npm run lint && npm run prepublishOnly",
|
|
21
19
|
"ci": "egg-bin cov",
|
|
20
|
+
"postci": "npm run clean",
|
|
22
21
|
"prepublishOnly": "tshy && tshy-after && attw --pack"
|
|
23
22
|
},
|
|
24
23
|
"repository": {
|
|
@@ -36,9 +35,9 @@
|
|
|
36
35
|
},
|
|
37
36
|
"homepage": "https://github.com/eggjs/core#readme",
|
|
38
37
|
"dependencies": {
|
|
39
|
-
"@eggjs/koa": "^2.20.
|
|
38
|
+
"@eggjs/koa": "^2.20.6",
|
|
40
39
|
"@eggjs/router": "^3.0.5",
|
|
41
|
-
"@eggjs/utils": "^4.
|
|
40
|
+
"@eggjs/utils": "^4.2.4",
|
|
42
41
|
"egg-logger": "^3.5.0",
|
|
43
42
|
"egg-path-matching": "^2.0.0",
|
|
44
43
|
"extend2": "^4.0.0",
|
|
@@ -53,22 +52,21 @@
|
|
|
53
52
|
},
|
|
54
53
|
"devDependencies": {
|
|
55
54
|
"@arethetypeswrong/cli": "^0.17.1",
|
|
56
|
-
"@eggjs/bin": "
|
|
55
|
+
"@eggjs/bin": "7",
|
|
56
|
+
"@eggjs/supertest": "^8.1.1",
|
|
57
57
|
"@eggjs/tsconfig": "1",
|
|
58
58
|
"@types/js-yaml": "4",
|
|
59
59
|
"@types/mocha": "10",
|
|
60
|
-
"@types/node": "
|
|
61
|
-
"@types/supertest": "6",
|
|
60
|
+
"@types/node": "22",
|
|
62
61
|
"await-event": "2",
|
|
63
62
|
"coffee": "5",
|
|
64
63
|
"eslint": "8",
|
|
65
64
|
"eslint-config-egg": "14",
|
|
66
65
|
"gals": "1",
|
|
67
66
|
"js-yaml": "3",
|
|
68
|
-
"mm": "
|
|
69
|
-
"pedding": "
|
|
67
|
+
"mm": "^4.0.2",
|
|
68
|
+
"pedding": "2",
|
|
70
69
|
"rimraf": "6",
|
|
71
|
-
"supertest": "7",
|
|
72
70
|
"ts-node": "10",
|
|
73
71
|
"tshy": "3",
|
|
74
72
|
"tshy-after": "1",
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { EggCore,
|
|
1
|
+
import type { EggCore, Context } from './egg.js';
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* BaseContextClass is a base class that can be extended,
|
|
@@ -6,7 +6,7 @@ import type { EggCore, ContextDelegation } from './egg.js';
|
|
|
6
6
|
* {@link Helper}, {@link Service} is extending it.
|
|
7
7
|
*/
|
|
8
8
|
export class BaseContextClass {
|
|
9
|
-
ctx:
|
|
9
|
+
ctx: Context;
|
|
10
10
|
app: EggCore;
|
|
11
11
|
config: Record<string, any>;
|
|
12
12
|
service: BaseContextClass;
|
|
@@ -14,7 +14,7 @@ export class BaseContextClass {
|
|
|
14
14
|
/**
|
|
15
15
|
* @since 1.0.0
|
|
16
16
|
*/
|
|
17
|
-
constructor(ctx:
|
|
17
|
+
constructor(ctx: Context) {
|
|
18
18
|
/**
|
|
19
19
|
* @member {Context} BaseContextClass#ctx
|
|
20
20
|
* @since 1.0.0
|
package/src/egg.ts
CHANGED
|
@@ -6,11 +6,10 @@ import {
|
|
|
6
6
|
Request as KoaRequest, Response as KoaResponse,
|
|
7
7
|
} from '@eggjs/koa';
|
|
8
8
|
import type {
|
|
9
|
-
ContextDelegation as KoaContextDelegation,
|
|
10
9
|
MiddlewareFunc as KoaMiddlewareFunc,
|
|
11
10
|
Next,
|
|
12
11
|
} from '@eggjs/koa';
|
|
13
|
-
import { EggConsoleLogger } from 'egg-logger';
|
|
12
|
+
import { EggConsoleLogger, Logger } from 'egg-logger';
|
|
14
13
|
import { RegisterOptions, ResourcesController, EggRouter as Router } from '@eggjs/router';
|
|
15
14
|
import type { ReadyFunctionArg } from 'get-ready';
|
|
16
15
|
import { BaseContextClass } from './base_context_class.js';
|
|
@@ -19,8 +18,12 @@ import type { Fun } from './utils/index.js';
|
|
|
19
18
|
import { Lifecycle } from './lifecycle.js';
|
|
20
19
|
import { EggLoader } from './loader/egg_loader.js';
|
|
21
20
|
import utils from './utils/index.js';
|
|
21
|
+
import { EggAppConfig } from './types.js';
|
|
22
|
+
import {
|
|
23
|
+
Singleton, type SingletonCreateMethod, type SingletonOptions,
|
|
24
|
+
} from './singleton.js';
|
|
22
25
|
|
|
23
|
-
const debug = debuglog('@eggjs/core
|
|
26
|
+
const debug = debuglog('@eggjs/core/egg');
|
|
24
27
|
|
|
25
28
|
export const EGG_LOADER = Symbol.for('egg#loader');
|
|
26
29
|
|
|
@@ -42,20 +45,18 @@ export {
|
|
|
42
45
|
|
|
43
46
|
// export @eggjs/koa types
|
|
44
47
|
export type {
|
|
45
|
-
Next, KoaMiddlewareFunc,
|
|
48
|
+
Next, KoaMiddlewareFunc,
|
|
46
49
|
};
|
|
47
50
|
|
|
48
51
|
// export @eggjs/core classes
|
|
49
52
|
export class Request extends KoaRequest {
|
|
50
53
|
declare app: EggCore;
|
|
51
54
|
declare response: Response;
|
|
52
|
-
declare ctx: ContextDelegation;
|
|
53
55
|
}
|
|
54
56
|
|
|
55
57
|
export class Response extends KoaResponse {
|
|
56
58
|
declare app: EggCore;
|
|
57
59
|
declare request: Request;
|
|
58
|
-
declare ctx: ContextDelegation;
|
|
59
60
|
}
|
|
60
61
|
|
|
61
62
|
export class Context extends KoaContext {
|
|
@@ -66,8 +67,7 @@ export class Context extends KoaContext {
|
|
|
66
67
|
}
|
|
67
68
|
|
|
68
69
|
// export @eggjs/core types
|
|
69
|
-
export type
|
|
70
|
-
export type MiddlewareFunc<T extends ContextDelegation = ContextDelegation> = KoaMiddlewareFunc<T>;
|
|
70
|
+
export type MiddlewareFunc<T = Context> = KoaMiddlewareFunc<T>;
|
|
71
71
|
|
|
72
72
|
export class EggCore extends KoaApplication {
|
|
73
73
|
options: EggCoreOptions;
|
|
@@ -188,6 +188,34 @@ export class EggCore extends KoaApplication {
|
|
|
188
188
|
});
|
|
189
189
|
}
|
|
190
190
|
|
|
191
|
+
get logger(): Logger {
|
|
192
|
+
return this.console;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
get coreLogger(): Logger {
|
|
196
|
+
return this.console;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
/**
|
|
200
|
+
* create a singleton instance
|
|
201
|
+
* @param {String} name - unique name for singleton
|
|
202
|
+
* @param {Function|AsyncFunction} create - method will be invoked when singleton instance create
|
|
203
|
+
*/
|
|
204
|
+
addSingleton(name: string, create: SingletonCreateMethod) {
|
|
205
|
+
const options: SingletonOptions = {
|
|
206
|
+
name,
|
|
207
|
+
create,
|
|
208
|
+
app: this,
|
|
209
|
+
};
|
|
210
|
+
const singleton = new Singleton(options);
|
|
211
|
+
const initPromise = singleton.init();
|
|
212
|
+
if (initPromise) {
|
|
213
|
+
this.beforeStart(async () => {
|
|
214
|
+
await initPromise;
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
|
|
191
219
|
/**
|
|
192
220
|
* override koa's app.use, support generator function
|
|
193
221
|
* @since 1.0.0
|
|
@@ -251,8 +279,8 @@ export class EggCore extends KoaApplication {
|
|
|
251
279
|
* @member {Config}
|
|
252
280
|
* @since 1.0.0
|
|
253
281
|
*/
|
|
254
|
-
get config() {
|
|
255
|
-
return this.loader ? this.loader.config : {};
|
|
282
|
+
get config(): EggAppConfig {
|
|
283
|
+
return this.loader ? this.loader.config : {} as EggAppConfig;
|
|
256
284
|
}
|
|
257
285
|
|
|
258
286
|
/**
|
package/src/index.ts
CHANGED
|
@@ -5,8 +5,10 @@ export { utils };
|
|
|
5
5
|
export * from './egg.js';
|
|
6
6
|
export * from './base_context_class.js';
|
|
7
7
|
export * from './lifecycle.js';
|
|
8
|
+
export * from './singleton.js';
|
|
8
9
|
export * from './loader/egg_loader.js';
|
|
9
10
|
export * from './loader/file_loader.js';
|
|
10
11
|
export * from './loader/context_loader.js';
|
|
11
12
|
export * from './utils/sequencify.js';
|
|
12
13
|
export * from './utils/timing.js';
|
|
14
|
+
export type * from './types.js';
|
package/src/lifecycle.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import assert from 'node:assert';
|
|
2
2
|
import { EventEmitter } from 'node:events';
|
|
3
|
-
import { debuglog } from 'node:util';
|
|
3
|
+
import { debuglog, format } from 'node:util';
|
|
4
4
|
import { isClass } from 'is-type-of';
|
|
5
5
|
import { Ready as ReadyObject } from 'get-ready';
|
|
6
6
|
import type { ReadyFunctionArg } from 'get-ready';
|
|
@@ -387,6 +387,10 @@ export class Lifecycle extends EventEmitter {
|
|
|
387
387
|
done();
|
|
388
388
|
this.timing.end(timingKey);
|
|
389
389
|
}, (err: Error) => {
|
|
390
|
+
// avoid non-stringify error: TypeError: Cannot convert object to primitive value
|
|
391
|
+
if (!(err instanceof Error)) {
|
|
392
|
+
err = new Error(format('%s', err));
|
|
393
|
+
}
|
|
390
394
|
done(err);
|
|
391
395
|
this.timing.end(timingKey);
|
|
392
396
|
});
|
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
import assert from 'node:assert';
|
|
2
2
|
import { isClass, isPrimitive } from 'is-type-of';
|
|
3
3
|
import { FileLoader, EXPORTS, type FileLoaderOptions } from './file_loader.js';
|
|
4
|
-
import type {
|
|
4
|
+
import type { Context } from '../egg.js';
|
|
5
5
|
|
|
6
6
|
const CLASS_LOADER = Symbol('classLoader');
|
|
7
7
|
|
|
8
8
|
export interface ClassLoaderOptions {
|
|
9
|
-
ctx:
|
|
9
|
+
ctx: Context;
|
|
10
10
|
properties: any;
|
|
11
11
|
}
|
|
12
12
|
|
|
13
13
|
export class ClassLoader {
|
|
14
14
|
readonly _cache = new Map();
|
|
15
|
-
_ctx:
|
|
15
|
+
_ctx: Context;
|
|
16
16
|
|
|
17
17
|
constructor(options: ClassLoaderOptions) {
|
|
18
18
|
assert(options.ctx, 'options.ctx is required');
|
|
@@ -98,7 +98,7 @@ export class ContextLoader extends FileLoader {
|
|
|
98
98
|
}
|
|
99
99
|
}
|
|
100
100
|
|
|
101
|
-
function getInstance(values: any, ctx:
|
|
101
|
+
function getInstance(values: any, ctx: Context) {
|
|
102
102
|
// it's a directory when it has no exports
|
|
103
103
|
// then use ClassLoader
|
|
104
104
|
const Class = values[EXPORTS] ? values : null;
|