@contrast/contrast 1.0.6 → 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 (221) hide show
  1. package/.prettierignore +0 -6
  2. package/dist/audit/catalogueApplication/catalogueApplication.js +23 -5
  3. package/dist/audit/languageAnalysisEngine/getProjectRootFilenames.js +10 -19
  4. package/dist/audit/languageAnalysisEngine/report/commonReportingFunctions.js +98 -37
  5. package/dist/audit/languageAnalysisEngine/report/models/reportListModel.js +2 -1
  6. package/dist/audit/languageAnalysisEngine/report/models/reportOutputModel.js +4 -3
  7. package/dist/audit/languageAnalysisEngine/report/models/severityCountModel.js +3 -0
  8. package/dist/audit/languageAnalysisEngine/report/reportingFeature.js +87 -19
  9. package/dist/audit/languageAnalysisEngine/report/utils/reportUtils.js +46 -16
  10. package/dist/audit/languageAnalysisEngine/sendSnapshot.js +57 -19
  11. package/dist/audit/save.js +37 -0
  12. package/dist/commands/audit/auditConfig.js +0 -16
  13. package/dist/commands/audit/auditController.js +18 -11
  14. package/dist/commands/audit/help.js +31 -25
  15. package/dist/commands/audit/processAudit.js +3 -3
  16. package/dist/commands/audit/saveFile.js +8 -4
  17. package/dist/commands/scan/sca/scaAnalysis.js +55 -10
  18. package/dist/common/HTTPClient.js +64 -23
  19. package/dist/common/errorHandling.js +6 -1
  20. package/dist/common/versionChecker.js +20 -5
  21. package/dist/constants/constants.js +7 -2
  22. package/dist/constants/locales.js +35 -38
  23. package/dist/constants.js +20 -13
  24. package/dist/index.js +55 -45
  25. package/dist/lambda/analytics.js +11 -0
  26. package/dist/lambda/lambda.js +38 -4
  27. package/dist/lambda/types.js +13 -0
  28. package/dist/sbom/generateSbom.js +5 -4
  29. package/dist/scaAnalysis/common/formatMessage.js +44 -1
  30. package/dist/scaAnalysis/common/treeUpload.js +4 -6
  31. package/dist/scaAnalysis/dotnet/analysis.js +43 -0
  32. package/dist/scaAnalysis/dotnet/index.js +10 -0
  33. package/dist/scaAnalysis/go/goReadDepFile.js +1 -3
  34. package/dist/scaAnalysis/java/analysis.js +5 -8
  35. package/dist/scaAnalysis/java/index.js +2 -2
  36. package/dist/scaAnalysis/javascript/analysis.js +107 -0
  37. package/dist/scaAnalysis/javascript/index.js +50 -0
  38. package/dist/scaAnalysis/php/analysis.js +70 -0
  39. package/dist/scaAnalysis/php/index.js +17 -0
  40. package/dist/scaAnalysis/python/analysis.js +42 -0
  41. package/dist/scaAnalysis/python/index.js +10 -0
  42. package/dist/scaAnalysis/ruby/analysis.js +218 -0
  43. package/dist/scaAnalysis/ruby/index.js +10 -0
  44. package/dist/scan/autoDetection.js +23 -22
  45. package/dist/scan/fileUtils.js +57 -20
  46. package/dist/scan/formatScanOutput.js +12 -14
  47. package/dist/scan/models/groupedResultsModel.js +1 -1
  48. package/dist/scan/models/scanResultsModel.js +3 -1
  49. package/dist/scan/populateProjectIdAndProjectName.js +2 -1
  50. package/dist/scan/scan.js +1 -0
  51. package/dist/scan/scanConfig.js +8 -3
  52. package/dist/scan/scanController.js +16 -3
  53. package/dist/scan/scanResults.js +5 -1
  54. package/dist/utils/commonApi.js +4 -1
  55. package/dist/utils/filterProjectPath.js +7 -2
  56. package/dist/utils/getConfig.js +1 -6
  57. package/package.json +12 -9
  58. package/src/audit/catalogueApplication/catalogueApplication.js +28 -7
  59. package/src/audit/languageAnalysisEngine/getProjectRootFilenames.js +10 -39
  60. package/src/audit/languageAnalysisEngine/report/commonReportingFunctions.ts +183 -68
  61. package/src/audit/languageAnalysisEngine/report/models/reportLibraryModel.ts +3 -3
  62. package/src/audit/languageAnalysisEngine/report/models/reportListModel.ts +18 -11
  63. package/src/audit/languageAnalysisEngine/report/models/reportOutputModel.ts +11 -5
  64. package/src/audit/languageAnalysisEngine/report/models/reportSeverityModel.ts +6 -1
  65. package/src/audit/languageAnalysisEngine/report/models/severityCountModel.ts +4 -0
  66. package/src/audit/languageAnalysisEngine/report/reportingFeature.ts +86 -32
  67. package/src/audit/languageAnalysisEngine/report/utils/reportUtils.ts +87 -32
  68. package/src/audit/languageAnalysisEngine/sendSnapshot.js +69 -20
  69. package/src/audit/save.js +48 -0
  70. package/src/commands/audit/auditConfig.ts +0 -25
  71. package/src/commands/audit/auditController.ts +18 -20
  72. package/src/commands/audit/help.ts +31 -25
  73. package/src/commands/audit/processAudit.ts +3 -6
  74. package/src/commands/audit/saveFile.ts +6 -2
  75. package/src/commands/scan/processScan.js +0 -1
  76. package/src/commands/scan/sca/scaAnalysis.js +84 -30
  77. package/src/common/HTTPClient.js +81 -34
  78. package/src/common/errorHandling.ts +10 -1
  79. package/src/common/versionChecker.ts +24 -5
  80. package/src/constants/constants.js +9 -3
  81. package/src/constants/locales.js +58 -43
  82. package/src/constants.js +21 -14
  83. package/src/index.ts +70 -58
  84. package/src/lambda/analytics.ts +9 -0
  85. package/src/lambda/arn.ts +2 -1
  86. package/src/lambda/lambda.ts +40 -17
  87. package/src/lambda/types.ts +36 -0
  88. package/src/lambda/utils.ts +2 -7
  89. package/src/sbom/generateSbom.ts +2 -2
  90. package/src/scaAnalysis/common/formatMessage.js +48 -1
  91. package/src/scaAnalysis/common/treeUpload.js +4 -6
  92. package/src/scaAnalysis/dotnet/analysis.js +54 -0
  93. package/src/scaAnalysis/dotnet/index.js +11 -0
  94. package/src/scaAnalysis/go/goAnalysis.js +2 -3
  95. package/src/scaAnalysis/go/goReadDepFile.js +1 -3
  96. package/src/scaAnalysis/java/analysis.js +7 -8
  97. package/src/scaAnalysis/java/index.js +2 -2
  98. package/src/scaAnalysis/javascript/analysis.js +126 -0
  99. package/src/scaAnalysis/javascript/index.js +72 -0
  100. package/src/scaAnalysis/php/analysis.js +78 -0
  101. package/src/scaAnalysis/php/index.js +22 -0
  102. package/src/scaAnalysis/python/analysis.js +49 -0
  103. package/src/scaAnalysis/python/index.js +11 -0
  104. package/src/scaAnalysis/ruby/analysis.js +273 -0
  105. package/src/scaAnalysis/ruby/index.js +11 -0
  106. package/src/scan/autoDetection.js +24 -26
  107. package/src/scan/fileUtils.js +60 -20
  108. package/src/scan/formatScanOutput.ts +14 -15
  109. package/src/scan/models/groupedResultsModel.ts +3 -3
  110. package/src/scan/models/resultContentModel.ts +1 -1
  111. package/src/scan/models/scanResultsModel.ts +5 -2
  112. package/src/scan/populateProjectIdAndProjectName.js +3 -1
  113. package/src/scan/scan.ts +1 -0
  114. package/src/scan/scanConfig.js +7 -5
  115. package/src/scan/scanController.js +18 -4
  116. package/src/scan/scanResults.js +10 -0
  117. package/src/utils/commonApi.js +4 -1
  118. package/src/utils/filterProjectPath.js +6 -2
  119. package/src/utils/getConfig.ts +1 -12
  120. package/dist/audit/AnalysisEngine.js +0 -37
  121. package/dist/audit/autodetection/autoDetectLanguage.js +0 -32
  122. package/dist/audit/dotnetAnalysisEngine/index.js +0 -25
  123. package/dist/audit/dotnetAnalysisEngine/parseLockFileContents.js +0 -35
  124. package/dist/audit/dotnetAnalysisEngine/parseProjectFileContents.js +0 -15
  125. package/dist/audit/dotnetAnalysisEngine/readLockFileContents.js +0 -18
  126. package/dist/audit/dotnetAnalysisEngine/readProjectFileContents.js +0 -14
  127. package/dist/audit/dotnetAnalysisEngine/sanitizer.js +0 -9
  128. package/dist/audit/goAnalysisEngine/index.js +0 -17
  129. package/dist/audit/goAnalysisEngine/parseProjectFileContents.js +0 -164
  130. package/dist/audit/goAnalysisEngine/readProjectFileContents.js +0 -21
  131. package/dist/audit/goAnalysisEngine/sanitizer.js +0 -5
  132. package/dist/audit/javaAnalysisEngine/index.js +0 -34
  133. package/dist/audit/javaAnalysisEngine/parseMavenProjectFileContents.js +0 -153
  134. package/dist/audit/javaAnalysisEngine/parseProjectFileContents.js +0 -353
  135. package/dist/audit/javaAnalysisEngine/readProjectFileContents.js +0 -98
  136. package/dist/audit/javaAnalysisEngine/sanitizer.js +0 -5
  137. package/dist/audit/languageAnalysisEngine/checkForMultipleIdentifiedLanguages.js +0 -24
  138. package/dist/audit/languageAnalysisEngine/checkForMultipleIdentifiedProjectFiles.js +0 -24
  139. package/dist/audit/languageAnalysisEngine/checkIdentifiedLanguageHasLockFile.js +0 -35
  140. package/dist/audit/languageAnalysisEngine/checkIdentifiedLanguageHasProjectFile.js +0 -23
  141. package/dist/audit/languageAnalysisEngine/constants.js +0 -20
  142. package/dist/audit/languageAnalysisEngine/getIdentifiedLanguageInfo.js +0 -25
  143. package/dist/audit/languageAnalysisEngine/index.js +0 -39
  144. package/dist/audit/languageAnalysisEngine/languageAnalysisFactory.js +0 -87
  145. package/dist/audit/languageAnalysisEngine/reduceIdentifiedLanguages.js +0 -150
  146. package/dist/audit/nodeAnalysisEngine/handleNPMLockFileV2.js +0 -40
  147. package/dist/audit/nodeAnalysisEngine/index.js +0 -31
  148. package/dist/audit/nodeAnalysisEngine/parseNPMLockFileContents.js +0 -18
  149. package/dist/audit/nodeAnalysisEngine/parseYarnLockFileContents.js +0 -18
  150. package/dist/audit/nodeAnalysisEngine/readNPMLockFileContents.js +0 -17
  151. package/dist/audit/nodeAnalysisEngine/readProjectFileContents.js +0 -14
  152. package/dist/audit/nodeAnalysisEngine/readYarnLockFileContents.js +0 -24
  153. package/dist/audit/nodeAnalysisEngine/sanitizer.js +0 -9
  154. package/dist/audit/phpAnalysisEngine/index.js +0 -23
  155. package/dist/audit/phpAnalysisEngine/parseLockFileContents.js +0 -52
  156. package/dist/audit/phpAnalysisEngine/readLockFileContents.js +0 -13
  157. package/dist/audit/phpAnalysisEngine/readProjectFileContents.js +0 -16
  158. package/dist/audit/phpAnalysisEngine/sanitizer.js +0 -5
  159. package/dist/audit/pythonAnalysisEngine/index.js +0 -25
  160. package/dist/audit/pythonAnalysisEngine/parsePipfileLockContents.js +0 -17
  161. package/dist/audit/pythonAnalysisEngine/parseProjectFileContents.js +0 -21
  162. package/dist/audit/pythonAnalysisEngine/readPipfileLockFileContents.js +0 -13
  163. package/dist/audit/pythonAnalysisEngine/readPythonProjectFileContents.js +0 -14
  164. package/dist/audit/pythonAnalysisEngine/sanitizer.js +0 -7
  165. package/dist/audit/rubyAnalysisEngine/index.js +0 -25
  166. package/dist/audit/rubyAnalysisEngine/parseGemfileLockContents.js +0 -176
  167. package/dist/audit/rubyAnalysisEngine/parsedGemfile.js +0 -22
  168. package/dist/audit/rubyAnalysisEngine/readGemfileContents.js +0 -14
  169. package/dist/audit/rubyAnalysisEngine/readGemfileLockContents.js +0 -14
  170. package/dist/audit/rubyAnalysisEngine/sanitizer.js +0 -6
  171. package/src/audit/AnalysisEngine.js +0 -103
  172. package/src/audit/autodetection/autoDetectLanguage.ts +0 -40
  173. package/src/audit/dotnetAnalysisEngine/index.js +0 -26
  174. package/src/audit/dotnetAnalysisEngine/parseLockFileContents.js +0 -47
  175. package/src/audit/dotnetAnalysisEngine/parseProjectFileContents.js +0 -29
  176. package/src/audit/dotnetAnalysisEngine/readLockFileContents.js +0 -30
  177. package/src/audit/dotnetAnalysisEngine/readProjectFileContents.js +0 -26
  178. package/src/audit/dotnetAnalysisEngine/sanitizer.js +0 -11
  179. package/src/audit/goAnalysisEngine/index.js +0 -18
  180. package/src/audit/goAnalysisEngine/parseProjectFileContents.js +0 -209
  181. package/src/audit/goAnalysisEngine/readProjectFileContents.js +0 -31
  182. package/src/audit/goAnalysisEngine/sanitizer.js +0 -7
  183. package/src/audit/javaAnalysisEngine/index.js +0 -41
  184. package/src/audit/javaAnalysisEngine/parseMavenProjectFileContents.js +0 -222
  185. package/src/audit/javaAnalysisEngine/parseProjectFileContents.js +0 -420
  186. package/src/audit/javaAnalysisEngine/readProjectFileContents.js +0 -141
  187. package/src/audit/javaAnalysisEngine/sanitizer.js +0 -6
  188. package/src/audit/languageAnalysisEngine/checkForMultipleIdentifiedLanguages.js +0 -35
  189. package/src/audit/languageAnalysisEngine/checkForMultipleIdentifiedProjectFiles.js +0 -41
  190. package/src/audit/languageAnalysisEngine/checkIdentifiedLanguageHasLockFile.js +0 -54
  191. package/src/audit/languageAnalysisEngine/checkIdentifiedLanguageHasProjectFile.js +0 -32
  192. package/src/audit/languageAnalysisEngine/constants.js +0 -23
  193. package/src/audit/languageAnalysisEngine/getIdentifiedLanguageInfo.js +0 -41
  194. package/src/audit/languageAnalysisEngine/index.js +0 -45
  195. package/src/audit/languageAnalysisEngine/languageAnalysisFactory.js +0 -116
  196. package/src/audit/languageAnalysisEngine/reduceIdentifiedLanguages.js +0 -249
  197. package/src/audit/nodeAnalysisEngine/handleNPMLockFileV2.js +0 -49
  198. package/src/audit/nodeAnalysisEngine/index.js +0 -35
  199. package/src/audit/nodeAnalysisEngine/parseNPMLockFileContents.js +0 -20
  200. package/src/audit/nodeAnalysisEngine/parseYarnLockFileContents.js +0 -26
  201. package/src/audit/nodeAnalysisEngine/readNPMLockFileContents.js +0 -23
  202. package/src/audit/nodeAnalysisEngine/readProjectFileContents.js +0 -27
  203. package/src/audit/nodeAnalysisEngine/readYarnLockFileContents.js +0 -36
  204. package/src/audit/nodeAnalysisEngine/sanitizer.js +0 -11
  205. package/src/audit/phpAnalysisEngine/index.js +0 -27
  206. package/src/audit/phpAnalysisEngine/parseLockFileContents.js +0 -60
  207. package/src/audit/phpAnalysisEngine/readLockFileContents.js +0 -14
  208. package/src/audit/phpAnalysisEngine/readProjectFileContents.js +0 -25
  209. package/src/audit/phpAnalysisEngine/sanitizer.js +0 -4
  210. package/src/audit/pythonAnalysisEngine/index.js +0 -55
  211. package/src/audit/pythonAnalysisEngine/parsePipfileLockContents.js +0 -23
  212. package/src/audit/pythonAnalysisEngine/parseProjectFileContents.js +0 -33
  213. package/src/audit/pythonAnalysisEngine/readPipfileLockFileContents.js +0 -16
  214. package/src/audit/pythonAnalysisEngine/readPythonProjectFileContents.js +0 -22
  215. package/src/audit/pythonAnalysisEngine/sanitizer.js +0 -9
  216. package/src/audit/rubyAnalysisEngine/index.js +0 -30
  217. package/src/audit/rubyAnalysisEngine/parseGemfileLockContents.js +0 -215
  218. package/src/audit/rubyAnalysisEngine/parsedGemfile.js +0 -39
  219. package/src/audit/rubyAnalysisEngine/readGemfileContents.js +0 -18
  220. package/src/audit/rubyAnalysisEngine/readGemfileLockContents.js +0 -17
  221. package/src/audit/rubyAnalysisEngine/sanitizer.js +0 -8
