@contrast/contrast 1.0.4 → 1.0.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.
Files changed (115) hide show
  1. package/.prettierignore +0 -3
  2. package/dist/audit/autodetection/autoDetectLanguage.js +32 -0
  3. package/dist/audit/catalogueApplication/catalogueApplication.js +2 -11
  4. package/dist/audit/javaAnalysisEngine/parseMavenProjectFileContents.js +4 -2
  5. package/dist/audit/languageAnalysisEngine/checkForMultipleIdentifiedLanguages.js +2 -1
  6. package/dist/audit/languageAnalysisEngine/checkForMultipleIdentifiedProjectFiles.js +2 -1
  7. package/dist/audit/languageAnalysisEngine/checkIdentifiedLanguageHasProjectFile.js +2 -1
  8. package/dist/audit/languageAnalysisEngine/languageAnalysisFactory.js +6 -2
  9. package/dist/audit/languageAnalysisEngine/reduceIdentifiedLanguages.js +39 -1
  10. package/dist/audit/languageAnalysisEngine/report/commonReportingFunctions.js +69 -30
  11. package/dist/audit/languageAnalysisEngine/report/models/reportOutputModel.js +24 -0
  12. package/dist/audit/languageAnalysisEngine/report/models/reportSeverityModel.js +3 -1
  13. package/dist/audit/languageAnalysisEngine/report/models/severityCountModel.js +13 -0
  14. package/dist/audit/languageAnalysisEngine/report/reportingFeature.js +2 -2
  15. package/dist/audit/languageAnalysisEngine/report/utils/reportUtils.js +56 -45
  16. package/dist/audit/languageAnalysisEngine/sendSnapshot.js +65 -17
  17. package/dist/commands/audit/auditConfig.js +8 -2
  18. package/dist/commands/audit/auditController.js +9 -3
  19. package/dist/commands/audit/processAudit.js +1 -1
  20. package/dist/commands/scan/processScan.js +7 -4
  21. package/dist/commands/scan/sca/scaAnalysis.js +60 -0
  22. package/dist/common/HTTPClient.js +50 -16
  23. package/dist/common/errorHandling.js +11 -16
  24. package/dist/common/versionChecker.js +1 -1
  25. package/dist/constants/constants.js +24 -2
  26. package/dist/constants/locales.js +31 -36
  27. package/dist/constants.js +20 -0
  28. package/dist/lambda/analytics.js +11 -0
  29. package/dist/lambda/lambda.js +35 -4
  30. package/dist/lambda/types.js +13 -0
  31. package/dist/scaAnalysis/common/formatMessage.js +35 -0
  32. package/dist/scaAnalysis/common/treeUpload.js +29 -0
  33. package/dist/scaAnalysis/go/goAnalysis.js +17 -0
  34. package/dist/scaAnalysis/go/goParseDeps.js +158 -0
  35. package/dist/scaAnalysis/go/goReadDepFile.js +23 -0
  36. package/dist/scaAnalysis/java/analysis.js +105 -0
  37. package/dist/scaAnalysis/java/index.js +18 -0
  38. package/dist/scaAnalysis/java/javaBuildDepsParser.js +339 -0
  39. package/dist/scaAnalysis/python/analysis.js +41 -0
  40. package/dist/scaAnalysis/python/index.js +10 -0
  41. package/dist/scaAnalysis/ruby/analysis.js +226 -0
  42. package/dist/scaAnalysis/ruby/index.js +10 -0
  43. package/dist/scan/autoDetection.js +50 -1
  44. package/dist/scan/fileUtils.js +80 -1
  45. package/dist/scan/formatScanOutput.js +213 -0
  46. package/dist/scan/help.js +3 -1
  47. package/dist/scan/models/groupedResultsModel.js +2 -1
  48. package/dist/scan/models/scanResultsModel.js +3 -1
  49. package/dist/scan/populateProjectIdAndProjectName.js +2 -1
  50. package/dist/scan/scan.js +6 -99
  51. package/dist/scan/scanConfig.js +6 -1
  52. package/dist/scan/scanController.js +26 -7
  53. package/dist/scan/scanResults.js +20 -20
  54. package/dist/utils/commonApi.js +4 -1
  55. package/dist/utils/oraWrapper.js +5 -1
  56. package/package.json +12 -7
  57. package/src/audit/autodetection/autoDetectLanguage.ts +40 -0
  58. package/src/audit/catalogueApplication/catalogueApplication.js +3 -16
  59. package/src/audit/javaAnalysisEngine/parseMavenProjectFileContents.js +11 -8
  60. package/src/audit/languageAnalysisEngine/checkForMultipleIdentifiedLanguages.js +2 -1
  61. package/src/audit/languageAnalysisEngine/checkForMultipleIdentifiedProjectFiles.js +2 -1
  62. package/src/audit/languageAnalysisEngine/checkIdentifiedLanguageHasProjectFile.js +2 -1
  63. package/src/audit/languageAnalysisEngine/languageAnalysisFactory.js +17 -5
  64. package/src/audit/languageAnalysisEngine/reduceIdentifiedLanguages.js +76 -3
  65. package/src/audit/languageAnalysisEngine/report/commonReportingFunctions.ts +122 -40
  66. package/src/audit/languageAnalysisEngine/report/models/reportLibraryModel.ts +3 -3
  67. package/src/audit/languageAnalysisEngine/report/models/reportListModel.ts +15 -11
  68. package/src/audit/languageAnalysisEngine/report/models/reportOutputModel.ts +29 -0
  69. package/src/audit/languageAnalysisEngine/report/models/reportSeverityModel.ts +12 -3
  70. package/src/audit/languageAnalysisEngine/report/models/severityCountModel.ts +16 -0
  71. package/src/audit/languageAnalysisEngine/report/reportingFeature.ts +3 -3
  72. package/src/audit/languageAnalysisEngine/report/utils/reportUtils.ts +87 -65
  73. package/src/audit/languageAnalysisEngine/sendSnapshot.js +78 -25
  74. package/src/commands/audit/auditConfig.ts +12 -3
  75. package/src/commands/audit/auditController.ts +9 -3
  76. package/src/commands/audit/processAudit.ts +4 -1
  77. package/src/commands/scan/processScan.js +10 -4
  78. package/src/commands/scan/sca/scaAnalysis.js +83 -0
  79. package/src/common/HTTPClient.js +65 -25
  80. package/src/common/errorHandling.ts +14 -22
  81. package/src/common/versionChecker.ts +1 -1
  82. package/src/constants/constants.js +24 -2
  83. package/src/constants/locales.js +33 -50
  84. package/src/constants.js +22 -0
  85. package/src/lambda/analytics.ts +9 -0
  86. package/src/lambda/arn.ts +2 -1
  87. package/src/lambda/lambda.ts +37 -17
  88. package/src/lambda/types.ts +35 -0
  89. package/src/lambda/utils.ts +2 -7
  90. package/src/scaAnalysis/common/formatMessage.js +38 -0
  91. package/src/scaAnalysis/common/treeUpload.js +30 -0
  92. package/src/scaAnalysis/go/goAnalysis.js +19 -0
  93. package/src/scaAnalysis/go/goParseDeps.js +203 -0
  94. package/src/scaAnalysis/go/goReadDepFile.js +32 -0
  95. package/src/scaAnalysis/java/analysis.js +142 -0
  96. package/src/scaAnalysis/java/index.js +21 -0
  97. package/src/scaAnalysis/java/javaBuildDepsParser.js +404 -0
  98. package/src/scaAnalysis/python/analysis.js +48 -0
  99. package/src/scaAnalysis/python/index.js +11 -0
  100. package/src/scaAnalysis/ruby/analysis.js +282 -0
  101. package/src/scaAnalysis/ruby/index.js +11 -0
  102. package/src/scan/autoDetection.js +58 -1
  103. package/src/scan/fileUtils.js +99 -1
  104. package/src/scan/formatScanOutput.ts +249 -0
  105. package/src/scan/help.js +3 -1
  106. package/src/scan/models/groupedResultsModel.ts +7 -5
  107. package/src/scan/models/resultContentModel.ts +2 -2
  108. package/src/scan/models/scanResultsModel.ts +5 -2
  109. package/src/scan/populateProjectIdAndProjectName.js +3 -1
  110. package/src/scan/scan.ts +8 -136
  111. package/src/scan/scanConfig.js +5 -1
  112. package/src/scan/scanController.js +30 -10
  113. package/src/scan/scanResults.js +31 -18
  114. package/src/utils/commonApi.js +4 -1
  115. package/src/utils/oraWrapper.js +6 -1
