@contrast/contrast 1.0.8 → 1.0.9

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 (173) hide show
  1. package/dist/audit/languageAnalysisEngine/getProjectRootFilenames.js +3 -12
  2. package/dist/audit/languageAnalysisEngine/report/commonReportingFunctions.js +88 -53
  3. package/dist/audit/languageAnalysisEngine/report/models/reportOutputModel.js +4 -3
  4. package/dist/audit/languageAnalysisEngine/report/reportingFeature.js +58 -11
  5. package/dist/audit/languageAnalysisEngine/report/utils/reportUtils.js +38 -5
  6. package/dist/audit/languageAnalysisEngine/sendSnapshot.js +6 -30
  7. package/dist/audit/save.js +21 -13
  8. package/dist/commands/audit/auditConfig.js +0 -16
  9. package/dist/commands/audit/auditController.js +1 -10
  10. package/dist/commands/audit/help.js +7 -24
  11. package/dist/commands/audit/processAudit.js +1 -7
  12. package/dist/commands/audit/saveFile.js +2 -2
  13. package/dist/commands/scan/sca/scaAnalysis.js +22 -9
  14. package/dist/common/HTTPClient.js +8 -8
  15. package/dist/constants/constants.js +7 -2
  16. package/dist/constants/locales.js +24 -30
  17. package/dist/constants.js +11 -9
  18. package/dist/index.js +54 -45
  19. package/dist/lambda/lambda.js +5 -2
  20. package/dist/sbom/generateSbom.js +2 -2
  21. package/dist/scaAnalysis/common/formatMessage.js +7 -1
  22. package/dist/scaAnalysis/common/treeUpload.js +4 -5
  23. package/dist/scaAnalysis/dotnet/analysis.js +43 -0
  24. package/dist/scaAnalysis/dotnet/index.js +10 -0
  25. package/dist/scaAnalysis/javascript/analysis.js +4 -7
  26. package/dist/scaAnalysis/javascript/index.js +14 -5
  27. package/dist/scaAnalysis/php/analysis.js +14 -33
  28. package/dist/scaAnalysis/php/index.js +11 -4
  29. package/dist/scaAnalysis/ruby/analysis.js +2 -10
  30. package/dist/scan/autoDetection.js +18 -21
  31. package/dist/scan/fileUtils.js +31 -12
  32. package/dist/scan/formatScanOutput.js +3 -3
  33. package/dist/scan/scanConfig.js +2 -2
  34. package/dist/utils/getConfig.js +1 -6
  35. package/package.json +2 -3
  36. package/src/audit/languageAnalysisEngine/getProjectRootFilenames.js +3 -32
  37. package/src/audit/languageAnalysisEngine/report/commonReportingFunctions.ts +128 -68
  38. package/src/audit/languageAnalysisEngine/report/models/reportOutputModel.ts +11 -5
  39. package/src/audit/languageAnalysisEngine/report/reportingFeature.ts +41 -19
  40. package/src/audit/languageAnalysisEngine/report/utils/reportUtils.ts +43 -4
  41. package/src/audit/languageAnalysisEngine/sendSnapshot.js +6 -32
  42. package/src/audit/save.js +32 -16
  43. package/src/commands/audit/auditConfig.ts +0 -25
  44. package/src/commands/audit/auditController.ts +0 -11
  45. package/src/commands/audit/help.ts +7 -24
  46. package/src/commands/audit/processAudit.ts +1 -7
  47. package/src/commands/audit/saveFile.ts +2 -2
  48. package/src/commands/scan/processScan.js +0 -1
  49. package/src/commands/scan/sca/scaAnalysis.js +28 -13
  50. package/src/common/HTTPClient.js +9 -9
  51. package/src/constants/constants.js +9 -3
  52. package/src/constants/locales.js +47 -35
  53. package/src/constants.js +12 -10
  54. package/src/index.ts +76 -66
  55. package/src/lambda/lambda.ts +5 -2
  56. package/src/lambda/types.ts +1 -0
  57. package/src/sbom/generateSbom.ts +2 -2
  58. package/src/scaAnalysis/common/formatMessage.js +8 -1
  59. package/src/scaAnalysis/common/treeUpload.js +4 -5
  60. package/src/scaAnalysis/dotnet/analysis.js +54 -0
  61. package/src/scaAnalysis/dotnet/index.js +11 -0
  62. package/src/scaAnalysis/javascript/analysis.js +6 -7
  63. package/src/scaAnalysis/javascript/index.js +23 -7
  64. package/src/scaAnalysis/php/analysis.js +15 -35
  65. package/src/scaAnalysis/php/index.js +15 -4
  66. package/src/scaAnalysis/ruby/analysis.js +2 -11
  67. package/src/scan/autoDetection.js +18 -24
  68. package/src/scan/fileUtils.js +33 -12
  69. package/src/scan/formatScanOutput.ts +3 -3
  70. package/src/scan/scanConfig.js +2 -4
  71. package/src/utils/getConfig.ts +1 -12
  72. package/dist/audit/AnalysisEngine.js +0 -37
  73. package/dist/audit/autodetection/autoDetectLanguage.js +0 -32
  74. package/dist/audit/dotnetAnalysisEngine/index.js +0 -25
  75. package/dist/audit/dotnetAnalysisEngine/parseLockFileContents.js +0 -35
  76. package/dist/audit/dotnetAnalysisEngine/parseProjectFileContents.js +0 -15
  77. package/dist/audit/dotnetAnalysisEngine/readLockFileContents.js +0 -18
  78. package/dist/audit/dotnetAnalysisEngine/readProjectFileContents.js +0 -14
  79. package/dist/audit/dotnetAnalysisEngine/sanitizer.js +0 -9
  80. package/dist/audit/goAnalysisEngine/index.js +0 -17
  81. package/dist/audit/goAnalysisEngine/parseProjectFileContents.js +0 -164
  82. package/dist/audit/goAnalysisEngine/readProjectFileContents.js +0 -21
  83. package/dist/audit/goAnalysisEngine/sanitizer.js +0 -5
  84. package/dist/audit/javaAnalysisEngine/index.js +0 -34
  85. package/dist/audit/javaAnalysisEngine/parseMavenProjectFileContents.js +0 -155
  86. package/dist/audit/javaAnalysisEngine/parseProjectFileContents.js +0 -353
  87. package/dist/audit/javaAnalysisEngine/readProjectFileContents.js +0 -98
  88. package/dist/audit/javaAnalysisEngine/sanitizer.js +0 -5
  89. package/dist/audit/languageAnalysisEngine/checkForMultipleIdentifiedLanguages.js +0 -25
  90. package/dist/audit/languageAnalysisEngine/checkForMultipleIdentifiedProjectFiles.js +0 -25
  91. package/dist/audit/languageAnalysisEngine/checkIdentifiedLanguageHasLockFile.js +0 -35
  92. package/dist/audit/languageAnalysisEngine/checkIdentifiedLanguageHasProjectFile.js +0 -24
  93. package/dist/audit/languageAnalysisEngine/constants.js +0 -20
  94. package/dist/audit/languageAnalysisEngine/getIdentifiedLanguageInfo.js +0 -25
  95. package/dist/audit/languageAnalysisEngine/index.js +0 -39
  96. package/dist/audit/languageAnalysisEngine/languageAnalysisFactory.js +0 -66
  97. package/dist/audit/languageAnalysisEngine/reduceIdentifiedLanguages.js +0 -166
  98. package/dist/audit/nodeAnalysisEngine/handleNPMLockFileV2.js +0 -40
  99. package/dist/audit/nodeAnalysisEngine/index.js +0 -31
  100. package/dist/audit/nodeAnalysisEngine/parseNPMLockFileContents.js +0 -18
  101. package/dist/audit/nodeAnalysisEngine/parseYarnLockFileContents.js +0 -18
  102. package/dist/audit/nodeAnalysisEngine/readNPMLockFileContents.js +0 -17
  103. package/dist/audit/nodeAnalysisEngine/readProjectFileContents.js +0 -14
  104. package/dist/audit/nodeAnalysisEngine/readYarnLockFileContents.js +0 -24
  105. package/dist/audit/nodeAnalysisEngine/sanitizer.js +0 -9
  106. package/dist/audit/phpAnalysisEngine/index.js +0 -23
  107. package/dist/audit/phpAnalysisEngine/parseLockFileContents.js +0 -52
  108. package/dist/audit/phpAnalysisEngine/readLockFileContents.js +0 -13
  109. package/dist/audit/phpAnalysisEngine/readProjectFileContents.js +0 -16
  110. package/dist/audit/phpAnalysisEngine/sanitizer.js +0 -5
  111. package/dist/audit/pythonAnalysisEngine/index.js +0 -25
  112. package/dist/audit/pythonAnalysisEngine/parsePipfileLockContents.js +0 -17
  113. package/dist/audit/pythonAnalysisEngine/parseProjectFileContents.js +0 -21
  114. package/dist/audit/pythonAnalysisEngine/readPipfileLockFileContents.js +0 -13
  115. package/dist/audit/pythonAnalysisEngine/readPythonProjectFileContents.js +0 -14
  116. package/dist/audit/pythonAnalysisEngine/sanitizer.js +0 -7
  117. package/dist/audit/rubyAnalysisEngine/index.js +0 -25
  118. package/dist/audit/rubyAnalysisEngine/parseGemfileLockContents.js +0 -176
  119. package/dist/audit/rubyAnalysisEngine/parsedGemfile.js +0 -22
  120. package/dist/audit/rubyAnalysisEngine/readGemfileContents.js +0 -14
  121. package/dist/audit/rubyAnalysisEngine/readGemfileLockContents.js +0 -14
  122. package/dist/audit/rubyAnalysisEngine/sanitizer.js +0 -6
  123. package/src/audit/AnalysisEngine.js +0 -103
  124. package/src/audit/autodetection/autoDetectLanguage.ts +0 -40
  125. package/src/audit/dotnetAnalysisEngine/index.js +0 -26
  126. package/src/audit/dotnetAnalysisEngine/parseLockFileContents.js +0 -47
  127. package/src/audit/dotnetAnalysisEngine/parseProjectFileContents.js +0 -29
  128. package/src/audit/dotnetAnalysisEngine/readLockFileContents.js +0 -30
  129. package/src/audit/dotnetAnalysisEngine/readProjectFileContents.js +0 -26
  130. package/src/audit/dotnetAnalysisEngine/sanitizer.js +0 -11
  131. package/src/audit/goAnalysisEngine/index.js +0 -18
  132. package/src/audit/goAnalysisEngine/parseProjectFileContents.js +0 -209
  133. package/src/audit/goAnalysisEngine/readProjectFileContents.js +0 -31
  134. package/src/audit/goAnalysisEngine/sanitizer.js +0 -7
  135. package/src/audit/javaAnalysisEngine/index.js +0 -41
  136. package/src/audit/javaAnalysisEngine/parseMavenProjectFileContents.js +0 -225
  137. package/src/audit/javaAnalysisEngine/parseProjectFileContents.js +0 -420
  138. package/src/audit/javaAnalysisEngine/readProjectFileContents.js +0 -141
  139. package/src/audit/javaAnalysisEngine/sanitizer.js +0 -6
  140. package/src/audit/languageAnalysisEngine/checkForMultipleIdentifiedLanguages.js +0 -36
  141. package/src/audit/languageAnalysisEngine/checkForMultipleIdentifiedProjectFiles.js +0 -42
  142. package/src/audit/languageAnalysisEngine/checkIdentifiedLanguageHasLockFile.js +0 -54
  143. package/src/audit/languageAnalysisEngine/checkIdentifiedLanguageHasProjectFile.js +0 -33
  144. package/src/audit/languageAnalysisEngine/constants.js +0 -23
  145. package/src/audit/languageAnalysisEngine/getIdentifiedLanguageInfo.js +0 -41
  146. package/src/audit/languageAnalysisEngine/index.js +0 -45
  147. package/src/audit/languageAnalysisEngine/languageAnalysisFactory.js +0 -96
  148. package/src/audit/languageAnalysisEngine/reduceIdentifiedLanguages.js +0 -251
  149. package/src/audit/nodeAnalysisEngine/handleNPMLockFileV2.js +0 -49
  150. package/src/audit/nodeAnalysisEngine/index.js +0 -35
  151. package/src/audit/nodeAnalysisEngine/parseNPMLockFileContents.js +0 -20
  152. package/src/audit/nodeAnalysisEngine/parseYarnLockFileContents.js +0 -26
  153. package/src/audit/nodeAnalysisEngine/readNPMLockFileContents.js +0 -23
  154. package/src/audit/nodeAnalysisEngine/readProjectFileContents.js +0 -27
  155. package/src/audit/nodeAnalysisEngine/readYarnLockFileContents.js +0 -36
  156. package/src/audit/nodeAnalysisEngine/sanitizer.js +0 -11
  157. package/src/audit/phpAnalysisEngine/index.js +0 -27
  158. package/src/audit/phpAnalysisEngine/parseLockFileContents.js +0 -60
  159. package/src/audit/phpAnalysisEngine/readLockFileContents.js +0 -14
  160. package/src/audit/phpAnalysisEngine/readProjectFileContents.js +0 -25
  161. package/src/audit/phpAnalysisEngine/sanitizer.js +0 -4
  162. package/src/audit/pythonAnalysisEngine/index.js +0 -55
  163. package/src/audit/pythonAnalysisEngine/parsePipfileLockContents.js +0 -23
  164. package/src/audit/pythonAnalysisEngine/parseProjectFileContents.js +0 -33
  165. package/src/audit/pythonAnalysisEngine/readPipfileLockFileContents.js +0 -16
  166. package/src/audit/pythonAnalysisEngine/readPythonProjectFileContents.js +0 -22
  167. package/src/audit/pythonAnalysisEngine/sanitizer.js +0 -9
  168. package/src/audit/rubyAnalysisEngine/index.js +0 -30
  169. package/src/audit/rubyAnalysisEngine/parseGemfileLockContents.js +0 -215
  170. package/src/audit/rubyAnalysisEngine/parsedGemfile.js +0 -39
  171. package/src/audit/rubyAnalysisEngine/readGemfileContents.js +0 -18
  172. package/src/audit/rubyAnalysisEngine/readGemfileLockContents.js +0 -17
  173. package/src/audit/rubyAnalysisEngine/sanitizer.js +0 -8
