@eggjs/tegg-loader 4.0.0-beta.1 → 4.0.0-beta.10

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/README.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # `@eggjs/tegg-loader`
2
2
 
3
+ [![NPM version][npm-image]][npm-url]
4
+ [![Known Vulnerabilities][snyk-image]][snyk-url]
5
+ [![npm download][download-image]][download-url]
6
+ [![Node.js Version](https://img.shields.io/node/v/@eggjs/tegg-loader.svg?style=flat)](https://nodejs.org/en/download/)
7
+
8
+ [npm-image]: https://img.shields.io/npm/v/@eggjs/tegg-loader.svg?style=flat-square
9
+ [npm-url]: https://npmjs.org/package/@eggjs/tegg-loader
10
+ [snyk-image]: https://snyk.io/test/npm/@eggjs/tegg-loader/badge.svg?style=flat-square
11
+ [snyk-url]: https://snyk.io/test/npm/@eggjs/tegg-loader
12
+ [download-image]: https://img.shields.io/npm/dm/@eggjs/tegg-loader.svg?style=flat-square
13
+ [download-url]: https://npmjs.org/package/@eggjs/tegg-loader
14
+
3
15
  # Usage
4
16
 
5
17
  This is an internal tegg library, you probably shouldn't use it directly.
@@ -1,5 +1,5 @@
1
- import { EggLoadUnitTypeLike, Loader, ModuleReference } from '@eggjs/tegg-types';
2
- import { ModuleDescriptor } from '@eggjs/tegg-metadata';
1
+ import { type EggLoadUnitTypeLike, type Loader, type ModuleReference } from '@eggjs/tegg-types';
2
+ import { type ModuleDescriptor } from '@eggjs/tegg-metadata';
3
3
  export type LoaderCreator = (unitPath: string) => Loader;
4
4
  export declare class LoaderFactory {
5
5
  private static loaderCreatorMap;
@@ -0,0 +1,43 @@
1
+ import { EggLoadUnitType } from '@eggjs/tegg-types';
2
+ import {} from '@eggjs/tegg-metadata';
3
+ import { PrototypeUtil } from '@eggjs/core-decorator';
4
+ export class LoaderFactory {
5
+ static loaderCreatorMap = new Map();
6
+ static createLoader(unitPath, type) {
7
+ const creator = this.loaderCreatorMap.get(type);
8
+ if (!creator) {
9
+ throw new Error(`not find creator for loader type ${type}`);
10
+ }
11
+ return creator(unitPath);
12
+ }
13
+ static registerLoader(type, creator) {
14
+ this.loaderCreatorMap.set(type, creator);
15
+ }
16
+ static async loadApp(moduleReferences) {
17
+ const result = [];
18
+ const multiInstanceClazzList = [];
19
+ for (const moduleReference of moduleReferences) {
20
+ const loader = LoaderFactory.createLoader(moduleReference.path, moduleReference.loaderType || EggLoadUnitType.MODULE);
21
+ const res = {
22
+ name: moduleReference.name,
23
+ unitPath: moduleReference.path,
24
+ clazzList: [],
25
+ protos: [],
26
+ multiInstanceClazzList,
27
+ optional: moduleReference.optional,
28
+ };
29
+ result.push(res);
30
+ const clazzList = await loader.load();
31
+ for (const clazz of clazzList) {
32
+ if (PrototypeUtil.isEggPrototype(clazz)) {
33
+ res.clazzList.push(clazz);
34
+ }
35
+ else if (PrototypeUtil.isEggMultiInstancePrototype(clazz)) {
36
+ res.multiInstanceClazzList.push(clazz);
37
+ }
38
+ }
39
+ }
40
+ return result;
41
+ }
42
+ }
43
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTG9hZGVyRmFjdG9yeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9Mb2FkZXJGYWN0b3J5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxlQUFlLEVBQXVGLE1BQU0sbUJBQW1CLENBQUM7QUFDekksT0FBTyxFQUF5QixNQUFNLHNCQUFzQixDQUFDO0FBQzdELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUl0RCxNQUFNLE9BQU8sYUFBYTtJQUNoQixNQUFNLENBQUMsZ0JBQWdCLEdBQTRDLElBQUksR0FBRyxFQUFFLENBQUM7SUFFckYsTUFBTSxDQUFDLFlBQVksQ0FBQyxRQUFnQixFQUFFLElBQXlCO1FBQzdELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDaEQsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2IsTUFBTSxJQUFJLEtBQUssQ0FBQyxvQ0FBb0MsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUM5RCxDQUFDO1FBQ0QsT0FBTyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDM0IsQ0FBQztJQUVELE1BQU0sQ0FBQyxjQUFjLENBQUMsSUFBeUIsRUFBRSxPQUFzQjtRQUNyRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBRUQsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsZ0JBQTRDO1FBQy9ELE1BQU0sTUFBTSxHQUF1QixFQUFFLENBQUM7UUFDdEMsTUFBTSxzQkFBc0IsR0FBd0IsRUFBRSxDQUFDO1FBQ3ZELEtBQUssTUFBTSxlQUFlLElBQUksZ0JBQWdCLEVBQUUsQ0FBQztZQUMvQyxNQUFNLE1BQU0sR0FBRyxhQUFhLENBQUMsWUFBWSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsZUFBZSxDQUFDLFVBQVUsSUFBSSxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDdEgsTUFBTSxHQUFHLEdBQXFCO2dCQUM1QixJQUFJLEVBQUUsZUFBZSxDQUFDLElBQUk7Z0JBQzFCLFFBQVEsRUFBRSxlQUFlLENBQUMsSUFBSTtnQkFDOUIsU0FBUyxFQUFFLEVBQUU7Z0JBQ2IsTUFBTSxFQUFFLEVBQUU7Z0JBQ1Ysc0JBQXNCO2dCQUN0QixRQUFRLEVBQUUsZUFBZSxDQUFDLFFBQVE7YUFDbkMsQ0FBQztZQUNGLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDakIsTUFBTSxTQUFTLEdBQUcsTUFBTSxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDdEMsS0FBSyxNQUFNLEtBQUssSUFBSSxTQUFTLEVBQUUsQ0FBQztnQkFDOUIsSUFBSSxhQUFhLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7b0JBQ3hDLEdBQUcsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUM1QixDQUFDO3FCQUFNLElBQUksYUFBYSxDQUFDLDJCQUEyQixDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7b0JBQzVELEdBQUcsQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3pDLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUMifQ==
@@ -0,0 +1,78 @@
1
+ var __rewriteRelativeImportExtension = (this && this.__rewriteRelativeImportExtension) || function (path, preserveJsx) {
2
+ if (typeof path === "string" && /^\.\.?\//.test(path)) {
3
+ return path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {
4
+ return tsx ? preserveJsx ? ".jsx" : ".js" : d && (!ext || !cm) ? m : (d + ext + "." + cm.toLowerCase() + "js");
5
+ });
6
+ }
7
+ return path;
8
+ };
9
+ import { PrototypeUtil } from '@eggjs/core-decorator';
10
+ import BuiltinModule from 'node:module';
11
+ import { isClass } from 'is-type-of';
12
+ // Guard against poorly mocked module constructors.
13
+ const Module = globalThis.module?.constructor?.length > 1
14
+ ? globalThis.module.constructor
15
+ /* istanbul ignore next */
16
+ : BuiltinModule;
17
+ export class LoaderUtil {
18
+ static config = {};
19
+ static setConfig(config) {
20
+ this.config = config;
21
+ }
22
+ static supportExtensions() {
23
+ const extensions = Object.keys(Module._extensions);
24
+ if (process.env.VITEST === 'true' && !extensions.includes('.ts')) {
25
+ extensions.push('.ts');
26
+ }
27
+ return extensions;
28
+ }
29
+ static get extension() {
30
+ return LoaderUtil.supportExtensions().includes('.ts') ? '.ts' : '.js';
31
+ }
32
+ static filePattern() {
33
+ const extensions = LoaderUtil.supportExtensions();
34
+ const extensionPattern = extensions.map(t => t.substring(1))
35
+ // JSON file will not export class
36
+ .filter(t => t !== 'json')
37
+ .join('|');
38
+ const filePattern = [
39
+ // load file end with node module allow extensions
40
+ `**/*.(${extensionPattern})`,
41
+ // not load files in .xxx/
42
+ '!**/+(.*)/**',
43
+ // not load node module
44
+ '!**/node_modules',
45
+ // node load type definitions
46
+ '!**/*.d.ts',
47
+ // not load test/coverage files
48
+ '!**/test',
49
+ '!**/coverage',
50
+ // extra file pattern
51
+ ...(this.config.extraFilePattern || []),
52
+ ];
53
+ return filePattern;
54
+ }
55
+ static async loadFile(filePath) {
56
+ let exports;
57
+ try {
58
+ exports = await import(__rewriteRelativeImportExtension(filePath));
59
+ }
60
+ catch (e) {
61
+ console.error('[tegg/loader] loadFile %s error:', filePath);
62
+ console.error(e);
63
+ throw new Error(`[tegg/loader] load ${filePath} failed: ${e.message}`);
64
+ }
65
+ const clazzList = [];
66
+ const exportNames = Object.keys(exports);
67
+ for (const exportName of exportNames) {
68
+ const clazz = exports[exportName];
69
+ const isEggProto = isClass(clazz) && (PrototypeUtil.isEggPrototype(clazz) || PrototypeUtil.isEggMultiInstancePrototype(clazz));
70
+ if (!isEggProto) {
71
+ continue;
72
+ }
73
+ clazzList.push(clazz);
74
+ }
75
+ return clazzList;
76
+ }
77
+ }
78
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTG9hZGVyVXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9Mb2FkZXJVdGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUEsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRXRELE9BQU8sYUFBYSxNQUFNLGFBQWEsQ0FBQztBQUN4QyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBRXJDLG1EQUFtRDtBQUNuRCxNQUFNLE1BQU0sR0FBRyxVQUFVLENBQUMsTUFBTSxFQUFFLFdBQVcsRUFBRSxNQUFNLEdBQUcsQ0FBQztJQUN2RCxDQUFDLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxXQUFXO0lBQy9CLDBCQUEwQjtJQUMxQixDQUFDLENBQUMsYUFBYSxDQUFDO0FBTWxCLE1BQU0sT0FBTyxVQUFVO0lBQ3JCLE1BQU0sQ0FBQyxNQUFNLEdBQXFCLEVBQUUsQ0FBQztJQUNyQyxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQXdCO1FBQ3ZDLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxNQUFNLENBQUMsaUJBQWlCO1FBQ3RCLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUUsTUFBYyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzVELElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEtBQUssTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ2pFLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDekIsQ0FBQztRQUNELE9BQU8sVUFBVSxDQUFDO0lBQ3BCLENBQUM7SUFFRCxNQUFNLEtBQUssU0FBUztRQUNsQixPQUFPLFVBQVUsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7SUFDeEUsQ0FBQztJQUVELE1BQU0sQ0FBQyxXQUFXO1FBQ2hCLE1BQU0sVUFBVSxHQUFHLFVBQVUsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQ2xELE1BQU0sZ0JBQWdCLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDMUQsa0NBQWtDO2FBQ2pDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxNQUFNLENBQUM7YUFDekIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRWIsTUFBTSxXQUFXLEdBQUc7WUFDbEIsa0RBQWtEO1lBQ2xELFNBQVMsZ0JBQWdCLEdBQUc7WUFDNUIsMEJBQTBCO1lBQzFCLGNBQWM7WUFDZCx1QkFBdUI7WUFDdkIsa0JBQWtCO1lBQ2xCLDZCQUE2QjtZQUM3QixZQUFZO1lBQ1osK0JBQStCO1lBQy9CLFVBQVU7WUFDVixjQUFjO1lBQ2QscUJBQXFCO1lBQ3JCLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGdCQUFnQixJQUFJLEVBQUUsQ0FBQztTQUN4QyxDQUFDO1FBRUYsT0FBTyxXQUFXLENBQUM7SUFDckIsQ0FBQztJQUVELE1BQU0sQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLFFBQWdCO1FBQ3BDLElBQUksT0FBTyxDQUFDO1FBQ1osSUFBSSxDQUFDO1lBQ0gsT0FBTyxHQUFHLE1BQU0sTUFBTSxrQ0FBQyxRQUFRLEVBQUMsQ0FBQztRQUNuQyxDQUFDO1FBQUMsT0FBTyxDQUFNLEVBQUUsQ0FBQztZQUNoQixPQUFPLENBQUMsS0FBSyxDQUFDLGtDQUFrQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQzVELE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDakIsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQkFBc0IsUUFBUSxZQUFZLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQ3pFLENBQUM7UUFDRCxNQUFNLFNBQVMsR0FBd0IsRUFBRSxDQUFDO1FBQzFDLE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDekMsS0FBSyxNQUFNLFVBQVUsSUFBSSxXQUFXLEVBQUUsQ0FBQztZQUNyQyxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDbEMsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsSUFBSSxhQUFhLENBQUMsMkJBQTJCLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUMvSCxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQ2hCLFNBQVM7WUFDWCxDQUFDO1lBQ0QsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN4QixDQUFDO1FBQ0QsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQyJ9
@@ -0,0 +1,37 @@
1
+ import path from 'node:path';
2
+ import { debuglog } from 'node:util';
3
+ import { globby } from 'globby';
4
+ import { LoaderUtil } from '../LoaderUtil.js';
5
+ import { LoaderFactory } from '../LoaderFactory.js';
6
+ const debug = debuglog('@eggjs/tegg-loader/impl/ModuleLoader');
7
+ export class ModuleLoader {
8
+ moduleDir;
9
+ protoClazzList;
10
+ constructor(moduleDir) {
11
+ this.moduleDir = moduleDir;
12
+ }
13
+ async load() {
14
+ // optimize for EggModuleLoader
15
+ if (this.protoClazzList) {
16
+ return this.protoClazzList;
17
+ }
18
+ const protoClassList = [];
19
+ const filePattern = LoaderUtil.filePattern();
20
+ const files = await globby(filePattern, { cwd: this.moduleDir });
21
+ debug('load files: %o, filePattern: %o, moduleDir: %o', files, filePattern, this.moduleDir);
22
+ for (const file of files) {
23
+ const realPath = path.join(this.moduleDir, file);
24
+ const fileClazzList = await LoaderUtil.loadFile(realPath);
25
+ for (const clazz of fileClazzList) {
26
+ protoClassList.push(clazz);
27
+ }
28
+ }
29
+ this.protoClazzList = Array.from(new Set(protoClassList));
30
+ return this.protoClazzList;
31
+ }
32
+ static createModuleLoader(path) {
33
+ return new ModuleLoader(path);
34
+ }
35
+ }
36
+ LoaderFactory.registerLoader('MODULE', ModuleLoader.createModuleLoader);
37
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTW9kdWxlTG9hZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2ltcGwvTW9kdWxlTG9hZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sSUFBSSxNQUFNLFdBQVcsQ0FBQztBQUM3QixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3JDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFFaEMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUVwRCxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsc0NBQXNDLENBQUMsQ0FBQztBQUUvRCxNQUFNLE9BQU8sWUFBWTtJQUNOLFNBQVMsQ0FBUztJQUMzQixjQUFjLENBQXNCO0lBRTVDLFlBQVksU0FBaUI7UUFDM0IsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7SUFDN0IsQ0FBQztJQUVELEtBQUssQ0FBQyxJQUFJO1FBQ1IsK0JBQStCO1FBQy9CLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3hCLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQztRQUM3QixDQUFDO1FBQ0QsTUFBTSxjQUFjLEdBQXdCLEVBQUUsQ0FBQztRQUMvQyxNQUFNLFdBQVcsR0FBRyxVQUFVLENBQUMsV0FBVyxFQUFFLENBQUM7UUFFN0MsTUFBTSxLQUFLLEdBQUcsTUFBTSxNQUFNLENBQUMsV0FBVyxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDO1FBQ2pFLEtBQUssQ0FBQyxnREFBZ0QsRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUM1RixLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ3pCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNqRCxNQUFNLGFBQWEsR0FBRyxNQUFNLFVBQVUsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDMUQsS0FBSyxNQUFNLEtBQUssSUFBSSxhQUFhLEVBQUUsQ0FBQztnQkFDbEMsY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM3QixDQUFDO1FBQ0gsQ0FBQztRQUNELElBQUksQ0FBQyxjQUFjLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDO1FBQzFELE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQztJQUM3QixDQUFDO0lBRUQsTUFBTSxDQUFDLGtCQUFrQixDQUFDLElBQVk7UUFDcEMsT0FBTyxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNoQyxDQUFDO0NBQ0Y7QUFFRCxhQUFhLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRSxZQUFZLENBQUMsa0JBQWtCLENBQUMsQ0FBQyJ9
@@ -1,2 +1,2 @@
1
1
  export * from './ModuleLoader.js';
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLG1CQUFtQixDQUFDIn0=
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW1wbC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLG1CQUFtQixDQUFDIn0=
@@ -1,4 +1,4 @@
1
1
  export * from './LoaderFactory.js';
2
2
  export * from './LoaderUtil.js';
3
3
  export * from './impl/index.js';
4
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLG9CQUFvQixDQUFDO0FBQ25DLGNBQWMsaUJBQWlCLENBQUM7QUFDaEMsY0FBYyxpQkFBaUIsQ0FBQyJ9
4
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxvQkFBb0IsQ0FBQztBQUNuQyxjQUFjLGlCQUFpQixDQUFDO0FBQ2hDLGNBQWMsaUJBQWlCLENBQUMifQ==
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@eggjs/tegg-loader",
3
- "version": "4.0.0-beta.1",
3
+ "version": "4.0.0-beta.10",
4
4
  "description": "tegg default loader implement",
5
5
  "keywords": [
6
6
  "egg",
@@ -10,24 +10,15 @@
10
10
  ],
11
11
  "type": "module",
12
12
  "exports": {
13
- ".": {
14
- "types": "./src/index.d.ts",
15
- "default": "./src/index.js"
16
- }
13
+ ".": "./dist/index.js",
14
+ "./package.json": "./package.json"
17
15
  },
18
16
  "files": [
19
- "src/**/*.js",
20
- "src/**/*.d.ts"
17
+ "dist"
21
18
  ],
22
- "scripts": {
23
- "clean": "tsc -b --clean",
24
- "tsc": "npm run clean && tsc -p ./tsconfig.json",
25
- "tsc:pub": "npm run tsc",
26
- "prepublishOnly": "npm run tsc"
27
- },
28
19
  "author": "killagu <killa123@126.com>",
29
20
  "license": "MIT",
30
- "homepage": "https://github.com/eggjs/tegg",
21
+ "homepage": "https://github.com/eggjs/tegg/tree/next/core/loader",
31
22
  "bugs": {
32
23
  "url": "https://github.com/eggjs/tegg/issues"
33
24
  },
@@ -37,23 +28,30 @@
37
28
  "directory": "core/loader"
38
29
  },
39
30
  "engines": {
40
- "node": ">=20.0.0"
31
+ "node": ">=22.18.0"
41
32
  },
42
33
  "dependencies": {
43
- "@eggjs/core-decorator": "^4.0.0-beta.1",
44
- "@eggjs/tegg-common-util": "^4.0.0-beta.1",
45
- "@eggjs/tegg-types": "^4.0.0-beta.1",
46
34
  "globby": "^14.1.0",
47
- "is-type-of": "^2.2.0"
35
+ "is-type-of": "^2.2.0",
36
+ "@eggjs/core-decorator": "4.0.0-beta.10",
37
+ "@eggjs/tegg-types": "4.0.0-beta.10",
38
+ "@eggjs/tegg-metadata": "4.0.0-beta.10"
48
39
  },
49
40
  "publishConfig": {
50
41
  "access": "public"
51
42
  },
52
43
  "devDependencies": {
53
- "@eggjs/tegg-metadata": "^4.0.0-beta.1",
54
- "@types/node": "22",
55
- "ts-node": "10",
56
- "typescript": "5"
57
- },
58
- "gitHead": "79a22905272d6de7fe06152231dff65d213d9166"
59
- }
44
+ "@types/node": "^22.10.5",
45
+ "typescript": "^5.9.3",
46
+ "tsdown": "^0.15.6",
47
+ "unplugin-unused": "^0.5.3"
48
+ },
49
+ "main": "./dist/index.js",
50
+ "module": "./dist/index.js",
51
+ "types": "./dist/index.d.ts",
52
+ "scripts": {
53
+ "clean": "rimraf dist",
54
+ "build": "tsdown && rimraf dist && tsc -b --clean && tsc",
55
+ "typecheck": "tsc --noEmit"
56
+ }
57
+ }
@@ -1,42 +0,0 @@
1
- import { EggLoadUnitType } from '@eggjs/tegg-types';
2
- import { PrototypeUtil } from '@eggjs/core-decorator';
3
- export class LoaderFactory {
4
- static loaderCreatorMap = new Map();
5
- static createLoader(unitPath, type) {
6
- const creator = this.loaderCreatorMap.get(type);
7
- if (!creator) {
8
- throw new Error(`not find creator for loader type ${type}`);
9
- }
10
- return creator(unitPath);
11
- }
12
- static registerLoader(type, creator) {
13
- this.loaderCreatorMap.set(type, creator);
14
- }
15
- static async loadApp(moduleReferences) {
16
- const result = [];
17
- const multiInstanceClazzList = [];
18
- for (const moduleReference of moduleReferences) {
19
- const loader = LoaderFactory.createLoader(moduleReference.path, moduleReference.loaderType || EggLoadUnitType.MODULE);
20
- const res = {
21
- name: moduleReference.name,
22
- unitPath: moduleReference.path,
23
- clazzList: [],
24
- protos: [],
25
- multiInstanceClazzList,
26
- optional: moduleReference.optional,
27
- };
28
- result.push(res);
29
- const clazzList = await loader.load();
30
- for (const clazz of clazzList) {
31
- if (PrototypeUtil.isEggPrototype(clazz)) {
32
- res.clazzList.push(clazz);
33
- }
34
- else if (PrototypeUtil.isEggMultiInstancePrototype(clazz)) {
35
- res.multiInstanceClazzList.push(clazz);
36
- }
37
- }
38
- }
39
- return result;
40
- }
41
- }
42
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTG9hZGVyRmFjdG9yeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIkxvYWRlckZhY3RvcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGVBQWUsRUFBbUUsTUFBTSxtQkFBbUIsQ0FBQztBQUVySCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFJdEQsTUFBTSxPQUFPLGFBQWE7SUFDaEIsTUFBTSxDQUFDLGdCQUFnQixHQUE0QyxJQUFJLEdBQUcsRUFBRSxDQUFDO0lBRXJGLE1BQU0sQ0FBQyxZQUFZLENBQUMsUUFBZ0IsRUFBRSxJQUF5QjtRQUM3RCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2hELElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNiLE1BQU0sSUFBSSxLQUFLLENBQUMsb0NBQW9DLElBQUksRUFBRSxDQUFDLENBQUM7UUFDOUQsQ0FBQztRQUNELE9BQU8sT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzNCLENBQUM7SUFFRCxNQUFNLENBQUMsY0FBYyxDQUFDLElBQXlCLEVBQUUsT0FBc0I7UUFDckUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVELE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGdCQUE0QztRQUMvRCxNQUFNLE1BQU0sR0FBdUIsRUFBRSxDQUFDO1FBQ3RDLE1BQU0sc0JBQXNCLEdBQXdCLEVBQUUsQ0FBQztRQUN2RCxLQUFLLE1BQU0sZUFBZSxJQUFJLGdCQUFnQixFQUFFLENBQUM7WUFDL0MsTUFBTSxNQUFNLEdBQUcsYUFBYSxDQUFDLFlBQVksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLGVBQWUsQ0FBQyxVQUFVLElBQUksZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3RILE1BQU0sR0FBRyxHQUFxQjtnQkFDNUIsSUFBSSxFQUFFLGVBQWUsQ0FBQyxJQUFJO2dCQUMxQixRQUFRLEVBQUUsZUFBZSxDQUFDLElBQUk7Z0JBQzlCLFNBQVMsRUFBRSxFQUFFO2dCQUNiLE1BQU0sRUFBRSxFQUFFO2dCQUNWLHNCQUFzQjtnQkFDdEIsUUFBUSxFQUFFLGVBQWUsQ0FBQyxRQUFRO2FBQ25DLENBQUM7WUFDRixNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2pCLE1BQU0sU0FBUyxHQUFHLE1BQU0sTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3RDLEtBQUssTUFBTSxLQUFLLElBQUksU0FBUyxFQUFFLENBQUM7Z0JBQzlCLElBQUksYUFBYSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO29CQUN4QyxHQUFHLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDNUIsQ0FBQztxQkFBTSxJQUFJLGFBQWEsQ0FBQywyQkFBMkIsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO29CQUM1RCxHQUFHLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUN6QyxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDIn0=
package/src/LoaderUtil.js DELETED
@@ -1,70 +0,0 @@
1
- import { PrototypeUtil } from '@eggjs/core-decorator';
2
- import BuiltinModule from 'node:module';
3
- import { isClass } from 'is-type-of';
4
- // Guard against poorly mocked module constructors.
5
- const Module = globalThis.module?.constructor?.length > 1
6
- ? globalThis.module.constructor
7
- /* istanbul ignore next */
8
- : BuiltinModule;
9
- export class LoaderUtil {
10
- static config = {};
11
- static setConfig(config) {
12
- this.config = config;
13
- }
14
- static supportExtensions() {
15
- const extensions = Object.keys(Module._extensions);
16
- if (process.env.VITEST === 'true' && !extensions.includes('.ts')) {
17
- extensions.push('.ts');
18
- }
19
- return extensions;
20
- }
21
- static get extension() {
22
- return LoaderUtil.supportExtensions().includes('.ts') ? '.ts' : '.js';
23
- }
24
- static filePattern() {
25
- const extensions = LoaderUtil.supportExtensions();
26
- const extensionPattern = extensions.map(t => t.substring(1))
27
- // JSON file will not export class
28
- .filter(t => t !== 'json')
29
- .join('|');
30
- const filePattern = [
31
- // load file end with node module allow extensions
32
- `**/*.(${extensionPattern})`,
33
- // not load files in .xxx/
34
- '!**/+(.*)/**',
35
- // not load node module
36
- '!**/node_modules',
37
- // node load type definitions
38
- '!**/*.d.ts',
39
- // not load test/coverage files
40
- '!**/test',
41
- '!**/coverage',
42
- // extra file pattern
43
- ...(this.config.extraFilePattern || []),
44
- ];
45
- return filePattern;
46
- }
47
- static async loadFile(filePath) {
48
- let exports;
49
- try {
50
- exports = await import(filePath);
51
- }
52
- catch (e) {
53
- console.error('[tegg/loader] loadFile %s error:', filePath);
54
- console.error(e);
55
- throw new Error(`[tegg/loader] load ${filePath} failed: ${e.message}`);
56
- }
57
- const clazzList = [];
58
- const exportNames = Object.keys(exports);
59
- for (const exportName of exportNames) {
60
- const clazz = exports[exportName];
61
- const isEggProto = isClass(clazz) && (PrototypeUtil.isEggPrototype(clazz) || PrototypeUtil.isEggMultiInstancePrototype(clazz));
62
- if (!isEggProto) {
63
- continue;
64
- }
65
- clazzList.push(clazz);
66
- }
67
- return clazzList;
68
- }
69
- }
70
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTG9hZGVyVXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIkxvYWRlclV0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRXRELE9BQU8sYUFBYSxNQUFNLGFBQWEsQ0FBQztBQUN4QyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBRXJDLG1EQUFtRDtBQUNuRCxNQUFNLE1BQU0sR0FBRyxVQUFVLENBQUMsTUFBTSxFQUFFLFdBQVcsRUFBRSxNQUFNLEdBQUcsQ0FBQztJQUN2RCxDQUFDLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxXQUFXO0lBQy9CLDBCQUEwQjtJQUMxQixDQUFDLENBQUMsYUFBYSxDQUFDO0FBTWxCLE1BQU0sT0FBTyxVQUFVO0lBQ3JCLE1BQU0sQ0FBQyxNQUFNLEdBQXFCLEVBQUUsQ0FBQztJQUNyQyxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQXdCO1FBQ3ZDLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxNQUFNLENBQUMsaUJBQWlCO1FBQ3RCLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUUsTUFBYyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzVELElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEtBQUssTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ2pFLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDekIsQ0FBQztRQUNELE9BQU8sVUFBVSxDQUFDO0lBQ3BCLENBQUM7SUFFRCxNQUFNLEtBQUssU0FBUztRQUNsQixPQUFPLFVBQVUsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7SUFDeEUsQ0FBQztJQUVELE1BQU0sQ0FBQyxXQUFXO1FBQ2hCLE1BQU0sVUFBVSxHQUFHLFVBQVUsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQ2xELE1BQU0sZ0JBQWdCLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDMUQsa0NBQWtDO2FBQ2pDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxNQUFNLENBQUM7YUFDekIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRWIsTUFBTSxXQUFXLEdBQUc7WUFDbEIsa0RBQWtEO1lBQ2xELFNBQVMsZ0JBQWdCLEdBQUc7WUFDNUIsMEJBQTBCO1lBQzFCLGNBQWM7WUFDZCx1QkFBdUI7WUFDdkIsa0JBQWtCO1lBQ2xCLDZCQUE2QjtZQUM3QixZQUFZO1lBQ1osK0JBQStCO1lBQy9CLFVBQVU7WUFDVixjQUFjO1lBQ2QscUJBQXFCO1lBQ3JCLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGdCQUFnQixJQUFJLEVBQUUsQ0FBQztTQUN4QyxDQUFDO1FBRUYsT0FBTyxXQUFXLENBQUM7SUFDckIsQ0FBQztJQUVELE1BQU0sQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLFFBQWdCO1FBQ3BDLElBQUksT0FBTyxDQUFDO1FBQ1osSUFBSSxDQUFDO1lBQ0gsT0FBTyxHQUFHLE1BQU0sTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ25DLENBQUM7UUFBQyxPQUFPLENBQU0sRUFBRSxDQUFDO1lBQ2hCLE9BQU8sQ0FBQyxLQUFLLENBQUMsa0NBQWtDLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDNUQsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNqQixNQUFNLElBQUksS0FBSyxDQUFDLHNCQUFzQixRQUFRLFlBQVksQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDekUsQ0FBQztRQUNELE1BQU0sU0FBUyxHQUF3QixFQUFFLENBQUM7UUFDMUMsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN6QyxLQUFLLE1BQU0sVUFBVSxJQUFJLFdBQVcsRUFBRSxDQUFDO1lBQ3JDLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUNsQyxNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxJQUFJLGFBQWEsQ0FBQywyQkFBMkIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQy9ILElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFDaEIsU0FBUztZQUNYLENBQUM7WUFDRCxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3hCLENBQUM7UUFDRCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDIn0=
@@ -1,37 +0,0 @@
1
- import path from 'node:path';
2
- import { debuglog } from 'node:util';
3
- import { globby } from 'globby';
4
- import { LoaderUtil } from '../LoaderUtil.js';
5
- import { LoaderFactory } from '../LoaderFactory.js';
6
- const debug = debuglog('@eggjs/tegg-loader/impl/ModuleLoader');
7
- export class ModuleLoader {
8
- moduleDir;
9
- protoClazzList;
10
- constructor(moduleDir) {
11
- this.moduleDir = moduleDir;
12
- }
13
- async load() {
14
- // optimize for EggModuleLoader
15
- if (this.protoClazzList) {
16
- return this.protoClazzList;
17
- }
18
- const protoClassList = [];
19
- const filePattern = LoaderUtil.filePattern();
20
- const files = await globby(filePattern, { cwd: this.moduleDir });
21
- debug('load files: %o, filePattern: %o, moduleDir: %o', files, filePattern, this.moduleDir);
22
- for (const file of files) {
23
- const realPath = path.join(this.moduleDir, file);
24
- const fileClazzList = await LoaderUtil.loadFile(realPath);
25
- for (const clazz of fileClazzList) {
26
- protoClassList.push(clazz);
27
- }
28
- }
29
- this.protoClazzList = Array.from(new Set(protoClassList));
30
- return this.protoClazzList;
31
- }
32
- static createModuleLoader(path) {
33
- return new ModuleLoader(path);
34
- }
35
- }
36
- LoaderFactory.registerLoader('MODULE', ModuleLoader.createModuleLoader);
37
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTW9kdWxlTG9hZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiTW9kdWxlTG9hZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sSUFBSSxNQUFNLFdBQVcsQ0FBQztBQUM3QixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3JDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFFaEMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUVwRCxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsc0NBQXNDLENBQUMsQ0FBQztBQUUvRCxNQUFNLE9BQU8sWUFBWTtJQUNOLFNBQVMsQ0FBUztJQUMzQixjQUFjLENBQXNCO0lBRTVDLFlBQVksU0FBaUI7UUFDM0IsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7SUFDN0IsQ0FBQztJQUVELEtBQUssQ0FBQyxJQUFJO1FBQ1IsK0JBQStCO1FBQy9CLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3hCLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQztRQUM3QixDQUFDO1FBQ0QsTUFBTSxjQUFjLEdBQXdCLEVBQUUsQ0FBQztRQUMvQyxNQUFNLFdBQVcsR0FBRyxVQUFVLENBQUMsV0FBVyxFQUFFLENBQUM7UUFFN0MsTUFBTSxLQUFLLEdBQUcsTUFBTSxNQUFNLENBQUMsV0FBVyxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDO1FBQ2pFLEtBQUssQ0FBQyxnREFBZ0QsRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUM1RixLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ3pCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNqRCxNQUFNLGFBQWEsR0FBRyxNQUFNLFVBQVUsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDMUQsS0FBSyxNQUFNLEtBQUssSUFBSSxhQUFhLEVBQUUsQ0FBQztnQkFDbEMsY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM3QixDQUFDO1FBQ0gsQ0FBQztRQUNELElBQUksQ0FBQyxjQUFjLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDO1FBQzFELE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQztJQUM3QixDQUFDO0lBRUQsTUFBTSxDQUFDLGtCQUFrQixDQUFDLElBQVk7UUFDcEMsT0FBTyxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNoQyxDQUFDO0NBQ0Y7QUFFRCxhQUFhLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRSxZQUFZLENBQUMsa0JBQWtCLENBQUMsQ0FBQyJ9
File without changes
File without changes
File without changes
File without changes