@@ -0,0 +1,38 @@
1
+ const createJavaTSMessage = javaTree => {
2
+ return {
3
+ java: {
4
+ mavenDependencyTrees: javaTree
5
+ }
6
+ }
7
+ }
8
+
9
+ const createGoTSMessage = goTree => {
10
+ return {
11
+ go: {
12
+ goDependencyTrees: goTree
13
+ }
14
+ }
15
+ }
16
+
17
+ const createRubyTSMessage = rubyTree => {
18
+ return {
19
+ ruby: {
20
+ rubyDependencyTrees: rubyTree
21
+ }
22
+ }
23
+ }
24
+
25
+ const createPythonTSMessage = pythonTree => {
26
+ return {
27
+ python: {
28
+ pythonDependencyTrees: pythonTree
29
+ }
30
+ }
31
+ }
32
+
33
+ module.exports = {
34
+ createJavaTSMessage,
35
+ createGoTSMessage,
36
+ createRubyTSMessage,
37
+ createPythonTSMessage
38
+ }
@@ -0,0 +1,30 @@
1
+ const { getHttpClient } = require('../../utils/commonApi')
2
+ const { APP_VERSION } = require('../../constants/constants')
3
+
4
+ const commonSendSnapShot = async (analysis, config) => {
5
+ const requestBody = {
6
+ appID: config.applicationId,
7
+ cliVersion: APP_VERSION,
8
+ snapshot: analysis
9
+ }
10
+
11
+ const client = getHttpClient(config)
12
+ return client
13
+ .sendSnapshot(requestBody, config)
14
+ .then(res => {
15
+ if (res.statusCode === 201) {
16
+ console.log('dependencies processed successfully')
17
+ return res.body
18
+ } else {
19
+ console.log(res.statusCode)
20
+ console.log('error processing dependencies')
21
+ }
22
+ })
23
+ .catch(err => {
24
+ console.log(err)
25
+ })
26
+ }
27
+
28
+ module.exports = {
29
+ commonSendSnapShot
30
+ }
@@ -0,0 +1,19 @@
1
+ const { createGoTSMessage } = require('../common/formatMessage')
2
+ const goReadDepFile = require('./goReadDepFile')
3
+ const goParseDeps = require('./goParseDeps')
4
+
5
+ const goAnalysis = (config, languageFiles) => {
6
+ try {
7
+ const rawGoDependencies = goReadDepFile.getGoDependencies(config)
8
+ const parsedGoDependencies =
9
+ goParseDeps.parseGoDependencies(rawGoDependencies)
10
+
11
+ return createGoTSMessage(parsedGoDependencies)
12
+ } catch (e) {
13
+ console.log(e.message.toString())
14
+ }
15
+ }
16
+
17
+ module.exports = {
18
+ goAnalysis
19
+ }
@@ -0,0 +1,203 @@
1
+ const crypto = require('crypto')
2
+
3
+ const parseGoDependencies = goDeps => {
4
+ return parseGo(goDeps)
5
+ }
6
+
7
+ const parseGo = modGraphOutput => {
8
+ let splitLines = splitAllLinesIntoArray(modGraphOutput)
9
+ const directDepNames = getDirectDepNames(splitLines)
10
+ const uniqueTransitiveDepNames = getAllUniqueTransitiveDepNames(
11
+ splitLines,
12
+ directDepNames
13
+ )
14
+
15
+ let rootNodes = createRootNodes(splitLines)
16
+
17
+ createTransitiveDeps(uniqueTransitiveDepNames, splitLines, rootNodes)
18
+
19
+ return rootNodes
20
+ }
21
+
22
+ const splitAllLinesIntoArray = modGraphOutput => {
23
+ return modGraphOutput.split(/\r\n|\r|\n/)
24
+ }
25
+
26
+ const getAllDepsOfADepAsEdge = (dep, deps) => {
27
+ let edges = {}
28
+
29
+ const depRows = deps.filter(line => {
30
+ return line.startsWith(dep)
31
+ })
32
+
33
+ depRows.forEach(dep => {
34
+ const edgeName = dep.split(' ')[1]
35
+ edges[edgeName] = edgeName
36
+ })
37
+
38
+ return edges
39
+ }
40
+
41
+ const getAllDepsOfADepAsName = (dep, deps) => {
42
+ let edges = []
43
+
44
+ const depRows = deps.filter(line => {
45
+ return line.startsWith(dep)
46
+ })
47
+
48
+ depRows.forEach(dep => {
49
+ const edgeName = dep.split(' ')[1]
50
+ edges.push(edgeName)
51
+ })
52
+
53
+ return edges
54
+ }
55
+
56
+ const createRootNodes = deps => {
57
+ let rootDep = {}
58
+ const rootDeps = getRootDeps(deps)
59
+
60
+ const edges = rootDeps.map(dep => {
61
+ return dep.split(' ')[1]
62
+ })
63
+
64
+ rootDep[rootDeps[0].split(' ')[0]] = {}
65
+
66
+ edges.forEach(edge => {
67
+ const splitEdge = edge.split('@')
68
+ const splitGroupName = splitEdge[0].split('/')
69
+ const name = splitGroupName.pop()
70
+ const lastSlash = splitEdge[0].lastIndexOf('/')
71
+ let group = splitEdge[0].substring(0, lastSlash)
72
+ const hash = getHash(splitEdge[0])
73
+
74
+ group = checkGroupExists(group, name)
75
+
76
+ //get the edges of the root dependency
77
+ const edgesOfDep = getAllDepsOfADepAsEdge(edge, deps)
78
+
79
+ rootDep[rootDeps[0].split(' ')[0]][edge] = {
80
+ artifactID: name,
81
+ group: group,
82
+ version: splitEdge[1],
83
+ scope: '"compile',
84
+ type: 'direct',
85
+ hash: hash,
86
+ edges: edgesOfDep
87
+ }
88
+ })
89
+ return rootDep
90
+ }
91
+
92
+ const getRootDeps = deps => {
93
+ const rootDeps = deps.filter(dep => {
94
+ const parentDep = dep.split(' ')[0]
95
+ if (parentDep.split('@v').length === 1) {
96
+ return dep
97
+ }
98
+ })
99
+ return rootDeps
100
+ }
101
+
102
+ const getHash = library => {
103
+ let shaSum = crypto.createHash('sha1')
104
+ shaSum.update(library)
105
+ return shaSum.digest('hex')
106
+ }
107
+
108
+ const getDirectDepNames = deps => {
109
+ const directDepNames = []
110
+
111
+ deps.forEach(dep => {
112
+ const parentDep = dep.split(' ')[0]
113
+ if (parentDep.split('@v').length === 1) {
114
+ dep.split(' ')[1] !== undefined
115
+ ? directDepNames.push(dep.split(' ')[1])
116
+ : null
117
+ }
118
+ })
119
+ return directDepNames
120
+ }
121
+
122
+ const getAllUniqueTransitiveDepNames = (deps, directDepNames) => {
123
+ let uniqueDeps = []
124
+
125
+ deps.forEach(dep => {
126
+ const parentDep = dep.split(' ')[0]
127
+ if (parentDep.split('@v').length !== 1) {
128
+ if (!directDepNames.includes(parentDep)) {
129
+ if (!uniqueDeps.includes(parentDep)) {
130
+ parentDep.length > 1 ? uniqueDeps.push(parentDep) : null
131
+ }
132
+ }
133
+ }
134
+ })
135
+ return uniqueDeps
136
+ }
137
+
138
+ const checkGroupExists = (group, name) => {
139
+ if (group === null || group === '') {
140
+ return name
141
+ }
142
+ return group
143
+ }
144
+
145
+ const createTransitiveDeps = (transitiveDeps, splitLines, rootNodes) => {
146
+ transitiveDeps.forEach(dep => {
147
+ //create transitive dep
148
+ const splitEdge = dep.split('@')
149
+ const splitGroupName = splitEdge[0].split('/')
150
+ const name = splitGroupName.pop()
151
+ const lastSlash = splitEdge[0].lastIndexOf('/')
152
+ let group = splitEdge[0].substring(0, lastSlash)
153
+ const hash = getHash(splitEdge[0])
154
+
155
+ group = checkGroupExists(group, name)
156
+
157
+ const transitiveDep = {
158
+ artifactID: name,
159
+ group: group,
160
+ version: splitEdge[1],
161
+ scope: 'compile',
162
+ type: 'transitive',
163
+ hash: hash,
164
+ edges: {}
165
+ }
166
+
167
+ //add edges to transitiveDep
168
+ const edges = getAllDepsOfADepAsEdge(dep, splitLines)
169
+ transitiveDep.edges = edges
170
+
171
+ //add all edges as a transitive dependency to rootNodes
172
+ const edgesAsName = getAllDepsOfADepAsName(dep, splitLines)
173
+
174
+ edgesAsName.forEach(dep => {
175
+ const splitEdge = dep.split('@')
176
+ const splitGroupName = splitEdge[0].split('/')
177
+ const name = splitGroupName.pop()
178
+ const lastSlash = splitEdge[0].lastIndexOf('/')
179
+ let group = splitEdge[0].substring(0, lastSlash)
180
+ const hash = getHash(splitEdge[0])
181
+
182
+ group = checkGroupExists(group, name)
183
+
184
+ const transitiveDep = {
185
+ artifactID: name,
186
+ group: group,
187
+ version: splitEdge[1],
188
+ scope: 'compile',
189
+ type: 'transitive',
190
+ hash: hash,
191
+ edges: {}
192
+ }
193
+ rootNodes[Object.keys(rootNodes)[0]][dep] = transitiveDep
194
+ })
195
+
196
+ //add transitive dependency to rootNodes
197
+ rootNodes[Object.keys(rootNodes)[0]][dep] = transitiveDep
198
+ })
199
+ }
200
+
201
+ module.exports = {
202
+ parseGoDependencies
203
+ }
@@ -0,0 +1,32 @@
1
+ const child_process = require('child_process')
2
+ const i18n = require('i18n')
3
+
4
+ const getGoDependencies = config => {
5
+ let cmdStdout
6
+ let cwd = config.projectPath
7
+ ? config.projectPath.replace('go.mod', '')
8
+ : process.cwd()
9
+
10
+ try {
11
+ // A sample of this output can be found
12
+ // in the go test folder data/goModGraphResults.text
13
+ cmdStdout = child_process.execSync('go mod graph', { cwd })
14
+
15
+ return cmdStdout.toString()
16
+ } catch (err) {
17
+ if (err.message === 'spawnSync /bin/sh ENOENT') {
18
+ err.message =
19
+ '\n\n*************** No transitive dependencies ***************\n\nWe are unable to build a dependency tree view from your repository as there were no transitive dependencies found.'
20
+ }
21
+ console.log(
22
+ i18n.__('goReadProjectFile', cwd, `${err.message ? err.message : ''}`)
23
+ )
24
+ // throw new Error(
25
+ // i18n.__('goReadProjectFile', cwd, `${err.message ? err.message : ''}`)
26
+ // )
27
+ }
28
+ }
29
+
30
+ module.exports = {
31
+ getGoDependencies
32
+ }
@@ -0,0 +1,142 @@
1
+ const child_process = require('child_process')
2
+ const path = require('path')
3
+ const i18n = require('i18n')
4
+ const fs = require('fs')
5
+
6
+ const MAVEN = 'maven'
7
+ const GRADLE = 'gradle'
8
+
9
+ const determineProjectTypeAndCwd = (files, projectPath) => {
10
+ const projectData = {}
11
+
12
+ if (files[0].includes('pom.xml')) {
13
+ projectData.projectType = MAVEN
14
+ } else if (files[0].includes('build.gradle')) {
15
+ projectData.projectType = GRADLE
16
+ }
17
+
18
+ //clean up the path to be a folder not a file
19
+ projectData.cwd = projectPath
20
+ ? projectPath.replace('pom.xml', '').replace('build.gradle', '')
21
+ : projectPath
22
+
23
+ return projectData
24
+ }
25
+
26
+ const buildMaven = (config, projectData, timeout) => {
27
+ let cmdStdout
28
+ let mvn_settings = ''
29
+
30
+ try {
31
+ // Allow users to provide a custom location for their settings.xml
32
+ if (config.mavenSettingsPath) {
33
+ mvn_settings = ' -s ' + config.mavenSettingsPath
34
+ }
35
+ cmdStdout = child_process.execSync(
36
+ 'mvn dependency:tree -B' + mvn_settings,
37
+ {
38
+ cwd: projectData.cwd,
39
+ timeout
40
+ }
41
+ )
42
+ return cmdStdout.toString()
43
+ } catch (err) {
44
+ throw new Error(
45
+ i18n.__('mavenDependencyTreeNonZero', projectData.cwd, `${err.message}`)
46
+ )
47
+ }
48
+ }
49
+
50
+ const buildGradle = (config, projectData, timeout) => {
51
+ let cmdStdout
52
+ let output = {}
53
+
54
+ try {
55
+ // path.sep is user here to either execute as "./gradlew" for UNIX/Linux/MacOS
56
+ // & ".\gradlew" for Windows
57
+ // Check if the user has specified a sub-project
58
+ if (config.subProject) {
59
+ cmdStdout = child_process.execSync(
60
+ '.' +
61
+ path.sep +
62
+ 'gradlew :' +
63
+ config.subProject +
64
+ ':dependencies --configuration runtimeClasspath',
65
+ {
66
+ cwd: projectData.cwd,
67
+ timeout
68
+ }
69
+ )
70
+ } else {
71
+ cmdStdout = child_process.execSync(
72
+ '.' +
73
+ path.sep +
74
+ 'gradlew dependencies --configuration runtimeClasspath',
75
+ {
76
+ cwd: projectData.cwd,
77
+ timeout
78
+ }
79
+ )
80
+ }
81
+ if (
82
+ cmdStdout
83
+ .toString()
84
+ .includes(
85
+ "runtimeClasspath - Runtime classpath of source set 'main'.\n" +
86
+ 'No dependencies'
87
+ )
88
+ ) {
89
+ cmdStdout = child_process.execSync(
90
+ '.' + path.sep + 'gradlew dependencies',
91
+ {
92
+ cwd: projectData.cwd,
93
+ timeout
94
+ }
95
+ )
96
+ }
97
+ output = cmdStdout.toString()
98
+ return output
99
+ } catch (err) {
100
+ if (
101
+ fs.existsSync(projectData.cwd + 'gradlew') ||
102
+ fs.existsSync(projectData.cwd + 'gradlew.bat')
103
+ ) {
104
+ throw new Error(
105
+ i18n.__(
106
+ 'gradleDependencyTreeNonZero',
107
+ projectData.cwd,
108
+ `${err.message}`
109
+ )
110
+ )
111
+ } else {
112
+ throw new Error(
113
+ i18n.__('gradleWrapperUnavailable', projectData.cwd, `${err.message}`)
114
+ )
115
+ }
116
+ }
117
+ }
118
+
119
+ const getJavaBuildDeps = (config, files) => {
120
+ const timeout = 960000
121
+ let output = {
122
+ mvnDependancyTreeOutput: undefined,
123
+ projectType: undefined
124
+ }
125
+
126
+ try {
127
+ const projectData = determineProjectTypeAndCwd(files, config.projectPath)
128
+ if (projectData.projectType === MAVEN) {
129
+ output.mvnDependancyTreeOutput = buildMaven(config, projectData, timeout)
130
+ } else if (projectData.projectType === GRADLE) {
131
+ output.mvnDependancyTreeOutput = buildGradle(config, projectData, timeout)
132
+ }
133
+ output.projectType = projectData.projectType
134
+ return output
135
+ } catch (err) {
136
+ console.log(err.message.toString())
137
+ }
138
+ }
139
+
140
+ module.exports = {
141
+ getJavaBuildDeps
142
+ }
@@ -0,0 +1,21 @@
1
+ const analysis = require('./analysis')
2
+ const { parseBuildDeps } = require('./javaBuildDepsParser')
3
+ const { createJavaTSMessage } = require('../common/formatMessage')
4
+
5
+ const javaAnalysis = (config, languageFiles) => {
6
+ languageFiles.JAVA.forEach(file => {
7
+ file.replace('build.gradle.kts', 'build.gradle')
8
+ })
9
+
10
+ const javaDeps = buildJavaTree(config, languageFiles.JAVA)
11
+ return createJavaTSMessage(javaDeps)
12
+ }
13
+
14
+ const buildJavaTree = (config, files) => {
15
+ const javaBuildDeps = analysis.getJavaBuildDeps(config, files)
16
+ return parseBuildDeps(config, javaBuildDeps)
17
+ }
18
+
19
+ module.exports = {
20
+ javaAnalysis
21
+ }