@@ -1,420 +0,0 @@
1
- const i18n = require('i18n')
2
- let projectType = ''
3
- const StringBuilder = require('string-builder')
4
- let sb = new StringBuilder()
5
-
6
- module.exports = exports = (
7
- { language: { projectFilePath }, java },
8
- next,
9
- config
10
- ) => {
11
- const { mvnDependancyTreeOutput } = java
12
- if (
13
- projectFilePath.endsWith('build.gradle') ||
14
- projectFilePath.endsWith('pom.xml')
15
- ) {
16
- if (projectFilePath.endsWith('build.gradle')) {
17
- projectType = 'Gradle'
18
- } else {
19
- projectType = 'Maven'
20
- }
21
- try {
22
- java.mavenDependencyTrees = parseGradle(mvnDependancyTreeOutput, config)
23
- next()
24
- } catch (err) {
25
- next(new Error(i18n.__('javaParseProjectFile') + `${err.message}`))
26
- return
27
- }
28
- } else {
29
- next()
30
- }
31
- }
32
-
33
- const preParser = shavedOutput => {
34
- let obj = []
35
- for (let dep in shavedOutput) {
36
- obj.push(
37
- shavedOutput[dep]
38
- .replace('+-', '+---')
39
- .replace('[INFO]', '')
40
- .replace('\\-', '\\---')
41
- .replace(':jar:', ':')
42
- .replace(':test', '')
43
- .replace(':compile', '')
44
- .replace(' +', '+')
45
- .replace(' |', '|')
46
- .replace(' \\', '\\')
47
- .replace(':runtime', '')
48
- )
49
- }
50
-
51
- let depTree = []
52
- for (let x in obj) {
53
- let nodeLevel = computeRelationToLastElement(obj[x])
54
-
55
- let notLastLevel =
56
- obj[x].startsWith('|') ||
57
- obj[x].startsWith('+') ||
58
- obj[x].startsWith('\\')
59
-
60
- if (notLastLevel) {
61
- if (nodeLevel === 0) {
62
- depTree.push(obj[x])
63
- } else {
64
- let level = computeLevel(nodeLevel)
65
- let validatedLevel = addIndentation(nodeLevel === 2 ? 5 : level, obj[x])
66
- depTree.push(validatedLevel)
67
- }
68
- } else {
69
- let level = computeLevel(nodeLevel)
70
- let validatedLevel = addIndentation(nodeLevel === 3 ? 5 : level, obj[x])
71
- depTree.push(validatedLevel)
72
- }
73
- }
74
-
75
- return depTree
76
- }
77
-
78
- const shaveOutput = gradleDependencyTreeOutput => {
79
- let shavedOutput = gradleDependencyTreeOutput.split('\n')
80
-
81
- if (projectType === 'Maven') {
82
- shavedOutput = preParser(shavedOutput)
83
- }
84
-
85
- let obj = []
86
- for (let key in shavedOutput) {
87
- if (shavedOutput[key].includes('project :')) {
88
- //skip
89
- } else if (
90
- shavedOutput[key].includes('+---') ||
91
- shavedOutput[key].includes('\\---')
92
- ) {
93
- obj.push(shavedOutput[key])
94
- }
95
- }
96
- return obj
97
- }
98
-
99
- const computeIndentation = element => {
100
- let hasPlus = element.includes('+')
101
- let hasSlash = element.includes('\\')
102
- if (hasPlus) {
103
- return element.substring(element.indexOf('+'))
104
- }
105
- if (hasSlash) {
106
- return element.substring(element.indexOf('\\'))
107
- }
108
- }
109
-
110
- const computeLevel = nodeLevel => {
111
- let num = [5, 8, 11, 14, 17, 20]
112
- for (let z in num) {
113
- if (num[z] === nodeLevel) {
114
- let n = parseInt(z)
115
- return 5 * (n + 2)
116
- }
117
- }
118
- }
119
-
120
- const addIndentation = (number, str) => {
121
- str = computeIndentation(str)
122
- sb.clear() // need to clear so each dep doesn't append to the string
123
- for (let j = 0; j < number; j++) {
124
- sb.append(' ')
125
- }
126
- sb.append(str)
127
- return sb.toString()
128
- }
129
-
130
- const computeRelationToLastElement = element => {
131
- let hasPlus = element.includes('+---')
132
- let hasSlash = element.includes('\\---')
133
- if (hasPlus) {
134
- return element.split('+---')[0].length
135
- }
136
- if (hasSlash) {
137
- return element.split('\\---')[0].length
138
- }
139
- }
140
-
141
- const stripElement = element => {
142
- return element
143
- .replace(/[|]/g, '')
144
- .replace('+---', '')
145
- .replace('\\---', '')
146
- .replace(/[' ']/g, '')
147
- .replace('(c)', '')
148
- .replace('->', '@')
149
- .replace('(*)', '')
150
- }
151
-
152
- const checkVersion = element => {
153
- let version = element.split(':')
154
- return version[version.length - 1]
155
- }
156
-
157
- const createElement = (element, isRoot) => {
158
- let tree
159
- let cleanElement = stripElement(element)
160
- let splitGroupName = cleanElement.split(':')
161
-
162
- let validateVersion = false
163
- if (!element.includes('->')) {
164
- validateVersion = true
165
- }
166
-
167
- tree = {
168
- artifactID: splitGroupName[1],
169
- group: splitGroupName[0],
170
- version: validateVersion
171
- ? checkVersion(cleanElement)
172
- : splitGroupName[splitGroupName.length - 1],
173
- scope: 'compile',
174
- type: isRoot ? 'direct' : 'transitive',
175
- edges: {}
176
- }
177
- return tree
178
- }
179
-
180
- const getElementHeader = element => {
181
- let elementHeader = stripElement(element)
182
- elementHeader = elementHeader.replace(':', '/')
183
- elementHeader = elementHeader.replace(':', '@')
184
-
185
- return elementHeader
186
- }
187
-
188
- const buildElement = (element, rootElement, parentOfCurrent, tree, isRoot) => {
189
- let childElement = createElement(element, isRoot)
190
- let elementHeader = getElementHeader(element)
191
- let levelsArray = [rootElement, parentOfCurrent]
192
- const treeNode = getNestedObject(tree, levelsArray)
193
- const rootNode = getNestedObject(tree, [rootElement])
194
-
195
- // eslint-disable-next-line
196
- if (!rootNode.hasOwnProperty(elementHeader)) {
197
- tree[rootElement][elementHeader] = childElement
198
- }
199
- treeNode.edges[elementHeader] = elementHeader
200
- }
201
-
202
- const hasChildren = (nextNodeLevel, nodeLevel) => {
203
- if (nextNodeLevel > nodeLevel) {
204
- return true
205
- }
206
- }
207
-
208
- const lastChild = (nextNodeLevel, nodeLevel) => {
209
- if (nextNodeLevel < nodeLevel) {
210
- return true
211
- }
212
- }
213
-
214
- const calculateLevels = (nextNodeLevel, nodeLevel) => {
215
- return (nodeLevel - nextNodeLevel) / 5
216
- }
217
-
218
- const buildTree = shavedOutput => {
219
- let tree = {}
220
- let rootElement
221
- let levelNodes = []
222
-
223
- shavedOutput.forEach((element, index) => {
224
- if (index === 0) {
225
- // console.log(element, index)
226
- let cleanElement = stripElement(element)
227
- let elementHeader = getElementHeader(cleanElement)
228
- let splitElement = element.split(' ')
229
- let splitGroupName = splitElement[1].split(':')
230
-
231
- let validateVersion = false
232
- if (!element.includes('->')) {
233
- validateVersion = true
234
- }
235
-
236
- tree[splitGroupName[0]] = {}
237
- tree[splitGroupName[0]][elementHeader] = {
238
- artifactID: splitGroupName[1],
239
- group: splitGroupName[0],
240
- version: validateVersion
241
- ? checkVersion(cleanElement)
242
- : splitElement[splitElement.length - 1],
243
- scope: 'compile',
244
- type: 'direct',
245
- edges: {}
246
- }
247
-
248
- rootElement = splitGroupName[0]
249
- levelNodes.push(elementHeader)
250
- }
251
-
252
- if (shavedOutput.length - 1 === index) {
253
- // console.log(element, index)
254
- const parentOfCurrent = levelNodes[levelNodes.length - 1]
255
- let nodeLevel = computeRelationToLastElement(element)
256
-
257
- let validateVersion = false
258
- if (!element.includes('->')) {
259
- validateVersion = true
260
- }
261
-
262
- if (nodeLevel === 0) {
263
- let cleanElement = stripElement(element)
264
- let elementHeader = getElementHeader(cleanElement)
265
- let splitElement = element.split(' ')
266
- let splitGroupName = splitElement[1].split(':')
267
- tree[rootElement][elementHeader] = {
268
- artifactID: splitGroupName[1],
269
- group: splitGroupName[0],
270
- version: validateVersion
271
- ? checkVersion(cleanElement)
272
- : splitElement[splitElement.length - 1],
273
- scope: 'compile',
274
- type: 'direct',
275
- edges: {}
276
- }
277
- } else {
278
- buildElement(element, rootElement, parentOfCurrent, tree)
279
- }
280
- }
281
-
282
- if (index >= 1 && index < shavedOutput.length - 1) {
283
- let nodeLevel = computeRelationToLastElement(element)
284
- let nextNodeLevel = computeRelationToLastElement(shavedOutput[index + 1])
285
- const parentOfCurrent = levelNodes[levelNodes.length - 1]
286
-
287
- let isRoot = false
288
- if (nodeLevel === 0) {
289
- isRoot = true
290
- }
291
-
292
- // useful for debugging
293
- // console.log(
294
- // element,
295
- // index,
296
- // 'nodeLevel:',
297
- // nodeLevel,
298
- // 'nextNodeLevel:',
299
- // nextNodeLevel,
300
- // 'parentofCurrent:',
301
- // parentOfCurrent
302
- // )
303
-
304
- if (isRoot) {
305
- let cleanElement = stripElement(element)
306
- let elementHeader = getElementHeader(cleanElement)
307
- let splitElement = element.split(' ')
308
- let splitGroupName = splitElement[1].split(':')
309
-
310
- let validateVersion = false
311
- if (!element.includes('->')) {
312
- validateVersion = true
313
- }
314
-
315
- tree[rootElement][elementHeader] = {
316
- artifactID: splitGroupName[1],
317
- group: splitGroupName[0],
318
- version: validateVersion
319
- ? checkVersion(cleanElement)
320
- : splitElement[splitElement.length - 1],
321
- scope: 'compile',
322
- type: 'direct',
323
- edges: {}
324
- }
325
- levelNodes.push(elementHeader)
326
- return
327
- }
328
-
329
- let elementHeader = getElementHeader(element)
330
- buildElement(element, rootElement, parentOfCurrent, tree, isRoot)
331
-
332
- if (hasChildren(nextNodeLevel, nodeLevel)) {
333
- buildElement(element, rootElement, parentOfCurrent, tree, isRoot)
334
- levelNodes.push(elementHeader)
335
- }
336
-
337
- if (lastChild(nextNodeLevel, nodeLevel)) {
338
- let levelDifference = calculateLevels(nextNodeLevel, nodeLevel)
339
- if (levelDifference === 0) {
340
- levelNodes.pop()
341
- } else {
342
- let i
343
- for (i = 0; i < levelDifference; i++) {
344
- levelNodes.pop()
345
- }
346
- }
347
- }
348
- }
349
- })
350
-
351
- return tree
352
- }
353
-
354
- const getNestedObject = (nestedObj, pathArr) => {
355
- return pathArr.reduce(
356
- (obj, key) => (obj && obj[key] !== 'undefined' ? obj[key] : undefined),
357
- nestedObj
358
- )
359
- }
360
-
361
- // emit any "+--- project :" within the tree
362
- const parseSubProject = shavedOutput => {
363
- let obj = []
364
- for (let key in shavedOutput) {
365
- if (!shavedOutput[key].includes('project')) {
366
- obj.push(shavedOutput[key])
367
- }
368
- }
369
- return obj
370
- }
371
-
372
- const validateIndentation = shavedOutput => {
373
- let validatedTree = []
374
- shavedOutput.forEach((element, index) => {
375
- let nextNodeLevel
376
- let nodeLevel = computeRelationToLastElement(element)
377
- if (shavedOutput[index + 1] !== undefined) {
378
- nextNodeLevel = computeRelationToLastElement(shavedOutput[index + 1])
379
- }
380
- if (index === 0) {
381
- validatedTree.push(shavedOutput[index])
382
- validatedTree.push(shavedOutput[index + 1])
383
- } else if (nextNodeLevel > nodeLevel + 5) {
384
- return
385
- } else {
386
- validatedTree.push(shavedOutput[index + 1])
387
- }
388
- })
389
- validatedTree.pop()
390
- return validatedTree
391
- }
392
-
393
- const parseGradle = (gradleDependencyTreeOutput, config) => {
394
- let shavedOutput = shaveOutput(gradleDependencyTreeOutput)
395
-
396
- if (config.subProject) {
397
- let subProject = parseSubProject(shavedOutput)
398
- let validatedOutput = validateIndentation(subProject)
399
- return buildTree(validatedOutput)
400
- } else {
401
- let validatedOutput = validateIndentation(shavedOutput)
402
- return buildTree(validatedOutput)
403
- }
404
- }
405
-
406
- exports.shaveOutput = shaveOutput
407
- exports.validateIndentation = validateIndentation
408
- exports.stripElement = stripElement
409
- exports.getElementHeader = getElementHeader
410
- exports.createElement = createElement
411
- exports.parseGradle = parseGradle
412
- exports.computeRelationToLastElement = computeRelationToLastElement
413
- exports.hasChildren = hasChildren
414
- exports.lastChild = lastChild
415
- exports.calculateLevels = calculateLevels
416
- exports.buildElement = buildElement
417
- exports.checkVersion = checkVersion
418
- exports.computeIndentation = computeIndentation
419
- exports.computeLevel = computeLevel
420
- exports.addIndentation = addIndentation
@@ -1,141 +0,0 @@
1
- const child_process = require('child_process')
2
- const fs = require('fs')
3
- const i18n = require('i18n')
4
- const path = require('path')
5
-
6
- module.exports = exports = (
7
- { language: { projectFilePath }, java },
8
- next,
9
- config
10
- ) => {
11
- let cmdStdout
12
- let cwd
13
- let timeout
14
- let javaProject = ''
15
- let mvn_settings = ''
16
- const maven = 'Maven'
17
- const gradle = 'Gradle'
18
-
19
- try {
20
- if (projectFilePath.includes('pom.xml')) {
21
- javaProject = maven
22
- cwd = projectFilePath.replace('pom.xml', '')
23
- } else if (projectFilePath.includes('build.gradle')) {
24
- javaProject = gradle
25
- cwd = projectFilePath.replace('build.gradle', '')
26
- }
27
-
28
- // timeout is in milliseconds and 2.30 mintues was choses as when tested against
29
- // Spring-boot (https://github.com/spring-projects/spring-boot) a complex project that was the
30
- // average time for a first run when it had to download projects then build tree
31
- timeout = 960000
32
-
33
- // A sample of this output can be found
34
- // in the java test data/mvnCmdResults.text
35
- if (javaProject === maven) {
36
- // Allow users to provide a custom location for their settings.xml
37
- if (config.mavenSettingsPath) {
38
- mvn_settings = ' -s ' + config.mavenSettingsPath
39
- }
40
-
41
- if (config.betaUnifiedJavaParser) {
42
- cmdStdout = child_process.execSync(
43
- 'mvn dependency:tree -B' + mvn_settings,
44
- {
45
- cwd,
46
- timeout
47
- }
48
- )
49
- } else {
50
- cmdStdout = child_process.execSync(
51
- 'mvn dependency:tree -DoutputType=dot -B' + mvn_settings,
52
- {
53
- cwd,
54
- timeout
55
- }
56
- )
57
- }
58
- java.mvnDependancyTreeOutput = cmdStdout.toString()
59
- } else if (javaProject === gradle) {
60
- // path.sep is user here to either execute as "./gradlew" for UNIX/Linux/MacOS
61
- // & ".\gradlew" for Windows
62
- // Check if the user has specified a sub-project
63
- if (config.subProject) {
64
- cmdStdout = child_process.execSync(
65
- '.' +
66
- path.sep +
67
- 'gradlew :' +
68
- config.subProject +
69
- ':dependencies --configuration runtimeClasspath',
70
- {
71
- cwd,
72
- timeout
73
- }
74
- )
75
- } else {
76
- cmdStdout = child_process.execSync(
77
- '.' +
78
- path.sep +
79
- 'gradlew dependencies --configuration runtimeClasspath',
80
- {
81
- cwd,
82
- timeout
83
- }
84
- )
85
- }
86
- if (
87
- cmdStdout
88
- .toString()
89
- .includes(
90
- "runtimeClasspath - Runtime classpath of source set 'main'.\n" +
91
- 'No dependencies'
92
- )
93
- ) {
94
- cmdStdout = child_process.execSync(
95
- '.' + path.sep + 'gradlew dependencies',
96
- {
97
- cwd,
98
- timeout
99
- }
100
- )
101
- }
102
- java.mvnDependancyTreeOutput = cmdStdout.toString()
103
- }
104
- next()
105
- } catch (err) {
106
- if (javaProject === maven) {
107
- try {
108
- child_process.execSync('mvn --version', {
109
- cwd,
110
- timeout
111
- })
112
-
113
- next(
114
- new Error(
115
- i18n.__('mavenDependencyTreeNonZero', cwd, `${err.message}`)
116
- )
117
- )
118
- } catch (mvnErr) {
119
- next(
120
- new Error(i18n.__('mavenNotInstalledError', cwd, `${mvnErr.message}`))
121
- )
122
- }
123
- } else if (javaProject === gradle) {
124
- if (
125
- fs.existsSync(cwd + 'gradlew') ||
126
- fs.existsSync(cwd + 'gradlew.bat')
127
- ) {
128
- next(
129
- new Error(
130
- i18n.__('gradleDependencyTreeNonZero', cwd, `${err.message}`)
131
- )
132
- )
133
- } else {
134
- next(
135
- new Error(i18n.__('gradleWrapperUnavailable', cwd, `${err.message}`))
136
- )
137
- }
138
- }
139
- return
140
- }
141
- }
@@ -1,6 +0,0 @@
1
- module.exports = exports = ({ java }, next) => {
2
- // Remove anything sensitive or unnecessary from being sent to the backend as
3
- // a result of our Java project analysis
4
- delete java.mvnDependancyTreeOutput
5
- next()
6
- }
@@ -1,36 +0,0 @@
1
- const i18n = require('i18n')
2
- /**
3
- * Checks that the list of languages and files that has been reduced doesn't
4
- * contain more than one identified language.
5
- */
6
- module.exports = exports = (analysis, next) => {
7
- const { languageAnalysis } = analysis
8
- try {
9
- checkForMultipleIdentifiedLanguages(languageAnalysis.identifiedLanguages)
10
- } catch (err) {
11
- next(err)
12
- return
13
- }
14
- next()
15
- }
16
-
17
- const checkForMultipleIdentifiedLanguages = identifiedLanguages => {
18
- if (Object.keys(identifiedLanguages).length > 1) {
19
- // Handle the error case where multiple languages have been identified
20
- let errMsg = i18n.__('languageAnalysisMultipleLanguages1')
21
-
22
- for (const [language, { projectFilenames }] of Object.entries(
23
- identifiedLanguages
24
- )) {
25
- errMsg += `\t${language}: ${projectFilenames.join(', ')}\n`
26
- }
27
-
28
- errMsg += i18n.__('languageAnalysisMultipleLanguages2', "'project_path'")
29
-
30
- throw new Error(errMsg)
31
- }
32
- }
33
-
34
- //For testing purposes
35
- exports.checkForMultipleIdentifiedLanguages =
36
- checkForMultipleIdentifiedLanguages
@@ -1,42 +0,0 @@
1
- const i18n = require('i18n')
2
- /**
3
- * Checks that the list of languages and files that has been reduced doesn't
4
- * contain more than one project file for any identified language.
5
- */
6
- module.exports = exports = (analysis, next) => {
7
- const { languageAnalysis } = analysis
8
- try {
9
- checkForMultipleIdentifiedProjectFiles(languageAnalysis.identifiedLanguages)
10
- } catch (err) {
11
- next(err)
12
- return
13
- }
14
- next()
15
- }
16
-
17
- const checkForMultipleIdentifiedProjectFiles = identifiedLanguages => {
18
- // Handle the error case where only a single language has been identified...
19
- if (Object.keys(identifiedLanguages).length == 1) {
20
- let { projectFilenames } = Object.values(identifiedLanguages)[0]
21
-
22
- // ...but multiple project files for that language have been found
23
- if (projectFilenames.length > 1) {
24
- const [language] = Object.keys(identifiedLanguages)
25
- projectFilenames = projectFilenames.join(', ')
26
-
27
- // NOTE : Quotation marks for language needs to be added back in (this includes tests)
28
- throw new Error(
29
- i18n.__(
30
- 'languageAnalysisProjectFiles',
31
- language,
32
- projectFilenames,
33
- "'project_path'"
34
- )
35
- )
36
- }
37
- }
38
- }
39
-
40
- //For testing purposes
41
- exports.checkForMultipleIdentifiedProjectFiles =
42
- checkForMultipleIdentifiedProjectFiles
@@ -1,54 +0,0 @@
1
- const i18n = require('i18n')
2
-
3
- /**
4
- * Checks that a project has a lock file
5
- */
6
- module.exports = exports = (analysis, next) => {
7
- try {
8
- const { languageAnalysis } = analysis
9
- //.NET and NODE both need lock files. currently JAVA and GO do not
10
- // need a lock file so if lang is JAVA / GO just go to next
11
- if (
12
- Object.getOwnPropertyNames(languageAnalysis.identifiedLanguages)[0] ===
13
- 'JAVA' ||
14
- Object.getOwnPropertyNames(languageAnalysis.identifiedLanguages)[0] ===
15
- 'GO'
16
- ) {
17
- next()
18
- return
19
- }
20
- checkForLockFile(languageAnalysis.identifiedLanguages)
21
- } catch (err) {
22
- next(err)
23
- return
24
- }
25
- next()
26
- return
27
- }
28
-
29
- const checkForLockFile = identifiedLanguages => {
30
- // Handle the error case where only a single language has been identified...
31
- if (Object.keys(identifiedLanguages).length == 1) {
32
- let { lockFilenames } = Object.values(identifiedLanguages)[0]
33
-
34
- // ...but no lock files for that language have been found
35
- if (lockFilenames.length == 0) {
36
- const [language] = Object.keys(identifiedLanguages)
37
- throw new Error(i18n.__('languageAnalysisHasNoLockFile', language))
38
- }
39
-
40
- if (lockFilenames.length > 1) {
41
- const [language] = Object.keys(identifiedLanguages)
42
- throw new Error(
43
- i18n.__(
44
- 'languageAnalysisHasMultipleLockFiles',
45
- language,
46
- String(lockFilenames)
47
- )
48
- )
49
- }
50
- }
51
- }
52
-
53
- //For testing purposes
54
- exports.checkForLockFile = checkForLockFile