@nu-art/ts-dependency-viewer-backend 0.400.7
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/index.d.ts +1 -0
- package/index.js +1 -0
- package/package.json +69 -0
- package/runtime-type-resolver/parse-type.d.ts +3 -0
- package/runtime-type-resolver/parse-type.js +99 -0
package/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/package.json
ADDED
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@nu-art/ts-dependency-viewer-backend",
|
|
3
|
+
"version": "0.400.7",
|
|
4
|
+
"description": "ts-dependency-viewer - Express & Typescript based backend framework Backend",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"TacB0sS",
|
|
7
|
+
"infra",
|
|
8
|
+
"nu-art",
|
|
9
|
+
"thunderstorm",
|
|
10
|
+
"typescript",
|
|
11
|
+
"ts-dependency-viewer"
|
|
12
|
+
],
|
|
13
|
+
"homepage": "https://github.com/nu-art-js/thunderstorm",
|
|
14
|
+
"bugs": {
|
|
15
|
+
"url": "https://github.com/nu-art-js/thunderstorm/issues"
|
|
16
|
+
},
|
|
17
|
+
"publishConfig": {
|
|
18
|
+
"directory": "dist",
|
|
19
|
+
"linkDirectory": true
|
|
20
|
+
},
|
|
21
|
+
"repository": {
|
|
22
|
+
"type": "git",
|
|
23
|
+
"url": "git+ssh://git@github.com:nu-art-js/thunderstorm.git"
|
|
24
|
+
},
|
|
25
|
+
"license": "Apache-2.0",
|
|
26
|
+
"author": "TacB0sS",
|
|
27
|
+
"files": [
|
|
28
|
+
"**/*"
|
|
29
|
+
],
|
|
30
|
+
"scripts": {
|
|
31
|
+
"build": "tsc"
|
|
32
|
+
},
|
|
33
|
+
"dependencies": {
|
|
34
|
+
"@nu-art/ts-dependency-viewer-shared": "0.400.7",
|
|
35
|
+
"@nu-art/thunderstorm-backend": "0.400.7",
|
|
36
|
+
"@nu-art/thunderstorm-shared": "0.400.7",
|
|
37
|
+
"@nu-art/ts-common": "0.400.7",
|
|
38
|
+
"compression": "^1.7.4",
|
|
39
|
+
"d3": "7.8.2",
|
|
40
|
+
"d3-graphviz": "5.0.2",
|
|
41
|
+
"d3-selection": "3.0.0",
|
|
42
|
+
"firebase": "^11.9.0",
|
|
43
|
+
"firebase-admin": "13.4.0",
|
|
44
|
+
"firebase-functions": "6.3.2",
|
|
45
|
+
"react": "^18.0.0",
|
|
46
|
+
"ts-graphviz": "1.5.3"
|
|
47
|
+
},
|
|
48
|
+
"devDependencies": {
|
|
49
|
+
"@types/react": "^18.0.0",
|
|
50
|
+
"@types/chai": "^4.3.4",
|
|
51
|
+
"@types/mocha": "^10.0.1",
|
|
52
|
+
"@types/d3": "^7.4.0",
|
|
53
|
+
"@types/d3-graphviz": "^2.6.7"
|
|
54
|
+
},
|
|
55
|
+
"unitConfig": {
|
|
56
|
+
"type": "typescript-lib"
|
|
57
|
+
},
|
|
58
|
+
"type": "module",
|
|
59
|
+
"exports": {
|
|
60
|
+
".": {
|
|
61
|
+
"types": "./index.d.ts",
|
|
62
|
+
"import": "./index.js"
|
|
63
|
+
},
|
|
64
|
+
"./*": {
|
|
65
|
+
"types": "./*.d.ts",
|
|
66
|
+
"import": "./*.js"
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import * as ts from 'typescript';
|
|
2
|
+
const resolvers = [
|
|
3
|
+
(descriptor, typeNode, checker) => {
|
|
4
|
+
if (!ts.isTypeLiteralNode(typeNode))
|
|
5
|
+
return;
|
|
6
|
+
descriptor.type = 'object';
|
|
7
|
+
descriptor.members = [];
|
|
8
|
+
typeNode.members.forEach(member => {
|
|
9
|
+
if (ts.isPropertySignature(member) && member.name && member.type) {
|
|
10
|
+
const memberDescriptor = { name: member.name.getText() };
|
|
11
|
+
parseTypeV2(memberDescriptor, member.type, checker);
|
|
12
|
+
descriptor.members.push(memberDescriptor);
|
|
13
|
+
}
|
|
14
|
+
});
|
|
15
|
+
},
|
|
16
|
+
(descriptor, typeNode, checker) => {
|
|
17
|
+
if (!ts.isFunctionTypeNode(typeNode))
|
|
18
|
+
return;
|
|
19
|
+
descriptor.type = 'function';
|
|
20
|
+
descriptor.parameters = [];
|
|
21
|
+
typeNode.parameters.forEach(paramNode => {
|
|
22
|
+
const paramDescriptor = { name: paramNode.name.getText() };
|
|
23
|
+
parseTypeV2(paramDescriptor, paramNode.type, checker);
|
|
24
|
+
descriptor.parameters.push(paramDescriptor);
|
|
25
|
+
});
|
|
26
|
+
// Resolve the return type of the function
|
|
27
|
+
descriptor.returnType = {};
|
|
28
|
+
parseTypeV2(descriptor.returnType, typeNode.type, checker);
|
|
29
|
+
},
|
|
30
|
+
(descriptor, typeNode, checker) => {
|
|
31
|
+
const types = checker.getTypeFromTypeNode(typeNode).aliasTypeArguments;
|
|
32
|
+
if (!types)
|
|
33
|
+
return;
|
|
34
|
+
descriptor.genericParams = [];
|
|
35
|
+
types.forEach(genericType => {
|
|
36
|
+
const paramDescriptor = { name: genericType.symbol.name };
|
|
37
|
+
paramDescriptor.type = checker.symbolToEntityName(checker.getBaseConstraintOfType(genericType).aliasSymbol, ts.SymbolFlags.Alias, undefined, undefined)
|
|
38
|
+
.getText();
|
|
39
|
+
// const constraintOfType = checker.getBaseConstraintOfType(genericType) ?? genericType;
|
|
40
|
+
// parseTypeV2(paramDescriptor, checker.typeToTypeNode(constraintOfType, undefined, undefined)!, checker);
|
|
41
|
+
descriptor.genericParams.push(paramDescriptor);
|
|
42
|
+
});
|
|
43
|
+
},
|
|
44
|
+
(descriptor, typeNode, checker) => {
|
|
45
|
+
if (descriptor.type !== undefined)
|
|
46
|
+
return;
|
|
47
|
+
// typeNode.typeName
|
|
48
|
+
descriptor.type = checker.typeToString(checker.getTypeFromTypeNode(typeNode));
|
|
49
|
+
},
|
|
50
|
+
(descriptor, typeNode, checker) => {
|
|
51
|
+
descriptor.typeLiteral = checker.typeToString(checker.getTypeFromTypeNode(typeNode));
|
|
52
|
+
},
|
|
53
|
+
];
|
|
54
|
+
function parseTypeV2(descriptor, typeNode, checker) {
|
|
55
|
+
return resolvers.reduce((descriptor, resolver) => {
|
|
56
|
+
resolver(descriptor, typeNode, checker);
|
|
57
|
+
return descriptor;
|
|
58
|
+
}, descriptor);
|
|
59
|
+
}
|
|
60
|
+
function collectTypes(sourceFile) {
|
|
61
|
+
const types = {};
|
|
62
|
+
const visit = (node) => {
|
|
63
|
+
if (ts.isTypeAliasDeclaration(node) || ts.isInterfaceDeclaration(node)) {
|
|
64
|
+
const typeName = node.name.text;
|
|
65
|
+
let typeNode;
|
|
66
|
+
if (ts.isTypeAliasDeclaration(node)) {
|
|
67
|
+
typeNode = node.type;
|
|
68
|
+
}
|
|
69
|
+
else if (ts.isInterfaceDeclaration(node)) {
|
|
70
|
+
const members = node.members;
|
|
71
|
+
typeNode = ts.factory.createTypeLiteralNode(members);
|
|
72
|
+
}
|
|
73
|
+
if (typeNode) {
|
|
74
|
+
types[typeName] = typeNode;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
ts.forEachChild(node, visit);
|
|
78
|
+
};
|
|
79
|
+
visit(sourceFile);
|
|
80
|
+
return types;
|
|
81
|
+
}
|
|
82
|
+
export function parseAllTypesFromFile(filePath) {
|
|
83
|
+
const program = ts.createProgram([filePath], {});
|
|
84
|
+
const checker = program.getTypeChecker();
|
|
85
|
+
const sourceFile = program.getSourceFile(filePath);
|
|
86
|
+
if (!sourceFile) {
|
|
87
|
+
throw new Error(`File ${filePath} not found`);
|
|
88
|
+
}
|
|
89
|
+
const types = collectTypes(sourceFile);
|
|
90
|
+
const parsedTypes = {};
|
|
91
|
+
for (const typeName in types) {
|
|
92
|
+
const typeNode = types[typeName];
|
|
93
|
+
const descriptor = { name: typeName };
|
|
94
|
+
parsedTypes[typeName] = parseTypeV2(descriptor, typeNode, checker);
|
|
95
|
+
}
|
|
96
|
+
return parsedTypes;
|
|
97
|
+
}
|
|
98
|
+
const parseTypeFromFile1 = parseAllTypesFromFile('./file.ts');
|
|
99
|
+
console.log('output:', JSON.stringify(parseTypeFromFile1, null, 2));
|