@contrast/contrast 1.0.8 → 1.0.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/audit/languageAnalysisEngine/getProjectRootFilenames.js +3 -12
- package/dist/audit/languageAnalysisEngine/report/commonReportingFunctions.js +88 -53
- package/dist/audit/languageAnalysisEngine/report/models/reportOutputModel.js +4 -3
- package/dist/audit/languageAnalysisEngine/report/reportingFeature.js +58 -11
- package/dist/audit/languageAnalysisEngine/report/utils/reportUtils.js +38 -5
- package/dist/audit/languageAnalysisEngine/sendSnapshot.js +6 -30
- package/dist/audit/save.js +21 -13
- package/dist/commands/audit/auditConfig.js +0 -16
- package/dist/commands/audit/auditController.js +1 -10
- package/dist/commands/audit/help.js +7 -24
- package/dist/commands/audit/processAudit.js +1 -7
- package/dist/commands/audit/saveFile.js +2 -2
- package/dist/commands/scan/sca/scaAnalysis.js +22 -9
- package/dist/common/HTTPClient.js +8 -8
- package/dist/constants/constants.js +7 -2
- package/dist/constants/locales.js +24 -30
- package/dist/constants.js +11 -9
- package/dist/index.js +54 -45
- package/dist/lambda/lambda.js +5 -2
- package/dist/sbom/generateSbom.js +2 -2
- package/dist/scaAnalysis/common/formatMessage.js +7 -1
- package/dist/scaAnalysis/common/treeUpload.js +4 -5
- package/dist/scaAnalysis/dotnet/analysis.js +43 -0
- package/dist/scaAnalysis/dotnet/index.js +10 -0
- package/dist/scaAnalysis/javascript/analysis.js +4 -7
- package/dist/scaAnalysis/javascript/index.js +14 -5
- package/dist/scaAnalysis/php/analysis.js +14 -33
- package/dist/scaAnalysis/php/index.js +11 -4
- package/dist/scaAnalysis/ruby/analysis.js +2 -10
- package/dist/scan/autoDetection.js +18 -21
- package/dist/scan/fileUtils.js +31 -12
- package/dist/scan/formatScanOutput.js +3 -3
- package/dist/scan/scanConfig.js +2 -2
- package/dist/utils/getConfig.js +1 -6
- package/package.json +2 -3
- package/src/audit/languageAnalysisEngine/getProjectRootFilenames.js +3 -32
- package/src/audit/languageAnalysisEngine/report/commonReportingFunctions.ts +128 -68
- package/src/audit/languageAnalysisEngine/report/models/reportOutputModel.ts +11 -5
- package/src/audit/languageAnalysisEngine/report/reportingFeature.ts +41 -19
- package/src/audit/languageAnalysisEngine/report/utils/reportUtils.ts +43 -4
- package/src/audit/languageAnalysisEngine/sendSnapshot.js +6 -32
- package/src/audit/save.js +32 -16
- package/src/commands/audit/auditConfig.ts +0 -25
- package/src/commands/audit/auditController.ts +0 -11
- package/src/commands/audit/help.ts +7 -24
- package/src/commands/audit/processAudit.ts +1 -7
- package/src/commands/audit/saveFile.ts +2 -2
- package/src/commands/scan/processScan.js +0 -1
- package/src/commands/scan/sca/scaAnalysis.js +28 -13
- package/src/common/HTTPClient.js +9 -9
- package/src/constants/constants.js +9 -3
- package/src/constants/locales.js +47 -35
- package/src/constants.js +12 -10
- package/src/index.ts +76 -66
- package/src/lambda/lambda.ts +5 -2
- package/src/lambda/types.ts +1 -0
- package/src/sbom/generateSbom.ts +2 -2
- package/src/scaAnalysis/common/formatMessage.js +8 -1
- package/src/scaAnalysis/common/treeUpload.js +4 -5
- package/src/scaAnalysis/dotnet/analysis.js +54 -0
- package/src/scaAnalysis/dotnet/index.js +11 -0
- package/src/scaAnalysis/javascript/analysis.js +6 -7
- package/src/scaAnalysis/javascript/index.js +23 -7
- package/src/scaAnalysis/php/analysis.js +15 -35
- package/src/scaAnalysis/php/index.js +15 -4
- package/src/scaAnalysis/ruby/analysis.js +2 -11
- package/src/scan/autoDetection.js +18 -24
- package/src/scan/fileUtils.js +33 -12
- package/src/scan/formatScanOutput.ts +3 -3
- package/src/scan/scanConfig.js +2 -4
- 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 -155
- 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 -25
- package/dist/audit/languageAnalysisEngine/checkForMultipleIdentifiedProjectFiles.js +0 -25
- package/dist/audit/languageAnalysisEngine/checkIdentifiedLanguageHasLockFile.js +0 -35
- package/dist/audit/languageAnalysisEngine/checkIdentifiedLanguageHasProjectFile.js +0 -24
- 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 -66
- package/dist/audit/languageAnalysisEngine/reduceIdentifiedLanguages.js +0 -166
- 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 -225
- 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 -36
- package/src/audit/languageAnalysisEngine/checkForMultipleIdentifiedProjectFiles.js +0 -42
- package/src/audit/languageAnalysisEngine/checkIdentifiedLanguageHasLockFile.js +0 -54
- package/src/audit/languageAnalysisEngine/checkIdentifiedLanguageHasProjectFile.js +0 -33
- 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 -96
- package/src/audit/languageAnalysisEngine/reduceIdentifiedLanguages.js +0 -251
- 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,33 +0,0 @@
|
|
|
1
|
-
const i18n = require('i18n')
|
|
2
|
-
/**
|
|
3
|
-
* Checks that a single identified language in the list of languages and files
|
|
4
|
-
* that has been reduced has a single project file. This is important in the
|
|
5
|
-
* (uncommon) case that a project has a lock file without a project file.
|
|
6
|
-
*/
|
|
7
|
-
module.exports = exports = (analysis, next) => {
|
|
8
|
-
const { languageAnalysis } = analysis
|
|
9
|
-
try {
|
|
10
|
-
checkIdentifiedLanguageHasProjectFile(languageAnalysis.identifiedLanguages)
|
|
11
|
-
} catch (err) {
|
|
12
|
-
next(err)
|
|
13
|
-
return
|
|
14
|
-
}
|
|
15
|
-
next()
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
const checkIdentifiedLanguageHasProjectFile = identifiedLanguages => {
|
|
19
|
-
// Handle the error case where only a single language has been identified...
|
|
20
|
-
if (Object.keys(identifiedLanguages).length == 1) {
|
|
21
|
-
let { projectFilenames } = Object.values(identifiedLanguages)[0]
|
|
22
|
-
|
|
23
|
-
// ...but no project files for that language have been found
|
|
24
|
-
if (projectFilenames.length == 0) {
|
|
25
|
-
const [language] = Object.keys(identifiedLanguages)
|
|
26
|
-
throw new Error(i18n.__('languageAnalysisProjectFileError', language))
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
//For testing purposes
|
|
32
|
-
exports.checkIdentifiedLanguageHasProjectFile =
|
|
33
|
-
checkIdentifiedLanguageHasProjectFile
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
// Language identifiers
|
|
2
|
-
const NODE = 'NODE'
|
|
3
|
-
const JAVASCRIPT = 'JAVASCRIPT'
|
|
4
|
-
const DOTNET = 'DOTNET'
|
|
5
|
-
const JAVA = 'JAVA'
|
|
6
|
-
const RUBY = 'RUBY'
|
|
7
|
-
const PYTHON = 'PYTHON'
|
|
8
|
-
const GO = 'GO'
|
|
9
|
-
// we set the langauge as Node instead of PHP since we're using the Node engine in TS
|
|
10
|
-
const PHP = 'PHP'
|
|
11
|
-
|
|
12
|
-
const LOW = 'LOW'
|
|
13
|
-
const MEDIUM = 'MEDIUM'
|
|
14
|
-
const HIGH = 'HIGH'
|
|
15
|
-
const CRITICAL = 'CRITICAL'
|
|
16
|
-
|
|
17
|
-
module.exports = {
|
|
18
|
-
supportedLanguages: { NODE, DOTNET, JAVA, RUBY, PYTHON, GO, PHP, JAVASCRIPT },
|
|
19
|
-
LOW: LOW,
|
|
20
|
-
MEDIUM: MEDIUM,
|
|
21
|
-
HIGH: HIGH,
|
|
22
|
-
CRITICAL: CRITICAL
|
|
23
|
-
}
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
const path = require('path')
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Assemble analysis results into a common object to provide
|
|
5
|
-
* language, project file name and paths
|
|
6
|
-
*/
|
|
7
|
-
module.exports = exports = (analysis, next) => {
|
|
8
|
-
const { file, languageAnalysis } = analysis
|
|
9
|
-
languageAnalysis.identifiedLanguageInfo = getIdentifiedLanguageInfo(
|
|
10
|
-
file,
|
|
11
|
-
languageAnalysis.identifiedLanguages
|
|
12
|
-
)
|
|
13
|
-
next()
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
const getIdentifiedLanguageInfo = (file, identifiedLanguages) => {
|
|
17
|
-
const [language] = Object.keys(identifiedLanguages)
|
|
18
|
-
const {
|
|
19
|
-
projectFilenames: [projectFilename],
|
|
20
|
-
lockFilenames: [lockFilename]
|
|
21
|
-
} = Object.values(identifiedLanguages)[0]
|
|
22
|
-
|
|
23
|
-
let identifiedLanguageInfo = {
|
|
24
|
-
language,
|
|
25
|
-
projectFilename,
|
|
26
|
-
projectFilePath: path.join(file, projectFilename)
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
if (lockFilename) {
|
|
30
|
-
identifiedLanguageInfo = {
|
|
31
|
-
...identifiedLanguageInfo,
|
|
32
|
-
lockFilename,
|
|
33
|
-
lockFilePath: path.join(file, lockFilename)
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
return identifiedLanguageInfo
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
//For testing purposes
|
|
41
|
-
exports.getIdentifiedLanguageInfo = getIdentifiedLanguageInfo
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
const AnalysisEngine = require('./../AnalysisEngine')
|
|
2
|
-
const i18n = require('i18n')
|
|
3
|
-
|
|
4
|
-
const getProjectRootFilenames = require('./getProjectRootFilenames')
|
|
5
|
-
const reduceIdentifiedLanguages = require('./reduceIdentifiedLanguages')
|
|
6
|
-
const checkForMultipleIdentifiedLanguages = require('./checkForMultipleIdentifiedLanguages')
|
|
7
|
-
const checkForMultipleIdentifiedProjectFiles = require('./checkForMultipleIdentifiedProjectFiles')
|
|
8
|
-
const checkIdentifiedLanguageHasProjectFile = require('./checkIdentifiedLanguageHasProjectFile')
|
|
9
|
-
const checkIdentifiedLanguageHasLockFile = require('./checkIdentifiedLanguageHasLockFile')
|
|
10
|
-
const getIdentifiedLanguageInfo = require('./getIdentifiedLanguageInfo')
|
|
11
|
-
const { libraryAnalysisError } = require('../../common/errorHandling')
|
|
12
|
-
|
|
13
|
-
module.exports = exports = (file, callback, appId, config) => {
|
|
14
|
-
// Create an analysis engine to identify the project language
|
|
15
|
-
const ae = new AnalysisEngine({
|
|
16
|
-
file,
|
|
17
|
-
appId,
|
|
18
|
-
languageAnalysis: { appId: appId },
|
|
19
|
-
config
|
|
20
|
-
})
|
|
21
|
-
|
|
22
|
-
ae.use([
|
|
23
|
-
getProjectRootFilenames,
|
|
24
|
-
reduceIdentifiedLanguages,
|
|
25
|
-
checkForMultipleIdentifiedLanguages,
|
|
26
|
-
checkForMultipleIdentifiedProjectFiles,
|
|
27
|
-
checkIdentifiedLanguageHasProjectFile,
|
|
28
|
-
checkIdentifiedLanguageHasLockFile,
|
|
29
|
-
getIdentifiedLanguageInfo
|
|
30
|
-
])
|
|
31
|
-
|
|
32
|
-
ae.analyze((err, analysis) => {
|
|
33
|
-
if (err) {
|
|
34
|
-
console.log(
|
|
35
|
-
'*******************' +
|
|
36
|
-
i18n.__('languageAnalysisFailureMessage') +
|
|
37
|
-
'****************'
|
|
38
|
-
)
|
|
39
|
-
console.error(`${err.message}`)
|
|
40
|
-
libraryAnalysisError()
|
|
41
|
-
process.exit(1)
|
|
42
|
-
}
|
|
43
|
-
callback(null, analysis)
|
|
44
|
-
})
|
|
45
|
-
}
|
|
@@ -1,96 +0,0 @@
|
|
|
1
|
-
const {
|
|
2
|
-
supportedLanguages: { DOTNET, NODE, JAVA, RUBY, PYTHON, GO, PHP }
|
|
3
|
-
} = require('../languageAnalysisEngine/constants')
|
|
4
|
-
const i18n = require('i18n')
|
|
5
|
-
const dotnetAE = require('../dotnetAnalysisEngine')
|
|
6
|
-
const nodeAE = require('../nodeAnalysisEngine')
|
|
7
|
-
const javaAE = require('../javaAnalysisEngine')
|
|
8
|
-
const rubyAE = require('../rubyAnalysisEngine')
|
|
9
|
-
const pythonAE = require('../pythonAnalysisEngine')
|
|
10
|
-
const phpAE = require('../phpAnalysisEngine')
|
|
11
|
-
const goAE = require('../goAnalysisEngine')
|
|
12
|
-
const { vulnerabilityReport } = require('./report/reportingFeature')
|
|
13
|
-
const { newSendSnapShot } = require('../languageAnalysisEngine/sendSnapshot')
|
|
14
|
-
const {
|
|
15
|
-
returnOra,
|
|
16
|
-
startSpinner,
|
|
17
|
-
succeedSpinner
|
|
18
|
-
} = require('../../utils/oraWrapper')
|
|
19
|
-
const { pollForSnapshotCompletition } = require('./sendSnapshot')
|
|
20
|
-
const auditSave = require('../save')
|
|
21
|
-
|
|
22
|
-
module.exports = exports = (err, analysis) => {
|
|
23
|
-
const { identifiedLanguageInfo } = analysis.languageAnalysis
|
|
24
|
-
const catalogueAppId = analysis.languageAnalysis.appId
|
|
25
|
-
|
|
26
|
-
if (err) {
|
|
27
|
-
console.error(err)
|
|
28
|
-
return
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
// this callback is the end of the chain
|
|
32
|
-
const langCallback = async (err, analysis) => {
|
|
33
|
-
const config = analysis.config
|
|
34
|
-
if (err) {
|
|
35
|
-
console.log()
|
|
36
|
-
console.log(
|
|
37
|
-
'***********' +
|
|
38
|
-
i18n.__('languageAnalysisFactoryFailureHeader') +
|
|
39
|
-
'****************'
|
|
40
|
-
)
|
|
41
|
-
console.log(identifiedLanguageInfo.language)
|
|
42
|
-
console.log()
|
|
43
|
-
console.error(
|
|
44
|
-
`${identifiedLanguageInfo.language}` +
|
|
45
|
-
i18n.__('languageAnalysisFailure') +
|
|
46
|
-
err
|
|
47
|
-
)
|
|
48
|
-
return process.exit(5)
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
const reportSpinner = returnOra(i18n.__('auditSCAAnalysisBegins'))
|
|
52
|
-
startSpinner(reportSpinner)
|
|
53
|
-
const snapshotResponse = await newSendSnapShot(analysis, catalogueAppId)
|
|
54
|
-
|
|
55
|
-
//poll for completion
|
|
56
|
-
await pollForSnapshotCompletition(
|
|
57
|
-
analysis.config,
|
|
58
|
-
snapshotResponse.id,
|
|
59
|
-
reportSpinner
|
|
60
|
-
)
|
|
61
|
-
succeedSpinner(reportSpinner, i18n.__('auditSCAAnalysisComplete'))
|
|
62
|
-
|
|
63
|
-
await vulnerabilityReport(analysis, catalogueAppId, snapshotResponse.id)
|
|
64
|
-
|
|
65
|
-
//should be moved to processAudit.ts once promises implemented
|
|
66
|
-
await auditSave.auditSave(config)
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
if (identifiedLanguageInfo.language === DOTNET) {
|
|
70
|
-
dotnetAE(identifiedLanguageInfo, analysis.config, langCallback)
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
if (identifiedLanguageInfo.language === NODE) {
|
|
74
|
-
nodeAE(identifiedLanguageInfo, analysis.config, langCallback)
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
if (identifiedLanguageInfo.language === JAVA) {
|
|
78
|
-
javaAE(identifiedLanguageInfo, analysis.config, langCallback)
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
if (identifiedLanguageInfo.language === RUBY) {
|
|
82
|
-
rubyAE(identifiedLanguageInfo, analysis.config, langCallback)
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
if (identifiedLanguageInfo.language === PYTHON) {
|
|
86
|
-
pythonAE(identifiedLanguageInfo, analysis.config, langCallback)
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
if (identifiedLanguageInfo.language === PHP) {
|
|
90
|
-
phpAE(identifiedLanguageInfo, analysis.config, langCallback)
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
if (identifiedLanguageInfo.language === GO) {
|
|
94
|
-
goAE(identifiedLanguageInfo, analysis.config, langCallback)
|
|
95
|
-
}
|
|
96
|
-
}
|
|
@@ -1,251 +0,0 @@
|
|
|
1
|
-
const {
|
|
2
|
-
supportedLanguages: { NODE, DOTNET, JAVA, RUBY, PYTHON, GO, PHP, JAVASCRIPT }
|
|
3
|
-
} = require('./constants')
|
|
4
|
-
const i18n = require('i18n')
|
|
5
|
-
|
|
6
|
-
const DOT_NET_PROJECT_FILE_REGEX = /.+\.csproj$/
|
|
7
|
-
const DOT_NET_LOCK_FILENAME = 'packages.lock.json'
|
|
8
|
-
|
|
9
|
-
const isDotNetProjectFilename = filename =>
|
|
10
|
-
filename.search(DOT_NET_PROJECT_FILE_REGEX) !== -1
|
|
11
|
-
const isDotNetLockFilename = filename => filename === DOT_NET_LOCK_FILENAME
|
|
12
|
-
function isJavaMavenProjectFilename(filename) {
|
|
13
|
-
return filename === 'pom.xml'
|
|
14
|
-
}
|
|
15
|
-
function isJavaGradleProjectFilename(filename) {
|
|
16
|
-
return filename === 'build.gradle' || filename === 'build.gradle.kts'
|
|
17
|
-
}
|
|
18
|
-
const isRubyProjectFilename = filename => filename === 'Gemfile'
|
|
19
|
-
const isNodeProjectFilename = filename => filename === 'package.json'
|
|
20
|
-
const isPythonProjectFilename = filename =>
|
|
21
|
-
filename === 'requirements.txt' || filename === 'Pipfile'
|
|
22
|
-
const isPhpProjectFilename = filename => filename === 'composer.json'
|
|
23
|
-
const isPhpLockFilename = filename => filename === 'composer.lock'
|
|
24
|
-
function isNodeLockFilename(filename) {
|
|
25
|
-
return filename === 'package-lock.json' || filename === 'yarn.lock'
|
|
26
|
-
}
|
|
27
|
-
const isRubyLockFilename = filename => filename === 'Gemfile.lock'
|
|
28
|
-
const isPipfileLockLockFilename = filename => filename === 'Pipfile.lock'
|
|
29
|
-
const isGoProjectFilename = filename => filename === 'go.mod'
|
|
30
|
-
|
|
31
|
-
const deduceLanguageScaAnalysis = filenames => {
|
|
32
|
-
const deducedLanguages = []
|
|
33
|
-
let language = ''
|
|
34
|
-
|
|
35
|
-
filenames.forEach(filename => {
|
|
36
|
-
// Check for project filenames...
|
|
37
|
-
if (isJavaMavenProjectFilename(filename)) {
|
|
38
|
-
deducedLanguages.push(filename)
|
|
39
|
-
language = JAVA
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
if (isJavaGradleProjectFilename(filename)) {
|
|
43
|
-
deducedLanguages.push(filename)
|
|
44
|
-
language = JAVA
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
if (isNodeProjectFilename(filename)) {
|
|
48
|
-
deducedLanguages.push(filename)
|
|
49
|
-
language = JAVASCRIPT
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
// if (isDotNetProjectFilename(filename)) {
|
|
53
|
-
// deducedLanguages.push({language: DOTNET, projectFilename: filename})
|
|
54
|
-
// }
|
|
55
|
-
|
|
56
|
-
if (isRubyProjectFilename(filename)) {
|
|
57
|
-
deducedLanguages.push(filename)
|
|
58
|
-
language = RUBY
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
if (isPythonProjectFilename(filename)) {
|
|
62
|
-
deducedLanguages.push(filename)
|
|
63
|
-
language = PYTHON
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
if (isPhpProjectFilename(filename)) {
|
|
67
|
-
deducedLanguages.push({ language: PHP, projectFilename: filename })
|
|
68
|
-
language = PHP
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
// // Check for lock filenames...
|
|
72
|
-
// if (isDotNetLockFilename(filename)) {
|
|
73
|
-
// deducedLanguages.push({language: DOTNET, lockFilename: filename})
|
|
74
|
-
// }
|
|
75
|
-
|
|
76
|
-
if (isNodeLockFilename(filename)) {
|
|
77
|
-
deducedLanguages.push(filename)
|
|
78
|
-
language = JAVASCRIPT
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
// if (isRubyLockFilename(filename)) {
|
|
82
|
-
// deducedLanguages.push({language: RUBY, lockFilename: filename})
|
|
83
|
-
// }
|
|
84
|
-
//
|
|
85
|
-
// // this is pipfileLock rather than python lock as there can be different python locks
|
|
86
|
-
// if (isPipfileLockLockFilename(filename)) {
|
|
87
|
-
// deducedLanguages.push({language: PYTHON, lockFilename: filename})
|
|
88
|
-
// }
|
|
89
|
-
|
|
90
|
-
if (isPhpLockFilename(filename)) {
|
|
91
|
-
deducedLanguages.push({ language: PHP, lockFilename: filename })
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
// go does not have a lockfile, it should have a go.mod file containing the modules
|
|
95
|
-
if (isGoProjectFilename(filename)) {
|
|
96
|
-
deducedLanguages.push({ language: GO, projectFilename: filename })
|
|
97
|
-
language = GO
|
|
98
|
-
}
|
|
99
|
-
})
|
|
100
|
-
let identifiedLanguages = { [language]: deducedLanguages }
|
|
101
|
-
|
|
102
|
-
return identifiedLanguages
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
const deduceLanguage = filename => {
|
|
106
|
-
const deducedLanguages = []
|
|
107
|
-
|
|
108
|
-
// In theory there shouldn't be multiple languages supported for a single
|
|
109
|
-
// project filename or lock filename but to protect ourselves and consumers we
|
|
110
|
-
// will try to detect it
|
|
111
|
-
|
|
112
|
-
// Check for project filenames...
|
|
113
|
-
if (isJavaMavenProjectFilename(filename)) {
|
|
114
|
-
deducedLanguages.push({ language: JAVA, projectFilename: filename })
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
if (isJavaGradleProjectFilename(filename)) {
|
|
118
|
-
deducedLanguages.push({ language: JAVA, projectFilename: filename })
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
if (isNodeProjectFilename(filename)) {
|
|
122
|
-
deducedLanguages.push({ language: NODE, projectFilename: filename })
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
if (isDotNetProjectFilename(filename)) {
|
|
126
|
-
deducedLanguages.push({ language: DOTNET, projectFilename: filename })
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
if (isRubyProjectFilename(filename)) {
|
|
130
|
-
deducedLanguages.push({ language: RUBY, projectFilename: filename })
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
if (isPythonProjectFilename(filename)) {
|
|
134
|
-
deducedLanguages.push({ language: PYTHON, projectFilename: filename })
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
if (isPhpProjectFilename(filename)) {
|
|
138
|
-
deducedLanguages.push({ language: PHP, projectFilename: filename })
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
// Check for lock filenames...
|
|
142
|
-
if (isDotNetLockFilename(filename)) {
|
|
143
|
-
deducedLanguages.push({ language: DOTNET, lockFilename: filename })
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
if (isNodeLockFilename(filename)) {
|
|
147
|
-
deducedLanguages.push({ language: NODE, lockFilename: filename })
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
if (isRubyLockFilename(filename)) {
|
|
151
|
-
deducedLanguages.push({ language: RUBY, lockFilename: filename })
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
// this is pipfileLock rather than python lock as there can be different python locks
|
|
155
|
-
if (isPipfileLockLockFilename(filename)) {
|
|
156
|
-
deducedLanguages.push({ language: PYTHON, lockFilename: filename })
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
if (isPhpLockFilename(filename)) {
|
|
160
|
-
deducedLanguages.push({ language: PHP, lockFilename: filename })
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
// go does not have a lockfile, it should have a go.mod file containing the modules
|
|
164
|
-
if (isGoProjectFilename(filename)) {
|
|
165
|
-
deducedLanguages.push({ language: GO, projectFilename: filename })
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
return deducedLanguages
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
const reduceIdentifiedLanguages = identifiedLanguages =>
|
|
172
|
-
identifiedLanguages.reduce((accumulator, identifiedLanguageInfo) => {
|
|
173
|
-
const { language, projectFilename, lockFilename } = identifiedLanguageInfo
|
|
174
|
-
|
|
175
|
-
// Add an entry to our map for an identified language (and its filename)
|
|
176
|
-
// if we haven't accumulated it yet. Otherwise simply add the filename to the
|
|
177
|
-
// existing list.
|
|
178
|
-
if (!(language in accumulator)) {
|
|
179
|
-
accumulator[language] = { projectFilenames: [], lockFilenames: [] }
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
if (projectFilename) {
|
|
183
|
-
accumulator[language].projectFilenames.push(projectFilename)
|
|
184
|
-
} else {
|
|
185
|
-
accumulator[language].lockFilenames.push(lockFilename)
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
return accumulator
|
|
189
|
-
}, {})
|
|
190
|
-
|
|
191
|
-
/**
|
|
192
|
-
* Look at each filename and using a heuristic see if we can determine that it
|
|
193
|
-
* specifies a specific language
|
|
194
|
-
*/
|
|
195
|
-
module.exports = exports = (analysis, next) => {
|
|
196
|
-
const { file, languageAnalysis, config } = analysis
|
|
197
|
-
|
|
198
|
-
let identifiedLanguages = languageAnalysis.projectRootFilenames.reduce(
|
|
199
|
-
(accumulator, filename) => {
|
|
200
|
-
const deducedLanguages = deduceLanguage(filename)
|
|
201
|
-
return [...accumulator, ...deducedLanguages]
|
|
202
|
-
},
|
|
203
|
-
[]
|
|
204
|
-
)
|
|
205
|
-
|
|
206
|
-
if (Object.keys(identifiedLanguages).length === 0) {
|
|
207
|
-
next(new Error(i18n.__('languageAnalysisNoLanguage', file)))
|
|
208
|
-
return
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
let language = config.language
|
|
212
|
-
if (language === undefined) {
|
|
213
|
-
languageAnalysis.identifiedLanguages =
|
|
214
|
-
reduceIdentifiedLanguages(identifiedLanguages)
|
|
215
|
-
} else {
|
|
216
|
-
let refinedIdentifiedLanguages = []
|
|
217
|
-
for (let x in identifiedLanguages) {
|
|
218
|
-
if (
|
|
219
|
-
identifiedLanguages[x].language === language.toUpperCase() ||
|
|
220
|
-
(identifiedLanguages[x].language === NODE &&
|
|
221
|
-
language.toUpperCase() === JAVASCRIPT)
|
|
222
|
-
) {
|
|
223
|
-
refinedIdentifiedLanguages.push(identifiedLanguages[x])
|
|
224
|
-
}
|
|
225
|
-
}
|
|
226
|
-
//languages found do not meet that supplied by the user
|
|
227
|
-
if (refinedIdentifiedLanguages.length === 0) {
|
|
228
|
-
console.log(`Could not detect language as specified: ${config.language}`)
|
|
229
|
-
process.exit(1)
|
|
230
|
-
}
|
|
231
|
-
|
|
232
|
-
languageAnalysis.identifiedLanguages = reduceIdentifiedLanguages(
|
|
233
|
-
refinedIdentifiedLanguages
|
|
234
|
-
)
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
next()
|
|
238
|
-
}
|
|
239
|
-
|
|
240
|
-
//For testing purposes
|
|
241
|
-
exports.isJavaMavenProjectFilename = isJavaMavenProjectFilename
|
|
242
|
-
exports.isJavaGradleProjectFilename = isJavaGradleProjectFilename
|
|
243
|
-
exports.isNodeProjectFilename = isNodeProjectFilename
|
|
244
|
-
exports.isDotNetProjectFilename = isDotNetProjectFilename
|
|
245
|
-
exports.isDotNetLockFilename = isDotNetLockFilename
|
|
246
|
-
exports.isGoProjectFilename = isGoProjectFilename
|
|
247
|
-
exports.isPhpProjectFilename = isPhpProjectFilename
|
|
248
|
-
exports.isPhpLockFilename = isPhpLockFilename
|
|
249
|
-
exports.deduceLanguage = deduceLanguage
|
|
250
|
-
exports.reduceIdentifiedLanguages = reduceIdentifiedLanguages
|
|
251
|
-
exports.deduceLanguageScaAnalysis = deduceLanguageScaAnalysis
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
const i18n = require('i18n')
|
|
2
|
-
module.exports = exports = (analysis, next) => {
|
|
3
|
-
const {
|
|
4
|
-
language: { lockFilePath },
|
|
5
|
-
node
|
|
6
|
-
} = analysis
|
|
7
|
-
|
|
8
|
-
try {
|
|
9
|
-
if (node.npmLockFile && node.npmLockFile.lockfileVersion > 1) {
|
|
10
|
-
const listOfTopDep = Object.keys(node.npmLockFile.dependencies)
|
|
11
|
-
Object.entries(node.npmLockFile.dependencies).forEach(([key, value]) => {
|
|
12
|
-
if (value.requires) {
|
|
13
|
-
const listOfRequiresDep = Object.keys(value.requires)
|
|
14
|
-
listOfRequiresDep.forEach(dep => {
|
|
15
|
-
if (!listOfTopDep.includes(dep)) {
|
|
16
|
-
addDepToLockFile(value['requires'], dep)
|
|
17
|
-
}
|
|
18
|
-
})
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
if (value.dependencies) {
|
|
22
|
-
Object.entries(value.dependencies).forEach(
|
|
23
|
-
([childKey, childValue]) => {
|
|
24
|
-
if (childValue.requires) {
|
|
25
|
-
const listOfRequiresDep = Object.keys(childValue.requires)
|
|
26
|
-
listOfRequiresDep.forEach(dep => {
|
|
27
|
-
if (!listOfTopDep.includes(dep)) {
|
|
28
|
-
addDepToLockFile(childValue['requires'], dep)
|
|
29
|
-
}
|
|
30
|
-
})
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
)
|
|
34
|
-
}
|
|
35
|
-
})
|
|
36
|
-
}
|
|
37
|
-
} catch (err) {
|
|
38
|
-
next(
|
|
39
|
-
next(new Error(i18n.__('NodeParseNPM', lockFilePath) + `${err.message}`))
|
|
40
|
-
)
|
|
41
|
-
return
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
function addDepToLockFile(depObj, key) {
|
|
45
|
-
node.npmLockFile.dependencies[key] = { version: depObj[key] }
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
next()
|
|
49
|
-
}
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
const AnalysisEngine = require('../AnalysisEngine')
|
|
2
|
-
|
|
3
|
-
const readProjectFileContents = require('./readProjectFileContents')
|
|
4
|
-
const readNPMLockFileContents = require('./readNPMLockFileContents')
|
|
5
|
-
const parseNPMLockFileContents = require('./parseNPMLockFileContents')
|
|
6
|
-
const readYarnLockFileContents = require('./readYarnLockFileContents')
|
|
7
|
-
const parseYarnLockFileContents = require('./parseYarnLockFileContents')
|
|
8
|
-
const parseYarn2LockFileContents = require('./parseYarn2LockFileContents')
|
|
9
|
-
const handleNPMLockFileV2 = require('./handleNPMLockFileV2')
|
|
10
|
-
const sanitizer = require('./sanitizer')
|
|
11
|
-
const i18n = require('i18n')
|
|
12
|
-
|
|
13
|
-
module.exports = exports = (language, config, callback) => {
|
|
14
|
-
const ae = new AnalysisEngine({ language, config, node: {} })
|
|
15
|
-
|
|
16
|
-
ae.use([
|
|
17
|
-
readProjectFileContents,
|
|
18
|
-
readNPMLockFileContents,
|
|
19
|
-
parseNPMLockFileContents,
|
|
20
|
-
readYarnLockFileContents,
|
|
21
|
-
parseYarnLockFileContents,
|
|
22
|
-
parseYarn2LockFileContents,
|
|
23
|
-
handleNPMLockFileV2,
|
|
24
|
-
sanitizer
|
|
25
|
-
])
|
|
26
|
-
|
|
27
|
-
ae.analyze((err, analysis) => {
|
|
28
|
-
if (err) {
|
|
29
|
-
callback(new Error(i18n.__('NodeAnalysisFailure') + `${err.message}`))
|
|
30
|
-
return
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
callback(null, analysis)
|
|
34
|
-
})
|
|
35
|
-
}
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
const i18n = require('i18n')
|
|
2
|
-
module.exports = exports = ({ language: { lockFilePath }, node }, next) => {
|
|
3
|
-
// If we never read the package-lock file then pass priority
|
|
4
|
-
if (node.rawLockFileContents === undefined) {
|
|
5
|
-
next()
|
|
6
|
-
} else {
|
|
7
|
-
try {
|
|
8
|
-
node.npmLockFile = JSON.parse(node.rawLockFileContents)
|
|
9
|
-
} catch (err) {
|
|
10
|
-
next(
|
|
11
|
-
new Error(
|
|
12
|
-
i18n.__('NodeParseNPM', lockFilePath ? lockFilePath : 'undefined') +
|
|
13
|
-
`${err.message}`
|
|
14
|
-
)
|
|
15
|
-
)
|
|
16
|
-
return
|
|
17
|
-
}
|
|
18
|
-
next()
|
|
19
|
-
}
|
|
20
|
-
}
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
const yarnParser = require('@yarnpkg/lockfile')
|
|
2
|
-
const i18n = require('i18n')
|
|
3
|
-
|
|
4
|
-
module.exports = exports = ({ language: { lockFilename }, node }, next) => {
|
|
5
|
-
// If we never read the lock file then pass priority
|
|
6
|
-
if (node.rawYarnLockFileContents === undefined || node.yarnVersion === 2) {
|
|
7
|
-
next()
|
|
8
|
-
} else {
|
|
9
|
-
try {
|
|
10
|
-
node.yarnLockFile = yarnParser.parse(node.rawYarnLockFileContents)
|
|
11
|
-
} catch (err) {
|
|
12
|
-
next(
|
|
13
|
-
new Error(
|
|
14
|
-
i18n.__(
|
|
15
|
-
'NodeParseYarn',
|
|
16
|
-
lockFilename.lockFilePath ? lockFilename.lockFilePath : 'undefined'
|
|
17
|
-
) + `${err.message}`
|
|
18
|
-
)
|
|
19
|
-
)
|
|
20
|
-
|
|
21
|
-
return
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
next()
|
|
25
|
-
}
|
|
26
|
-
}
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
const fs = require('fs')
|
|
2
|
-
const i18n = require('i18n')
|
|
3
|
-
|
|
4
|
-
module.exports = exports = ({ language: { lockFilePath }, node }, next) => {
|
|
5
|
-
// check if the lockFilename is populated and if it is check to
|
|
6
|
-
// see if it has the package-lock if not then go on to next handler
|
|
7
|
-
if (!lockFilePath || !lockFilePath.includes('package-lock.json')) {
|
|
8
|
-
next()
|
|
9
|
-
return
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
try {
|
|
13
|
-
node.rawLockFileContents = fs.readFileSync(lockFilePath)
|
|
14
|
-
} catch (err) {
|
|
15
|
-
next(
|
|
16
|
-
new Error(i18n.__('NodeReadNpmError', lockFilePath) + `${err.message}`)
|
|
17
|
-
)
|
|
18
|
-
|
|
19
|
-
return
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
next()
|
|
23
|
-
}
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
const fs = require('fs')
|
|
2
|
-
const i18n = require('i18n')
|
|
3
|
-
|
|
4
|
-
module.exports = exports = (analysis, next) => {
|
|
5
|
-
const {
|
|
6
|
-
language: { projectFilePath },
|
|
7
|
-
node
|
|
8
|
-
} = analysis
|
|
9
|
-
|
|
10
|
-
// Read the NODE project file contents. We are reading into memory presuming
|
|
11
|
-
// that the contents of the file aren't large which may be bad... Could look
|
|
12
|
-
// into streaming in the future
|
|
13
|
-
|
|
14
|
-
try {
|
|
15
|
-
// package.json is stored in the projectFilePath other files have the word lock so are stored in lockFilename arr
|
|
16
|
-
node.packageJSON = JSON.parse(fs.readFileSync(projectFilePath, 'utf8'))
|
|
17
|
-
} catch (err) {
|
|
18
|
-
next(
|
|
19
|
-
new Error(
|
|
20
|
-
i18n.__('nodeReadProjectFileError', projectFilePath) + `${err.message}`
|
|
21
|
-
)
|
|
22
|
-
)
|
|
23
|
-
return
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
next()
|
|
27
|
-
}
|