@eggjs/core 6.0.0-beta.0

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 (60) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +296 -0
  3. package/dist/commonjs/base_context_class.d.ts +16 -0
  4. package/dist/commonjs/base_context_class.js +41 -0
  5. package/dist/commonjs/egg.d.ts +204 -0
  6. package/dist/commonjs/egg.js +346 -0
  7. package/dist/commonjs/index.d.ts +5 -0
  8. package/dist/commonjs/index.js +26 -0
  9. package/dist/commonjs/lifecycle.d.ts +75 -0
  10. package/dist/commonjs/lifecycle.js +306 -0
  11. package/dist/commonjs/loader/context_loader.d.ts +24 -0
  12. package/dist/commonjs/loader/context_loader.js +109 -0
  13. package/dist/commonjs/loader/egg_loader.d.ts +405 -0
  14. package/dist/commonjs/loader/egg_loader.js +1497 -0
  15. package/dist/commonjs/loader/file_loader.d.ts +96 -0
  16. package/dist/commonjs/loader/file_loader.js +248 -0
  17. package/dist/commonjs/package.json +3 -0
  18. package/dist/commonjs/types.d.ts +1 -0
  19. package/dist/commonjs/types.js +403 -0
  20. package/dist/commonjs/utils/index.d.ts +14 -0
  21. package/dist/commonjs/utils/index.js +146 -0
  22. package/dist/commonjs/utils/sequencify.d.ts +13 -0
  23. package/dist/commonjs/utils/sequencify.js +59 -0
  24. package/dist/commonjs/utils/timing.d.ts +22 -0
  25. package/dist/commonjs/utils/timing.js +100 -0
  26. package/dist/esm/base_context_class.d.ts +16 -0
  27. package/dist/esm/base_context_class.js +37 -0
  28. package/dist/esm/egg.d.ts +204 -0
  29. package/dist/esm/egg.js +339 -0
  30. package/dist/esm/index.d.ts +5 -0
  31. package/dist/esm/index.js +6 -0
  32. package/dist/esm/lifecycle.d.ts +75 -0
  33. package/dist/esm/lifecycle.js +276 -0
  34. package/dist/esm/loader/context_loader.d.ts +24 -0
  35. package/dist/esm/loader/context_loader.js +102 -0
  36. package/dist/esm/loader/egg_loader.d.ts +405 -0
  37. package/dist/esm/loader/egg_loader.js +1490 -0
  38. package/dist/esm/loader/file_loader.d.ts +96 -0
  39. package/dist/esm/loader/file_loader.js +241 -0
  40. package/dist/esm/package.json +3 -0
  41. package/dist/esm/types.d.ts +1 -0
  42. package/dist/esm/types.js +402 -0
  43. package/dist/esm/utils/index.d.ts +14 -0
  44. package/dist/esm/utils/index.js +141 -0
  45. package/dist/esm/utils/sequencify.d.ts +13 -0
  46. package/dist/esm/utils/sequencify.js +56 -0
  47. package/dist/esm/utils/timing.d.ts +22 -0
  48. package/dist/esm/utils/timing.js +93 -0
  49. package/package.json +103 -0
  50. package/src/base_context_class.ts +39 -0
  51. package/src/egg.ts +430 -0
  52. package/src/index.ts +6 -0
  53. package/src/lifecycle.ts +363 -0
  54. package/src/loader/context_loader.ts +121 -0
  55. package/src/loader/egg_loader.ts +1703 -0
  56. package/src/loader/file_loader.ts +295 -0
  57. package/src/types.ts +447 -0
  58. package/src/utils/index.ts +154 -0
  59. package/src/utils/sequencify.ts +70 -0
  60. package/src/utils/timing.ts +114 -0
