@eggjs/tegg-common-util 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 +13 -1
- package/dist/FSUtil.js +13 -0
- package/dist/Graph.js +159 -0
- package/dist/MapUtil.js +9 -0
- package/dist/ModuleConfig.js +282 -0
- package/dist/ModuleConfigs.js +10 -0
- package/dist/NameUtil.js +6 -0
- package/{src → dist}/ObjectUtils.d.ts +1 -1
- package/dist/ObjectUtils.js +51 -0
- package/{src → dist}/ProxyUtil.js +1 -1
- package/{src → dist}/StackUtil.js +6 -2
- package/dist/TimerUtil.js +6 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.js +13 -0
- package/package.json +24 -24
- package/src/FSUtil.js +0 -13
- package/src/Graph.js +0 -159
- package/src/MapUtil.js +0 -9
- package/src/ModuleConfig.js +0 -282
- package/src/ModuleConfigs.js +0 -10
- package/src/NameUtil.js +0 -6
- package/src/ObjectUtils.js +0 -51
- package/src/TimerUtil.js +0 -6
- package/src/index.d.ts +0 -12
- package/src/index.js +0 -13
- /package/{src → dist}/FSUtil.d.ts +0 -0
- /package/{src → dist}/Graph.d.ts +0 -0
- /package/{src → dist}/MapUtil.d.ts +0 -0
- /package/{src → dist}/ModuleConfig.d.ts +0 -0
- /package/{src → dist}/ModuleConfigs.d.ts +0 -0
- /package/{src → dist}/NameUtil.d.ts +0 -0
- /package/{src → dist}/ProxyUtil.d.ts +0 -0
- /package/{src → dist}/StackUtil.d.ts +0 -0
- /package/{src → dist}/TimerUtil.d.ts +0 -0
package/README.md
CHANGED
|
@@ -1,4 +1,16 @@
|
|
|
1
|
-
# `@eggjs/common-util`
|
|
1
|
+
# `@eggjs/tegg-common-util`
|
|
2
|
+
|
|
3
|
+
[![NPM version][npm-image]][npm-url]
|
|
4
|
+
[![Known Vulnerabilities][snyk-image]][snyk-url]
|
|
5
|
+
[![npm download][download-image]][download-url]
|
|
6
|
+
[](https://nodejs.org/en/download/)
|
|
7
|
+
|
|
8
|
+
[npm-image]: https://img.shields.io/npm/v/@eggjs/tegg-common-util.svg?style=flat-square
|
|
9
|
+
[npm-url]: https://npmjs.org/package/@eggjs/tegg-common-util
|
|
10
|
+
[snyk-image]: https://snyk.io/test/npm/@eggjs/tegg-common-util/badge.svg?style=flat-square
|
|
11
|
+
[snyk-url]: https://snyk.io/test/npm/@eggjs/tegg-common-util
|
|
12
|
+
[download-image]: https://img.shields.io/npm/dm/@eggjs/tegg-common-util.svg?style=flat-square
|
|
13
|
+
[download-url]: https://npmjs.org/package/@eggjs/tegg-common-util
|
|
2
14
|
|
|
3
15
|
# Usage
|
|
4
16
|
|
package/dist/FSUtil.js
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import fs from 'node:fs/promises';
|
|
2
|
+
export class FSUtil {
|
|
3
|
+
static async fileExists(filePath) {
|
|
4
|
+
try {
|
|
5
|
+
await fs.access(filePath);
|
|
6
|
+
}
|
|
7
|
+
catch {
|
|
8
|
+
return false;
|
|
9
|
+
}
|
|
10
|
+
return true;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRlNVdGlsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL0ZTVXRpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUVsQyxNQUFNLE9BQU8sTUFBTTtJQUNqQixNQUFNLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxRQUFnQjtRQUN0QyxJQUFJLENBQUM7WUFDSCxNQUFNLEVBQUUsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDNUIsQ0FBQztRQUFDLE1BQU0sQ0FBQztZQUNQLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztDQUNGIn0=
|
package/dist/Graph.js
ADDED
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
const inspect = Symbol.for('nodejs.util.inspect.custom');
|
|
2
|
+
export class GraphNode {
|
|
3
|
+
val;
|
|
4
|
+
toNodeMap = new Map();
|
|
5
|
+
fromNodeMap = new Map();
|
|
6
|
+
constructor(val) {
|
|
7
|
+
this.val = val;
|
|
8
|
+
}
|
|
9
|
+
get id() {
|
|
10
|
+
return this.val.id;
|
|
11
|
+
}
|
|
12
|
+
addToVertex(node, meta) {
|
|
13
|
+
if (this.toNodeMap.has(node.id)) {
|
|
14
|
+
return false;
|
|
15
|
+
}
|
|
16
|
+
this.toNodeMap.set(node.id, { node, meta });
|
|
17
|
+
return true;
|
|
18
|
+
}
|
|
19
|
+
addFromVertex(node, meta) {
|
|
20
|
+
if (this.fromNodeMap.has(node.id)) {
|
|
21
|
+
return false;
|
|
22
|
+
}
|
|
23
|
+
this.fromNodeMap.set(node.id, { node, meta });
|
|
24
|
+
return true;
|
|
25
|
+
}
|
|
26
|
+
[inspect]() {
|
|
27
|
+
return this.toJSON();
|
|
28
|
+
}
|
|
29
|
+
toJSON() {
|
|
30
|
+
return {
|
|
31
|
+
val: this.val,
|
|
32
|
+
toNodes: Array.from(this.toNodeMap.values()),
|
|
33
|
+
fromNodes: Array.from(this.fromNodeMap.values()),
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
toString() {
|
|
37
|
+
return this.val.toString();
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
export class GraphPath {
|
|
41
|
+
nodeIdMap = new Map();
|
|
42
|
+
nodes = [];
|
|
43
|
+
pushVertex(node, meta) {
|
|
44
|
+
const val = this.nodeIdMap.get(node.id) || 0;
|
|
45
|
+
this.nodeIdMap.set(node.id, val + 1);
|
|
46
|
+
this.nodes.push({ node, meta });
|
|
47
|
+
return val === 0;
|
|
48
|
+
}
|
|
49
|
+
popVertex() {
|
|
50
|
+
const nodeHandler = this.nodes.pop();
|
|
51
|
+
if (nodeHandler) {
|
|
52
|
+
const val = this.nodeIdMap.get(nodeHandler.node.id);
|
|
53
|
+
this.nodeIdMap.set(nodeHandler.node.id, val - 1);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
toString() {
|
|
57
|
+
const res = this.nodes.reduce((p, c) => {
|
|
58
|
+
let msg = '';
|
|
59
|
+
if (c.meta) {
|
|
60
|
+
msg += ` ${c.meta.toString()} -> `;
|
|
61
|
+
}
|
|
62
|
+
else if (p.length) {
|
|
63
|
+
msg += ' -> ';
|
|
64
|
+
}
|
|
65
|
+
msg += c.node.val.toString();
|
|
66
|
+
p.push(msg);
|
|
67
|
+
return p;
|
|
68
|
+
}, new Array());
|
|
69
|
+
return res.join('');
|
|
70
|
+
}
|
|
71
|
+
[inspect]() {
|
|
72
|
+
return this.toString();
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
export class Graph {
|
|
76
|
+
nodes = new Map();
|
|
77
|
+
addVertex(node) {
|
|
78
|
+
if (this.nodes.has(node.id)) {
|
|
79
|
+
return false;
|
|
80
|
+
}
|
|
81
|
+
this.nodes.set(node.id, node);
|
|
82
|
+
return true;
|
|
83
|
+
}
|
|
84
|
+
addEdge(from, to, meta) {
|
|
85
|
+
to.addFromVertex(from, meta);
|
|
86
|
+
return from.addToVertex(to, meta);
|
|
87
|
+
}
|
|
88
|
+
findToNode(id, meta) {
|
|
89
|
+
const node = this.nodes.get(id);
|
|
90
|
+
if (!node)
|
|
91
|
+
return undefined;
|
|
92
|
+
for (const { node: toNode, meta: edgeMeta } of node.toNodeMap.values()) {
|
|
93
|
+
if (edgeMeta && meta.equal(edgeMeta)) {
|
|
94
|
+
return toNode;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
return undefined;
|
|
98
|
+
}
|
|
99
|
+
appendVertexToPath(node, accessPath, meta) {
|
|
100
|
+
if (!accessPath.pushVertex(node, meta)) {
|
|
101
|
+
return false;
|
|
102
|
+
}
|
|
103
|
+
for (const toNode of node.toNodeMap.values()) {
|
|
104
|
+
if (!this.appendVertexToPath(toNode.node, accessPath, toNode.meta)) {
|
|
105
|
+
return false;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
accessPath.popVertex();
|
|
109
|
+
return true;
|
|
110
|
+
}
|
|
111
|
+
loopPath() {
|
|
112
|
+
const accessPath = new GraphPath();
|
|
113
|
+
const nodes = Array.from(this.nodes.values());
|
|
114
|
+
for (const node of nodes) {
|
|
115
|
+
if (!this.appendVertexToPath(node, accessPath)) {
|
|
116
|
+
return accessPath;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
accessNode(node, nodes, accessed, res) {
|
|
122
|
+
const index = nodes.indexOf(node);
|
|
123
|
+
if (accessed[index]) {
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
if (!node.toNodeMap.size) {
|
|
127
|
+
accessed[nodes.indexOf(node)] = true;
|
|
128
|
+
res.push(node);
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
for (const toNode of node.toNodeMap.values()) {
|
|
132
|
+
this.accessNode(toNode.node, nodes, accessed, res);
|
|
133
|
+
}
|
|
134
|
+
accessed[nodes.indexOf(node)] = true;
|
|
135
|
+
res.push(node);
|
|
136
|
+
}
|
|
137
|
+
// sort by direct
|
|
138
|
+
// priority:
|
|
139
|
+
// 1. vertex can not be access
|
|
140
|
+
// 2. reverse by access direct
|
|
141
|
+
//
|
|
142
|
+
// notice:
|
|
143
|
+
// 1. sort result is not stable
|
|
144
|
+
// 2. graph with loop can not be sort
|
|
145
|
+
sort() {
|
|
146
|
+
const res = [];
|
|
147
|
+
const nodes = Array.from(this.nodes.values());
|
|
148
|
+
const accessed = [];
|
|
149
|
+
for (let i = 0; i < nodes.length; ++i) {
|
|
150
|
+
accessed.push(false);
|
|
151
|
+
}
|
|
152
|
+
for (let i = 0; i < nodes.length; ++i) {
|
|
153
|
+
const node = nodes[i];
|
|
154
|
+
this.accessNode(node, nodes, accessed, res);
|
|
155
|
+
}
|
|
156
|
+
return res;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR3JhcGguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvR3JhcGgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO0FBT3pELE1BQU0sT0FBTyxTQUFTO0lBQ3BCLEdBQUcsQ0FBSTtJQUNQLFNBQVMsR0FBbUQsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUN0RSxXQUFXLEdBQW1ELElBQUksR0FBRyxFQUFFLENBQUM7SUFFeEUsWUFBWSxHQUFNO1FBQ2hCLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO0lBQ2pCLENBQUM7SUFFRCxJQUFJLEVBQUU7UUFDSixPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO0lBQ3JCLENBQUM7SUFFRCxXQUFXLENBQUMsSUFBcUIsRUFBRSxJQUFRO1FBQ3pDLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDaEMsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBQ0QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQzVDLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELGFBQWEsQ0FBQyxJQUFxQixFQUFFLElBQVE7UUFDM0MsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUNsQyxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFDRCxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDOUMsT0FBTyxJQUFJLENBQUM7SUFDZCxD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
|
package/dist/MapUtil.js
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export class MapUtil {
|
|
2
|
+
static getOrStore(map, key, value) {
|
|
3
|
+
if (!map.has(key)) {
|
|
4
|
+
map.set(key, value);
|
|
5
|
+
}
|
|
6
|
+
return map.get(key);
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWFwVXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9NYXBVdGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sT0FBTyxPQUFPO0lBQ2xCLE1BQU0sQ0FBQyxVQUFVLENBQU8sR0FBYyxFQUFFLEdBQU0sRUFBRSxLQUFRO1FBQ3RELElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDbEIsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDdEIsQ0FBQztRQUNELE9BQU8sR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUUsQ0FBQztJQUN2QixDQUFDO0NBQ0YifQ==
|
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
import assert from 'node:assert';
|
|
2
|
+
import fs, { promises as fsPromise } from 'node:fs';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { extend } from 'extend2';
|
|
5
|
+
import { globbySync } from 'globby';
|
|
6
|
+
import { load as yamlLoad } from 'js-yaml';
|
|
7
|
+
import { importResolve } from '@eggjs/utils';
|
|
8
|
+
import { FSUtil } from "./FSUtil.js";
|
|
9
|
+
export class ModuleReferenceConfigHelp {
|
|
10
|
+
static isInlineModuleReference(moduleReference) {
|
|
11
|
+
return !!moduleReference.path;
|
|
12
|
+
}
|
|
13
|
+
static isNpmModuleReference(moduleReference) {
|
|
14
|
+
return !!moduleReference.package;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
const DEFAULT_READ_MODULE_REF_OPTS = {
|
|
18
|
+
deep: 10,
|
|
19
|
+
};
|
|
20
|
+
export class ModuleConfigUtil {
|
|
21
|
+
static configNames;
|
|
22
|
+
static setConfigNames(configNames) {
|
|
23
|
+
ModuleConfigUtil.configNames = configNames;
|
|
24
|
+
}
|
|
25
|
+
static readModuleReference(baseDir, options) {
|
|
26
|
+
// 1. module.json exits use module.json as module reference
|
|
27
|
+
// 1. module.json not exits scan baseDir get package.json to find modules
|
|
28
|
+
const configDir = path.join(baseDir, 'config');
|
|
29
|
+
const moduleJsonPath = path.join(configDir, 'module.json');
|
|
30
|
+
if (fs.existsSync(moduleJsonPath)) {
|
|
31
|
+
return this.readModuleReferenceFromModuleJson(configDir, moduleJsonPath, options?.cwd || baseDir);
|
|
32
|
+
}
|
|
33
|
+
return this.readModuleReferenceFromScan(baseDir, options);
|
|
34
|
+
}
|
|
35
|
+
static readModuleReferenceFromModuleJson(configDir, moduleJsonPath, cwd) {
|
|
36
|
+
const moduleJsonContent = fs.readFileSync(moduleJsonPath, 'utf8');
|
|
37
|
+
const moduleJson = JSON.parse(moduleJsonContent);
|
|
38
|
+
const moduleReferenceList = [];
|
|
39
|
+
for (const moduleReferenceConfig of moduleJson) {
|
|
40
|
+
let moduleReference;
|
|
41
|
+
if (ModuleReferenceConfigHelp.isNpmModuleReference(moduleReferenceConfig)) {
|
|
42
|
+
const options = cwd ? { paths: [cwd] } : {};
|
|
43
|
+
// path.posix for windows keep path as foo/package.json
|
|
44
|
+
const pkgJson = path.posix.join(moduleReferenceConfig.package, 'package.json');
|
|
45
|
+
const file = importResolve(pkgJson, options);
|
|
46
|
+
const modulePath = path.dirname(file);
|
|
47
|
+
moduleReference = {
|
|
48
|
+
path: modulePath,
|
|
49
|
+
name: ModuleConfigUtil.readModuleNameSync(modulePath),
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
else if (ModuleReferenceConfigHelp.isInlineModuleReference(moduleReferenceConfig)) {
|
|
53
|
+
const modulePath = path.join(configDir, moduleReferenceConfig.path);
|
|
54
|
+
moduleReference = {
|
|
55
|
+
path: modulePath,
|
|
56
|
+
name: ModuleConfigUtil.readModuleNameSync(modulePath),
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
throw new Error('unknown type of module reference config: ' + JSON.stringify(moduleReferenceConfig));
|
|
61
|
+
}
|
|
62
|
+
moduleReferenceList.push(moduleReference);
|
|
63
|
+
}
|
|
64
|
+
return moduleReferenceList;
|
|
65
|
+
}
|
|
66
|
+
static readModuleReferenceFromScan(baseDir, options) {
|
|
67
|
+
const ref = [];
|
|
68
|
+
const realOptions = Object.assign({}, DEFAULT_READ_MODULE_REF_OPTS, options);
|
|
69
|
+
const packagePaths = globbySync([
|
|
70
|
+
'**/package.json',
|
|
71
|
+
// not load node_modules
|
|
72
|
+
'!**/node_modules',
|
|
73
|
+
// not load files in .xxx/
|
|
74
|
+
'!**/+(.*)/**',
|
|
75
|
+
// not load coverage
|
|
76
|
+
'!**/coverage',
|
|
77
|
+
...(realOptions.extraFilePattern || []),
|
|
78
|
+
], {
|
|
79
|
+
cwd: baseDir,
|
|
80
|
+
deep: realOptions.deep,
|
|
81
|
+
});
|
|
82
|
+
const moduleDirSet = new Set();
|
|
83
|
+
for (const packagePath of packagePaths) {
|
|
84
|
+
const absolutePkgPath = path.join(baseDir, packagePath);
|
|
85
|
+
let realPkgPath;
|
|
86
|
+
try {
|
|
87
|
+
realPkgPath = fs.realpathSync(absolutePkgPath);
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
continue;
|
|
91
|
+
}
|
|
92
|
+
const moduleDir = path.dirname(realPkgPath);
|
|
93
|
+
// skip the symbolic link
|
|
94
|
+
if (moduleDirSet.has(moduleDir)) {
|
|
95
|
+
continue;
|
|
96
|
+
}
|
|
97
|
+
moduleDirSet.add(moduleDir);
|
|
98
|
+
let name;
|
|
99
|
+
try {
|
|
100
|
+
name = this.readModuleNameSync(moduleDir);
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
continue;
|
|
104
|
+
}
|
|
105
|
+
ref.push({
|
|
106
|
+
path: moduleDir,
|
|
107
|
+
name,
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
const moduleReferences = this.readModuleFromNodeModules(baseDir);
|
|
111
|
+
for (const moduleReference of moduleReferences) {
|
|
112
|
+
const moduleBasePath = path.basename(moduleReference.path);
|
|
113
|
+
moduleDirSet.forEach(modulePath => {
|
|
114
|
+
if (path.basename(modulePath) === moduleBasePath) {
|
|
115
|
+
throw new Error('duplicate import of module reference: ' + moduleBasePath);
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
ref.push({
|
|
119
|
+
path: moduleReference.path,
|
|
120
|
+
name: moduleReference.name,
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
return ref;
|
|
124
|
+
}
|
|
125
|
+
static readModuleFromNodeModules(baseDir) {
|
|
126
|
+
const ref = [];
|
|
127
|
+
let pkgContent;
|
|
128
|
+
try {
|
|
129
|
+
pkgContent = fs.readFileSync(path.join(baseDir, 'package.json'), 'utf8');
|
|
130
|
+
}
|
|
131
|
+
catch {
|
|
132
|
+
return [];
|
|
133
|
+
}
|
|
134
|
+
const pkg = JSON.parse(pkgContent);
|
|
135
|
+
for (const dependencyKey of Object.keys(pkg.dependencies || {})) {
|
|
136
|
+
let packageJsonPath;
|
|
137
|
+
try {
|
|
138
|
+
// https://nodejs.org/api/packages.html#package-entry-points
|
|
139
|
+
// ignore cases where the package entry is exports but package.json is not exported
|
|
140
|
+
packageJsonPath = importResolve(`${dependencyKey}/package.json`, { paths: [baseDir] });
|
|
141
|
+
}
|
|
142
|
+
catch {
|
|
143
|
+
continue;
|
|
144
|
+
}
|
|
145
|
+
const absolutePkgPath = path.dirname(packageJsonPath);
|
|
146
|
+
const realPkgPath = fs.realpathSync(absolutePkgPath);
|
|
147
|
+
try {
|
|
148
|
+
const name = this.readModuleNameSync(realPkgPath);
|
|
149
|
+
ref.push({
|
|
150
|
+
path: realPkgPath,
|
|
151
|
+
name,
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
catch {
|
|
155
|
+
continue;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
return ref;
|
|
159
|
+
}
|
|
160
|
+
static resolveModuleDir(moduleDir, baseDir) {
|
|
161
|
+
if (path.isAbsolute(moduleDir)) {
|
|
162
|
+
return moduleDir;
|
|
163
|
+
}
|
|
164
|
+
assert(baseDir, 'baseDir is required');
|
|
165
|
+
return path.join(baseDir, 'config', moduleDir);
|
|
166
|
+
}
|
|
167
|
+
static getModuleName(pkg) {
|
|
168
|
+
assert(pkg.eggModule && pkg.eggModule.name, 'eggModule.name not found in package.json');
|
|
169
|
+
return pkg.eggModule.name;
|
|
170
|
+
}
|
|
171
|
+
static async readModuleName(baseDir, moduleDir) {
|
|
172
|
+
moduleDir = ModuleConfigUtil.resolveModuleDir(moduleDir, baseDir);
|
|
173
|
+
const pkgContent = await fsPromise.readFile(path.join(moduleDir, 'package.json'), 'utf8');
|
|
174
|
+
const pkg = JSON.parse(pkgContent);
|
|
175
|
+
return ModuleConfigUtil.getModuleName(pkg);
|
|
176
|
+
}
|
|
177
|
+
static readModuleNameSync(moduleDir, baseDir) {
|
|
178
|
+
moduleDir = ModuleConfigUtil.resolveModuleDir(moduleDir, baseDir);
|
|
179
|
+
const pkgContent = fs.readFileSync(path.join(moduleDir, 'package.json'), 'utf8');
|
|
180
|
+
const pkg = JSON.parse(pkgContent);
|
|
181
|
+
return ModuleConfigUtil.getModuleName(pkg);
|
|
182
|
+
}
|
|
183
|
+
static async loadModuleConfig(moduleDir, baseDir, env) {
|
|
184
|
+
const modulePath = ModuleConfigUtil.resolveModuleDir(moduleDir, baseDir);
|
|
185
|
+
let configNames;
|
|
186
|
+
if (env) {
|
|
187
|
+
configNames = ['module', `module.${env}`];
|
|
188
|
+
}
|
|
189
|
+
else {
|
|
190
|
+
// assert(ModuleConfigUtil.configNames, 'should setConfigNames before load module config');
|
|
191
|
+
configNames = ModuleConfigUtil.configNames || ['module'];
|
|
192
|
+
}
|
|
193
|
+
const target = {};
|
|
194
|
+
for (const configName of configNames) {
|
|
195
|
+
let config = await ModuleConfigUtil.#loadOne(modulePath, configName);
|
|
196
|
+
// both module.yml and module.default.yml are ok for default config
|
|
197
|
+
if (configName === 'module.default' && !config) {
|
|
198
|
+
config = await ModuleConfigUtil.#loadOne(modulePath, 'module');
|
|
199
|
+
}
|
|
200
|
+
if (config) {
|
|
201
|
+
extend(true, target, config);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
return target;
|
|
205
|
+
}
|
|
206
|
+
static async #loadOne(moduleDir, configName) {
|
|
207
|
+
const yamlConfigPath = path.join(moduleDir, `${configName}.yml`);
|
|
208
|
+
let config = await ModuleConfigUtil.#loadYaml(yamlConfigPath);
|
|
209
|
+
if (!config) {
|
|
210
|
+
const jsonConfigPath = path.join(moduleDir, `${configName}.json`);
|
|
211
|
+
config = await ModuleConfigUtil.#loadJson(jsonConfigPath);
|
|
212
|
+
}
|
|
213
|
+
return config;
|
|
214
|
+
}
|
|
215
|
+
static async #loadJson(moduleJsonPath) {
|
|
216
|
+
const moduleJsonPathExists = await FSUtil.fileExists(moduleJsonPath);
|
|
217
|
+
if (!moduleJsonPathExists) {
|
|
218
|
+
return;
|
|
219
|
+
}
|
|
220
|
+
const moduleJsonContent = await fsPromise.readFile(moduleJsonPath, 'utf8');
|
|
221
|
+
const moduleJson = JSON.parse(moduleJsonContent);
|
|
222
|
+
return moduleJson.config;
|
|
223
|
+
}
|
|
224
|
+
static async #loadYaml(moduleYamlPath) {
|
|
225
|
+
const moduleYamlPathExists = await FSUtil.fileExists(moduleYamlPath);
|
|
226
|
+
if (!moduleYamlPathExists) {
|
|
227
|
+
return;
|
|
228
|
+
}
|
|
229
|
+
const moduleYamlContent = await fsPromise.readFile(moduleYamlPath, 'utf8');
|
|
230
|
+
return yamlLoad(moduleYamlContent);
|
|
231
|
+
}
|
|
232
|
+
static loadModuleConfigSync(moduleDir, baseDir, env) {
|
|
233
|
+
const modulePath = ModuleConfigUtil.resolveModuleDir(moduleDir, baseDir);
|
|
234
|
+
let configNames;
|
|
235
|
+
if (env) {
|
|
236
|
+
configNames = ['module', `module.${env}`];
|
|
237
|
+
}
|
|
238
|
+
else {
|
|
239
|
+
// assert(ModuleConfigUtil.configNames, 'should setConfigNames before load module config');
|
|
240
|
+
configNames = ModuleConfigUtil.configNames || ['module'];
|
|
241
|
+
}
|
|
242
|
+
const target = {};
|
|
243
|
+
for (const configName of configNames) {
|
|
244
|
+
let config = ModuleConfigUtil.#loadOneSync(modulePath, configName);
|
|
245
|
+
// both module.yml and module.default.yml are ok for default config
|
|
246
|
+
if (configName === 'module.default' && !config) {
|
|
247
|
+
config = ModuleConfigUtil.#loadOneSync(modulePath, 'module');
|
|
248
|
+
}
|
|
249
|
+
if (config) {
|
|
250
|
+
extend(true, target, config);
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
return target;
|
|
254
|
+
}
|
|
255
|
+
static #loadOneSync(moduleDir, configName) {
|
|
256
|
+
const yamlConfigPath = path.join(moduleDir, `${configName}.yml`);
|
|
257
|
+
let config = ModuleConfigUtil.#loadYamlSync(yamlConfigPath);
|
|
258
|
+
if (!config) {
|
|
259
|
+
const jsonConfigPath = path.join(moduleDir, `${configName}.json`);
|
|
260
|
+
config = ModuleConfigUtil.#loadJsonSync(jsonConfigPath);
|
|
261
|
+
}
|
|
262
|
+
return config;
|
|
263
|
+
}
|
|
264
|
+
static #loadJsonSync(moduleJsonPath) {
|
|
265
|
+
const moduleJsonPathExists = fs.existsSync(moduleJsonPath);
|
|
266
|
+
if (!moduleJsonPathExists) {
|
|
267
|
+
return;
|
|
268
|
+
}
|
|
269
|
+
const moduleJsonContent = fs.readFileSync(moduleJsonPath, 'utf8');
|
|
270
|
+
const moduleJson = JSON.parse(moduleJsonContent);
|
|
271
|
+
return moduleJson.config;
|
|
272
|
+
}
|
|
273
|
+
static #loadYamlSync(moduleYamlPath) {
|
|
274
|
+
const moduleYamlPathExists = fs.existsSync(moduleYamlPath);
|
|
275
|
+
if (!moduleYamlPathExists) {
|
|
276
|
+
return;
|
|
277
|
+
}
|
|
278
|
+
const moduleYamlContent = fs.readFileSync(moduleYamlPath, 'utf8');
|
|
279
|
+
return yamlLoad(moduleYamlContent);
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTW9kdWxlQ29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL01vZHVsZUNvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLE1BQU0sTUFBTSxhQUFhLENBQUM7QUFDakMsT0FBTyxFQUFFLEVBQUUsRUFBRSxRQUFRLElBQUksU0FBUyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ3BELE9BQU8sSUFBSSxNQUFNLFdBQVcsQ0FBQztBQUU3QixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ2pDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDcEMsT0FBTyxFQUFFLElBQUksSUFBSSxRQUFRLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFTM0MsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUU3QyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRXJDLE1BQU0sT0FBTyx5QkFBeUI7SUFDcEMsTUFBTSxDQUFDLHVCQUF1QixDQUFDLGVBQXNDO1FBQ25FLE9BQU8sQ0FBQyxDQUFFLGVBQStDLENBQUMsSUFBSSxDQUFDO0lBQ2pFLENBQUM7SUFFRCxNQUFNLENBQUMsb0JBQW9CLENBQUMsZUFBc0M7UUFDaEUsT0FBTyxDQUFDLENBQUUsZUFBNEMsQ0FBQyxPQUFPLENBQUM7SUFDakUsQ0FBQztDQUNGO0FBRUQsTUFBTSw0QkFBNEIsR0FBRztJQUNuQyxJQUFJLEVBQUUsRUFBRTtDQUNULENBQUM7QUFFRixNQUFNLE9BQU8sZ0JBQWdCO0lBQzNCLE1BQU0sQ0FBQyxXQUFXLENBQXVCO0lBRWxDLE1BQU0sQ0FBQyxjQUFjLENBQUMsV0FBaUM7UUFDNUQsZ0JBQWdCLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQztJQUM3QyxDQUFDO0lBRU0sTUFBTSxDQUFDLG1CQUFtQixDQUFDLE9BQWUsRUFBRSxPQUFvQztRQUNyRiwyREFBMkQ7UUFDM0QseUVB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
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export class ModuleConfigs {
|
|
2
|
+
inner;
|
|
3
|
+
constructor(inner) {
|
|
4
|
+
this.inner = inner;
|
|
5
|
+
}
|
|
6
|
+
get(moduleName) {
|
|
7
|
+
return this.inner[moduleName]?.config;
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTW9kdWxlQ29uZmlncy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9Nb2R1bGVDb25maWdzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE1BQU0sT0FBTyxhQUFhO0lBQ2YsS0FBSyxDQUFxQztJQUVuRCxZQUFZLEtBQXlDO1FBQ25ELElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0lBQ3JCLENBQUM7SUFFRCxHQUFHLENBQUMsVUFBa0I7UUFDcEIsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxFQUFFLE1BQU0sQ0FBQztJQUN4QyxDQUFDO0NBQ0YifQ==
|
package/dist/NameUtil.js
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export class NameUtil {
|
|
2
|
+
static getClassName(constructor) {
|
|
3
|
+
return constructor.name[0].toLowerCase() + constructor.name.substring(1);
|
|
4
|
+
}
|
|
5
|
+
}
|
|
6
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTmFtZVV0aWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvTmFtZVV0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxPQUFPLFFBQVE7SUFDbkIsTUFBTSxDQUFDLFlBQVksQ0FBQyxXQUFxQjtRQUN2QyxPQUFPLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDM0UsQ0FBQztDQUNGIn0=
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
export class ObjectUtils {
|
|
2
|
+
static getProperties(obj) {
|
|
3
|
+
const properties = [];
|
|
4
|
+
do {
|
|
5
|
+
for (const property of Object.getOwnPropertyNames(obj)) {
|
|
6
|
+
properties.push(property);
|
|
7
|
+
}
|
|
8
|
+
} while ((obj = Object.getPrototypeOf(obj)) && obj !== Object.prototype);
|
|
9
|
+
return properties;
|
|
10
|
+
}
|
|
11
|
+
static getFunctionArgNameList(func) {
|
|
12
|
+
if (func.length === 0) {
|
|
13
|
+
return [];
|
|
14
|
+
}
|
|
15
|
+
let sourcecode = func.toString();
|
|
16
|
+
sourcecode = sourcecode
|
|
17
|
+
// Remove /* ... */
|
|
18
|
+
.replace(/\/\*[\s\S]*?\*\//g, '')
|
|
19
|
+
// Remove //
|
|
20
|
+
.replace(/\/\/(.)*/g, '')
|
|
21
|
+
// Remove { ... }
|
|
22
|
+
.replace(/{[\s\S]*}/, '')
|
|
23
|
+
// Remove =>
|
|
24
|
+
.replace(/=>/g, '')
|
|
25
|
+
.trim();
|
|
26
|
+
let argsString = sourcecode.substring(sourcecode.indexOf('(') + 1, sourcecode.length - 1);
|
|
27
|
+
// Remove =(...,...)
|
|
28
|
+
argsString = argsString.replace(/=\([\s\S]*\)/g, '');
|
|
29
|
+
const args = argsString.split(',');
|
|
30
|
+
const argNames = args.map(arg => {
|
|
31
|
+
// Remove default value
|
|
32
|
+
return arg.replace(/=[\s\S]*/g, '').trim();
|
|
33
|
+
}).filter(arg => arg.length);
|
|
34
|
+
return argNames;
|
|
35
|
+
}
|
|
36
|
+
static getConstructorArgNameList(clazz) {
|
|
37
|
+
if (clazz.length === 0) {
|
|
38
|
+
return [];
|
|
39
|
+
}
|
|
40
|
+
const classString = clazz.toString();
|
|
41
|
+
const constructorMatch = classString.match(/constructor\s*\(([^)]+)\)/);
|
|
42
|
+
if (!constructorMatch) {
|
|
43
|
+
return [];
|
|
44
|
+
}
|
|
45
|
+
const params = constructorMatch[1].split(',').map(param => param.trim());
|
|
46
|
+
return params.map(param => param.match(/(\w+)\s*(?=\s*(?:=|\/\/|\s*$))/))
|
|
47
|
+
.filter(Boolean)
|
|
48
|
+
.map(match => match[0].trim());
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiT2JqZWN0VXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvT2JqZWN0VXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsTUFBTSxPQUFPLFdBQVc7SUFDdEIsTUFBTSxDQUFDLGFBQWEsQ0FBQyxHQUFXO1FBQzlCLE1BQU0sVUFBVSxHQUFhLEVBQUUsQ0FBQztRQUNoQyxHQUFHLENBQUM7WUFDRixLQUFLLE1BQU0sUUFBUSxJQUFJLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUN2RCxVQUFVLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzVCLENBQUM7UUFDSCxDQUFDLFFBQVEsQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEdBQUcsS0FBSyxNQUFNLENBQUMsU0FBUyxFQUFFO1FBQ3pFLE9BQU8sVUFBVSxDQUFDO0lBQ3BCLENBQUM7SUFFRCxNQUFNLENBQUMsc0JBQXNCLENBQUMsSUFBYztRQUMxQyxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDdEIsT0FBTyxFQUFFLENBQUM7UUFDWixDQUFDO1FBQ0QsSUFBSSxVQUFVLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2pDLFVBQVUsR0FBRyxVQUFVO1lBQ3JCLG1CQUFtQjthQUNsQixPQUFPLENBQUMsbUJBQW1CLEVBQUUsRUFBRSxDQUFDO1lBQ2pDLFlBQVk7YUFDWCxPQUFPLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQztZQUN6QixpQkFBaUI7YUFDaEIsT0FBTyxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUM7WUFDekIsWUFBWTthQUNYLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDO2FBQ2xCLElBQUksRUFBRSxDQUFDO1FBQ1YsSUFBSSxVQUFVLEdBQUcsVUFBVSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzFGLG9CQUFvQjtRQUNwQixVQUFVLEdBQUcsVUFBVSxDQUFDLE9BQU8sQ0FBQyxlQUFlLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDckQsTUFBTSxJQUFJLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNuQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQzlCLHVCQUF1QjtZQUN2QixPQUFPLEdBQUcsQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQzdDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM3QixPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0lBRUQsTUFBTSxDQUFDLHlCQUF5QixDQUFDLEtBQXdCO1FBQ3ZELElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUN2QixPQUFPLEVBQUUsQ0FBQztRQUNaLENBQUM7UUFDRCxNQUFNLFdBQVcsR0FBRyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDckMsTUFBTSxnQkFBZ0IsR0FBRyxXQUFXLENBQUMsS0FBSyxDQUFDLDJCQUEyQixDQUFDLENBQUM7UUFDeEUsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDdEIsT0FBTyxFQUFFLENBQUM7UUFDWixDQUFDO1FBQ0QsTUFBTSxNQUFNLEdBQUcsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ3pFLE9BQU8sTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsZ0NBQWdDLENBQUMsQ0FBQzthQUN0RSxNQUFNLENBQUMsT0FBTyxDQUFDO2FBQ2YsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7SUFDcEMsQ0FBQztDQUNGIn0=
|
|
@@ -11,4 +11,4 @@ export class ProxyUtil {
|
|
|
11
11
|
});
|
|
12
12
|
}
|
|
13
13
|
}
|
|
14
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
14
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUHJveHlVdGlsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL1Byb3h5VXRpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLE9BQU8sU0FBUztJQUNwQixNQUFNLENBQUMsU0FBUyxDQUFtQixHQUFNLEVBQUUsTUFBdUM7UUFDaEYsT0FBTyxJQUFJLEtBQUssQ0FBQyxHQUFHLEVBQUU7WUFDcEIsR0FBRyxDQUFDLE1BQVMsRUFBRSxDQUFjO2dCQUMzQixvR0FBb0c7Z0JBQ3BHLElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO29CQUN4QixPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUNoQyxDQUFDO2dCQUNELE9BQU8sTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztZQUMzQixDQUFDO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGIn0=
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { fileURLToPath } from 'node:url';
|
|
1
2
|
import { debuglog } from 'node:util';
|
|
2
3
|
const debug = debuglog('@eggjs/tegg-common-util/StackUtil');
|
|
3
4
|
/**
|
|
@@ -26,11 +27,14 @@ export class StackUtil {
|
|
|
26
27
|
}
|
|
27
28
|
const callSite = obj.stack[stackIndex];
|
|
28
29
|
let fileName;
|
|
29
|
-
/* istanbul ignore else */
|
|
30
30
|
if (callSite) {
|
|
31
31
|
// egg-mock will create a proxy
|
|
32
32
|
// https://github.com/eggjs/egg-mock/blob/master/lib/app.js#L174
|
|
33
33
|
fileName = callSite.getFileName();
|
|
34
|
+
if (fileName?.startsWith('file://')) {
|
|
35
|
+
// remove file://
|
|
36
|
+
fileName = fileURLToPath(fileName);
|
|
37
|
+
}
|
|
34
38
|
}
|
|
35
39
|
Error.prepareStackTrace = prep;
|
|
36
40
|
Error.stackTraceLimit = limit;
|
|
@@ -42,4 +46,4 @@ export class StackUtil {
|
|
|
42
46
|
return `${fileName}:${callSite.getLineNumber()}:${callSite.getColumnNumber()}`;
|
|
43
47
|
}
|
|
44
48
|
}
|
|
45
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
49
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RhY2tVdGlsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL1N0YWNrVXRpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFckMsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLG1DQUFtQyxDQUFDLENBQUM7QUFFNUQ7OztHQUdHO0FBRUgsU0FBUyx1QkFBdUIsQ0FBQyxDQUFRLEVBQUUsS0FBd0I7SUFDakUsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBRUQsTUFBTSxPQUFPLFNBQVM7SUFDcEIsc0JBQXNCO0lBQ3RCLGdFQUFnRTtJQUNoRSxNQUFNLENBQUMsa0JBQWtCLENBQUMsUUFBaUIsRUFBRSxVQUFtQjtRQUM5RCxVQUFVLEdBQUcsVUFBVSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUM7UUFDdkQsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLGVBQWUsQ0FBQztRQUNwQyxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsaUJBQWlCLENBQUM7UUFFckMsS0FBSyxDQUFDLGlCQUFpQixHQUFHLHVCQUF1QixDQUFDO1FBQ2xELEtBQUssQ0FBQyxlQUFlLEdBQUcsRUFBRSxDQUFDO1FBRTNCLG9CQUFvQjtRQUNwQixNQUFNLEdBQUcsR0FBaUM7WUFDeEMsS0FBSyxFQUFFLEVBQUU7U0FDVixDQUFDO1FBQ0YsS0FBSyxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzdCLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2xCLEtBQUssQ0FBQyxnQkFBZ0IsRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsSUFBSSxhQUFhLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUN6RyxDQUFDO1FBQ0QsTUFBTSxRQUFRLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUN2QyxJQUFJLFFBQTRCLENBQUM7UUFDakMsSUFBSSxRQUFRLEVBQUUsQ0FBQztZQUNiLCtCQUErQjtZQUMvQixnRUFBZ0U7WUFDaEUsUUFBUSxHQUFHLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNsQyxJQUFJLFFBQVEsRUFBRSxVQUFVLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztnQkFDcEMsaUJBQWlCO2dCQUNqQixRQUFRLEdBQUcsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3JDLENBQUM7UUFDSCxDQUFDO1FBRUQsS0FBSyxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQztRQUMvQixLQUFLLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQztRQUU5Qix3QkFBd0I7UUFDeEIsSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLFFBQVE7WUFBRSxPQUFPLGFBQWEsQ0FBQztRQUNqRCxJQUFJLENBQUMsUUFBUTtZQUFFLE9BQU8sUUFBUSxDQUFDO1FBQy9CLE9BQU8sR0FBRyxRQUFRLElBQUksUUFBUSxDQUFDLGFBQWEsRUFBRSxJQUFJLFFBQVEsQ0FBQyxlQUFlLEVBQUUsRUFBRSxDQUFDO0lBQ2pGLENBQUM7Q0FDRiJ9
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export class TimerUtil {
|
|
2
|
+
static async sleep(ms) {
|
|
3
|
+
await new Promise(resolve => setTimeout(resolve, ms));
|
|
4
|
+
}
|
|
5
|
+
}
|
|
6
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVGltZXJVdGlsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL1RpbWVyVXRpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLE9BQU8sU0FBUztJQUNwQixNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUFVO1FBQzNCLE1BQU0sSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDeEQsQ0FBQztDQUNGIn0=
|