@@ -0,0 +1,126 @@
1
+ const fs = require('fs')
2
+ const yarnParser = require('@yarnpkg/lockfile')
3
+ const yaml = require('js-yaml')
4
+ const i18n = require('i18n')
5
+ const {
6
+ formatKey
7
+ } = require('../../audit/nodeAnalysisEngine/parseYarn2LockFileContents')
8
+
9
+ const readFile = async (config, languageFiles, nameOfFile) => {
10
+ const index = languageFiles.findIndex(v => v.includes(nameOfFile))
11
+
12
+ if (config.file) {
13
+ return fs.readFileSync(config.file.concat(languageFiles[index]), 'utf8')
14
+ } else {
15
+ throw new Error('could not find file')
16
+ }
17
+ }
18
+
19
+ const readYarn = async (config, languageFiles, nameOfFile) => {
20
+ let yarn = {
21
+ yarnVersion: 1,
22
+ rawYarnLockFileContents: ''
23
+ }
24
+
25
+ try {
26
+ let rawYarnLockFileContents = await readFile(
27
+ config,
28
+ languageFiles,
29
+ nameOfFile
30
+ )
31
+ yarn.rawYarnLockFileContents = rawYarnLockFileContents
32
+
33
+ if (
34
+ !yarn.rawYarnLockFileContents.includes('lockfile v1') ||
35
+ yarn.rawYarnLockFileContents.includes('__metadata')
36
+ ) {
37
+ yarn.rawYarnLockFileContents = yaml.load(rawYarnLockFileContents)
38
+ yarn.yarnVersion = 2
39
+ }
40
+
41
+ return yarn
42
+ } catch (err) {
43
+ throw new Error(i18n.__('nodeReadYarnLockFileError') + `${err.message}`)
44
+ }
45
+ }
46
+
47
+ const parseNpmLockFile = async js => {
48
+ try {
49
+ js.npmLockFile = JSON.parse(js.rawLockFileContents)
50
+ if (js.npmLockFile && js.npmLockFile.lockfileVersion > 1) {
51
+ const listOfTopDep = Object.keys(js.npmLockFile.dependencies)
52
+ Object.entries(js.npmLockFile.dependencies).forEach(([objKey, value]) => {
53
+ if (value.requires) {
54
+ const listOfRequiresDep = Object.keys(value.requires)
55
+ listOfRequiresDep.forEach(dep => {
56
+ if (!listOfTopDep.includes(dep)) {
57
+ addDepToLockFile(js, value['requires'], dep)
58
+ }
59
+ })
60
+ }
61
+
62
+ if (value.dependencies) {
63
+ Object.entries(value.dependencies).forEach(
64
+ ([objChildKey, childValue]) => {
65
+ if (childValue.requires) {
66
+ const listOfRequiresDep = Object.keys(childValue.requires)
67
+ listOfRequiresDep.forEach(dep => {
68
+ if (!listOfTopDep.includes(dep)) {
69
+ addDepToLockFile(js, childValue['requires'], dep)
70
+ }
71
+ })
72
+ }
73
+ }
74
+ )
75
+ }
76
+ })
77
+ return js.npmLockFile
78
+ } else {
79
+ return js.npmLockFile
80
+ }
81
+ } catch (err) {
82
+ throw new Error(i18n.__('NodeParseNPM') + `${err.message}`)
83
+ }
84
+ }
85
+
86
+ const addDepToLockFile = (js, depObj, key) => {
87
+ return (js.npmLockFile.dependencies[key] = { version: depObj[key] })
88
+ }
89
+ const parseYarnLockFile = async js => {
90
+ try {
91
+ js.yarn.yarnLockFile = {}
92
+ if (js.yarn.yarnVersion === 1) {
93
+ js.yarn.yarnLockFile = yarnParser.parse(js.yarn.rawYarnLockFileContents)
94
+ delete js.yarn.rawYarnLockFileContents
95
+ return js
96
+ } else {
97
+ js.yarn.yarnLockFile['object'] = js.yarn.rawYarnLockFileContents
98
+ delete js.yarn.yarnLockFile['object'].__metadata
99
+ js.yarn.yarnLockFile['type'] = 'success'
100
+
101
+ Object.entries(js.yarn.rawYarnLockFileContents).forEach(
102
+ ([key, value]) => {
103
+ const rawKeyNames = key.split(',')
104
+ const keyNames = formatKey(rawKeyNames)
105
+
106
+ keyNames.forEach(name => {
107
+ js.yarn.yarnLockFile.object[name] = value
108
+ })
109
+ }
110
+ )
111
+ return js
112
+ }
113
+ } catch (err) {
114
+ throw new Error(
115
+ i18n.__('NodeParseYarn', js.yarn.yarnVersion) + `${err.message}`
116
+ )
117
+ }
118
+ }
119
+
120
+ module.exports = {
121
+ readYarn,
122
+ parseYarnLockFile,
123
+ parseNpmLockFile,
124
+ readFile,
125
+ formatKey
126
+ }
@@ -0,0 +1,72 @@
1
+ const analysis = require('./analysis')
2
+ const i18n = require('i18n')
3
+ const formatMessage = require('../common/formatMessage')
4
+
5
+ const jsAnalysis = async (config, languageFiles) => {
6
+ checkForCorrectFiles(languageFiles)
7
+
8
+ return buildNodeTree(config, languageFiles.JAVASCRIPT)
9
+ }
10
+ const buildNodeTree = async (config, files) => {
11
+ let analysis = await readFiles(config, files)
12
+ const rawNode = await parseFiles(config, files, analysis)
13
+ return formatMessage.createJavaScriptTSMessage(rawNode)
14
+ }
15
+
16
+ const readFiles = async (config, files) => {
17
+ let js = {}
18
+
19
+ js.packageJSON = JSON.parse(
20
+ await analysis.readFile(config, files, 'package.json')
21
+ )
22
+
23
+ if (files.includes('package-lock.json')) {
24
+ js.rawLockFileContents = await analysis.readFile(
25
+ config,
26
+ files,
27
+ 'package-lock.json'
28
+ )
29
+ }
30
+ if (files.includes('yarn.lock')) {
31
+ js.yarn = {}
32
+ js.yarn = await analysis.readYarn(config, files, 'yarn.lock')
33
+ }
34
+
35
+ return js
36
+ }
37
+
38
+ const parseFiles = async (config, files, js) => {
39
+ if (files.includes('package-lock.json')) {
40
+ js.npmLockFile = await analysis.parseNpmLockFile(js)
41
+ }
42
+ if (files.includes('yarn.lock')) {
43
+ js = await analysis.parseYarnLockFile(js)
44
+ }
45
+
46
+ return js
47
+ }
48
+
49
+ const checkForCorrectFiles = languageFiles => {
50
+ if (
51
+ languageFiles.JAVASCRIPT.includes('package-lock.json') &&
52
+ languageFiles.JAVASCRIPT.includes('yarn.lock')
53
+ ) {
54
+ throw new Error(
55
+ i18n.__('languageAnalysisHasMultipleLockFiles', 'javascript')
56
+ )
57
+ }
58
+
59
+ if (
60
+ !languageFiles.JAVASCRIPT.includes('package-lock.json') &&
61
+ !languageFiles.JAVASCRIPT.includes('yarn.lock')
62
+ ) {
63
+ throw new Error(i18n.__('languageAnalysisHasNoLockFile', 'javascript'))
64
+ }
65
+
66
+ if (!languageFiles.JAVASCRIPT.includes('package.json')) {
67
+ throw new Error(i18n.__('languageAnalysisHasNoPackageJsonFile'))
68
+ }
69
+ }
70
+ module.exports = {
71
+ jsAnalysis
72
+ }
@@ -0,0 +1,78 @@
1
+ const fs = require('fs')
2
+ const i18n = require('i18n')
3
+ const _ = require('lodash')
4
+
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
+ }
15
+
16
+ const parseProjectFiles = php => {
17
+ try {
18
+ // composer.json
19
+ php.composerJSON.dependencies = php.composerJSON.require
20
+ php.composerJSON.devDependencies = php.composerJSON['require-dev']
21
+
22
+ // composer.lock
23
+ php.lockFile = php.rawLockFileContents
24
+ let packages = _.keyBy(php.lockFile.packages, 'name')
25
+ let packagesDev = _.keyBy(php.lockFile['packages-dev'], 'name')
26
+ php.lockFile.dependencies = _.merge(packages, packagesDev)
27
+
28
+ const listOfTopDep = Object.keys(php.lockFile.dependencies)
29
+
30
+ Object.entries(php.lockFile.dependencies).forEach(([key, value]) => {
31
+ if (value.require) {
32
+ const listOfRequiresDep = Object.keys(value.require)
33
+ listOfRequiresDep.forEach(dep => {
34
+ if (!listOfTopDep.includes(dep)) {
35
+ addChildDepToLockFileAsOwnObj(php, value['require'], dep)
36
+ }
37
+ })
38
+ }
39
+
40
+ if (value['require-dev']) {
41
+ const listOfRequiresDep = Object.keys(value['require-dev'])
42
+ listOfRequiresDep.forEach(dep => {
43
+ if (!listOfTopDep.includes(dep)) {
44
+ addChildDepToLockFileAsOwnObj(php, value['require-dev'], dep)
45
+ }
46
+ })
47
+ }
48
+ })
49
+ formatParentDepToLockFile(php)
50
+ delete php.rawLockFileContents
51
+ return php
52
+ } catch (err) {
53
+ return console.log(i18n.__('phpParseComposerLock', php) + `${err.message}`) // not sure on this
54
+ }
55
+ }
56
+
57
+ function addChildDepToLockFileAsOwnObj(php, depObj, key) {
58
+ php.lockFile.dependencies[key] = { version: depObj[key] }
59
+ }
60
+
61
+ function formatParentDepToLockFile(php) {
62
+ for (const [key, value] of Object.entries(php.lockFile.dependencies)) {
63
+ let requires = {}
64
+ for (const [childKey, childValue] of Object.entries(value)) {
65
+ if (childKey === 'require' || childKey === 'require-dev') {
66
+ requires = _.merge(requires, childValue)
67
+ php.lockFile.dependencies[key].requires = requires
68
+ delete php.lockFile.dependencies[key].require
69
+ delete php.lockFile.dependencies[key]['require-dev']
70
+ }
71
+ }
72
+ }
73
+ }
74
+
75
+ module.exports = {
76
+ parseProjectFiles,
77
+ readFile
78
+ }
@@ -0,0 +1,22 @@
1
+ const { readFile, parseProjectFiles } = require('./analysis')
2
+ const { createPhpTSMessage } = require('../common/formatMessage')
3
+
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
18
+ }
19
+
20
+ module.exports = {
21
+ phpAnalysis
22
+ }
@@ -0,0 +1,49 @@
1
+ const multiReplace = require('string-multiple-replace')
2
+ const fs = require('fs')
3
+
4
+ const readAndParseProjectFile = file => {
5
+ const filePath = filePathForWindows(file + '/Pipfile')
6
+ const pipFile = fs.readFileSync(filePath, 'utf8')
7
+
8
+ const matcherObj = { '"': '' }
9
+ const sequencer = ['"']
10
+ const parsedPipfile = multiReplace(pipFile, matcherObj, sequencer)
11
+
12
+ const pythonArray = parsedPipfile.split('\n')
13
+
14
+ return pythonArray.filter(element => element !== '' && !element.includes('#'))
15
+ }
16
+
17
+ const readAndParseLockFile = file => {
18
+ const filePath = filePathForWindows(file + '/Pipfile.lock')
19
+ const lockFile = fs.readFileSync(filePath, 'utf8')
20
+ let parsedPipLock = JSON.parse(lockFile)
21
+ parsedPipLock['defaults'] = parsedPipLock['default']
22
+ delete parsedPipLock['default']
23
+ return parsedPipLock
24
+ }
25
+
26
+ const getPythonDeps = config => {
27
+ try {
28
+ const parseProject = readAndParseProjectFile(config.file)
29
+ const parsePip = readAndParseLockFile(config.file)
30
+
31
+ return { pipfileLock: parsePip, pipfilDependanceies: parseProject }
32
+ } catch (err) {
33
+ console.log(err.message.toString())
34
+ process.exit(1)
35
+ }
36
+ }
37
+
38
+ const filePathForWindows = path => {
39
+ if (process.platform === 'win32') {
40
+ path = path.replace(/\//g, '\\')
41
+ }
42
+ return path
43
+ }
44
+
45
+ module.exports = {
46
+ getPythonDeps,
47
+ readAndParseProjectFile,
48
+ readAndParseLockFile
49
+ }
@@ -0,0 +1,11 @@
1
+ const { createPythonTSMessage } = require('../common/formatMessage')
2
+ const { getPythonDeps } = require('./analysis')
3
+
4
+ const pythonAnalysis = (config, languageFiles) => {
5
+ const pythonDeps = getPythonDeps(config, languageFiles.PYTHON)
6
+ return createPythonTSMessage(pythonDeps)
7
+ }
8
+
9
+ module.exports = {
10
+ pythonAnalysis
11
+ }
@@ -0,0 +1,273 @@
1
+ const fs = require('fs')
2
+
3
+ const readAndParseGemfile = file => {
4
+ const gemFile = fs.readFileSync(file + '/Gemfile', 'utf8')
5
+ const rubyArray = gemFile.split('\n')
6
+
7
+ let filteredRubyDep = rubyArray.filter(element => {
8
+ return (
9
+ !element.includes('#') &&
10
+ element.includes('gem') &&
11
+ !element.includes('source')
12
+ )
13
+ })
14
+
15
+ for (let i = 0; i < filteredRubyDep.length; i++) {
16
+ filteredRubyDep[i] = filteredRubyDep[i].trim()
17
+ }
18
+
19
+ return filteredRubyDep
20
+ }
21
+
22
+ const readAndParseGemLockFile = file => {
23
+ const lockFile = fs.readFileSync(file + '/Gemfile.lock', 'utf8')
24
+ const dependencyRegEx = /^\s*([A-Za-z0-9.!@#$%\-^&*_+]*)\s*(\((.*?)\))/
25
+
26
+ const lines = lockFile.split('\n')
27
+
28
+ return {
29
+ dependencies: getDirectDependencies(lines, dependencyRegEx),
30
+ runtimeDetails: getLockFileRuntimeInfo(lines),
31
+ sources: getSourceArray(lines, dependencyRegEx)
32
+ }
33
+ }
34
+
35
+ const nonDependencyKeys = (line, sourceObject) => {
36
+ const GEMFILE_KEY_VALUE = /^\s*([^:(]*)\s*\:*\s*(.*)/
37
+ let parts = GEMFILE_KEY_VALUE.exec(line)
38
+ let key = parts[1].trim()
39
+ let value = parts[2] || ''
40
+
41
+ sourceObject[key] = value
42
+ return sourceObject
43
+ }
44
+
45
+ const populateResolveAndPlatform = (version, sourceObject) => {
46
+ const depArr = version.split('-')
47
+ sourceObject.resolved = depArr[0]
48
+ sourceObject.platform = depArr.length > 1 ? depArr[1] : 'UNSPECIFIED'
49
+ return sourceObject
50
+ }
51
+
52
+ const isUpperCase = str => {
53
+ return str === str.toUpperCase()
54
+ }
55
+
56
+ const getDirectDependencies = (lines, dependencyRegEx) => {
57
+ const dependencies = {}
58
+
59
+ let depIndex = 0
60
+ for (let i = 0; i < lines.length; i++) {
61
+ if (lines[i] === 'DEPENDENCIES') {
62
+ depIndex = i
63
+ }
64
+ }
65
+ const getDepArray = lines.slice(depIndex)
66
+
67
+ for (let j = 1; j < getDepArray.length; j++) {
68
+ const element = getDepArray[j]
69
+ if (!isUpperCase(element)) {
70
+ const isDependencyWithVersion = dependencyRegEx.test(element)
71
+ if (isDependencyWithVersion) {
72
+ const dependency = dependencyRegEx.exec(element)
73
+ let name = dependency[1]
74
+ name = name.replace('!', '')
75
+ dependencies[name.trim()] = dependency[3]
76
+ } else {
77
+ let name = element
78
+ name = name.replace('!', ' ')
79
+ dependencies[name.trim()] = 'UNSPECIFIED'
80
+ }
81
+ }
82
+ }
83
+
84
+ return dependencies
85
+ }
86
+
87
+ const getLockFileRuntimeInfo = lines => {
88
+ let rubVersionIndex = 0
89
+ for (let i = 0; i < lines.length; i++) {
90
+ if (lines[i] === 'RUBY VERSION') {
91
+ rubVersionIndex = i
92
+ break
93
+ }
94
+ }
95
+
96
+ const runtimeDetails = {}
97
+ if (rubVersionIndex !== 0) {
98
+ const getRubyVersionArray = lines.slice(rubVersionIndex)
99
+
100
+ for (let element of getRubyVersionArray) {
101
+ if (!isUpperCase(element)) {
102
+ runtimeDetails['version'] = getVersion(element)
103
+ runtimeDetails['patchLevel'] = getPatchLevel(element)
104
+
105
+ if (element.includes('engine')) {
106
+ let splitElement = element.split(' ')
107
+ runtimeDetails[splitElement[0]] = splitElement[1]
108
+ }
109
+ }
110
+ }
111
+ }
112
+ return runtimeDetails
113
+ }
114
+
115
+ const getVersion = element => {
116
+ const versionRegex = /^([ruby\s0-9.*]+)/
117
+ if (versionRegex.test(element)) {
118
+ let version = versionRegex.exec(element)[0]
119
+
120
+ if (version.includes('ruby')) {
121
+ return trimWhiteSpace(version.replace('ruby', ''))
122
+ }
123
+ }
124
+ }
125
+
126
+ const getPatchLevel = element => {
127
+ const patchLevelRegex = /(p\d+)/
128
+ if (patchLevelRegex.test(element)) {
129
+ return patchLevelRegex.exec(element)[0]
130
+ }
131
+ }
132
+
133
+ const formatSourceArr = sourceArr => {
134
+ return sourceArr.map(element => {
135
+ if (element.sourceType === 'GIT') {
136
+ delete element.specs
137
+ }
138
+
139
+ if (element.sourceType === 'GEM') {
140
+ delete element.branch
141
+ delete element.revision
142
+ delete element.depthLevel
143
+ delete element.specs
144
+ }
145
+
146
+ if (element.sourceType === 'PATH') {
147
+ delete element.branch
148
+ delete element.revision
149
+ delete element.depthLevel
150
+ delete element.specs
151
+ delete element.platform
152
+ }
153
+ return element
154
+ })
155
+ }
156
+
157
+ const getSourceArray = (lines, dependencyRegEx) => {
158
+ const sourceObject = {
159
+ dependencies: {}
160
+ }
161
+
162
+ const whitespaceRegx = /^(\s*)/
163
+ let index = 0
164
+
165
+ let line = 0
166
+ const sources = []
167
+ while ((line = lines[index++]) !== undefined) {
168
+ let currentWS = whitespaceRegx.exec(line)[1].length
169
+ if (!line.includes(' bundler (')) {
170
+ if (currentWS === 0 && !line.includes(':') && line !== '') {
171
+ sourceObject.sourceType = line
172
+ }
173
+
174
+ if (currentWS !== 0 && line.includes(':')) {
175
+ nonDependencyKeys(line, sourceObject)
176
+ }
177
+
178
+ if (currentWS > 2) {
179
+ let nexlineWS = whitespaceRegx.exec(lines[index])[1].length
180
+ sourceObject.dependencies = buildSourceDependencyWithVersion(
181
+ whitespaceRegx,
182
+ dependencyRegEx,
183
+ line,
184
+ currentWS,
185
+ sourceObject.name,
186
+ sourceObject.dependencies
187
+ )
188
+
189
+ if (currentWS === 4 && sourceObject.depthLevel === undefined) {
190
+ const dependency = dependencyRegEx.exec(line)
191
+ sourceObject.name = dependency[1]
192
+ sourceObject.depthLevel = currentWS
193
+ populateResolveAndPlatform(dependency[3], sourceObject)
194
+ }
195
+
196
+ if (currentWS === 4 && sourceObject.depthLevel) {
197
+ // create new Parent
198
+ const dependency = dependencyRegEx.exec(line)
199
+ sourceObject.name = dependency[1]
200
+ sourceObject.depthLevel = currentWS
201
+ populateResolveAndPlatform(dependency[3], sourceObject)
202
+ }
203
+
204
+ if (
205
+ (currentWS === 4 && nexlineWS === 4) ||
206
+ (currentWS === 6 && nexlineWS === 4) ||
207
+ nexlineWS == ''
208
+ ) {
209
+ let newObj = {}
210
+ newObj = JSON.parse(JSON.stringify(sourceObject))
211
+ sources.push(newObj)
212
+ sourceObject.dependencies = {}
213
+ }
214
+ }
215
+ }
216
+ }
217
+ return formatSourceArr(sources)
218
+ }
219
+
220
+ const buildSourceDependencyWithVersion = (
221
+ whitespaceRegx,
222
+ dependencyRegEx,
223
+ line,
224
+ currentWhiteSpace,
225
+ name,
226
+ dependencies
227
+ ) => {
228
+ const isDependencyWithVersion = dependencyRegEx.test(line)
229
+
230
+ if (currentWhiteSpace === 6) {
231
+ const dependency = dependencyRegEx.exec(line)
232
+ if (isDependencyWithVersion) {
233
+ if (name !== dependency[1]) {
234
+ dependencies[dependency[1]] = dependency[3]
235
+ }
236
+ } else {
237
+ dependencies[line.trim()] = 'UNSPECIFIED'
238
+ }
239
+ }
240
+
241
+ return dependencies
242
+ }
243
+
244
+ const getRubyDeps = config => {
245
+ try {
246
+ const parsedGem = readAndParseGemfile(config.file)
247
+ const parsedLock = readAndParseGemLockFile(config.file)
248
+
249
+ return { gemfilesDependanceies: parsedGem, gemfileLock: parsedLock }
250
+ } catch (err) {
251
+ console.log(err.message)
252
+ process.exit(1)
253
+ }
254
+ }
255
+
256
+ const trimWhiteSpace = string => {
257
+ return string.replace(/\s+/g, '')
258
+ }
259
+
260
+ module.exports = {
261
+ getRubyDeps,
262
+ readAndParseGemfile,
263
+ readAndParseGemLockFile,
264
+ nonDependencyKeys,
265
+ populateResolveAndPlatform,
266
+ isUpperCase,
267
+ getDirectDependencies,
268
+ getLockFileRuntimeInfo,
269
+ getVersion,
270
+ getPatchLevel,
271
+ formatSourceArr,
272
+ getSourceArray
273
+ }
@@ -0,0 +1,11 @@
1
+ const analysis = require('./analysis')
2
+ const { createRubyTSMessage } = require('../common/formatMessage')
3
+
4
+ const rubyAnalysis = (config, languageFiles) => {
5
+ const rubyDeps = analysis.getRubyDeps(config, languageFiles.RUBY)
6
+ return createRubyTSMessage(rubyDeps)
7
+ }
8
+
9
+ module.exports = {
10
+ rubyAnalysis
11
+ }