Skip to content

Commit 715f6e7

Browse files
committed
Add external dependencies reports for Typescript
1 parent 7a4ae0e commit 715f6e7

13 files changed

+1871
-40
lines changed
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
// Explore Typescript nodes with globalFqn property by their label, count and if they came from the node_modules folder
2+
3+
MATCH (typescript:TS)
4+
WHERE typescript.globalFqn IS NOT NULL
5+
RETURN labels(file)[0..4] AS nodeType
6+
,(typescript.globalFqn contains '/node_modules/') AS isNodeModule
7+
,count(*) AS numberOfNodes
8+
,collect(DISTINCT typescript.globalFqn)[0..9] AS examples
9+
ORDER BY nodeType ASC, numberOfNodes DESC
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
// External Typescript module usage overall
2+
3+
MATCH (internalModule:TS:Module)-[:EXPORTS]->(internalElement:TS)
4+
WITH count(DISTINCT internalElement.globalFqn) AS allInternalElements
5+
,count(DISTINCT internalModule.globalFqn) AS allModules
6+
,collect(DISTINCT internalElement) AS internalElementList
7+
UNWIND internalElementList AS internalElement
8+
MATCH (internalElement)-[externalDependency:DEPENDS_ON]->(externalDeclaration:ExternalDeclaration)
9+
WHERE externalDeclaration.isNodeModule = true
10+
MATCH (internalModule:TS:Module)-[:EXPORTS]->(internalElement)
11+
MATCH (externalModule:ExternalModule)-[:EXPORTS]->(externalDeclaration)
12+
WITH allInternalElements
13+
,allModules
14+
,coalesce(nullIf(externalModule.namespace, '') + '/' + externalModule.name, externalModule.name) AS externalModuleName
15+
,count(DISTINCT internalModule.globalFqn) AS numberOfExternalCallerModules
16+
,count(DISTINCT internalElement.globalFqn) AS numberOfExternalCallerElements
17+
,count(externalDependency) AS numberOfExternalDeclarationCalls
18+
,sum(externalDependency.cardinality) AS numberOfExternalDeclarationCallsWeighted
19+
,collect('<' + internalElement.name
20+
+ '> of module <'
21+
+ internalModule.name
22+
+ '> imports <'
23+
+ externalDeclaration.name
24+
+ '> from external module <'
25+
+ externalModule.name + '>')[0..4] AS exampleStories
26+
RETURN externalModuleName
27+
,numberOfExternalCallerModules
28+
,numberOfExternalCallerElements
29+
,numberOfExternalDeclarationCalls
30+
,numberOfExternalDeclarationCallsWeighted
31+
,allModules
32+
,allInternalElements
33+
,exampleStories
34+
ORDER BY numberOfExternalCallerModules DESC, externalModuleName ASC
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
// External Typescript module usage per interal module aggregated
2+
3+
// Get the overall internal module statistics first
4+
MATCH (internalModule:TS:Module)-[:EXPORTS]->(internalElement:TS)
5+
WITH internalModule.name AS internalModuleName
6+
,internalModule.communityLeidenId AS leidenCommunityId
7+
,count(DISTINCT internalElement.globalFqn) AS internalModuleElementsCount
8+
,collect(DISTINCT internalElement) AS internalElementList
9+
10+
// Get the external dependencies for each internal internalElement
11+
UNWIND internalElementList AS internalElement
12+
MATCH (internalElement)-[:DEPENDS_ON]->(externalDeclaration:ExternalDeclaration)
13+
MATCH (internalModule:Module)-[:EXPORTS]->(internalElement)
14+
MATCH (externalModule:ExternalModule)-[:EXPORTS]->(externalDeclaration)
15+
WHERE externalDeclaration.isNodeModule = true
16+
WITH internalModuleName
17+
,leidenCommunityId
18+
,internalModuleElementsCount
19+
,internalModule.globalFqn AS fullInternalModuleName
20+
,internalElement.globalFqn AS fullInternalElementName
21+
,coalesce(
22+
nullIf(externalModule.namespace, '') + '/' + externalModule.name,
23+
externalModule.name) AS externalModuleName
24+
25+
// Group by internalModule and external internalElement
26+
WITH internalModuleName
27+
,leidenCommunityId
28+
,internalModuleElementsCount
29+
,externalModuleName
30+
,count(DISTINCT fullInternalModuleName) AS internalModulesCount
31+
,COLLECT(DISTINCT fullInternalModuleName)[0..9] AS internalModulesExamples
32+
,count(DISTINCT fullInternalElementName) AS internalElementsCount
33+
,COLLECT(DISTINCT fullInternalElementName)[0..9] AS internalElementsExamples
34+
,100.0 / internalModuleElementsCount * count(DISTINCT fullInternalElementName) AS internalElementsCallingExternalRate
35+
36+
// Pre order the results by number of packages that use the external package dependency descending
37+
ORDER BY internalModulesCount DESC, internalModuleName ASC
38+
39+
// Optionally filter out external dependencies that are only used by one internal module
40+
// WHERE internalModulesCount > 1
41+
42+
// Group by internalModule, aggregate statistics and return the results
43+
RETURN internalModuleName
44+
,leidenCommunityId
45+
,internalModuleElementsCount
46+
,count(DISTINCT externalModuleName) AS numberOfExternalModules
47+
48+
// Statistics about the packages and their external package usage count
49+
,min(internalModulesCount) AS minNumberOfInternalModules
50+
,max(internalModulesCount) AS maxNumberOfInternalModules
51+
,percentileCont(internalModulesCount, 0.5) AS medNumberOfInternalModules
52+
,avg(internalModulesCount) AS avgNumberOfInternalModules
53+
,stDev(internalModulesCount) AS stdNumberOfInternalModules
54+
55+
// Statistics about the types and their external package usage count
56+
,min(internalElementsCount) AS minNumberOfInternalElements
57+
,max(internalElementsCount) AS maxNumberOfInternalElements
58+
,percentileCont(internalElementsCount, 0.5) AS medNumberOfInternalElements
59+
,avg(internalElementsCount) AS avgNumberOfInternalElements
60+
,stDev(internalElementsCount) AS stdNumberOfInternalElements
61+
62+
// Statistics about the types and their external package usage count percentage
63+
,min(internalElementsCallingExternalRate) AS minNumberOfInternalElementsPercentage
64+
,max(internalElementsCallingExternalRate) AS maxNumberOfInternalElementsPercentage
65+
,percentileCont(internalElementsCallingExternalRate, 0.5) AS medNumberOfInternalElementsPercentage
66+
,avg(internalElementsCallingExternalRate) AS avgNumberOfInternalElementsPercentage
67+
,stDev(internalElementsCallingExternalRate) AS stdNumberOfInternalElementsPercentage
68+
69+
// Examples of external packages, caller packages and caller types
70+
,collect(externalModuleName)[0..9] AS top10ExternalPackageNamesByUsageDescending
71+
,COLLECT(internalModulesExamples)[0] AS internalModulesExamples
72+
,COLLECT(internalElementsExamples)[0] AS internalElementsExamples
73+
74+
ORDER BY maxNumberOfInternalModules DESC, internalModuleName ASC
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
// External Typescript module usage distribution for internal modules
2+
3+
MATCH (internalModule:TS:Module)-[:EXPORTS]->(internalElement:TS)
4+
WITH internalModule.name AS internalModuleName
5+
,count(DISTINCT internalElement.globalFqn) AS numberOfAllInternalElements
6+
,collect(DISTINCT internalElement) AS internalElementList
7+
UNWIND internalElementList AS internalElement
8+
MATCH (internalElement)-[:DEPENDS_ON]->(externalElement:ExternalDeclaration)
9+
WHERE externalElement.isNodeModule = true
10+
MATCH (internalModule:Module)-[:EXPORTS]->(internalElement)
11+
MATCH (externalModule:ExternalModule)-[:EXPORTS]->(externalElement)
12+
WITH internalModuleName
13+
,numberOfAllInternalElements
14+
,internalModule.globalFqn AS fullInternalModuleName
15+
,internalElement.globalFqn AS fullInternalElementName
16+
,coalesce(
17+
nullIf(externalModule.namespace, '') + '/' + externalModule.name,
18+
externalModule.name) AS externalModuleName
19+
WITH internalModuleName
20+
,numberOfAllInternalElements
21+
,count(DISTINCT externalModuleName) AS externalModuleCount
22+
,COLLECT(DISTINCT externalModuleName)[0..9] AS externalModuleExamples
23+
,count(DISTINCT fullInternalElementName) AS internalElementCount
24+
,COLLECT(DISTINCT fullInternalElementName)[0..9] AS internalElementExamples
25+
RETURN internalModuleName
26+
,numberOfAllInternalElements
27+
,externalModuleCount
28+
,internalElementCount
29+
,100.0 / numberOfAllInternalElements * internalElementCount AS internalElementsCallingExternalRate
30+
,externalModuleExamples
31+
,internalElementExamples
32+
ORDER BY internalElementCount DESC, internalModuleName ASC
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
// External Typescript module usage per internal module sorted by external usage descending
2+
3+
MATCH (internalModule:TS:Module)-[:EXPORTS]->(internalElement:TS)
4+
OPTIONAL MATCH (internalElement)-[:DEPENDS_ON]->(externalDeclaration:ExternalDeclaration)
5+
WHERE externalDeclaration.isNodeModule = true
6+
OPTIONAL MATCH (externalModule:ExternalModule)-[:EXPORTS]->(externalDeclaration)
7+
WITH internalModule.name AS internalModuleName
8+
,count(DISTINCT internalElement.globalFqn) AS numberOfAllElementsInInternalModule
9+
,count(DISTINCT externalDeclaration.globalFqn) AS numberOfAllExternalDeclarationsUsedInInternalModule
10+
,count(DISTINCT externalModule.globalFqn) AS numberOfAllExternalModulesUsedInInternalModule
11+
,collect(DISTINCT internalElement) AS internalElementList
12+
UNWIND internalElementList AS internalElement
13+
MATCH (internalElement)-[externalDependency:DEPENDS_ON]->(externalDeclaration:ExternalDeclaration)
14+
WHERE externalDeclaration.isNodeModule = true
15+
MATCH (externalModule:ExternalModule)-[:EXPORTS]->(externalDeclaration)
16+
WITH numberOfAllElementsInInternalModule
17+
,numberOfAllExternalDeclarationsUsedInInternalModule
18+
,numberOfAllExternalModulesUsedInInternalModule
19+
,100.0 / numberOfAllElementsInInternalModule * numberOfAllExternalDeclarationsUsedInInternalModule AS externalDeclarationRate
20+
,externalDependency
21+
,internalModuleName
22+
,internalElement.globalFqn AS fullInternalElementName
23+
,internalElement.name AS internalElementName
24+
,coalesce(
25+
nullIf(externalModule.namespace, '') + '/' + externalModule.name,
26+
externalModule.name) AS externalModuleName
27+
,externalDeclaration.name AS externalDeclarationName
28+
WITH numberOfAllElementsInInternalModule
29+
,numberOfAllExternalDeclarationsUsedInInternalModule
30+
,numberOfAllExternalModulesUsedInInternalModule
31+
,externalDeclarationRate
32+
,internalModuleName
33+
,externalModuleName
34+
,count(externalDependency) AS numberOfExternalDeclarationCaller
35+
,sum(externalDependency.cardinality) AS numberOfExternalDeclarationCalls
36+
,collect(DISTINCT externalDeclarationName) AS externalDeclarationNames
37+
RETURN internalModuleName
38+
,externalModuleName
39+
,numberOfExternalDeclarationCaller
40+
,numberOfExternalDeclarationCalls
41+
,numberOfAllElementsInInternalModule
42+
,numberOfAllExternalDeclarationsUsedInInternalModule
43+
,numberOfAllExternalModulesUsedInInternalModule
44+
,externalDeclarationRate
45+
,externalDeclarationNames
46+
ORDER BY externalDeclarationRate DESC
47+
,internalModuleName ASC
48+
,numberOfExternalDeclarationCaller DESC
49+
,externalModuleName ASC
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
// External Typescript module usage spread
2+
3+
// Get the overall internal modules statistics first
4+
MATCH (internalModule:TS:Module)-[:EXPORTS]->(internalElement:TS)
5+
WITH count(DISTINCT internalModule.globalFqn) AS internalModulesCountOverall
6+
,count(DISTINCT internalElement.globalFqn) AS internalElementsCountOverall
7+
,collect(DISTINCT internalElement) AS internalElementList
8+
9+
// Get the external declarations for each internal element
10+
UNWIND internalElementList AS internalElement
11+
MATCH (internalElement)-[:DEPENDS_ON]->(externalDeclaration:ExternalDeclaration)
12+
WHERE externalDeclaration.isNodeModule = true
13+
MATCH (internalModule:TS:Module)-[:EXPORTS]->(internalElement)
14+
MATCH (externalModule:TS:ExternalModule)-[:EXPORTS]->(externalDeclaration)
15+
WITH internalModulesCountOverall
16+
,internalElementsCountOverall
17+
,coalesce(nullIf(externalModule.namespace, '') + '/' + externalModule.name, externalModule.name) AS externalModuleName
18+
,coalesce(nullIf(internalModule.namespace, '') + '/' + internalModule.name, internalModule.name) AS internalModuleName
19+
20+
// Gathering counts for every internal element and the external module it uses
21+
,count (DISTINCT externalDeclaration.globalFqn) AS externalDeclarationsCount
22+
,COLLECT(DISTINCT externalDeclaration.globalFqn )[0..9] AS externalDeclarationsExamples
23+
,count (DISTINCT internalElement.globalFqn) AS internalElementsCount
24+
,COLLECT(DISTINCT internalElement.globalFqn )[0..9] AS internalElementsExamples
25+
,100.0 / internalModulesCountOverall
26+
* count(DISTINCT internalElement.globalFqn) AS internalElementsCallingExternalRate
27+
28+
// Group by external module
29+
RETURN externalModuleName
30+
,count(DISTINCT internalModuleName) AS numberOfInternalModules
31+
32+
// Statistics about how many internal modules are using that external module
33+
,sum(externalDeclarationsCount) AS sumNumberOfUsedExternalDeclarations
34+
,min(externalDeclarationsCount) AS minNumberOfUsedExternalDeclarations
35+
,max(externalDeclarationsCount) AS maxNumberOfUsedExternalDeclarations
36+
,percentileCont(externalDeclarationsCount, 0.5) AS medNumberOfUsedExternalDeclarations
37+
,avg(externalDeclarationsCount) AS avgNumberOfUsedExternalDeclarations
38+
,stDev(externalDeclarationsCount) AS stdNumberOfUsedExternalDeclarations
39+
40+
// Statistics about the internal elements and their external module usage
41+
,sum(internalElementsCount) AS sumNumberOfInternalElements
42+
,min(internalElementsCount) AS minNumberOfInternalElements
43+
,max(internalElementsCount) AS maxNumberOfInternalElements
44+
,percentileCont(internalElementsCount, 0.5) AS medNumberOfInternalElements
45+
,avg(internalElementsCount) AS avgNumberOfInternalElements
46+
,stDev(internalElementsCount) AS stdNumberOfInternalElements
47+
48+
// Statistics about the types and their external package usage count percentage
49+
,min(internalElementsCallingExternalRate) AS minNumberOfInternalElementsPercentage
50+
,max(internalElementsCallingExternalRate) AS maxNumberOfInternalElementsPercentage
51+
,percentileCont(internalElementsCallingExternalRate, 0.5) AS medNumberOfInternalElementsPercentage
52+
,avg(internalElementsCallingExternalRate) AS avgNumberOfInternalElementsPercentage
53+
,stDev(internalElementsCallingExternalRate) AS stdNumberOfInternalElementsPercentage
54+
55+
,collect(DISTINCT internalModuleName)[0..4] AS internalModuleExamples
56+
57+
// Order the results descending by the number of internal modules that use the external module
58+
ORDER BY numberOfInternalModules DESC, externalModuleName ASC
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
// External Typescript namespace usage overall
2+
3+
MATCH (internalModule:TS:Module)-[:EXPORTS]->(internalElement:TS)
4+
WITH count(DISTINCT internalElement.globalFqn) AS allInternalElements
5+
,count(DISTINCT internalModule.globalFqn) AS allModules
6+
,collect(DISTINCT internalElement) AS internalElementList
7+
UNWIND internalElementList AS internalElement
8+
MATCH (internalElement)-[externalDependency:DEPENDS_ON]->(externalDeclaration:ExternalDeclaration)
9+
WHERE externalDeclaration.isNodeModule = true
10+
MATCH (internalModule:TS:Module)-[:EXPORTS]->(internalElement)
11+
MATCH (externalModule:ExternalModule)-[:EXPORTS]->(externalDeclaration)
12+
WITH allInternalElements
13+
,allModules
14+
,externalModule.namespace AS externalNamespaceName
15+
,count(DISTINCT internalModule.globalFqn) AS numberOfExternalCallerModules
16+
,count(DISTINCT internalElement.globalFqn) AS numberOfExternalCallerElements
17+
,count(externalDependency) AS numberOfExternalDeclarationCalls
18+
,sum(externalDependency.cardinality) AS numberOfExternalDeclarationCallsWeighted
19+
,collect('<' + internalElement.name
20+
+ '> of module <'
21+
+ internalModule.name
22+
+ '> imports <'
23+
+ externalDeclaration.name
24+
+ '> from external namespace <'
25+
+ externalModule.namespace + '>')[0..4] AS exampleStories
26+
RETURN externalNamespaceName
27+
,numberOfExternalCallerModules
28+
,numberOfExternalCallerElements
29+
,numberOfExternalDeclarationCalls
30+
,numberOfExternalDeclarationCallsWeighted
31+
,allModules
32+
,allInternalElements
33+
,exampleStories
34+
ORDER BY numberOfExternalCallerModules DESC, externalNamespaceName ASC
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
// External Typescript module usage per internal module sorted by external usage descending
2+
3+
MATCH (internalModule:TS:Module)-[:EXPORTS]->(internalElement:TS)
4+
OPTIONAL MATCH (internalElement)-[:DEPENDS_ON]->(externalDeclaration:ExternalDeclaration)
5+
WHERE externalDeclaration.isNodeModule = true
6+
OPTIONAL MATCH (externalModule:ExternalModule)-[:EXPORTS]->(externalDeclaration)
7+
WITH internalModule.name AS internalModuleName
8+
,count(DISTINCT internalElement.globalFqn) AS numberOfAllElementsInInternalModule
9+
,count(DISTINCT externalDeclaration.globalFqn) AS numberOfAllExternalDeclarationsUsedInInternalModule
10+
,count(DISTINCT externalModule.globalFqn) AS numberOfAllExternalModulesUsedInInternalModule
11+
,collect(DISTINCT internalElement) AS internalElementList
12+
UNWIND internalElementList AS internalElement
13+
MATCH (internalElement)-[externalDependency:DEPENDS_ON]->(externalDeclaration:ExternalDeclaration)
14+
WHERE externalDeclaration.isNodeModule = true
15+
MATCH (externalModule:ExternalModule)-[:EXPORTS]->(externalDeclaration)
16+
WITH numberOfAllElementsInInternalModule
17+
,numberOfAllExternalDeclarationsUsedInInternalModule
18+
,numberOfAllExternalModulesUsedInInternalModule
19+
,100.0 / numberOfAllElementsInInternalModule * numberOfAllExternalDeclarationsUsedInInternalModule AS externalDeclarationRate
20+
,externalDependency
21+
,internalModuleName
22+
,internalElement.globalFqn AS fullInternalElementName
23+
,internalElement.name AS internalElementName
24+
,externalModule.namespace AS externalNamespaceName
25+
,externalDeclaration.name AS externalDeclarationName
26+
WITH numberOfAllElementsInInternalModule
27+
,numberOfAllExternalDeclarationsUsedInInternalModule
28+
,numberOfAllExternalModulesUsedInInternalModule
29+
,externalDeclarationRate
30+
,internalModuleName
31+
,externalNamespaceName
32+
,count(externalDependency) AS numberOfExternalDeclarationCaller
33+
,sum(externalDependency.cardinality) AS numberOfExternalDeclarationCalls
34+
,collect(DISTINCT externalDeclarationName) AS externalDeclarationNames
35+
RETURN internalModuleName
36+
,externalNamespaceName
37+
,numberOfExternalDeclarationCaller
38+
,numberOfExternalDeclarationCalls
39+
,numberOfAllElementsInInternalModule
40+
,numberOfAllExternalDeclarationsUsedInInternalModule
41+
,numberOfAllExternalModulesUsedInInternalModule
42+
,externalDeclarationRate
43+
,externalDeclarationNames
44+
ORDER BY externalDeclarationRate DESC
45+
,internalModuleName ASC
46+
,numberOfExternalDeclarationCaller DESC
47+
,externalNamespaceName ASC

0 commit comments

Comments
 (0)