@contrast/contrast 1.0.8 → 1.0.11

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 (217) hide show
  1. package/README.md +2 -2
  2. package/dist/audit/languageAnalysisEngine/getProjectRootFilenames.js +16 -25
  3. package/dist/audit/languageAnalysisEngine/report/commonReportingFunctions.js +103 -57
  4. package/dist/audit/languageAnalysisEngine/report/models/reportGuidanceModel.js +6 -0
  5. package/dist/audit/languageAnalysisEngine/report/models/reportOutputModel.js +3 -3
  6. package/dist/audit/languageAnalysisEngine/report/models/severityCountModel.js +1 -0
  7. package/dist/audit/languageAnalysisEngine/report/reportingFeature.js +68 -17
  8. package/dist/audit/languageAnalysisEngine/report/utils/reportUtils.js +39 -7
  9. package/dist/audit/languageAnalysisEngine/sendSnapshot.js +6 -30
  10. package/dist/audit/save.js +21 -13
  11. package/dist/commands/audit/auditConfig.js +3 -19
  12. package/dist/commands/audit/auditController.js +1 -10
  13. package/dist/commands/audit/help.js +7 -24
  14. package/dist/commands/audit/processAudit.js +5 -9
  15. package/dist/commands/audit/saveFile.js +2 -2
  16. package/dist/commands/auth/auth.js +1 -1
  17. package/dist/commands/config/config.js +2 -2
  18. package/dist/commands/scan/processScan.js +11 -4
  19. package/dist/commands/scan/sca/scaAnalysis.js +37 -13
  20. package/dist/common/HTTPClient.js +17 -8
  21. package/dist/common/errorHandling.js +2 -2
  22. package/dist/common/fail.js +66 -0
  23. package/dist/common/versionChecker.js +1 -1
  24. package/dist/constants/constants.js +7 -2
  25. package/dist/constants/locales.js +40 -38
  26. package/dist/constants.js +62 -12
  27. package/dist/index.js +57 -45
  28. package/dist/lambda/lambda.js +5 -2
  29. package/dist/sbom/generateSbom.js +2 -2
  30. package/dist/scaAnalysis/common/formatMessage.js +7 -1
  31. package/dist/scaAnalysis/common/scaParserForGoAndJava.js +32 -0
  32. package/dist/scaAnalysis/common/treeUpload.js +24 -10
  33. package/dist/scaAnalysis/dotnet/analysis.js +55 -0
  34. package/dist/scaAnalysis/dotnet/index.js +10 -0
  35. package/dist/scaAnalysis/go/goAnalysis.js +8 -2
  36. package/dist/scaAnalysis/java/analysis.js +10 -6
  37. package/dist/scaAnalysis/java/index.js +7 -1
  38. package/dist/scaAnalysis/java/javaBuildDepsParser.js +19 -3
  39. package/dist/scaAnalysis/javascript/analysis.js +4 -7
  40. package/dist/scaAnalysis/javascript/index.js +16 -4
  41. package/dist/scaAnalysis/php/analysis.js +14 -33
  42. package/dist/scaAnalysis/php/index.js +11 -4
  43. package/dist/scaAnalysis/python/analysis.js +43 -5
  44. package/dist/scaAnalysis/python/index.js +7 -2
  45. package/dist/scaAnalysis/ruby/analysis.js +16 -14
  46. package/dist/scan/autoDetection.js +13 -24
  47. package/dist/scan/fileUtils.js +31 -12
  48. package/dist/scan/formatScanOutput.js +9 -8
  49. package/dist/scan/populateProjectIdAndProjectName.js +5 -0
  50. package/dist/scan/scan.js +4 -0
  51. package/dist/scan/scanConfig.js +5 -5
  52. package/dist/scan/scanResults.js +39 -3
  53. package/dist/telemetry/telemetry.js +137 -0
  54. package/dist/utils/commonApi.js +1 -1
  55. package/dist/utils/getConfig.js +3 -8
  56. package/dist/utils/parsedCLIOptions.js +3 -1
  57. package/dist/utils/requestUtils.js +7 -1
  58. package/package.json +2 -3
  59. package/src/audit/languageAnalysisEngine/getProjectRootFilenames.js +21 -57
  60. package/src/audit/languageAnalysisEngine/report/commonReportingFunctions.ts +155 -77
  61. package/src/audit/languageAnalysisEngine/report/models/reportGuidanceModel.ts +5 -0
  62. package/src/audit/languageAnalysisEngine/report/models/reportOutputModel.ts +5 -5
  63. package/src/audit/languageAnalysisEngine/report/models/severityCountModel.ts +2 -0
  64. package/src/audit/languageAnalysisEngine/report/reportingFeature.ts +56 -27
  65. package/src/audit/languageAnalysisEngine/report/utils/reportUtils.ts +45 -6
  66. package/src/audit/languageAnalysisEngine/sendSnapshot.js +6 -32
  67. package/src/audit/save.js +32 -16
  68. package/src/commands/audit/auditConfig.ts +10 -28
  69. package/src/commands/audit/auditController.ts +0 -11
  70. package/src/commands/audit/help.ts +7 -24
  71. package/src/commands/audit/processAudit.ts +16 -8
  72. package/src/commands/audit/saveFile.ts +2 -2
  73. package/src/commands/auth/auth.js +3 -1
  74. package/src/commands/config/config.js +4 -2
  75. package/src/commands/scan/processScan.js +18 -5
  76. package/src/commands/scan/sca/scaAnalysis.js +50 -18
  77. package/src/common/HTTPClient.js +23 -9
  78. package/src/common/errorHandling.ts +2 -3
  79. package/src/common/fail.js +75 -0
  80. package/src/common/versionChecker.ts +1 -1
  81. package/src/constants/constants.js +9 -3
  82. package/src/constants/locales.js +70 -45
  83. package/src/constants.js +67 -13
  84. package/src/index.ts +91 -66
  85. package/src/lambda/lambda.ts +5 -2
  86. package/src/lambda/types.ts +1 -0
  87. package/src/sbom/generateSbom.ts +2 -2
  88. package/src/scaAnalysis/common/formatMessage.js +8 -1
  89. package/src/scaAnalysis/common/scaParserForGoAndJava.js +41 -0
  90. package/src/scaAnalysis/common/treeUpload.js +25 -11
  91. package/src/scaAnalysis/dotnet/analysis.js +72 -0
  92. package/src/scaAnalysis/dotnet/index.js +11 -0
  93. package/src/scaAnalysis/go/goAnalysis.js +9 -2
  94. package/src/scaAnalysis/java/analysis.js +11 -6
  95. package/src/scaAnalysis/java/index.js +9 -1
  96. package/src/scaAnalysis/java/javaBuildDepsParser.js +25 -6
  97. package/src/scaAnalysis/javascript/analysis.js +6 -7
  98. package/src/scaAnalysis/javascript/index.js +25 -6
  99. package/src/scaAnalysis/php/analysis.js +15 -35
  100. package/src/scaAnalysis/php/index.js +15 -4
  101. package/src/scaAnalysis/python/analysis.js +49 -5
  102. package/src/scaAnalysis/python/index.js +7 -2
  103. package/src/scaAnalysis/ruby/analysis.js +18 -15
  104. package/src/scan/autoDetection.js +14 -27
  105. package/src/scan/fileUtils.js +33 -12
  106. package/src/scan/formatScanOutput.ts +10 -8
  107. package/src/scan/populateProjectIdAndProjectName.js +5 -1
  108. package/src/scan/scan.ts +4 -0
  109. package/src/scan/scanConfig.js +7 -7
  110. package/src/scan/scanResults.js +46 -3
  111. package/src/telemetry/telemetry.ts +154 -0
  112. package/src/utils/commonApi.js +1 -1
  113. package/src/utils/getConfig.ts +5 -18
  114. package/src/utils/parsedCLIOptions.js +14 -1
  115. package/src/utils/requestUtils.js +8 -1
  116. package/dist/audit/AnalysisEngine.js +0 -37
  117. package/dist/audit/autodetection/autoDetectLanguage.js +0 -32
  118. package/dist/audit/dotnetAnalysisEngine/index.js +0 -25
  119. package/dist/audit/dotnetAnalysisEngine/parseLockFileContents.js +0 -35
  120. package/dist/audit/dotnetAnalysisEngine/parseProjectFileContents.js +0 -15
  121. package/dist/audit/dotnetAnalysisEngine/readLockFileContents.js +0 -18
  122. package/dist/audit/dotnetAnalysisEngine/readProjectFileContents.js +0 -14
  123. package/dist/audit/dotnetAnalysisEngine/sanitizer.js +0 -9
  124. package/dist/audit/goAnalysisEngine/index.js +0 -17
  125. package/dist/audit/goAnalysisEngine/parseProjectFileContents.js +0 -164
  126. package/dist/audit/goAnalysisEngine/readProjectFileContents.js +0 -21
  127. package/dist/audit/goAnalysisEngine/sanitizer.js +0 -5
  128. package/dist/audit/javaAnalysisEngine/index.js +0 -34
  129. package/dist/audit/javaAnalysisEngine/parseMavenProjectFileContents.js +0 -155
  130. package/dist/audit/javaAnalysisEngine/parseProjectFileContents.js +0 -353
  131. package/dist/audit/javaAnalysisEngine/readProjectFileContents.js +0 -98
  132. package/dist/audit/javaAnalysisEngine/sanitizer.js +0 -5
  133. package/dist/audit/languageAnalysisEngine/checkForMultipleIdentifiedLanguages.js +0 -25
  134. package/dist/audit/languageAnalysisEngine/checkForMultipleIdentifiedProjectFiles.js +0 -25
  135. package/dist/audit/languageAnalysisEngine/checkIdentifiedLanguageHasLockFile.js +0 -35
  136. package/dist/audit/languageAnalysisEngine/checkIdentifiedLanguageHasProjectFile.js +0 -24
  137. package/dist/audit/languageAnalysisEngine/constants.js +0 -20
  138. package/dist/audit/languageAnalysisEngine/getIdentifiedLanguageInfo.js +0 -25
  139. package/dist/audit/languageAnalysisEngine/index.js +0 -39
  140. package/dist/audit/languageAnalysisEngine/languageAnalysisFactory.js +0 -66
  141. package/dist/audit/languageAnalysisEngine/reduceIdentifiedLanguages.js +0 -166
  142. package/dist/audit/nodeAnalysisEngine/handleNPMLockFileV2.js +0 -40
  143. package/dist/audit/nodeAnalysisEngine/index.js +0 -31
  144. package/dist/audit/nodeAnalysisEngine/parseNPMLockFileContents.js +0 -18
  145. package/dist/audit/nodeAnalysisEngine/parseYarnLockFileContents.js +0 -18
  146. package/dist/audit/nodeAnalysisEngine/readNPMLockFileContents.js +0 -17
  147. package/dist/audit/nodeAnalysisEngine/readProjectFileContents.js +0 -14
  148. package/dist/audit/nodeAnalysisEngine/readYarnLockFileContents.js +0 -24
  149. package/dist/audit/nodeAnalysisEngine/sanitizer.js +0 -9
  150. package/dist/audit/phpAnalysisEngine/index.js +0 -23
  151. package/dist/audit/phpAnalysisEngine/parseLockFileContents.js +0 -52
  152. package/dist/audit/phpAnalysisEngine/readLockFileContents.js +0 -13
  153. package/dist/audit/phpAnalysisEngine/readProjectFileContents.js +0 -16
  154. package/dist/audit/phpAnalysisEngine/sanitizer.js +0 -5
  155. package/dist/audit/pythonAnalysisEngine/index.js +0 -25
  156. package/dist/audit/pythonAnalysisEngine/parsePipfileLockContents.js +0 -17
  157. package/dist/audit/pythonAnalysisEngine/parseProjectFileContents.js +0 -21
  158. package/dist/audit/pythonAnalysisEngine/readPipfileLockFileContents.js +0 -13
  159. package/dist/audit/pythonAnalysisEngine/readPythonProjectFileContents.js +0 -14
  160. package/dist/audit/pythonAnalysisEngine/sanitizer.js +0 -7
  161. package/dist/audit/rubyAnalysisEngine/index.js +0 -25
  162. package/dist/audit/rubyAnalysisEngine/parseGemfileLockContents.js +0 -176
  163. package/dist/audit/rubyAnalysisEngine/parsedGemfile.js +0 -22
  164. package/dist/audit/rubyAnalysisEngine/readGemfileContents.js +0 -14
  165. package/dist/audit/rubyAnalysisEngine/readGemfileLockContents.js +0 -14
  166. package/dist/audit/rubyAnalysisEngine/sanitizer.js +0 -6
  167. package/src/audit/AnalysisEngine.js +0 -103
  168. package/src/audit/autodetection/autoDetectLanguage.ts +0 -40
  169. package/src/audit/dotnetAnalysisEngine/index.js +0 -26
  170. package/src/audit/dotnetAnalysisEngine/parseLockFileContents.js +0 -47
  171. package/src/audit/dotnetAnalysisEngine/parseProjectFileContents.js +0 -29
  172. package/src/audit/dotnetAnalysisEngine/readLockFileContents.js +0 -30
  173. package/src/audit/dotnetAnalysisEngine/readProjectFileContents.js +0 -26
  174. package/src/audit/dotnetAnalysisEngine/sanitizer.js +0 -11
  175. package/src/audit/goAnalysisEngine/index.js +0 -18
  176. package/src/audit/goAnalysisEngine/parseProjectFileContents.js +0 -209
  177. package/src/audit/goAnalysisEngine/readProjectFileContents.js +0 -31
  178. package/src/audit/goAnalysisEngine/sanitizer.js +0 -7
  179. package/src/audit/javaAnalysisEngine/index.js +0 -41
  180. package/src/audit/javaAnalysisEngine/parseMavenProjectFileContents.js +0 -225
  181. package/src/audit/javaAnalysisEngine/parseProjectFileContents.js +0 -420
  182. package/src/audit/javaAnalysisEngine/readProjectFileContents.js +0 -141
  183. package/src/audit/javaAnalysisEngine/sanitizer.js +0 -6
  184. package/src/audit/languageAnalysisEngine/checkForMultipleIdentifiedLanguages.js +0 -36
  185. package/src/audit/languageAnalysisEngine/checkForMultipleIdentifiedProjectFiles.js +0 -42
  186. package/src/audit/languageAnalysisEngine/checkIdentifiedLanguageHasLockFile.js +0 -54
  187. package/src/audit/languageAnalysisEngine/checkIdentifiedLanguageHasProjectFile.js +0 -33
  188. package/src/audit/languageAnalysisEngine/constants.js +0 -23
  189. package/src/audit/languageAnalysisEngine/getIdentifiedLanguageInfo.js +0 -41
  190. package/src/audit/languageAnalysisEngine/index.js +0 -45
  191. package/src/audit/languageAnalysisEngine/languageAnalysisFactory.js +0 -96
  192. package/src/audit/languageAnalysisEngine/reduceIdentifiedLanguages.js +0 -251
  193. package/src/audit/nodeAnalysisEngine/handleNPMLockFileV2.js +0 -49
  194. package/src/audit/nodeAnalysisEngine/index.js +0 -35
  195. package/src/audit/nodeAnalysisEngine/parseNPMLockFileContents.js +0 -20
  196. package/src/audit/nodeAnalysisEngine/parseYarnLockFileContents.js +0 -26
  197. package/src/audit/nodeAnalysisEngine/readNPMLockFileContents.js +0 -23
  198. package/src/audit/nodeAnalysisEngine/readProjectFileContents.js +0 -27
  199. package/src/audit/nodeAnalysisEngine/readYarnLockFileContents.js +0 -36
  200. package/src/audit/nodeAnalysisEngine/sanitizer.js +0 -11
  201. package/src/audit/phpAnalysisEngine/index.js +0 -27
  202. package/src/audit/phpAnalysisEngine/parseLockFileContents.js +0 -60
  203. package/src/audit/phpAnalysisEngine/readLockFileContents.js +0 -14
  204. package/src/audit/phpAnalysisEngine/readProjectFileContents.js +0 -25
  205. package/src/audit/phpAnalysisEngine/sanitizer.js +0 -4
  206. package/src/audit/pythonAnalysisEngine/index.js +0 -55
  207. package/src/audit/pythonAnalysisEngine/parsePipfileLockContents.js +0 -23
  208. package/src/audit/pythonAnalysisEngine/parseProjectFileContents.js +0 -33
  209. package/src/audit/pythonAnalysisEngine/readPipfileLockFileContents.js +0 -16
  210. package/src/audit/pythonAnalysisEngine/readPythonProjectFileContents.js +0 -22
  211. package/src/audit/pythonAnalysisEngine/sanitizer.js +0 -9
  212. package/src/audit/rubyAnalysisEngine/index.js +0 -30
  213. package/src/audit/rubyAnalysisEngine/parseGemfileLockContents.js +0 -215
  214. package/src/audit/rubyAnalysisEngine/parsedGemfile.js +0 -39
  215. package/src/audit/rubyAnalysisEngine/readGemfileContents.js +0 -18
  216. package/src/audit/rubyAnalysisEngine/readGemfileLockContents.js +0 -17
  217. package/src/audit/rubyAnalysisEngine/sanitizer.js +0 -8
