Skip to content

Commit 399dd06

Browse files
committed
Add external dependencies reports for Typescript
1 parent 7a4ae0e commit 399dd06

10 files changed

+1910
-39
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(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: 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 numberOfElementsInInternalModule
9+
,count(DISTINCT externalDeclaration.globalFqn) AS numberOfExternalDeclarationsUsedInInternalModule
10+
,count(DISTINCT externalModule.globalFqn) AS numberOfExternalModulesUsedInInternalModule
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 numberOfElementsInInternalModule
17+
,numberOfExternalDeclarationsUsedInInternalModule
18+
,numberOfExternalModulesUsedInInternalModule
19+
,100.0 / numberOfElementsInInternalModule * numberOfExternalDeclarationsUsedInInternalModule 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 numberOfElementsInInternalModule
29+
,numberOfExternalDeclarationsUsedInInternalModule
30+
,numberOfExternalModulesUsedInInternalModule
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+
,numberOfElementsInInternalModule
42+
,numberOfExternalDeclarationsUsedInInternalModule
43+
,numberOfExternalModulesUsedInInternalModule
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(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(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: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
// External Typescript namespace 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(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+
,externalModule.namespace AS externalModuleNamespace
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 namespace
29+
RETURN externalModuleNamespace
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 namespace
58+
ORDER BY numberOfInternalModules DESC, externalModuleNamespace ASC
Lines changed: 47 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,49 @@
1-
// External package usage per artifact sorted by external usage descending
1+
// External Typescript module usage per internal module sorted by external usage descending
22

3-
MATCH (artifact:Artifact:Archive)-[:CONTAINS]->(type:Type)
4-
OPTIONAL MATCH (type)-[:DEPENDS_ON]->(externalType:ExternalType)
5-
WITH replace(last(split(artifact.fileName, '/')), '.jar', '') AS artifactName
6-
,count(DISTINCT type.fqn) AS numberOfTypesInArtifact
7-
,count(DISTINCT externalType.fqn) AS numberOfExternalTypesInArtifact
8-
,count(DISTINCT replace(externalType.fqn, '.' + externalType.name, '')) AS numberOfExternalPackagesInArtifact
9-
,collect(DISTINCT type) AS typeList
10-
UNWIND typeList AS type
11-
MATCH (type)-[externalDependency:DEPENDS_ON]->(externalType:ExternalType)
12-
WITH numberOfTypesInArtifact
13-
,numberOfExternalTypesInArtifact
14-
,numberOfExternalPackagesInArtifact
15-
,100.0 / numberOfTypesInArtifact * numberOfExternalTypesInArtifact AS externalTypeRate
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
1620
,externalDependency
17-
,artifactName
18-
,type.fqn AS fullTypeName
19-
,type.name AS typeName
20-
,replace(externalType.fqn, '.' + externalType.name, '') AS externalPackageName
21-
,externalType.name AS externalTypeName
22-
WITH numberOfTypesInArtifact
23-
,numberOfExternalTypesInArtifact
24-
,numberOfExternalPackagesInArtifact
25-
,externalTypeRate
26-
,artifactName
27-
,externalPackageName
28-
,count(externalDependency) AS numberOfExternalTypeCaller
29-
,sum(externalDependency.weight) AS numberOfExternalTypeCalls
30-
,collect(DISTINCT externalTypeName) AS externalTypeNames
31-
RETURN artifactName
32-
,externalPackageName
33-
,numberOfExternalTypeCaller
34-
,numberOfExternalTypeCalls
35-
,numberOfTypesInArtifact
36-
,numberOfExternalTypesInArtifact
37-
,numberOfExternalPackagesInArtifact
38-
,externalTypeRate
39-
,externalTypeNames
40-
ORDER BY externalTypeRate DESC, artifactName ASC, numberOfExternalTypeCaller DESC, externalPackageName ASC
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

0 commit comments

Comments
 (0)