@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
package/dist/scan/fileUtils.js
CHANGED
|
@@ -10,69 +10,87 @@ const findFile = async () => {
|
|
|
10
10
|
onlyFiles: true
|
|
11
11
|
});
|
|
12
12
|
};
|
|
13
|
-
const findFilesJava = async (languagesFound) => {
|
|
13
|
+
const findFilesJava = async (languagesFound, filePath) => {
|
|
14
14
|
const result = await fg(['**/pom.xml', '**/build.gradle', '**/build.gradle.kts'], {
|
|
15
15
|
dot: false,
|
|
16
16
|
deep: 1,
|
|
17
|
-
onlyFiles: true
|
|
17
|
+
onlyFiles: true,
|
|
18
|
+
cwd: filePath ? filePath : process.cwd()
|
|
18
19
|
});
|
|
19
20
|
if (result.length > 0) {
|
|
20
|
-
return languagesFound.push({
|
|
21
|
+
return languagesFound.push({ JAVA: result });
|
|
21
22
|
}
|
|
22
23
|
return languagesFound;
|
|
23
24
|
};
|
|
24
|
-
const findFilesJavascript = async (languagesFound) => {
|
|
25
|
-
const result = await fg(['**/package.json', '**/yarn.lock', '**/package
|
|
25
|
+
const findFilesJavascript = async (languagesFound, filePath) => {
|
|
26
|
+
const result = await fg(['**/package.json', '**/yarn.lock', '**/package-lock.json'], {
|
|
26
27
|
dot: false,
|
|
27
28
|
deep: 1,
|
|
28
|
-
onlyFiles: true
|
|
29
|
+
onlyFiles: true,
|
|
30
|
+
cwd: filePath ? filePath : process.cwd()
|
|
29
31
|
});
|
|
30
32
|
if (result.length > 0) {
|
|
31
|
-
return languagesFound.push({
|
|
33
|
+
return languagesFound.push({ JAVASCRIPT: result });
|
|
32
34
|
}
|
|
33
35
|
return languagesFound;
|
|
34
36
|
};
|
|
35
|
-
const findFilesPython = async (languagesFound) => {
|
|
37
|
+
const findFilesPython = async (languagesFound, filePath) => {
|
|
36
38
|
const result = await fg(['**/Pipfile.lock', '**/Pipfile'], {
|
|
37
39
|
dot: false,
|
|
38
40
|
deep: 3,
|
|
39
|
-
onlyFiles: true
|
|
41
|
+
onlyFiles: true,
|
|
42
|
+
cwd: filePath ? filePath : process.cwd()
|
|
40
43
|
});
|
|
41
44
|
if (result.length > 0) {
|
|
42
|
-
return languagesFound.push({
|
|
45
|
+
return languagesFound.push({ PYTHON: result });
|
|
43
46
|
}
|
|
44
47
|
return languagesFound;
|
|
45
48
|
};
|
|
46
|
-
const findFilesGo = async (languagesFound) => {
|
|
49
|
+
const findFilesGo = async (languagesFound, filePath) => {
|
|
47
50
|
const result = await fg(['**/go.mod'], {
|
|
48
51
|
dot: false,
|
|
49
52
|
deep: 3,
|
|
50
|
-
onlyFiles: true
|
|
53
|
+
onlyFiles: true,
|
|
54
|
+
cwd: filePath ? filePath : process.cwd()
|
|
51
55
|
});
|
|
52
56
|
if (result.length > 0) {
|
|
53
|
-
return languagesFound.push({
|
|
57
|
+
return languagesFound.push({ GO: result });
|
|
54
58
|
}
|
|
55
59
|
return languagesFound;
|
|
56
60
|
};
|
|
57
|
-
const findFilesRuby = async (languagesFound) => {
|
|
61
|
+
const findFilesRuby = async (languagesFound, filePath) => {
|
|
58
62
|
const result = await fg(['**/Gemfile', '**/Gemfile.lock'], {
|
|
59
63
|
dot: false,
|
|
60
64
|
deep: 3,
|
|
61
|
-
onlyFiles: true
|
|
65
|
+
onlyFiles: true,
|
|
66
|
+
cwd: filePath ? filePath : process.cwd()
|
|
62
67
|
});
|
|
63
68
|
if (result.length > 0) {
|
|
64
|
-
return languagesFound.push({
|
|
69
|
+
return languagesFound.push({ RUBY: result });
|
|
65
70
|
}
|
|
66
71
|
return languagesFound;
|
|
67
72
|
};
|
|
68
|
-
const findFilesPhp = async (languagesFound) => {
|
|
73
|
+
const findFilesPhp = async (languagesFound, filePath) => {
|
|
69
74
|
const result = await fg(['**/composer.json', '**/composer.lock'], {
|
|
70
75
|
dot: false,
|
|
71
76
|
deep: 3,
|
|
72
|
-
onlyFiles: true
|
|
77
|
+
onlyFiles: true,
|
|
78
|
+
cwd: filePath ? filePath : process.cwd()
|
|
73
79
|
});
|
|
74
80
|
if (result.length > 0) {
|
|
75
|
-
return languagesFound.push({
|
|
81
|
+
return languagesFound.push({ PHP: result });
|
|
82
|
+
}
|
|
83
|
+
return languagesFound;
|
|
84
|
+
};
|
|
85
|
+
const findFilesDotNet = async (languagesFound, filePath) => {
|
|
86
|
+
const result = await fg(['**/*.csproj', '**/packages.lock.json'], {
|
|
87
|
+
dot: false,
|
|
88
|
+
deep: 3,
|
|
89
|
+
onlyFiles: true,
|
|
90
|
+
cwd: filePath ? filePath : process.cwd()
|
|
91
|
+
});
|
|
92
|
+
if (result.length > 0) {
|
|
93
|
+
return languagesFound.push({ DOTNET: result });
|
|
76
94
|
}
|
|
77
95
|
return languagesFound;
|
|
78
96
|
};
|
|
@@ -90,6 +108,23 @@ const checkFilePermissions = file => {
|
|
|
90
108
|
const fileExists = path => {
|
|
91
109
|
return fs.existsSync(path);
|
|
92
110
|
};
|
|
111
|
+
const fileIsEmpty = path => {
|
|
112
|
+
if (fileExists(path) && checkFilePermissions(path)) {
|
|
113
|
+
try {
|
|
114
|
+
return fs.readFileSync(path).length === 0;
|
|
115
|
+
}
|
|
116
|
+
catch (e) {
|
|
117
|
+
if (e.message.toString().includes('illegal operation on a directory, read')) {
|
|
118
|
+
console.log('file provided cannot be a directory');
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
console.log(e.message.toString());
|
|
122
|
+
}
|
|
123
|
+
process.exit(0);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
return false;
|
|
127
|
+
};
|
|
93
128
|
module.exports = {
|
|
94
129
|
findFile,
|
|
95
130
|
fileExists,
|
|
@@ -99,5 +134,7 @@ module.exports = {
|
|
|
99
134
|
findFilesPython,
|
|
100
135
|
findFilesGo,
|
|
101
136
|
findFilesPhp,
|
|
102
|
-
findFilesRuby
|
|
137
|
+
findFilesRuby,
|
|
138
|
+
findFilesDotNet,
|
|
139
|
+
fileIsEmpty
|
|
103
140
|
};
|
|
@@ -12,7 +12,7 @@ const cli_table3_1 = __importDefault(require("cli-table3"));
|
|
|
12
12
|
const constants_1 = require("../constants/constants");
|
|
13
13
|
function formatScanOutput(scanResults) {
|
|
14
14
|
const { scanResultsInstances } = scanResults;
|
|
15
|
-
|
|
15
|
+
const projectOverview = getProjectOverview(scanResultsInstances);
|
|
16
16
|
if (scanResultsInstances.content.length === 0) {
|
|
17
17
|
console.log(i18n_1.default.__('scanNoVulnerabilitiesFound'));
|
|
18
18
|
console.log(i18n_1.default.__('scanNoVulnerabilitiesFoundSecureCode'));
|
|
@@ -25,8 +25,9 @@ function formatScanOutput(scanResults) {
|
|
|
25
25
|
console.log(chalk_1.default.bold(message));
|
|
26
26
|
console.log();
|
|
27
27
|
let defaultView = getDefaultView(scanResultsInstances.content);
|
|
28
|
-
let count =
|
|
28
|
+
let count = 0;
|
|
29
29
|
defaultView.forEach(entry => {
|
|
30
|
+
count++;
|
|
30
31
|
let table = new cli_table3_1.default({
|
|
31
32
|
chars: {
|
|
32
33
|
top: '',
|
|
@@ -52,7 +53,7 @@ function formatScanOutput(scanResults) {
|
|
|
52
53
|
});
|
|
53
54
|
let learnRow = [];
|
|
54
55
|
let adviceRow = [];
|
|
55
|
-
|
|
56
|
+
const headerRow = [
|
|
56
57
|
chalk_1.default
|
|
57
58
|
.hex(entry.colour)
|
|
58
59
|
.bold(`CONTRAST-${count.toString().padStart(3, '0')}`),
|
|
@@ -60,12 +61,13 @@ function formatScanOutput(scanResults) {
|
|
|
60
61
|
chalk_1.default.hex(entry.colour).bold(`[${entry.severity}] ${entry.ruleId}`) +
|
|
61
62
|
entry.message
|
|
62
63
|
];
|
|
63
|
-
|
|
64
|
+
const codePath = entry.codePath?.replace(/^@/, '');
|
|
65
|
+
const codeRow = [
|
|
64
66
|
chalk_1.default.hex('#F6F5F5').bold(`Code`),
|
|
65
67
|
chalk_1.default.hex('#F6F5F5').bold(`:`),
|
|
66
|
-
chalk_1.default.hex('#F6F5F5').bold(`${
|
|
68
|
+
chalk_1.default.hex('#F6F5F5').bold(`${codePath}`)
|
|
67
69
|
];
|
|
68
|
-
|
|
70
|
+
const issueRow = [chalk_1.default.bold(`Issue`), chalk_1.default.bold(`:`), `${entry.issue}`];
|
|
69
71
|
table.push(headerRow, codeRow, issueRow);
|
|
70
72
|
if (entry?.advice) {
|
|
71
73
|
adviceRow = [
|
|
@@ -83,7 +85,6 @@ function formatScanOutput(scanResults) {
|
|
|
83
85
|
];
|
|
84
86
|
table.push(learnRow);
|
|
85
87
|
}
|
|
86
|
-
count--;
|
|
87
88
|
console.log(table.toString());
|
|
88
89
|
console.log();
|
|
89
90
|
});
|
|
@@ -98,7 +99,7 @@ function printVulnInfo(projectOverview) {
|
|
|
98
99
|
console.log(i18n_1.default.__('foundDetailedVulnerabilities', String(projectOverview.critical), String(projectOverview.high), String(projectOverview.medium), String(projectOverview.low), String(projectOverview.note)));
|
|
99
100
|
}
|
|
100
101
|
function getProjectOverview(scanResultsInstances) {
|
|
101
|
-
|
|
102
|
+
const acc = {
|
|
102
103
|
critical: 0,
|
|
103
104
|
high: 0,
|
|
104
105
|
medium: 0,
|
|
@@ -118,7 +119,7 @@ function getProjectOverview(scanResultsInstances) {
|
|
|
118
119
|
}
|
|
119
120
|
exports.getProjectOverview = getProjectOverview;
|
|
120
121
|
function formatLinks(objName, entry) {
|
|
121
|
-
|
|
122
|
+
const line = chalk_1.default.bold(objName + ' : ');
|
|
122
123
|
if (entry.length === 1) {
|
|
123
124
|
console.log(line + chalk_1.default.hex('#97DCF7').bold.underline(entry[0]));
|
|
124
125
|
}
|
|
@@ -148,7 +149,7 @@ function getDefaultView(content) {
|
|
|
148
149
|
groupTypeResults.push(groupResultsObj);
|
|
149
150
|
assignBySeverity(resultEntry, groupResultsObj);
|
|
150
151
|
});
|
|
151
|
-
return (0, lodash_1.sortBy)(groupTypeResults, ['priority'])
|
|
152
|
+
return (0, lodash_1.sortBy)(groupTypeResults, ['priority']);
|
|
152
153
|
}
|
|
153
154
|
exports.getDefaultView = getDefaultView;
|
|
154
155
|
function editVulName(message) {
|
|
@@ -179,10 +180,7 @@ function getCodeFlowInfo(resultEntry) {
|
|
|
179
180
|
}
|
|
180
181
|
exports.getCodeFlowInfo = getCodeFlowInfo;
|
|
181
182
|
function stripTags(oldString) {
|
|
182
|
-
return oldString
|
|
183
|
-
.replace(/\n/g, ' ')
|
|
184
|
-
.replace(/\s+/g, ' ')
|
|
185
|
-
.trim();
|
|
183
|
+
return oldString.replace(/\n/g, ' ').replace(/\s+/g, ' ').trim();
|
|
186
184
|
}
|
|
187
185
|
exports.stripTags = stripTags;
|
|
188
186
|
function assignBySeverity(entry, assignedObj) {
|
|
@@ -5,7 +5,9 @@ class ScanResultsModel {
|
|
|
5
5
|
constructor(scan) {
|
|
6
6
|
this.projectOverview = scan.projectOverview;
|
|
7
7
|
this.scanDetail = scan.scanDetail;
|
|
8
|
-
this.scanResultsInstances =
|
|
8
|
+
this.scanResultsInstances =
|
|
9
|
+
scan.scanResultsInstances;
|
|
10
|
+
this.newProject = scan.newProject;
|
|
9
11
|
}
|
|
10
12
|
}
|
|
11
13
|
exports.ScanResultsModel = ScanResultsModel;
|
|
@@ -8,8 +8,9 @@ const populateProjectId = async (config) => {
|
|
|
8
8
|
proj = await getExistingProjectIdByName(config, client).then(res => {
|
|
9
9
|
return res;
|
|
10
10
|
});
|
|
11
|
+
return { projectId: proj, isNewProject: false };
|
|
11
12
|
}
|
|
12
|
-
return proj;
|
|
13
|
+
return { projectId: proj, isNewProject: true };
|
|
13
14
|
};
|
|
14
15
|
const createProjectId = async (config, client) => {
|
|
15
16
|
return client
|
package/dist/scan/scan.js
CHANGED
package/dist/scan/scanConfig.js
CHANGED
|
@@ -3,7 +3,7 @@ const paramHandler = require('../utils/paramsUtil/paramHandler');
|
|
|
3
3
|
const constants = require('../../src/constants.js');
|
|
4
4
|
const parsedCLIOptions = require('../../src/utils/parsedCLIOptions');
|
|
5
5
|
const path = require('path');
|
|
6
|
-
const {
|
|
6
|
+
const { supportedLanguagesScan } = require('../constants/constants');
|
|
7
7
|
const i18n = require('i18n');
|
|
8
8
|
const { scanUsageGuide } = require('./help');
|
|
9
9
|
const getScanConfig = argv => {
|
|
@@ -15,16 +15,21 @@ const getScanConfig = argv => {
|
|
|
15
15
|
const paramsAuth = paramHandler.getAuth(scanParams);
|
|
16
16
|
if (scanParams.language) {
|
|
17
17
|
scanParams.language = scanParams.language.toUpperCase();
|
|
18
|
-
if (!Object.values(
|
|
18
|
+
if (!Object.values(supportedLanguagesScan).includes(scanParams.language)) {
|
|
19
19
|
console.log(`Did not recognise --language ${scanParams.language}`);
|
|
20
20
|
console.log(i18n.__('constantsHowToRunDev3'));
|
|
21
21
|
process.exit(1);
|
|
22
22
|
}
|
|
23
23
|
}
|
|
24
|
+
let projectNameSource;
|
|
24
25
|
if (!scanParams.name && scanParams.file) {
|
|
25
26
|
scanParams.name = getFileName(scanParams.file);
|
|
27
|
+
projectNameSource = 'AUTO';
|
|
26
28
|
}
|
|
27
|
-
|
|
29
|
+
else {
|
|
30
|
+
projectNameSource = 'USER';
|
|
31
|
+
}
|
|
32
|
+
return { ...paramsAuth, ...scanParams, projectNameSource };
|
|
28
33
|
};
|
|
29
34
|
const getFileName = file => {
|
|
30
35
|
return file.split(path.sep).pop();
|
|
@@ -24,6 +24,10 @@ const fileAndLanguageLogic = async (configToUse) => {
|
|
|
24
24
|
console.log(i18n.__('fileNotExist'));
|
|
25
25
|
process.exit(1);
|
|
26
26
|
}
|
|
27
|
+
if (fileFunctions.fileIsEmpty(configToUse.file)) {
|
|
28
|
+
console.log(i18n.__('scanFileIsEmpty'));
|
|
29
|
+
process.exit(1);
|
|
30
|
+
}
|
|
27
31
|
return configToUse;
|
|
28
32
|
}
|
|
29
33
|
else {
|
|
@@ -35,14 +39,20 @@ const fileAndLanguageLogic = async (configToUse) => {
|
|
|
35
39
|
const startScan = async (configToUse) => {
|
|
36
40
|
const startTime = performance.now();
|
|
37
41
|
await fileAndLanguageLogic(configToUse);
|
|
42
|
+
let newProject;
|
|
38
43
|
if (!configToUse.projectId) {
|
|
39
|
-
|
|
44
|
+
const { projectId, isNewProject } = await populateProjectIdAndProjectName.populateProjectId(configToUse);
|
|
45
|
+
configToUse.projectId = projectId;
|
|
46
|
+
newProject = isNewProject;
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
newProject = false;
|
|
40
50
|
}
|
|
41
51
|
const codeArtifactId = await scan.sendScan(configToUse);
|
|
42
52
|
if (!configToUse.ff) {
|
|
43
53
|
const startScanSpinner = returnOra('🚀 Contrast Scan started');
|
|
44
54
|
startSpinner(startScanSpinner);
|
|
45
|
-
const scanDetail = await scanResults.returnScanResults(configToUse, codeArtifactId, getTimeout(configToUse), startScanSpinner);
|
|
55
|
+
const scanDetail = await scanResults.returnScanResults(configToUse, codeArtifactId, newProject, getTimeout(configToUse), startScanSpinner);
|
|
46
56
|
const scanResultsInstances = await scanResults.returnScanResultsInstances(configToUse, scanDetail.id);
|
|
47
57
|
const endTime = performance.now();
|
|
48
58
|
const scanDurationMs = endTime - startTime;
|
|
@@ -54,7 +64,10 @@ const startScan = async (configToUse) => {
|
|
|
54
64
|
else {
|
|
55
65
|
succeedSpinner(startScanSpinner, 'Contrast Scan complete');
|
|
56
66
|
console.log(`----- Scan completed in ${(scanDurationMs / 1000).toFixed(2)}s -----`);
|
|
57
|
-
return {
|
|
67
|
+
return {
|
|
68
|
+
scanDetail,
|
|
69
|
+
scanResultsInstances: scanResultsInstances.body
|
|
70
|
+
};
|
|
58
71
|
}
|
|
59
72
|
}
|
|
60
73
|
};
|
package/dist/scan/scanResults.js
CHANGED
|
@@ -26,9 +26,13 @@ const pollScanResults = async (config, scanId, client) => {
|
|
|
26
26
|
console.log(err);
|
|
27
27
|
});
|
|
28
28
|
};
|
|
29
|
-
const returnScanResults = async (config, codeArtifactId, timeout, startScanSpinner) => {
|
|
29
|
+
const returnScanResults = async (config, codeArtifactId, newProject, timeout, startScanSpinner) => {
|
|
30
30
|
const client = commonApi.getHttpClient(config);
|
|
31
31
|
let scanId = await getScanId(config, codeArtifactId, client);
|
|
32
|
+
if (process.env.CODESEC_INVOCATION_ENVIRONMENT &&
|
|
33
|
+
process.env.CODESEC_INVOCATION_ENVIRONMENT.toUpperCase() === 'GITHUB') {
|
|
34
|
+
await client.createNewEvent(config, scanId, newProject);
|
|
35
|
+
}
|
|
32
36
|
let startTime = new Date();
|
|
33
37
|
let complete = false;
|
|
34
38
|
if (!_.isNil(scanId)) {
|
package/dist/utils/commonApi.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
const HttpClient = require('./../common/HTTPClient');
|
|
3
|
-
const { badRequestError, unauthenticatedError, forbiddenError, proxyError, genericError } = require('../common/errorHandling');
|
|
3
|
+
const { badRequestError, unauthenticatedError, forbiddenError, proxyError, genericError, maxAppError } = require('../common/errorHandling');
|
|
4
4
|
const handleResponseErrors = (res, api) => {
|
|
5
5
|
if (res.statusCode === 400) {
|
|
6
6
|
api === 'catalogue' ? badRequestError(true) : badRequestError(false);
|
|
@@ -14,6 +14,9 @@ const handleResponseErrors = (res, api) => {
|
|
|
14
14
|
else if (res.statusCode === 407) {
|
|
15
15
|
proxyError();
|
|
16
16
|
}
|
|
17
|
+
else if (res.statusCode === 412) {
|
|
18
|
+
maxAppError();
|
|
19
|
+
}
|
|
17
20
|
else {
|
|
18
21
|
genericError();
|
|
19
22
|
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
const path = require('path');
|
|
3
|
+
const child_process = require('child_process');
|
|
3
4
|
function resolveFilePath(filepath) {
|
|
4
5
|
if (filepath[0] === '~') {
|
|
5
6
|
return path.join(process.env.HOME, filepath.slice(1));
|
|
@@ -7,11 +8,15 @@ function resolveFilePath(filepath) {
|
|
|
7
8
|
return filepath;
|
|
8
9
|
}
|
|
9
10
|
const returnProjectPath = () => {
|
|
10
|
-
if (process.
|
|
11
|
+
if (process.platform == 'win32') {
|
|
12
|
+
let winPath = child_process.execSync('cd').toString();
|
|
13
|
+
return winPath.replace(/\//g, '\\').trim();
|
|
14
|
+
}
|
|
15
|
+
else if (process.env.PWD !== (undefined || null || 'undefined')) {
|
|
11
16
|
return process.env.PWD;
|
|
12
17
|
}
|
|
13
18
|
else {
|
|
14
|
-
return process.argv[process.argv.indexOf('--
|
|
19
|
+
return process.argv[process.argv.indexOf('--file') + 1];
|
|
15
20
|
}
|
|
16
21
|
};
|
|
17
22
|
module.exports = {
|
package/dist/utils/getConfig.js
CHANGED
|
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.setConfigValues = exports.
|
|
6
|
+
exports.setConfigValues = exports.localConfig = void 0;
|
|
7
7
|
const conf_1 = __importDefault(require("conf"));
|
|
8
8
|
const localConfig = (name, version) => {
|
|
9
9
|
const config = new conf_1.default({
|
|
@@ -19,11 +19,6 @@ const localConfig = (name, version) => {
|
|
|
19
19
|
return config;
|
|
20
20
|
};
|
|
21
21
|
exports.localConfig = localConfig;
|
|
22
|
-
const createConfigFromYaml = (yamlPath) => {
|
|
23
|
-
const yamlConfig = {};
|
|
24
|
-
return yamlConfig;
|
|
25
|
-
};
|
|
26
|
-
exports.createConfigFromYaml = createConfigFromYaml;
|
|
27
22
|
const setConfigValues = (config, values) => {
|
|
28
23
|
config.set('apiKey', values.apiKey);
|
|
29
24
|
config.set('organizationId', values.orgId);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@contrast/contrast",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.9",
|
|
4
4
|
"description": "Contrast Security's command line tool",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"bin": {
|
|
@@ -23,9 +23,9 @@
|
|
|
23
23
|
"test": "jest --testPathIgnorePatterns=./test-integration/",
|
|
24
24
|
"test-int": "jest ./test-integration/",
|
|
25
25
|
"test-int-scan": "jest ./test-integration/scan",
|
|
26
|
-
"test-int-audit": "jest
|
|
27
|
-
"format": "prettier --write \"**/*.{ts,tsx,js,
|
|
28
|
-
"check-format": "prettier --check \"**/*.{ts,tsx,js,
|
|
26
|
+
"test-int-audit": "jest test-integration/audit/audit-int.spec.js",
|
|
27
|
+
"format": "prettier --write \"**/*.{ts,tsx,js,json,md,yml}\" .eslintrc.*",
|
|
28
|
+
"check-format": "prettier --check \"**/*.{ts,tsx,js,json,md,yml}\" .eslintrc.*",
|
|
29
29
|
"coverage-local": "nyc --reporter=text mocha './test/**/*.spec.js'",
|
|
30
30
|
"coverage": "yarn test --coverage",
|
|
31
31
|
"lint": "eslint --config .eslintrc.json . --ext .ts",
|
|
@@ -53,7 +53,6 @@
|
|
|
53
53
|
"fast-glob": "^3.2.11",
|
|
54
54
|
"i18n": "^0.14.2",
|
|
55
55
|
"js-yaml": "^4.1.0",
|
|
56
|
-
"latest-version": "5.1.0",
|
|
57
56
|
"lodash": "^4.17.21",
|
|
58
57
|
"log-symbols": "^4.1.0",
|
|
59
58
|
"open": "^8.4.0",
|
|
@@ -74,12 +73,13 @@
|
|
|
74
73
|
"@types/i18n": "^0.13.2",
|
|
75
74
|
"@types/jest": "^27.4.1",
|
|
76
75
|
"@types/lodash": "^4.14.182",
|
|
76
|
+
"@types/node": "*",
|
|
77
77
|
"@typescript-eslint/eslint-plugin": "^5.21.0",
|
|
78
78
|
"@typescript-eslint/parser": "^5.21.0",
|
|
79
79
|
"csv-writer": "^1.6.0",
|
|
80
80
|
"eslint": "^8.14.0",
|
|
81
81
|
"eslint-config-prettier": "^8.5.0",
|
|
82
|
-
"eslint-plugin-prettier": "^4.
|
|
82
|
+
"eslint-plugin-prettier": "^4.2.1",
|
|
83
83
|
"husky": "^3.1.0",
|
|
84
84
|
"jest": "^27.5.1",
|
|
85
85
|
"jest-junit": "^13.2.0",
|
|
@@ -87,7 +87,7 @@
|
|
|
87
87
|
"npm-license-crawler": "^0.2.1",
|
|
88
88
|
"nyc": "^15.1.0",
|
|
89
89
|
"pkg": "^5.6.0",
|
|
90
|
-
"prettier": "^
|
|
90
|
+
"prettier": "^2.7.1",
|
|
91
91
|
"tmp": "^0.2.1",
|
|
92
92
|
"ts-jest": "^27.1.4",
|
|
93
93
|
"ts-node": "^10.7.0",
|
|
@@ -103,12 +103,15 @@
|
|
|
103
103
|
],
|
|
104
104
|
"prettier": {
|
|
105
105
|
"semi": false,
|
|
106
|
+
"trailingComma": "none",
|
|
107
|
+
"arrowParens": "avoid",
|
|
108
|
+
"bracketSpacing": true,
|
|
106
109
|
"singleQuote": true,
|
|
110
|
+
"bracketSameLine": true,
|
|
107
111
|
"overrides": [
|
|
108
112
|
{
|
|
109
113
|
"files": [
|
|
110
|
-
".eslintrc
|
|
111
|
-
".babelrc"
|
|
114
|
+
".eslintrc"
|
|
112
115
|
],
|
|
113
116
|
"options": {
|
|
114
117
|
"parser": "json"
|
|
@@ -1,10 +1,5 @@
|
|
|
1
|
-
const i18n = require('i18n')
|
|
2
1
|
const { getHttpClient, handleResponseErrors } = require('../../utils/commonApi')
|
|
3
2
|
|
|
4
|
-
const displaySuccessMessage = () => {
|
|
5
|
-
console.log(i18n.__('catalogueSuccessCommand'))
|
|
6
|
-
}
|
|
7
|
-
|
|
8
3
|
const catalogueApplication = async config => {
|
|
9
4
|
const client = getHttpClient(config)
|
|
10
5
|
let appId
|
|
@@ -14,8 +9,9 @@ const catalogueApplication = async config => {
|
|
|
14
9
|
if (res.statusCode === 201) {
|
|
15
10
|
//displaySuccessMessage(config, res.body.application.app_id)
|
|
16
11
|
appId = res.body.application.app_id
|
|
12
|
+
} else if (doesMessagesContainAppId(res)) {
|
|
13
|
+
appId = tryRetrieveAppIdFromMessages(res.body.messages)
|
|
17
14
|
} else {
|
|
18
|
-
// console.log(res.statusCode)
|
|
19
15
|
handleResponseErrors(res, 'catalogue')
|
|
20
16
|
}
|
|
21
17
|
})
|
|
@@ -25,6 +21,31 @@ const catalogueApplication = async config => {
|
|
|
25
21
|
return appId
|
|
26
22
|
}
|
|
27
23
|
|
|
24
|
+
const doesMessagesContainAppId = res => {
|
|
25
|
+
const regex = /(Application ID =)/
|
|
26
|
+
if (
|
|
27
|
+
res.statusCode === 400 &&
|
|
28
|
+
res.body.messages.filter(message => regex.exec(message))[0]
|
|
29
|
+
) {
|
|
30
|
+
return true
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
return false
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
const tryRetrieveAppIdFromMessages = messages => {
|
|
37
|
+
let appId
|
|
38
|
+
messages.forEach(message => {
|
|
39
|
+
if (message.includes('Application ID')) {
|
|
40
|
+
appId = message.split('=')[1].replace(/\s+/g, '')
|
|
41
|
+
}
|
|
42
|
+
})
|
|
43
|
+
|
|
44
|
+
return appId
|
|
45
|
+
}
|
|
46
|
+
|
|
28
47
|
module.exports = {
|
|
29
|
-
catalogueApplication: catalogueApplication
|
|
48
|
+
catalogueApplication: catalogueApplication,
|
|
49
|
+
doesMessagesContainAppId,
|
|
50
|
+
tryRetrieveAppIdFromMessages
|
|
30
51
|
}
|
|
@@ -1,43 +1,14 @@
|
|
|
1
1
|
const fs = require('fs')
|
|
2
2
|
const path = require('path')
|
|
3
3
|
const i18n = require('i18n')
|
|
4
|
-
/**
|
|
5
|
-
* Will get the filenames from the project path provided to the SCA CLI tool. If
|
|
6
|
-
* the project path points to a file and not a directory will return the
|
|
7
|
-
* filename in the same fashion as if a directory had been read.
|
|
8
|
-
*
|
|
9
|
-
* Will fail and throw for a manner of reasons when doing file/directory
|
|
10
|
-
* inspection.
|
|
11
|
-
*
|
|
12
|
-
* @param {string} projectPath - The path to a projects root directory or a
|
|
13
|
-
* specific project file
|
|
14
|
-
*
|
|
15
|
-
* @return {string[]} List of filenames associated with a projects root
|
|
16
|
-
* directory or the name of the specific project file if that was provided to
|
|
17
|
-
* the 'projectPath' parameter
|
|
18
|
-
*
|
|
19
|
-
* @throws {Error} If the project path doesn't exist
|
|
20
|
-
* @throws {Error} If the project path information can't be collected
|
|
21
|
-
* @throws {Error} If a non-file or non-directory inspected
|
|
22
|
-
*/
|
|
23
|
-
module.exports = exports = (analysis, next) => {
|
|
24
|
-
const { projectPath, languageAnalysis } = analysis
|
|
25
|
-
try {
|
|
26
|
-
languageAnalysis.projectRootFilenames = getProjectRootFilenames(projectPath)
|
|
27
|
-
} catch (err) {
|
|
28
|
-
next(err)
|
|
29
|
-
return
|
|
30
|
-
}
|
|
31
|
-
next()
|
|
32
|
-
}
|
|
33
4
|
|
|
34
|
-
const getProjectRootFilenames =
|
|
5
|
+
const getProjectRootFilenames = file => {
|
|
35
6
|
let projectStats = null
|
|
36
7
|
try {
|
|
37
|
-
projectStats = fs.statSync(
|
|
8
|
+
projectStats = fs.statSync(file)
|
|
38
9
|
} catch (err) {
|
|
39
10
|
throw new Error(
|
|
40
|
-
i18n.__('languageAnalysisProjectRootFileNameFailure',
|
|
11
|
+
i18n.__('languageAnalysisProjectRootFileNameFailure', file) +
|
|
41
12
|
`${err.message}`
|
|
42
13
|
)
|
|
43
14
|
}
|
|
@@ -45,10 +16,10 @@ const getProjectRootFilenames = projectPath => {
|
|
|
45
16
|
// Return the contents of a directory...
|
|
46
17
|
if (projectStats.isDirectory()) {
|
|
47
18
|
try {
|
|
48
|
-
return fs.readdirSync(
|
|
19
|
+
return fs.readdirSync(file)
|
|
49
20
|
} catch (err) {
|
|
50
21
|
throw new Error(
|
|
51
|
-
i18n.__('languageAnalysisProjectRootFileNameReadError',
|
|
22
|
+
i18n.__('languageAnalysisProjectRootFileNameReadError', file) +
|
|
52
23
|
`${err.message}`
|
|
53
24
|
)
|
|
54
25
|
}
|
|
@@ -57,16 +28,16 @@ const getProjectRootFilenames = projectPath => {
|
|
|
57
28
|
// If we are working with a file return it in a list as we do when we work
|
|
58
29
|
// with a directory...
|
|
59
30
|
if (projectStats.isFile()) {
|
|
60
|
-
return [path.basename(
|
|
31
|
+
return [path.basename(file)]
|
|
61
32
|
}
|
|
62
33
|
|
|
63
34
|
// Error out if we are working with something like a socket file or some
|
|
64
35
|
// other craziness...
|
|
65
36
|
throw new Error(
|
|
66
37
|
i18n.__('languageAnalysisProjectRootFileNameMissingError'),
|
|
67
|
-
|
|
38
|
+
file
|
|
68
39
|
)
|
|
69
40
|
}
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
41
|
+
module.exports = {
|
|
42
|
+
getProjectRootFilenames
|
|
43
|
+
}
|