@@ -1,29 +1,43 @@
1
- const { getHttpClient } = require('../../utils/commonApi')
1
+ const commonApi = require('../../utils/commonApi')
2
2
  const { APP_VERSION } = require('../../constants/constants')
3
3
 
4
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)
5
+ let requestBody = {}
6
+ config.experimental === true
7
+ ? (requestBody = sendToSCAServices(config, analysis))
8
+ : (requestBody = {
9
+ appID: config.applicationId,
10
+ cliVersion: APP_VERSION,
11
+ snapshot: analysis
12
+ })
13
+ const client = commonApi.getHttpClient(config)
12
14
  return client
13
15
  .sendSnapshot(requestBody, config)
14
16
  .then(res => {
15
17
  if (res.statusCode === 201) {
16
18
  return res.body
17
19
  } else {
18
- console.log(res.statusCode)
19
- console.log('error processing dependencies')
20
+ throw new Error(res.statusCode + ` error processing dependencies`)
20
21
  }
21
22
  })
22
23
  .catch(err => {
23
- console.log(err)
24
+ throw err
24
25
  })
25
26
  }
26
27
 
28
+ const sendToSCAServices = (config, analysis) => {
29
+ return {
30
+ applicationId: config.applicationId,
31
+ dependencyTree: analysis,
32
+ organizationId: config.organizationId,
33
+ language: config.language,
34
+ tool: {
35
+ name: 'Contrast Codesec',
36
+ version: APP_VERSION
37
+ }
38
+ }
39
+ }
40
+
27
41
  module.exports = {
28
42
  commonSendSnapShot
29
43
  }