@@ -0,0 +1,96 @@
1
+ import { Fun } from '../utils/index.js';
2
+ export declare const FULLPATH: unique symbol;
3
+ export declare const EXPORTS: unique symbol;
4
+ export type CaseStyle = 'camel' | 'lower' | 'upper';
5
+ export type CaseStyleFunction = (filepath: string) => string[];
6
+ export type FileLoaderInitializer = (exports: unknown, options: {
7
+ path: string;
8
+ pathName: string;
9
+ }) => unknown;
10
+ export type FileLoaderFilter = (exports: unknown) => boolean;
11
+ export interface FileLoaderOptions {
12
+ /** directories to be loaded */
13
+ directory: string | string[];
14
+ /** attach the target object from loaded files */
15
+ target: Record<string, any>;
16
+ /** match the files when load, support glob, default to all js files */
17
+ match?: string | string[];
18
+ /** ignore the files when load, support glob */
19
+ ignore?: string | string[];
20
+ /** custom file exports, receive two parameters, first is the inject object(if not js file, will be content buffer), second is an `options` object that contain `path` */
21
+ initializer?: FileLoaderInitializer;
22
+ /** determine whether invoke when exports is function */
23
+ call?: boolean;
24
+ /** determine whether override the property when get the same name */
25
+ override?: boolean;
26
+ /** an object that be the argument when invoke the function */
27
+ inject?: Record<string, any>;
28
+ /** a function that filter the exports which can be loaded */
29
+ filter?: FileLoaderFilter;
30
+ /** set property's case when converting a filepath to property list. */
31
+ caseStyle?: CaseStyle | CaseStyleFunction;
32
+ lowercaseFirst?: boolean;
33
+ }
34
+ export interface FileLoaderParseItem {
35
+ fullpath: string;
36
+ properties: string[];
37
+ exports: object | Fun;
38
+ }
39
+ /**
40
+ * Load files from directory to target object.
41
+ * @since 1.0.0
42
+ */
43
+ export declare class FileLoader {
44
+ static get FULLPATH(): symbol;
45
+ static get EXPORTS(): symbol;
46
+ readonly options: FileLoaderOptions & Required<Pick<FileLoaderOptions, 'caseStyle'>>;
47
+ /**
48
+ * @class
49
+ * @param {Object} options - options
50
+ * @param {String|Array} options.directory - directories to be loaded
51
+ * @param {Object} options.target - attach the target object from loaded files
52
+ * @param {String} options.match - match the files when load, support glob, default to all js files
53
+ * @param {String} options.ignore - ignore the files when load, support glob
54
+ * @param {Function} options.initializer - custom file exports, receive two parameters, first is the inject object(if not js file, will be content buffer), second is an `options` object that contain `path`
55
+ * @param {Boolean} options.call - determine whether invoke when exports is function
56
+ * @param {Boolean} options.override - determine whether override the property when get the same name
57
+ * @param {Object} options.inject - an object that be the argument when invoke the function
58
+ * @param {Function} options.filter - a function that filter the exports which can be loaded
59
+ * @param {String|Function} options.caseStyle - set property's case when converting a filepath to property list.
60
+ */
61
+ constructor(options: FileLoaderOptions);
62
+ /**
63
+ * attach items to target object. Mapping the directory to properties.
64
+ * `app/controller/group/repository.js` => `target.group.repository`
65
+ * @return {Object} target
66
+ * @since 1.0.0
67
+ */
68
+ load(): Promise<object>;
69
+ /**
70
+ * Parse files from given directories, then return an items list, each item contains properties and exports.
71
+ *
72
+ * For example, parse `app/controller/group/repository.js`
73
+ *
74
+ * ```
75
+ * module.exports = app => {
76
+ * return class RepositoryController extends app.Controller {};
77
+ * }
78
+ * ```
79
+ *
80
+ * It returns a item
81
+ *
82
+ * ```
83
+ * {
84
+ * properties: [ 'group', 'repository' ],
85
+ * exports: app => { ... },
86
+ * }
87
+ * ```
88
+ *
89
+ * `Properties` is an array that contains the directory of a filepath.
90
+ *
91
+ * `Exports` depends on type, if exports is a function, it will be called. if initializer is specified, it will be called with exports for customizing.
92
+ * @return {Array} items
93
+ * @since 1.0.0
94
+ */
95
+ protected parse(): Promise<FileLoaderParseItem[]>;
96
+ }
@@ -0,0 +1,248 @@
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.FileLoader = exports.EXPORTS = exports.FULLPATH = void 0;
7
+ const node_assert_1 = __importDefault(require("node:assert"));
8
+ const node_fs_1 = __importDefault(require("node:fs"));
9
+ const node_util_1 = require("node:util");
10
+ const node_path_1 = __importDefault(require("node:path"));
11
+ const globby_1 = __importDefault(require("globby"));
12
+ const is_type_of_1 = require("is-type-of");
13
+ const index_js_1 = __importDefault(require("../utils/index.js"));
14
+ const debug = (0, node_util_1.debuglog)('@eggjs/core:file_loader');
15
+ exports.FULLPATH = Symbol('EGG_LOADER_ITEM_FULLPATH');
16
+ exports.EXPORTS = Symbol('EGG_LOADER_ITEM_EXPORTS');
17
+ /**
18
+ * Load files from directory to target object.
19
+ * @since 1.0.0
20
+ */
21
+ class FileLoader {
22
+ static get FULLPATH() {
23
+ return exports.FULLPATH;
24
+ }
25
+ static get EXPORTS() {
26
+ return exports.EXPORTS;
27
+ }
28
+ options;
29
+ /**
30
+ * @class
31
+ * @param {Object} options - options
32
+ * @param {String|Array} options.directory - directories to be loaded
33
+ * @param {Object} options.target - attach the target object from loaded files
34
+ * @param {String} options.match - match the files when load, support glob, default to all js files
35
+ * @param {String} options.ignore - ignore the files when load, support glob
36
+ * @param {Function} options.initializer - custom file exports, receive two parameters, first is the inject object(if not js file, will be content buffer), second is an `options` object that contain `path`
37
+ * @param {Boolean} options.call - determine whether invoke when exports is function
38
+ * @param {Boolean} options.override - determine whether override the property when get the same name
39
+ * @param {Object} options.inject - an object that be the argument when invoke the function
40
+ * @param {Function} options.filter - a function that filter the exports which can be loaded
41
+ * @param {String|Function} options.caseStyle - set property's case when converting a filepath to property list.
42
+ */
43
+ constructor(options) {
44
+ (0, node_assert_1.default)(options.directory, 'options.directory is required');
45
+ (0, node_assert_1.default)(options.target, 'options.target is required');
46
+ this.options = {
47
+ caseStyle: 'camel',
48
+ call: true,
49
+ override: false,
50
+ ...options,
51
+ };
52
+ // compatible old options _lowercaseFirst_
53
+ if (this.options.lowercaseFirst === true) {
54
+ index_js_1.default.deprecated('lowercaseFirst is deprecated, use caseStyle instead');
55
+ this.options.caseStyle = 'lower';
56
+ }
57
+ }
58
+ /**
59
+ * attach items to target object. Mapping the directory to properties.
60
+ * `app/controller/group/repository.js` => `target.group.repository`
61
+ * @return {Object} target
62
+ * @since 1.0.0
63
+ */
64
+ async load() {
65
+ const items = await this.parse();
66
+ const target = this.options.target;
67
+ for (const item of items) {
68
+ debug('loading item: %o', item);
69
+ // item { properties: [ 'a', 'b', 'c'], exports }
70
+ // => target.a.b.c = exports
71
+ item.properties.reduce((target, property, index) => {
72
+ let obj;
73
+ const properties = item.properties.slice(0, index + 1).join('.');
74
+ if (index === item.properties.length - 1) {
75
+ if (property in target) {
76
+ if (!this.options.override)
77
+ throw new Error(`can't overwrite property '${properties}' from ${target[property][exports.FULLPATH]} by ${item.fullpath}`);
78
+ }
79
+ obj = item.exports;
80
+ if (obj && !(0, is_type_of_1.isPrimitive)(obj)) {
81
+ Reflect.set(obj, exports.FULLPATH, item.fullpath);
82
+ Reflect.set(obj, exports.EXPORTS, true);
83
+ }
84
+ }
85
+ else {
86
+ obj = target[property] || {};
87
+ }
88
+ target[property] = obj;
89
+ debug('loaded item properties: %o => %o', properties, obj);
90
+ return obj;
91
+ }, target);
92
+ }
93
+ return target;
94
+ }
95
+ /**
96
+ * Parse files from given directories, then return an items list, each item contains properties and exports.
97
+ *
98
+ * For example, parse `app/controller/group/repository.js`
99
+ *
100
+ * ```
101
+ * module.exports = app => {
102
+ * return class RepositoryController extends app.Controller {};
103
+ * }
104
+ * ```
105
+ *
106
+ * It returns a item
107
+ *
108
+ * ```
109
+ * {
110
+ * properties: [ 'group', 'repository' ],
111
+ * exports: app => { ... },
112
+ * }
113
+ * ```
114
+ *
115
+ * `Properties` is an array that contains the directory of a filepath.
116
+ *
117
+ * `Exports` depends on type, if exports is a function, it will be called. if initializer is specified, it will be called with exports for customizing.
118
+ * @return {Array} items
119
+ * @since 1.0.0
120
+ */
121
+ async parse() {
122
+ let files = this.options.match;
123
+ if (!files) {
124
+ files = (process.env.EGG_TYPESCRIPT === 'true' && index_js_1.default.extensions['.ts'])
125
+ ? ['**/*.(js|ts)', '!**/*.d.ts']
126
+ : ['**/*.js'];
127
+ }
128
+ else {
129
+ files = Array.isArray(files) ? files : [files];
130
+ }
131
+ let ignore = this.options.ignore;
132
+ if (ignore) {
133
+ ignore = Array.isArray(ignore) ? ignore : [ignore];
134
+ ignore = ignore.filter(f => !!f).map(f => '!' + f);
135
+ files = files.concat(ignore);
136
+ }
137
+ let directories = this.options.directory;
138
+ if (!Array.isArray(directories)) {
139
+ directories = [directories];
140
+ }
141
+ const filter = typeof this.options.filter === 'function' ? this.options.filter : null;
142
+ const items = [];
143
+ debug('[parse] parsing directories: %j', directories);
144
+ for (const directory of directories) {
145
+ const filepaths = globby_1.default.sync(files, { cwd: directory });
146
+ debug('[parse] globby files: %o, cwd: %o => %o', files, directory, filepaths);
147
+ for (const filepath of filepaths) {
148
+ const fullpath = node_path_1.default.join(directory, filepath);
149
+ if (!node_fs_1.default.statSync(fullpath).isFile())
150
+ continue;
151
+ // get properties
152
+ // app/service/foo/bar.js => [ 'foo', 'bar' ]
153
+ const properties = getProperties(filepath, this.options.caseStyle);
154
+ // app/service/foo/bar.js => service.foo.bar
155
+ const pathName = directory.split(/[/\\]/).slice(-1) + '.' + properties.join('.');
156
+ // get exports from the file
157
+ const exports = await getExports(fullpath, this.options, pathName);
158
+ // ignore exports when it's null or false returned by filter function
159
+ if (exports == null || (filter && filter(exports) === false)) {
160
+ continue;
161
+ }
162
+ // set properties of class
163
+ if ((0, is_type_of_1.isClass)(exports)) {
164
+ exports.prototype.pathName = pathName;
165
+ exports.prototype.fullPath = fullpath;
166
+ }
167
+ items.push({ fullpath, properties, exports });
168
+ debug('[parse] parse %s, properties %j, exports %o', fullpath, properties, exports);
169
+ }
170
+ }
171
+ return items;
172
+ }
173
+ }
174
+ exports.FileLoader = FileLoader;
175
+ // convert file path to an array of properties
176
+ // a/b/c.js => ['a', 'b', 'c']
177
+ function getProperties(filepath, caseStyle) {
178
+ // if caseStyle is function, return the result of function
179
+ if (typeof caseStyle === 'function') {
180
+ const result = caseStyle(filepath);
181
+ (0, node_assert_1.default)(Array.isArray(result), `caseStyle expect an array, but got ${JSON.stringify(result)}`);
182
+ return result;
183
+ }
184
+ // use default camelize
185
+ return defaultCamelize(filepath, caseStyle);
186
+ }
187
+ // Get exports from filepath
188
+ // If exports is null/undefined, it will be ignored
189
+ async function getExports(fullpath, options, pathName) {
190
+ let exports = await index_js_1.default.loadFile(fullpath);
191
+ // process exports as you like
192
+ if (options.initializer) {
193
+ exports = options.initializer(exports, { path: fullpath, pathName });
194
+ debug('[getExports] after initializer => %o', exports);
195
+ }
196
+ if ((0, is_type_of_1.isGeneratorFunction)(exports)) {
197
+ throw new TypeError(`Support for generators was removed, fullpath: ${fullpath}`);
198
+ }
199
+ // return exports when it's a class or async function
200
+ //
201
+ // module.exports = class Service {};
202
+ // or
203
+ // module.exports = async function() {}
204
+ if ((0, is_type_of_1.isClass)(exports) || (0, is_type_of_1.isAsyncFunction)(exports)) {
205
+ return exports;
206
+ }
207
+ // return exports after call when it's a function
208
+ //
209
+ // module.exports = function(app) {
210
+ // return {};
211
+ // }
212
+ if (options.call && typeof exports === 'function') {
213
+ exports = exports(options.inject);
214
+ if (exports != null) {
215
+ return exports;
216
+ }
217
+ }
218
+ // return exports what is
219
+ return exports;
220
+ }
221
+ function defaultCamelize(filepath, caseStyle) {
222
+ const properties = filepath.substring(0, filepath.lastIndexOf('.')).split('/');
223
+ return properties.map(property => {
224
+ if (!/^[a-z][a-z0-9_-]*$/i.test(property)) {
225
+ throw new Error(`${property} is not match 'a-z0-9_-' in ${filepath}`);
226
+ }
227
+ // use default camelize, will capitalize the first letter
228
+ // foo_bar.js > FooBar
229
+ // fooBar.js > FooBar
230
+ // FooBar.js > FooBar
231
+ // FooBar.js > FooBar
232
+ // FooBar.js > fooBar (if lowercaseFirst is true)
233
+ property = property.replace(/[_-][a-z]/ig, s => s.substring(1).toUpperCase());
234
+ let first = property[0];
235
+ switch (caseStyle) {
236
+ case 'lower':
237
+ first = first.toLowerCase();
238
+ break;
239
+ case 'upper':
240
+ first = first.toUpperCase();
241
+ break;
242
+ case 'camel':
243
+ default:
244
+ }
245
+ return first + property.substring(1);
246
+ });
247
+ }
248
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZV9sb2FkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbG9hZGVyL2ZpbGVfbG9hZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLDhEQUFpQztBQUNqQyxzREFBeUI7QUFDekIseUNBQXFDO0FBQ3JDLDBEQUE2QjtBQUM3QixvREFBNEI7QUFDNUIsMkNBQXdGO0FBQ3hGLGlFQUErQztBQUUvQyxNQUFNLEtBQUssR0FBRyxJQUFBLG9CQUFRLEVBQUMseUJBQXlCLENBQUMsQ0FBQztBQUVyQyxRQUFBLFFBQVEsR0FBRyxNQUFNLENBQUMsMEJBQTBCLENBQUMsQ0FBQztBQUM5QyxRQUFBLE9BQU8sR0FBRyxNQUFNLENBQUMseUJBQXlCLENBQUMsQ0FBQztBQXFDekQ7OztHQUdHO0FBQ0gsTUFBYSxVQUFVO0lBQ3JCLE1BQU0sS0FBSyxRQUFRO1FBQ2pCLE9BQU8sZ0JBQVEsQ0FBQztJQUNsQixDQUFDO0lBRUQsTUFBTSxLQUFLLE9BQU87UUFDaEIsT0FBTyxlQUFPLENBQUM7SUFDakIsQ0FBQztJQUVRLE9BQU8sQ0FBcUU7SUFFckY7Ozs7Ozs7Ozs7Ozs7T0FhRztJQUNILFlBQVksT0FBMEI7UUFDcEMsSUFBQSxxQkFBTSxFQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsK0JBQStCLENBQUMsQ0FBQztRQUMzRCxJQUFBLHFCQUFNLEVBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSw0QkFBNEIsQ0FBQyxDQUFDO1FBQ3JELElBQUksQ0FBQyxPQUFPLEdBQUc7WUFDYixTQUFTLEVBQUUsT0FBTztZQUNsQixJQUFJLEVBQUUsSUFBSTtZQUNWLFFBQVEsRUFBRSxLQUFLO1lBQ2YsR0FBRyxPQUFPO1NBQ1gsQ0FBQztRQUVGLDBDQUEwQztRQUMxQyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxLQUFLLElBQUksRUFBRSxDQUFDO1lBQ3pDLGtCQUFLLENBQUMsVUFBVSxDQUFDLHFEQUFxRCxDQUFDLENB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
@@ -0,0 +1,3 @@
1
+ {
2
+ "type": "commonjs"
3
+ }
@@ -0,0 +1 @@
1
+ export {};