@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.
- package/.prettierignore +0 -6
- package/dist/audit/catalogueApplication/catalogueApplication.js +23 -5
- package/dist/audit/languageAnalysisEngine/getProjectRootFilenames.js +10 -19
- package/dist/audit/languageAnalysisEngine/report/commonReportingFunctions.js +98 -37
- package/dist/audit/languageAnalysisEngine/report/models/reportListModel.js +2 -1
- package/dist/audit/languageAnalysisEngine/report/models/reportOutputModel.js +4 -3
- package/dist/audit/languageAnalysisEngine/report/models/severityCountModel.js +3 -0
- package/dist/audit/languageAnalysisEngine/report/reportingFeature.js +87 -19
- package/dist/audit/languageAnalysisEngine/report/utils/reportUtils.js +46 -16
- package/dist/audit/languageAnalysisEngine/sendSnapshot.js +57 -19
- package/dist/audit/save.js +37 -0
- package/dist/commands/audit/auditConfig.js +0 -16
- package/dist/commands/audit/auditController.js +18 -11
- package/dist/commands/audit/help.js +31 -25
- package/dist/commands/audit/processAudit.js +3 -3
- package/dist/commands/audit/saveFile.js +8 -4
- package/dist/commands/scan/sca/scaAnalysis.js +55 -10
- package/dist/common/HTTPClient.js +64 -23
- package/dist/common/errorHandling.js +6 -1
- package/dist/common/versionChecker.js +20 -5
- package/dist/constants/constants.js +7 -2
- package/dist/constants/locales.js +35 -38
- package/dist/constants.js +20 -13
- package/dist/index.js +55 -45
- package/dist/lambda/analytics.js +11 -0
- package/dist/lambda/lambda.js +38 -4
- package/dist/lambda/types.js +13 -0
- package/dist/sbom/generateSbom.js +5 -4
- package/dist/scaAnalysis/common/formatMessage.js +44 -1
- package/dist/scaAnalysis/common/treeUpload.js +4 -6
- package/dist/scaAnalysis/dotnet/analysis.js +43 -0
- package/dist/scaAnalysis/dotnet/index.js +10 -0
- package/dist/scaAnalysis/go/goReadDepFile.js +1 -3
- package/dist/scaAnalysis/java/analysis.js +5 -8
- package/dist/scaAnalysis/java/index.js +2 -2
- package/dist/scaAnalysis/javascript/analysis.js +107 -0
- package/dist/scaAnalysis/javascript/index.js +50 -0
- package/dist/scaAnalysis/php/analysis.js +70 -0
- package/dist/scaAnalysis/php/index.js +17 -0
- package/dist/scaAnalysis/python/analysis.js +42 -0
- package/dist/scaAnalysis/python/index.js +10 -0
- package/dist/scaAnalysis/ruby/analysis.js +218 -0
- package/dist/scaAnalysis/ruby/index.js +10 -0
- package/dist/scan/autoDetection.js +23 -22
- package/dist/scan/fileUtils.js +57 -20
- package/dist/scan/formatScanOutput.js +12 -14
- package/dist/scan/models/groupedResultsModel.js +1 -1
- package/dist/scan/models/scanResultsModel.js +3 -1
- package/dist/scan/populateProjectIdAndProjectName.js +2 -1
- package/dist/scan/scan.js +1 -0
- package/dist/scan/scanConfig.js +8 -3
- package/dist/scan/scanController.js +16 -3
- package/dist/scan/scanResults.js +5 -1
- package/dist/utils/commonApi.js +4 -1
- package/dist/utils/filterProjectPath.js +7 -2
- package/dist/utils/getConfig.js +1 -6
- package/package.json +12 -9
- package/src/audit/catalogueApplication/catalogueApplication.js +28 -7
- package/src/audit/languageAnalysisEngine/getProjectRootFilenames.js +10 -39
- package/src/audit/languageAnalysisEngine/report/commonReportingFunctions.ts +183 -68
- package/src/audit/languageAnalysisEngine/report/models/reportLibraryModel.ts +3 -3
- package/src/audit/languageAnalysisEngine/report/models/reportListModel.ts +18 -11
- package/src/audit/languageAnalysisEngine/report/models/reportOutputModel.ts +11 -5
- package/src/audit/languageAnalysisEngine/report/models/reportSeverityModel.ts +6 -1
- package/src/audit/languageAnalysisEngine/report/models/severityCountModel.ts +4 -0
- package/src/audit/languageAnalysisEngine/report/reportingFeature.ts +86 -32
- package/src/audit/languageAnalysisEngine/report/utils/reportUtils.ts +87 -32
- package/src/audit/languageAnalysisEngine/sendSnapshot.js +69 -20
- package/src/audit/save.js +48 -0
- package/src/commands/audit/auditConfig.ts +0 -25
- package/src/commands/audit/auditController.ts +18 -20
- package/src/commands/audit/help.ts +31 -25
- package/src/commands/audit/processAudit.ts +3 -6
- package/src/commands/audit/saveFile.ts +6 -2
- package/src/commands/scan/processScan.js +0 -1
- package/src/commands/scan/sca/scaAnalysis.js +84 -30
- package/src/common/HTTPClient.js +81 -34
- package/src/common/errorHandling.ts +10 -1
- package/src/common/versionChecker.ts +24 -5
- package/src/constants/constants.js +9 -3
- package/src/constants/locales.js +58 -43
- package/src/constants.js +21 -14
- package/src/index.ts +70 -58
- package/src/lambda/analytics.ts +9 -0
- package/src/lambda/arn.ts +2 -1
- package/src/lambda/lambda.ts +40 -17
- package/src/lambda/types.ts +36 -0
- package/src/lambda/utils.ts +2 -7
- package/src/sbom/generateSbom.ts +2 -2
- package/src/scaAnalysis/common/formatMessage.js +48 -1
- package/src/scaAnalysis/common/treeUpload.js +4 -6
- package/src/scaAnalysis/dotnet/analysis.js +54 -0
- package/src/scaAnalysis/dotnet/index.js +11 -0
- package/src/scaAnalysis/go/goAnalysis.js +2 -3
- package/src/scaAnalysis/go/goReadDepFile.js +1 -3
- package/src/scaAnalysis/java/analysis.js +7 -8
- package/src/scaAnalysis/java/index.js +2 -2
- package/src/scaAnalysis/javascript/analysis.js +126 -0
- package/src/scaAnalysis/javascript/index.js +72 -0
- package/src/scaAnalysis/php/analysis.js +78 -0
- package/src/scaAnalysis/php/index.js +22 -0
- package/src/scaAnalysis/python/analysis.js +49 -0
- package/src/scaAnalysis/python/index.js +11 -0
- package/src/scaAnalysis/ruby/analysis.js +273 -0
- package/src/scaAnalysis/ruby/index.js +11 -0
- package/src/scan/autoDetection.js +24 -26
- package/src/scan/fileUtils.js +60 -20
- package/src/scan/formatScanOutput.ts +14 -15
- package/src/scan/models/groupedResultsModel.ts +3 -3
- package/src/scan/models/resultContentModel.ts +1 -1
- package/src/scan/models/scanResultsModel.ts +5 -2
- package/src/scan/populateProjectIdAndProjectName.js +3 -1
- package/src/scan/scan.ts +1 -0
- package/src/scan/scanConfig.js +7 -5
- package/src/scan/scanController.js +18 -4
- package/src/scan/scanResults.js +10 -0
- package/src/utils/commonApi.js +4 -1
- package/src/utils/filterProjectPath.js +6 -2
- package/src/utils/getConfig.ts +1 -12
- package/dist/audit/AnalysisEngine.js +0 -37
- package/dist/audit/autodetection/autoDetectLanguage.js +0 -32
- package/dist/audit/dotnetAnalysisEngine/index.js +0 -25
- package/dist/audit/dotnetAnalysisEngine/parseLockFileContents.js +0 -35
- package/dist/audit/dotnetAnalysisEngine/parseProjectFileContents.js +0 -15
- package/dist/audit/dotnetAnalysisEngine/readLockFileContents.js +0 -18
- package/dist/audit/dotnetAnalysisEngine/readProjectFileContents.js +0 -14
- package/dist/audit/dotnetAnalysisEngine/sanitizer.js +0 -9
- package/dist/audit/goAnalysisEngine/index.js +0 -17
- package/dist/audit/goAnalysisEngine/parseProjectFileContents.js +0 -164
- package/dist/audit/goAnalysisEngine/readProjectFileContents.js +0 -21
- package/dist/audit/goAnalysisEngine/sanitizer.js +0 -5
- package/dist/audit/javaAnalysisEngine/index.js +0 -34
- package/dist/audit/javaAnalysisEngine/parseMavenProjectFileContents.js +0 -153
- package/dist/audit/javaAnalysisEngine/parseProjectFileContents.js +0 -353
- package/dist/audit/javaAnalysisEngine/readProjectFileContents.js +0 -98
- package/dist/audit/javaAnalysisEngine/sanitizer.js +0 -5
- package/dist/audit/languageAnalysisEngine/checkForMultipleIdentifiedLanguages.js +0 -24
- package/dist/audit/languageAnalysisEngine/checkForMultipleIdentifiedProjectFiles.js +0 -24
- package/dist/audit/languageAnalysisEngine/checkIdentifiedLanguageHasLockFile.js +0 -35
- package/dist/audit/languageAnalysisEngine/checkIdentifiedLanguageHasProjectFile.js +0 -23
- package/dist/audit/languageAnalysisEngine/constants.js +0 -20
- package/dist/audit/languageAnalysisEngine/getIdentifiedLanguageInfo.js +0 -25
- package/dist/audit/languageAnalysisEngine/index.js +0 -39
- package/dist/audit/languageAnalysisEngine/languageAnalysisFactory.js +0 -87
- package/dist/audit/languageAnalysisEngine/reduceIdentifiedLanguages.js +0 -150
- package/dist/audit/nodeAnalysisEngine/handleNPMLockFileV2.js +0 -40
- package/dist/audit/nodeAnalysisEngine/index.js +0 -31
- package/dist/audit/nodeAnalysisEngine/parseNPMLockFileContents.js +0 -18
- package/dist/audit/nodeAnalysisEngine/parseYarnLockFileContents.js +0 -18
- package/dist/audit/nodeAnalysisEngine/readNPMLockFileContents.js +0 -17
- package/dist/audit/nodeAnalysisEngine/readProjectFileContents.js +0 -14
- package/dist/audit/nodeAnalysisEngine/readYarnLockFileContents.js +0 -24
- package/dist/audit/nodeAnalysisEngine/sanitizer.js +0 -9
- package/dist/audit/phpAnalysisEngine/index.js +0 -23
- package/dist/audit/phpAnalysisEngine/parseLockFileContents.js +0 -52
- package/dist/audit/phpAnalysisEngine/readLockFileContents.js +0 -13
- package/dist/audit/phpAnalysisEngine/readProjectFileContents.js +0 -16
- package/dist/audit/phpAnalysisEngine/sanitizer.js +0 -5
- package/dist/audit/pythonAnalysisEngine/index.js +0 -25
- package/dist/audit/pythonAnalysisEngine/parsePipfileLockContents.js +0 -17
- package/dist/audit/pythonAnalysisEngine/parseProjectFileContents.js +0 -21
- package/dist/audit/pythonAnalysisEngine/readPipfileLockFileContents.js +0 -13
- package/dist/audit/pythonAnalysisEngine/readPythonProjectFileContents.js +0 -14
- package/dist/audit/pythonAnalysisEngine/sanitizer.js +0 -7
- package/dist/audit/rubyAnalysisEngine/index.js +0 -25
- package/dist/audit/rubyAnalysisEngine/parseGemfileLockContents.js +0 -176
- package/dist/audit/rubyAnalysisEngine/parsedGemfile.js +0 -22
- package/dist/audit/rubyAnalysisEngine/readGemfileContents.js +0 -14
- package/dist/audit/rubyAnalysisEngine/readGemfileLockContents.js +0 -14
- package/dist/audit/rubyAnalysisEngine/sanitizer.js +0 -6
- package/src/audit/AnalysisEngine.js +0 -103
- package/src/audit/autodetection/autoDetectLanguage.ts +0 -40
- package/src/audit/dotnetAnalysisEngine/index.js +0 -26
- package/src/audit/dotnetAnalysisEngine/parseLockFileContents.js +0 -47
- package/src/audit/dotnetAnalysisEngine/parseProjectFileContents.js +0 -29
- package/src/audit/dotnetAnalysisEngine/readLockFileContents.js +0 -30
- package/src/audit/dotnetAnalysisEngine/readProjectFileContents.js +0 -26
- package/src/audit/dotnetAnalysisEngine/sanitizer.js +0 -11
- package/src/audit/goAnalysisEngine/index.js +0 -18
- package/src/audit/goAnalysisEngine/parseProjectFileContents.js +0 -209
- package/src/audit/goAnalysisEngine/readProjectFileContents.js +0 -31
- package/src/audit/goAnalysisEngine/sanitizer.js +0 -7
- package/src/audit/javaAnalysisEngine/index.js +0 -41
- package/src/audit/javaAnalysisEngine/parseMavenProjectFileContents.js +0 -222
- package/src/audit/javaAnalysisEngine/parseProjectFileContents.js +0 -420
- package/src/audit/javaAnalysisEngine/readProjectFileContents.js +0 -141
- package/src/audit/javaAnalysisEngine/sanitizer.js +0 -6
- package/src/audit/languageAnalysisEngine/checkForMultipleIdentifiedLanguages.js +0 -35
- package/src/audit/languageAnalysisEngine/checkForMultipleIdentifiedProjectFiles.js +0 -41
- package/src/audit/languageAnalysisEngine/checkIdentifiedLanguageHasLockFile.js +0 -54
- package/src/audit/languageAnalysisEngine/checkIdentifiedLanguageHasProjectFile.js +0 -32
- package/src/audit/languageAnalysisEngine/constants.js +0 -23
- package/src/audit/languageAnalysisEngine/getIdentifiedLanguageInfo.js +0 -41
- package/src/audit/languageAnalysisEngine/index.js +0 -45
- package/src/audit/languageAnalysisEngine/languageAnalysisFactory.js +0 -116
- package/src/audit/languageAnalysisEngine/reduceIdentifiedLanguages.js +0 -249
- package/src/audit/nodeAnalysisEngine/handleNPMLockFileV2.js +0 -49
- package/src/audit/nodeAnalysisEngine/index.js +0 -35
- package/src/audit/nodeAnalysisEngine/parseNPMLockFileContents.js +0 -20
- package/src/audit/nodeAnalysisEngine/parseYarnLockFileContents.js +0 -26
- package/src/audit/nodeAnalysisEngine/readNPMLockFileContents.js +0 -23
- package/src/audit/nodeAnalysisEngine/readProjectFileContents.js +0 -27
- package/src/audit/nodeAnalysisEngine/readYarnLockFileContents.js +0 -36
- package/src/audit/nodeAnalysisEngine/sanitizer.js +0 -11
- package/src/audit/phpAnalysisEngine/index.js +0 -27
- package/src/audit/phpAnalysisEngine/parseLockFileContents.js +0 -60
- package/src/audit/phpAnalysisEngine/readLockFileContents.js +0 -14
- package/src/audit/phpAnalysisEngine/readProjectFileContents.js +0 -25
- package/src/audit/phpAnalysisEngine/sanitizer.js +0 -4
- package/src/audit/pythonAnalysisEngine/index.js +0 -55
- package/src/audit/pythonAnalysisEngine/parsePipfileLockContents.js +0 -23
- package/src/audit/pythonAnalysisEngine/parseProjectFileContents.js +0 -33
- package/src/audit/pythonAnalysisEngine/readPipfileLockFileContents.js +0 -16
- package/src/audit/pythonAnalysisEngine/readPythonProjectFileContents.js +0 -22
- package/src/audit/pythonAnalysisEngine/sanitizer.js +0 -9
- package/src/audit/rubyAnalysisEngine/index.js +0 -30
- package/src/audit/rubyAnalysisEngine/parseGemfileLockContents.js +0 -215
- package/src/audit/rubyAnalysisEngine/parsedGemfile.js +0 -39
- package/src/audit/rubyAnalysisEngine/readGemfileContents.js +0 -18
- package/src/audit/rubyAnalysisEngine/readGemfileLockContents.js +0 -17
- 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,35 +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 = checkForMultipleIdentifiedLanguages
|
|
@@ -1,41 +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 = 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
|