@@ -0,0 +1,72 @@
1
+ const fs = require('fs')
2
+ const xml2js = require('xml2js')
3
+ const i18n = require('i18n')
4
+
5
+ const readAndParseProjectFile = projectFilePath => {
6
+ const projectFile = fs.readFileSync(projectFilePath)
7
+
8
+ return new xml2js.Parser({
9
+ explicitArray: false,
10
+ mergeAttrs: true
11
+ }).parseString(projectFile)
12
+ }
13
+
14
+ const readAndParseLockFile = lockFilePath => {
15
+ const lockFile = JSON.parse(fs.readFileSync(lockFilePath).toString())
16
+
17
+ let count = 0 // Used to test if some nodes are deleted
18
+
19
+ for (const dependenciesNode in lockFile.dependencies) {
20
+ for (const innerNode in lockFile.dependencies[dependenciesNode]) {
21
+ const nodeValidation = JSON.stringify(
22
+ lockFile.dependencies[dependenciesNode][innerNode]
23
+ )
24
+ if (nodeValidation.includes('"type":"Project"')) {
25
+ count += 1
26
+ delete lockFile.dependencies[dependenciesNode][innerNode]
27
+ lockFile.additionalInfo = 'dependenciesNote'
28
+ }
29
+ }
30
+ }
31
+
32
+ if (count > 0) {
33
+ const multiLevelProjectWarning = () => {
34
+ console.log('')
35
+ console.log(i18n.__('dependenciesNote'))
36
+ }
37
+ setTimeout(multiLevelProjectWarning, 7000)
38
+ }
39
+
40
+ return lockFile
41
+ }
42
+
43
+ const checkForCorrectFiles = languageFiles => {
44
+ if (!languageFiles.includes('packages.lock.json')) {
45
+ throw new Error(i18n.__('languageAnalysisHasNoLockFile', '.NET'))
46
+ }
47
+
48
+ if (!languageFiles.some(i => i.includes('.csproj'))) {
49
+ throw new Error(i18n.__('languageAnalysisProjectFileError', '.NET'))
50
+ }
51
+ }
52
+
53
+ const getDotNetDeps = (filePath, languageFiles) => {
54
+ checkForCorrectFiles(languageFiles)
55
+ const projectFileName = languageFiles.find(fileName =>
56
+ fileName.includes('.csproj')
57
+ )
58
+ const lockFileName = languageFiles.find(fileName =>
59
+ fileName.includes('.json')
60
+ )
61
+ const projectFile = readAndParseProjectFile(filePath + `/${projectFileName}`)
62
+ const lockFile = readAndParseLockFile(filePath + `/${lockFileName}`)
63
+
64
+ return { projectFile, lockFile }
65
+ }
66
+
67
+ module.exports = {
68
+ getDotNetDeps,
69
+ readAndParseProjectFile,
70
+ readAndParseLockFile,
71
+ checkForCorrectFiles
72
+ }
@@ -0,0 +1,11 @@
1
+ const { getDotNetDeps } = require('./analysis')
2
+ const { createDotNetTSMessage } = require('../common/formatMessage')
3
+
4
+ const dotNetAnalysis = (config, languageFiles) => {
5
+ const dotNetDeps = getDotNetDeps(config.file, languageFiles.DOTNET)
6
+ return createDotNetTSMessage(dotNetDeps)
7
+ }
8
+
9
+ module.exports = {
10
+ dotNetAnalysis
11
+ }
@@ -1,14 +1,21 @@
1
1
  const { createGoTSMessage } = require('../common/formatMessage')
2
+ const {
3
+ parseDependenciesForSCAServices
4
+ } = require('../common/scaParserForGoAndJava')
2
5
  const goReadDepFile = require('./goReadDepFile')
3
6
  const goParseDeps = require('./goParseDeps')
4
7
 
5
- const goAnalysis = (config, languageFiles) => {
8
+ const goAnalysis = config => {
6
9
  try {
7
10
  const rawGoDependencies = goReadDepFile.getGoDependencies(config)
8
11
  const parsedGoDependencies =
9
12
  goParseDeps.parseGoDependencies(rawGoDependencies)
10
13
 
11
- return createGoTSMessage(parsedGoDependencies)
14
+ if (config.experimental) {
15
+ return parseDependenciesForSCAServices(parsedGoDependencies)
16
+ } else {
17
+ return createGoTSMessage(parsedGoDependencies)
18
+ }
12
19
  } catch (e) {
13
20
  console.log(e.message.toString())
14
21
  }
@@ -6,9 +6,13 @@ const fs = require('fs')
6
6
  const MAVEN = 'maven'
7
7
  const GRADLE = 'gradle'
8
8
 
9
- const determineProjectTypeAndCwd = (files, file) => {
9
+ const determineProjectTypeAndCwd = (files, config) => {
10
10
  const projectData = {}
11
11
 
12
+ if (files.length > 1) {
13
+ files = files.filter(i => config.fileName.includes(i))
14
+ }
15
+
12
16
  if (files[0].includes('pom.xml')) {
13
17
  projectData.projectType = MAVEN
14
18
  } else if (files[0].includes('build.gradle')) {
@@ -16,9 +20,9 @@ const determineProjectTypeAndCwd = (files, file) => {
16
20
  }
17
21
 
18
22
  //clean up the path to be a folder not a file
19
- projectData.cwd = file
20
- ? file.replace('pom.xml', '').replace('build.gradle', '')
21
- : file
23
+ projectData.cwd = config.file
24
+ ? config.file.replace('pom.xml', '').replace('build.gradle', '')
25
+ : config.file
22
26
 
23
27
  return projectData
24
28
  }
@@ -124,7 +128,7 @@ const getJavaBuildDeps = (config, files) => {
124
128
  }
125
129
 
126
130
  try {
127
- const projectData = determineProjectTypeAndCwd(files, config.file)
131
+ const projectData = determineProjectTypeAndCwd(files, config)
128
132
  if (projectData.projectType === MAVEN) {
129
133
  output.mvnDependancyTreeOutput = buildMaven(config, projectData, timeout)
130
134
  } else if (projectData.projectType === GRADLE) {
@@ -138,5 +142,6 @@ const getJavaBuildDeps = (config, files) => {
138
142
  }
139
143
 
140
144
  module.exports = {
141
- getJavaBuildDeps
145
+ getJavaBuildDeps,
146
+ determineProjectTypeAndCwd
142
147
  }
@@ -1,6 +1,9 @@
1
1
  const analysis = require('./analysis')
2
2
  const { parseBuildDeps } = require('./javaBuildDepsParser')
3
3
  const { createJavaTSMessage } = require('../common/formatMessage')
4
+ const {
5
+ parseDependenciesForSCAServices
6
+ } = require('../common/scaParserForGoAndJava')
4
7
 
5
8
  const javaAnalysis = (config, languageFiles) => {
6
9
  languageFiles.JAVA.forEach(file => {
@@ -8,7 +11,12 @@ const javaAnalysis = (config, languageFiles) => {
8
11
  })
9
12
 
10
13
  const javaDeps = buildJavaTree(config, languageFiles.JAVA)
11
- return createJavaTSMessage(javaDeps)
14
+
15
+ if (config.experimental) {
16
+ return parseDependenciesForSCAServices(javaDeps)
17
+ } else {
18
+ return createJavaTSMessage(javaDeps)
19
+ }
12
20
  }
13
21
 
14
22
  const buildJavaTree = (config, files) => {
@@ -14,14 +14,14 @@ const parseBuildDeps = (config, input) => {
14
14
  const preParser = shavedOutput => {
15
15
  let obj = []
16
16
  for (let dep in shavedOutput) {
17
+ shavedOutput[dep] = shaveDependencyType(shavedOutput[dep])
18
+
17
19
  obj.push(
18
20
  shavedOutput[dep]
19
21
  .replace('+-', '+---')
20
22
  .replace('[INFO]', '')
21
23
  .replace('\\-', '\\---')
22
24
  .replace(':jar:', ':')
23
- .replace(':test', '')
24
- .replace(':compile', '')
25
25
  .replace(' +', '+')
26
26
  .replace(' |', '|')
27
27
  .replace(' \\', '\\')
@@ -56,11 +56,29 @@ const preParser = shavedOutput => {
56
56
  return depTree
57
57
  }
58
58
 
59
+ const shaveDependencyType = dep => {
60
+ if (dep.endsWith('\r')) {
61
+ dep = dep.slice(0, -1)
62
+ }
63
+
64
+ if (dep.endsWith(':test')) {
65
+ dep = dep.slice(0, -5)
66
+ }
67
+
68
+ if (dep.endsWith(':compile')) {
69
+ dep = dep.slice(0, -8)
70
+ }
71
+
72
+ if (dep.endsWith(':provided')) {
73
+ dep = dep.slice(0, -9)
74
+ }
75
+
76
+ return dep
77
+ }
78
+
59
79
  const shaveOutput = (gradleDependencyTreeOutput, projectType) => {
60
80
  let shavedOutput = gradleDependencyTreeOutput.split('\n')
61
81
 
62
- // console.log(projectType)
63
-
64
82
  if (projectType === 'maven') {
65
83
  shavedOutput = preParser(shavedOutput)
66
84
  }
@@ -375,7 +393,6 @@ const validateIndentation = shavedOutput => {
375
393
 
376
394
  const parseGradle = (gradleDependencyTreeOutput, config, projectType) => {
377
395
  let shavedOutput = shaveOutput(gradleDependencyTreeOutput, projectType)
378
-
379
396
  if (config.subProject) {
380
397
  let subProject = parseSubProject(shavedOutput)
381
398
  let validatedOutput = validateIndentation(subProject)
@@ -400,5 +417,7 @@ module.exports = {
400
417
  computeRelationToLastElement,
401
418
  addIndentation,
402
419
  computeLevel,
403
- computeIndentation
420
+ computeIndentation,
421
+ shaveDependencyType,
422
+ preParser
404
423
  }
@@ -12,7 +12,7 @@ const readFile = async (config, languageFiles, nameOfFile) => {
12
12
  if (config.file) {
13
13
  return fs.readFileSync(config.file.concat(languageFiles[index]), 'utf8')
14
14
  } else {
15
- console.log('could not find file')
15
+ throw new Error('could not find file')
16
16
  }
17
17
  }
18
18
 
@@ -40,8 +40,7 @@ const readYarn = async (config, languageFiles, nameOfFile) => {
40
40
 
41
41
  return yarn
42
42
  } catch (err) {
43
- console.log(i18n.__('nodeReadYarnLockFileError') + `${err.message}`)
44
- return
43
+ throw new Error(i18n.__('nodeReadYarnLockFileError') + `${err.message}`)
45
44
  }
46
45
  }
47
46
 
@@ -80,8 +79,7 @@ const parseNpmLockFile = async js => {
80
79
  return js.npmLockFile
81
80
  }
82
81
  } catch (err) {
83
- console.log(i18n.__('NodeParseNPM') + `${err.message}`)
84
- return
82
+ throw new Error(i18n.__('NodeParseNPM') + `${err.message}`)
85
83
  }
86
84
  }
87
85
 
@@ -113,8 +111,9 @@ const parseYarnLockFile = async js => {
113
111
  return js
114
112
  }
115
113
  } catch (err) {
116
- console.log(i18n.__('NodeParseYarn') + `${err.message}`)
117
- return
114
+ throw new Error(
115
+ i18n.__('NodeParseYarn', js.yarn.yarnVersion) + `${err.message}`
116
+ )
118
117
  }
119
118
  }
120
119
 
@@ -3,12 +3,10 @@ const i18n = require('i18n')
3
3
  const formatMessage = require('../common/formatMessage')
4
4
 
5
5
  const jsAnalysis = async (config, languageFiles) => {
6
- if (
7
- languageFiles.JAVASCRIPT.includes('package-lock.json') &&
8
- languageFiles.JAVASCRIPT.includes('yarn.lock')
9
- ) {
10
- console.log(i18n.__('languageAnalysisMultipleLanguages1'))
11
- return
6
+ checkForCorrectFiles(languageFiles)
7
+
8
+ if (!config.file.endsWith('/')) {
9
+ config.file = config.file.concat('/')
12
10
  }
13
11
  return buildNodeTree(config, languageFiles.JAVASCRIPT)
14
12
  }
@@ -51,6 +49,27 @@ const parseFiles = async (config, files, js) => {
51
49
  return js
52
50
  }
53
51
 
52
+ const checkForCorrectFiles = languageFiles => {
53
+ if (
54
+ languageFiles.JAVASCRIPT.includes('package-lock.json') &&
55
+ languageFiles.JAVASCRIPT.includes('yarn.lock')
56
+ ) {
57
+ throw new Error(
58
+ i18n.__('languageAnalysisHasMultipleLockFiles', 'javascript')
59
+ )
60
+ }
61
+
62
+ if (
63
+ !languageFiles.JAVASCRIPT.includes('package-lock.json') &&
64
+ !languageFiles.JAVASCRIPT.includes('yarn.lock')
65
+ ) {
66
+ throw new Error(i18n.__('languageAnalysisHasNoLockFile', 'javascript'))
67
+ }
68
+
69
+ if (!languageFiles.JAVASCRIPT.includes('package.json')) {
70
+ throw new Error(i18n.__('languageAnalysisHasNoPackageJsonFile'))
71
+ }
72
+ }
54
73
  module.exports = {
55
74
  jsAnalysis
56
75
  }
@@ -2,24 +2,24 @@ const fs = require('fs')
2
2
  const i18n = require('i18n')
3
3
  const _ = require('lodash')
4
4
 
5
- let php = {}
5
+ const readFile = (config, nameOfFile) => {
6
+ if (config.file) {
7
+ try {
8
+ return fs.readFileSync(config.file + '/' + nameOfFile)
9
+ } catch (error) {
10
+ console.log('Unable to find file')
11
+ console.log(error)
12
+ }
13
+ }
14
+ }
6
15
 
7
- const readProjectFile = (projectPath, customFile) => {
8
- const filePath = filePathForWindows(projectPath + customFile)
16
+ const parseProjectFiles = php => {
9
17
  try {
10
- php.composerJSON = JSON.parse(fs.readFileSync(filePath, 'utf8')) //wrong here
18
+ // composer.json
11
19
  php.composerJSON.dependencies = php.composerJSON.require
12
20
  php.composerJSON.devDependencies = php.composerJSON['require-dev']
13
- return php
14
- } catch (err) {
15
- console.log(err.message.toString())
16
- }
17
- }
18
21
 
19
- const readAndParseLockFile = (projectPath, customFile) => {
20
- const filePath = filePathForWindows(projectPath + customFile)
21
- try {
22
- php.rawLockFileContents = JSON.parse(fs.readFileSync(filePath, 'utf8'))
22
+ // composer.lock
23
23
  php.lockFile = php.rawLockFileContents
24
24
  let packages = _.keyBy(php.lockFile.packages, 'name')
25
25
  let packagesDev = _.keyBy(php.lockFile['packages-dev'], 'name')
@@ -54,25 +54,6 @@ const readAndParseLockFile = (projectPath, customFile) => {
54
54
  }
55
55
  }
56
56
 
57
- const getPhpDeps = (config, files) => {
58
- try {
59
- return (
60
- readProjectFile(config.file, files[0].projectFilename),
61
- readAndParseLockFile(config.file, files[1].lockFilename)
62
- )
63
- } catch (err) {
64
- console.log(err.message.toString())
65
- process.exit(1)
66
- }
67
- }
68
-
69
- const filePathForWindows = path => {
70
- if (process.platform === 'win32') {
71
- path = path.replace(/\//g, '\\')
72
- }
73
- return path
74
- }
75
-
76
57
  function addChildDepToLockFileAsOwnObj(php, depObj, key) {
77
58
  php.lockFile.dependencies[key] = { version: depObj[key] }
78
59
  }
@@ -92,7 +73,6 @@ function formatParentDepToLockFile(php) {
92
73
  }
93
74
 
94
75
  module.exports = {
95
- getPhpDeps,
96
- readAndParseLockFile,
97
- readProjectFile
76
+ parseProjectFiles,
77
+ readFile
98
78
  }
@@ -1,9 +1,20 @@
1
- const { getPhpDeps } = require('./analysis')
1
+ const { readFile, parseProjectFiles } = require('./analysis')
2
2
  const { createPhpTSMessage } = require('../common/formatMessage')
3
3
 
4
- const phpAnalysis = (config, languageFiles) => {
5
- const phpDeps = getPhpDeps(config, languageFiles.PHP)
6
- return createPhpTSMessage(phpDeps)
4
+ const phpAnalysis = (config, files) => {
5
+ let analysis = readFiles(config, files.PHP)
6
+ const phpDep = parseProjectFiles(analysis)
7
+ return createPhpTSMessage(phpDep)
8
+ }
9
+
10
+ const readFiles = (config, files) => {
11
+ let php = {}
12
+
13
+ php.composerJSON = JSON.parse(readFile(config, 'composer.json'))
14
+
15
+ php.rawLockFileContents = JSON.parse(readFile(config, 'composer.lock'))
16
+
17
+ return php
7
18
  }
8
19
 
9
20
  module.exports = {
@@ -1,5 +1,6 @@
1
1
  const multiReplace = require('string-multiple-replace')
2
2
  const fs = require('fs')
3
+ const i18n = require('i18n')
3
4
 
4
5
  const readAndParseProjectFile = file => {
5
6
  const filePath = filePathForWindows(file + '/Pipfile')
@@ -23,12 +24,52 @@ const readAndParseLockFile = file => {
23
24
  return parsedPipLock
24
25
  }
25
26
 
26
- const getPythonDeps = config => {
27
+ const readLockFile = file => {
28
+ const filePath = filePathForWindows(file + '/Pipfile.lock')
29
+ const lockFile = fs.readFileSync(filePath, 'utf8')
30
+ let parsedPipLock = JSON.parse(lockFile)
31
+ return parsedPipLock['default']
32
+ }
33
+
34
+ const scaPythonParser = pythonDependencies => {
35
+ let pythonParsedDeps = {}
36
+ for (let key in pythonDependencies) {
37
+ pythonParsedDeps[key] = {}
38
+ pythonParsedDeps[key].version = pythonDependencies[key].version.replace(
39
+ '==',
40
+ ''
41
+ )
42
+ pythonParsedDeps[key].group = null
43
+ pythonParsedDeps[key].name = key
44
+ pythonParsedDeps[key].isProduction = true
45
+ pythonParsedDeps[key].dependencies = []
46
+ pythonParsedDeps[key].directDependency = true
47
+ }
48
+ return pythonParsedDeps
49
+ }
50
+
51
+ const checkForCorrectFiles = languageFiles => {
52
+ if (!languageFiles.includes('Pipfile.lock')) {
53
+ throw new Error(i18n.__('languageAnalysisHasNoLockFile', 'python'))
54
+ }
55
+
56
+ if (!languageFiles.includes('Pipfile')) {
57
+ throw new Error(i18n.__('languageAnalysisProjectFileError', 'python'))
58
+ }
59
+ }
60
+
61
+ const getPythonDeps = (config, languageFiles) => {
27
62
  try {
28
- const parseProject = readAndParseProjectFile(config.file)
29
- const parsePip = readAndParseLockFile(config.file)
63
+ if (config.experimental) {
64
+ let pythonLockFileContents = readLockFile(config.file)
65
+ return scaPythonParser(pythonLockFileContents)
66
+ } else {
67
+ checkForCorrectFiles(languageFiles)
68
+ const parseProject = readAndParseProjectFile(config.file)
69
+ const parsePip = readAndParseLockFile(config.file)
30
70
 
31
- return { pipfileLock: parsePip, pipfilDependanceies: parseProject }
71
+ return { pipfileLock: parsePip, pipfilDependanceies: parseProject }
72
+ }
32
73
  } catch (err) {
33
74
  console.log(err.message.toString())
34
75
  process.exit(1)
@@ -44,6 +85,9 @@ const filePathForWindows = path => {
44
85
 
45
86
  module.exports = {
46
87
  getPythonDeps,
88
+ scaPythonParser,
89
+ readAndParseLockFile,
47
90
  readAndParseProjectFile,
48
- readAndParseLockFile
91
+ checkForCorrectFiles,
92
+ readLockFile
49
93
  }
@@ -1,9 +1,14 @@
1
1
  const { createPythonTSMessage } = require('../common/formatMessage')
2
- const { getPythonDeps } = require('./analysis')
2
+ const { getPythonDeps, secondaryParser } = require('./analysis')
3
3
 
4
4
  const pythonAnalysis = (config, languageFiles) => {
5
5
  const pythonDeps = getPythonDeps(config, languageFiles.PYTHON)
6
- return createPythonTSMessage(pythonDeps)
6
+
7
+ if (config.experimental) {
8
+ return pythonDeps
9
+ } else {
10
+ return createPythonTSMessage(pythonDeps)
11
+ }
7
12
  }
8
13
 
9
14
  module.exports = {
@@ -1,8 +1,8 @@
1
1
  const fs = require('fs')
2
+ const i18n = require('i18n')
2
3
 
3
4
  const readAndParseGemfile = file => {
4
- const fileName = filePathForWindows(file + '/Gemfile')
5
- const gemFile = fs.readFileSync(fileName, 'utf8')
5
+ const gemFile = fs.readFileSync(file + '/Gemfile', 'utf8')
6
6
  const rubyArray = gemFile.split('\n')
7
7
 
8
8
  let filteredRubyDep = rubyArray.filter(element => {
@@ -21,8 +21,7 @@ const readAndParseGemfile = file => {
21
21
  }
22
22
 
23
23
  const readAndParseGemLockFile = file => {
24
- const fileName = filePathForWindows(file + '/Gemfile.lock')
25
- const lockFile = fs.readFileSync(fileName, 'utf8')
24
+ const lockFile = fs.readFileSync(file + '/Gemfile.lock', 'utf8')
26
25
  const dependencyRegEx = /^\s*([A-Za-z0-9.!@#$%\-^&*_+]*)\s*(\((.*?)\))/
27
26
 
28
27
  const lines = lockFile.split('\n')
@@ -243,27 +242,30 @@ const buildSourceDependencyWithVersion = (
243
242
  return dependencies
244
243
  }
245
244
 
246
- const getRubyDeps = config => {
245
+ const getRubyDeps = (config, languageFiles) => {
247
246
  try {
247
+ checkForCorrectFiles(languageFiles)
248
248
  const parsedGem = readAndParseGemfile(config.file)
249
249
  const parsedLock = readAndParseGemLockFile(config.file)
250
250
 
251
251
  return { gemfilesDependanceies: parsedGem, gemfileLock: parsedLock }
252
252
  } catch (err) {
253
- console.log(err.message)
254
- process.exit(1)
253
+ throw err
255
254
  }
256
255
  }
257
256
 
258
- const trimWhiteSpace = string => {
259
- return string.replace(/\s+/g, '')
260
- }
257
+ const checkForCorrectFiles = languageFiles => {
258
+ if (!languageFiles.includes('Gemfile.lock')) {
259
+ throw new Error(i18n.__('languageAnalysisHasNoLockFile', 'ruby'))
260
+ }
261
261
 
262
- const filePathForWindows = path => {
263
- if (process.platform === 'win32') {
264
- path = path.replace(/\//g, '\\')
262
+ if (!languageFiles.includes('Gemfile')) {
263
+ throw new Error(i18n.__('languageAnalysisProjectFileError', 'ruby'))
265
264
  }
266
- return path
265
+ }
266
+
267
+ const trimWhiteSpace = string => {
268
+ return string.replace(/\s+/g, '')
267
269
  }
268
270
 
269
271
  module.exports = {
@@ -278,5 +280,6 @@ module.exports = {
278
280
  getVersion,
279
281
  getPatchLevel,
280
282
  formatSourceArr,
281
- getSourceArray
283
+ getSourceArray,
284
+ checkForCorrectFiles
282
285
  }