@appland/scanner 1.54.0 → 1.56.0
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/CHANGELOG.md +24 -0
- package/built/cli/ci/command.js +33 -24
- package/built/cli/ci/command.js.map +1 -1
- package/built/cli/scan/command.js +49 -182
- package/built/cli/scan/command.js.map +1 -1
- package/built/cli/scan/formatReport.js +117 -0
- package/built/cli/scan/formatReport.js.map +1 -0
- package/built/cli/scan/singleScan.js +128 -0
- package/built/cli/scan/singleScan.js.map +1 -0
- package/built/cli/scan/watchScan.js +134 -0
- package/built/cli/scan/watchScan.js.map +1 -0
- package/built/cli/scan.js +9 -10
- package/built/cli/scan.js.map +1 -1
- package/built/cli/scanArgs.js +2 -3
- package/built/cli/scanArgs.js.map +1 -1
- package/built/cli/upload/command.js +1 -1
- package/built/cli/upload/command.js.map +1 -1
- package/built/cli/validateFile.js +9 -5
- package/built/cli/validateFile.js.map +1 -1
- package/built/configuration/configurationProvider.js +9 -3
- package/built/configuration/configurationProvider.js.map +1 -1
- package/built/integration/appland/app/listFindingStatus.js +2 -2
- package/built/integration/appland/app/listFindingStatus.js.map +1 -1
- package/built/rules/lib/util.js +64 -1
- package/built/rules/lib/util.js.map +1 -1
- package/built/rules/secretInLog.js +3 -3
- package/built/rules/secretInLog.js.map +1 -1
- package/package.json +4 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,27 @@
|
|
|
1
|
+
# [@appland/scanner-v1.56.0](https://github.com/applandinc/appmap-js/compare/@appland/scanner-v1.55.0...@appland/scanner-v1.56.0) (2022-05-11)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### Features
|
|
5
|
+
|
|
6
|
+
* Add --watch flag to scan command ([51cb6fc](https://github.com/applandinc/appmap-js/commit/51cb6fc168e1b416587077e26c09d4e54dc9565b))
|
|
7
|
+
|
|
8
|
+
# [@appland/scanner-v1.55.0](https://github.com/applandinc/appmap-js/compare/@appland/scanner-v1.54.1...@appland/scanner-v1.55.0) (2022-05-10)
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
### Features
|
|
12
|
+
|
|
13
|
+
* Change default file names ([e173fbb](https://github.com/applandinc/appmap-js/commit/e173fbbe464c8076133f91e04ecdb531dd80c13f))
|
|
14
|
+
* Read appmap_dir from appmap.yml ([b0b6b0d](https://github.com/applandinc/appmap-js/commit/b0b6b0db45eec8c0b8fa96d0f3005677a43f813b))
|
|
15
|
+
* Support repeated appmap-file option ([62edf68](https://github.com/applandinc/appmap-js/commit/62edf68a00d2e169cfbfed5e63246b5fbec947d7))
|
|
16
|
+
|
|
17
|
+
# [@appland/scanner-v1.54.1](https://github.com/applandinc/appmap-js/compare/@appland/scanner-v1.54.0...@appland/scanner-v1.54.1) (2022-05-03)
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
### Bug Fixes
|
|
21
|
+
|
|
22
|
+
* Metadata rule title ([8d87864](https://github.com/applandinc/appmap-js/commit/8d878645001457d02487fd564498e8b858362f72))
|
|
23
|
+
* Progress bar exit ([f311bb2](https://github.com/applandinc/appmap-js/commit/f311bb2af258e6a140c9a09c64ae71ebc43c52f7))
|
|
24
|
+
|
|
1
25
|
# [@appland/scanner-v1.54.0](https://github.com/applandinc/appmap-js/compare/@appland/scanner-v1.53.0...@appland/scanner-v1.54.0) (2022-05-03)
|
|
2
26
|
|
|
3
27
|
|
package/built/cli/ci/command.js
CHANGED
|
@@ -102,48 +102,57 @@ exports.default = {
|
|
|
102
102
|
},
|
|
103
103
|
handler: function (options) {
|
|
104
104
|
return __awaiter(this, void 0, void 0, function () {
|
|
105
|
-
var
|
|
105
|
+
var appmapDir, _a, config, isVerbose, failOption, appIdArg, reportFile, doUpload, updateCommitStatusOption, mergeKey, commit, branch, environment, appId, glob, files, configData, scanner, _b, rawScanResults, findingStatuses, scanResults, uploadResponse, err_1;
|
|
106
106
|
return __generator(this, function (_c) {
|
|
107
107
|
switch (_c.label) {
|
|
108
108
|
case 0:
|
|
109
|
-
|
|
109
|
+
appmapDir = options.appmapDir;
|
|
110
|
+
_a = options, config = _a.config, isVerbose = _a.verbose, failOption = _a.fail, appIdArg = _a.app, reportFile = _a.reportFile, doUpload = _a.upload, updateCommitStatusOption = _a.updateCommitStatus, mergeKey = _a.mergeKey, commit = _a.commit, branch = _a.branch, environment = _a.environment;
|
|
110
111
|
if (isVerbose) {
|
|
111
112
|
(0, util_2.verbose)(true);
|
|
112
113
|
}
|
|
113
114
|
_c.label = 1;
|
|
114
115
|
case 1:
|
|
115
|
-
_c.trys.push([1,
|
|
116
|
-
if (
|
|
117
|
-
|
|
118
|
-
}
|
|
119
|
-
return [4 /*yield*/, (0, validateFile_1.default)('directory', appmapDir)];
|
|
116
|
+
_c.trys.push([1, 17, , 18]);
|
|
117
|
+
if (!!appmapDir) return [3 /*break*/, 3];
|
|
118
|
+
return [4 /*yield*/, (0, util_2.appmapDirFromConfig)()];
|
|
120
119
|
case 2:
|
|
120
|
+
appmapDir = _c.sent();
|
|
121
|
+
_c.label = 3;
|
|
122
|
+
case 3:
|
|
123
|
+
if (!!appmapDir) return [3 /*break*/, 5];
|
|
124
|
+
return [4 /*yield*/, (0, util_2.appmapDirFromConfig)()];
|
|
125
|
+
case 4:
|
|
126
|
+
appmapDir = _c.sent();
|
|
127
|
+
throw new errors_1.ValidationError('--appmap-dir is required');
|
|
128
|
+
case 5: return [4 /*yield*/, (0, validateFile_1.default)('directory', appmapDir)];
|
|
129
|
+
case 6:
|
|
121
130
|
_c.sent();
|
|
122
131
|
return [4 /*yield*/, (0, resolveAppId_1.default)(appIdArg, appmapDir)];
|
|
123
|
-
case
|
|
132
|
+
case 7:
|
|
124
133
|
appId = _c.sent();
|
|
125
134
|
glob = (0, util_1.promisify)(glob_1.glob);
|
|
126
135
|
return [4 /*yield*/, glob("".concat(appmapDir, "/**/*.appmap.json"))];
|
|
127
|
-
case
|
|
136
|
+
case 8:
|
|
128
137
|
files = _c.sent();
|
|
129
138
|
return [4 /*yield*/, (0, configurationProvider_1.parseConfigFile)(config)];
|
|
130
|
-
case
|
|
139
|
+
case 9:
|
|
131
140
|
configData = _c.sent();
|
|
132
141
|
return [4 /*yield*/, (0, scanner_1.default)(false, configData, files)];
|
|
133
|
-
case
|
|
142
|
+
case 10:
|
|
134
143
|
scanner = _c.sent();
|
|
135
144
|
return [4 /*yield*/, Promise.all([scanner.scan(), scanner.fetchFindingStatus(appIdArg, appmapDir)])];
|
|
136
|
-
case
|
|
145
|
+
case 11:
|
|
137
146
|
_b = __read.apply(void 0, [_c.sent(), 2]), rawScanResults = _b[0], findingStatuses = _b[1];
|
|
138
147
|
// Always report the raw data
|
|
139
148
|
return [4 /*yield*/, (0, promises_1.writeFile)(reportFile, JSON.stringify(rawScanResults, null, 2))];
|
|
140
|
-
case
|
|
149
|
+
case 12:
|
|
141
150
|
// Always report the raw data
|
|
142
151
|
_c.sent();
|
|
143
152
|
scanResults = rawScanResults.withFindings((0, findings_1.newFindings)(rawScanResults.findings, findingStatuses));
|
|
144
153
|
(0, findingsReport_1.default)(scanResults.findings, scanResults.appMapMetadata);
|
|
145
154
|
(0, summaryReport_1.default)(scanResults, true);
|
|
146
|
-
if (!doUpload) return [3 /*break*/,
|
|
155
|
+
if (!doUpload) return [3 /*break*/, 14];
|
|
147
156
|
return [4 /*yield*/, (0, upload_1.default)(rawScanResults, appId, appmapDir, mergeKey, {
|
|
148
157
|
branch: branch,
|
|
149
158
|
commit: commit,
|
|
@@ -151,22 +160,22 @@ exports.default = {
|
|
|
151
160
|
}, {
|
|
152
161
|
maxRetries: 3,
|
|
153
162
|
})];
|
|
154
|
-
case
|
|
163
|
+
case 13:
|
|
155
164
|
uploadResponse = _c.sent();
|
|
156
165
|
(0, reportUploadURL_1.default)(uploadResponse.summary.numFindings, uploadResponse.url);
|
|
157
|
-
_c.label =
|
|
158
|
-
case
|
|
159
|
-
if (!updateCommitStatusOption) return [3 /*break*/,
|
|
166
|
+
_c.label = 14;
|
|
167
|
+
case 14:
|
|
168
|
+
if (!updateCommitStatusOption) return [3 /*break*/, 16];
|
|
160
169
|
return [4 /*yield*/, (0, updateCommitStatus_1.default)(scanResults.findings.length, scanResults.summary.numChecks)];
|
|
161
|
-
case
|
|
170
|
+
case 15:
|
|
162
171
|
_c.sent();
|
|
163
|
-
_c.label =
|
|
164
|
-
case
|
|
172
|
+
_c.label = 16;
|
|
173
|
+
case 16:
|
|
165
174
|
if (failOption) {
|
|
166
175
|
(0, fail_1.default)(scanResults.findings.length);
|
|
167
176
|
}
|
|
168
|
-
return [3 /*break*/,
|
|
169
|
-
case
|
|
177
|
+
return [3 /*break*/, 18];
|
|
178
|
+
case 17:
|
|
170
179
|
err_1 = _c.sent();
|
|
171
180
|
if (err_1 instanceof errors_1.ValidationError) {
|
|
172
181
|
console.warn(err_1.message);
|
|
@@ -180,7 +189,7 @@ exports.default = {
|
|
|
180
189
|
return [2 /*return*/, process.exit(exitCode_1.ExitCode.RuntimeError)];
|
|
181
190
|
}
|
|
182
191
|
throw err_1;
|
|
183
|
-
case
|
|
192
|
+
case 18: return [2 /*return*/];
|
|
184
193
|
}
|
|
185
194
|
});
|
|
186
195
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"command.js","sourceRoot":"","sources":["../../../src/cli/ci/command.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,6BAA4C;AAC5C,wCAAwC;AACxC,6BAAiC;AAKjC,mFAA4E;AAC5E,uCAA2D;AAE3D,
|
|
1
|
+
{"version":3,"file":"command.js","sourceRoot":"","sources":["../../../src/cli/ci/command.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,15 +1,4 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __assign = (this && this.__assign) || function () {
|
|
3
|
-
__assign = Object.assign || function(t) {
|
|
4
|
-
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
5
|
-
s = arguments[i];
|
|
6
|
-
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
7
|
-
t[p] = s[p];
|
|
8
|
-
}
|
|
9
|
-
return t;
|
|
10
|
-
};
|
|
11
|
-
return __assign.apply(this, arguments);
|
|
12
|
-
};
|
|
13
2
|
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
14
3
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
15
4
|
return new (P || (P = Promise))(function (resolve, reject) {
|
|
@@ -46,66 +35,25 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
|
46
35
|
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
47
36
|
}
|
|
48
37
|
};
|
|
49
|
-
var __read = (this && this.__read) || function (o, n) {
|
|
50
|
-
var m = typeof Symbol === "function" && o[Symbol.iterator];
|
|
51
|
-
if (!m) return o;
|
|
52
|
-
var i = m.call(o), r, ar = [], e;
|
|
53
|
-
try {
|
|
54
|
-
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
|
|
55
|
-
}
|
|
56
|
-
catch (error) { e = { error: error }; }
|
|
57
|
-
finally {
|
|
58
|
-
try {
|
|
59
|
-
if (r && !r.done && (m = i["return"])) m.call(i);
|
|
60
|
-
}
|
|
61
|
-
finally { if (e) throw e.error; }
|
|
62
|
-
}
|
|
63
|
-
return ar;
|
|
64
|
-
};
|
|
65
|
-
var __values = (this && this.__values) || function(o) {
|
|
66
|
-
var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
|
|
67
|
-
if (m) return m.call(o);
|
|
68
|
-
if (o && typeof o.length === "number") return {
|
|
69
|
-
next: function () {
|
|
70
|
-
if (o && i >= o.length) o = void 0;
|
|
71
|
-
return { value: o && o[i++], done: !o };
|
|
72
|
-
}
|
|
73
|
-
};
|
|
74
|
-
throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
|
|
75
|
-
};
|
|
76
|
-
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
|
77
|
-
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
|
78
|
-
if (ar || !(i in from)) {
|
|
79
|
-
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
|
|
80
|
-
ar[i] = from[i];
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
return to.concat(ar || Array.prototype.slice.call(from));
|
|
84
|
-
};
|
|
85
38
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
86
39
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
87
40
|
};
|
|
88
41
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
89
|
-
var glob_1 = require("glob");
|
|
90
|
-
var promises_1 = require("fs/promises");
|
|
91
|
-
var util_1 = require("util");
|
|
92
42
|
var configurationProvider_1 = require("../../configuration/configurationProvider");
|
|
93
43
|
var errors_1 = require("../../errors");
|
|
94
|
-
var
|
|
95
|
-
var findings_1 = require("../../findings");
|
|
96
|
-
var findingsReport_1 = __importDefault(require("../../report/findingsReport"));
|
|
97
|
-
var summaryReport_1 = __importDefault(require("../../report/summaryReport"));
|
|
44
|
+
var util_1 = require("../../rules/lib/util");
|
|
98
45
|
var validateFile_1 = __importDefault(require("../validateFile"));
|
|
99
|
-
var scanner_1 = __importDefault(require("./scanner"));
|
|
100
46
|
var scanArgs_1 = __importDefault(require("../scanArgs"));
|
|
101
47
|
var resolveAppId_1 = __importDefault(require("../resolveAppId"));
|
|
48
|
+
var singleScan_1 = __importDefault(require("./singleScan"));
|
|
49
|
+
var watchScan_1 = __importDefault(require("./watchScan"));
|
|
102
50
|
exports.default = {
|
|
103
51
|
command: 'scan',
|
|
104
52
|
describe: 'Scan AppMaps for code behavior findings',
|
|
105
53
|
builder: function (args) {
|
|
106
54
|
(0, scanArgs_1.default)(args);
|
|
107
55
|
args.option('appmap-file', {
|
|
108
|
-
describe: 'single file to scan',
|
|
56
|
+
describe: 'single file to scan, or repeat this option to scan multiple specific files',
|
|
109
57
|
alias: 'f',
|
|
110
58
|
});
|
|
111
59
|
args.option('ide', {
|
|
@@ -117,153 +65,72 @@ exports.default = {
|
|
|
117
65
|
default: false,
|
|
118
66
|
type: 'boolean',
|
|
119
67
|
});
|
|
68
|
+
args.option('watch', {
|
|
69
|
+
describe: 'scan code changes and report findings on changed files',
|
|
70
|
+
default: false,
|
|
71
|
+
type: 'boolean',
|
|
72
|
+
});
|
|
120
73
|
return args.strict();
|
|
121
74
|
},
|
|
122
75
|
handler: function (options) {
|
|
123
76
|
return __awaiter(this, void 0, void 0, function () {
|
|
124
|
-
var
|
|
125
|
-
return __generator(this, function (
|
|
126
|
-
switch (
|
|
77
|
+
var appmapDir, _a, appmapFile, config, isVerbose, reportAllFindings, watch, appIdArg, apiKey, ide, reportFile, configData, watchAppMapDir, appId;
|
|
78
|
+
return __generator(this, function (_b) {
|
|
79
|
+
switch (_b.label) {
|
|
127
80
|
case 0:
|
|
128
|
-
|
|
81
|
+
appmapDir = options.appmapDir;
|
|
82
|
+
_a = options, appmapFile = _a.appmapFile, config = _a.config, isVerbose = _a.verbose, reportAllFindings = _a.all, watch = _a.watch, appIdArg = _a.app, apiKey = _a.apiKey, ide = _a.ide, reportFile = _a.reportFile;
|
|
129
83
|
if (isVerbose) {
|
|
130
|
-
(0,
|
|
84
|
+
(0, util_1.verbose)(true);
|
|
131
85
|
}
|
|
132
86
|
if (apiKey) {
|
|
133
87
|
process.env.APPLAND_API_KEY = apiKey;
|
|
134
88
|
}
|
|
135
|
-
if (appmapFile &&
|
|
136
|
-
throw new errors_1.ValidationError('Use --appmap-
|
|
89
|
+
if (appmapFile && watch) {
|
|
90
|
+
throw new errors_1.ValidationError('Use --appmap-file or --watch, but not both');
|
|
137
91
|
}
|
|
138
|
-
if (
|
|
139
|
-
throw new errors_1.ValidationError('
|
|
92
|
+
if (reportAllFindings && watch) {
|
|
93
|
+
throw new errors_1.ValidationError("Don't use --all with --watch, because in watch mode all findings are reported");
|
|
140
94
|
}
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
95
|
+
if (appIdArg && watch) {
|
|
96
|
+
throw new errors_1.ValidationError("Don't use --app with --watch, because in watch mode all findings are reported");
|
|
97
|
+
}
|
|
98
|
+
if (!(!appmapFile && !appmapDir)) return [3 /*break*/, 2];
|
|
99
|
+
return [4 /*yield*/, (0, util_1.appmapDirFromConfig)()];
|
|
144
100
|
case 1:
|
|
145
|
-
|
|
146
|
-
|
|
101
|
+
appmapDir = (_b.sent()) || '.';
|
|
102
|
+
_b.label = 2;
|
|
147
103
|
case 2:
|
|
148
|
-
|
|
149
|
-
if (!appmapDir) return [3 /*break*/, 5];
|
|
104
|
+
if (!appmapDir) return [3 /*break*/, 4];
|
|
150
105
|
return [4 /*yield*/, (0, validateFile_1.default)('directory', appmapDir)];
|
|
151
106
|
case 3:
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
case 4:
|
|
156
|
-
files = _c.sent();
|
|
157
|
-
_c.label = 5;
|
|
107
|
+
_b.sent();
|
|
108
|
+
_b.label = 4;
|
|
109
|
+
case 4: return [4 /*yield*/, (0, configurationProvider_1.parseConfigFile)(config)];
|
|
158
110
|
case 5:
|
|
159
|
-
|
|
160
|
-
return [
|
|
111
|
+
configData = _b.sent();
|
|
112
|
+
if (!watch) return [3 /*break*/, 6];
|
|
113
|
+
watchAppMapDir = appmapDir;
|
|
114
|
+
return [2 /*return*/, (0, watchScan_1.default)({ appmapDir: watchAppMapDir, configData: configData })];
|
|
161
115
|
case 6:
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
case 7:
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
])];
|
|
178
|
-
case 10:
|
|
179
|
-
_b = __read.apply(void 0, [_c.sent(), 2]), rawScanResults = _b[0], findingStatuses = _b[1];
|
|
180
|
-
// Always report the raw data
|
|
181
|
-
return [4 /*yield*/, (0, promises_1.writeFile)(reportFile, formatReport(rawScanResults))];
|
|
182
|
-
case 11:
|
|
183
|
-
// Always report the raw data
|
|
184
|
-
_c.sent();
|
|
185
|
-
if (reportAllFindings) {
|
|
186
|
-
scanResults = rawScanResults;
|
|
187
|
-
}
|
|
188
|
-
else {
|
|
189
|
-
scanResults = rawScanResults.withFindings((0, findings_1.newFindings)(rawScanResults.findings, findingStatuses));
|
|
190
|
-
}
|
|
191
|
-
(0, findingsReport_1.default)(scanResults.findings, scanResults.appMapMetadata, ide);
|
|
192
|
-
console.log();
|
|
193
|
-
(0, summaryReport_1.default)(scanResults, true);
|
|
194
|
-
console.log('\n');
|
|
195
|
-
elapsed = Date.now() - startTime;
|
|
196
|
-
numChecks = scanResults.checks.length * scanResults.summary.numAppMaps;
|
|
197
|
-
console.log("Performed ".concat(numChecks, " checks in ").concat(elapsed, "ms (").concat(Math.floor(numChecks / (elapsed / 1000.0)), " checks/sec)"));
|
|
198
|
-
return [2 /*return*/];
|
|
116
|
+
appId = appIdArg;
|
|
117
|
+
if (!!reportAllFindings) return [3 /*break*/, 8];
|
|
118
|
+
return [4 /*yield*/, (0, resolveAppId_1.default)(appIdArg, appmapDir)];
|
|
119
|
+
case 7:
|
|
120
|
+
appId = _b.sent();
|
|
121
|
+
_b.label = 8;
|
|
122
|
+
case 8: return [2 /*return*/, (0, singleScan_1.default)({
|
|
123
|
+
appmapFile: appmapFile,
|
|
124
|
+
appmapDir: appmapDir,
|
|
125
|
+
configData: configData,
|
|
126
|
+
reportAllFindings: reportAllFindings,
|
|
127
|
+
appId: appId,
|
|
128
|
+
ide: ide,
|
|
129
|
+
reportFile: reportFile,
|
|
130
|
+
})];
|
|
199
131
|
}
|
|
200
132
|
});
|
|
201
133
|
});
|
|
202
134
|
},
|
|
203
135
|
};
|
|
204
|
-
function metadataFilter(_a) {
|
|
205
|
-
var apps = _a.apps.length, clients = _a.clients.length, frameworks = _a.frameworks.length, git = _a.git.length, languages = _a.languages.length, recorders = _a.recorders.length;
|
|
206
|
-
var filtered = Object.entries({
|
|
207
|
-
app: apps < 2,
|
|
208
|
-
client: clients < 2,
|
|
209
|
-
git: git < 2,
|
|
210
|
-
language: languages < 2,
|
|
211
|
-
recorder: recorders < 2,
|
|
212
|
-
})
|
|
213
|
-
.filter(function (_a) {
|
|
214
|
-
var _b = __read(_a, 2), v = _b[1];
|
|
215
|
-
return v;
|
|
216
|
-
})
|
|
217
|
-
.map(function (_a) {
|
|
218
|
-
var _b = __read(_a, 1), k = _b[0];
|
|
219
|
-
return k;
|
|
220
|
-
});
|
|
221
|
-
return function (metadata) {
|
|
222
|
-
return Object.fromEntries(Object.entries(metadata).filter(function (_a) {
|
|
223
|
-
var _b = __read(_a, 2), k = _b[0], v = _b[1];
|
|
224
|
-
if (filtered.includes(k))
|
|
225
|
-
return false;
|
|
226
|
-
if (k === 'frameworks')
|
|
227
|
-
return (v || []).length !== frameworks;
|
|
228
|
-
return true;
|
|
229
|
-
}));
|
|
230
|
-
};
|
|
231
|
-
}
|
|
232
|
-
function uniq(entries, key) {
|
|
233
|
-
var e_1, _a;
|
|
234
|
-
var result = new Map();
|
|
235
|
-
try {
|
|
236
|
-
for (var entries_1 = __values(entries), entries_1_1 = entries_1.next(); !entries_1_1.done; entries_1_1 = entries_1.next()) {
|
|
237
|
-
var entry = entries_1_1.value;
|
|
238
|
-
var k = key(entry);
|
|
239
|
-
if (result.has(k))
|
|
240
|
-
continue;
|
|
241
|
-
result.set(k, entry);
|
|
242
|
-
}
|
|
243
|
-
}
|
|
244
|
-
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
245
|
-
finally {
|
|
246
|
-
try {
|
|
247
|
-
if (entries_1_1 && !entries_1_1.done && (_a = entries_1.return)) _a.call(entries_1);
|
|
248
|
-
}
|
|
249
|
-
finally { if (e_1) throw e_1.error; }
|
|
250
|
-
}
|
|
251
|
-
return result.values();
|
|
252
|
-
}
|
|
253
|
-
// Formats a report to JSON. Does some data deduplication.
|
|
254
|
-
function formatReport(rawScanResults) {
|
|
255
|
-
var _a = __assign({}, rawScanResults), summary = _a.summary, appMapMetadata = _a.appMapMetadata, findings = _a.findings;
|
|
256
|
-
// remove metadata that's common between appmaps
|
|
257
|
-
var filter = metadataFilter(summary.appMapMetadata);
|
|
258
|
-
var metadata = Object.fromEntries(Object.entries(appMapMetadata).map(function (_a) {
|
|
259
|
-
var _b = __read(_a, 2), id = _b[0], metadata = _b[1];
|
|
260
|
-
return [id, filter(metadata)];
|
|
261
|
-
}));
|
|
262
|
-
// only keep one finding of the same hash
|
|
263
|
-
var uniqueFindings = __spreadArray([], __read(uniq(findings, function (_a) {
|
|
264
|
-
var hash = _a.hash;
|
|
265
|
-
return hash;
|
|
266
|
-
})), false);
|
|
267
|
-
return JSON.stringify(__assign(__assign({}, rawScanResults), { summary: __assign(__assign({}, summary), { numFindings: uniqueFindings.length }), appMapMetadata: metadata, findings: uniqueFindings }), null, 2);
|
|
268
|
-
}
|
|
269
136
|
//# sourceMappingURL=command.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"command.js","sourceRoot":"","sources":["../../../src/cli/scan/command.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"command.js","sourceRoot":"","sources":["../../../src/cli/scan/command.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __assign = (this && this.__assign) || function () {
|
|
3
|
+
__assign = Object.assign || function(t) {
|
|
4
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
5
|
+
s = arguments[i];
|
|
6
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
7
|
+
t[p] = s[p];
|
|
8
|
+
}
|
|
9
|
+
return t;
|
|
10
|
+
};
|
|
11
|
+
return __assign.apply(this, arguments);
|
|
12
|
+
};
|
|
13
|
+
var __read = (this && this.__read) || function (o, n) {
|
|
14
|
+
var m = typeof Symbol === "function" && o[Symbol.iterator];
|
|
15
|
+
if (!m) return o;
|
|
16
|
+
var i = m.call(o), r, ar = [], e;
|
|
17
|
+
try {
|
|
18
|
+
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
|
|
19
|
+
}
|
|
20
|
+
catch (error) { e = { error: error }; }
|
|
21
|
+
finally {
|
|
22
|
+
try {
|
|
23
|
+
if (r && !r.done && (m = i["return"])) m.call(i);
|
|
24
|
+
}
|
|
25
|
+
finally { if (e) throw e.error; }
|
|
26
|
+
}
|
|
27
|
+
return ar;
|
|
28
|
+
};
|
|
29
|
+
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
|
30
|
+
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
|
31
|
+
if (ar || !(i in from)) {
|
|
32
|
+
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
|
|
33
|
+
ar[i] = from[i];
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return to.concat(ar || Array.prototype.slice.call(from));
|
|
37
|
+
};
|
|
38
|
+
var __values = (this && this.__values) || function(o) {
|
|
39
|
+
var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
|
|
40
|
+
if (m) return m.call(o);
|
|
41
|
+
if (o && typeof o.length === "number") return {
|
|
42
|
+
next: function () {
|
|
43
|
+
if (o && i >= o.length) o = void 0;
|
|
44
|
+
return { value: o && o[i++], done: !o };
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
|
|
48
|
+
};
|
|
49
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
50
|
+
exports.formatReport = void 0;
|
|
51
|
+
// Formats a report to JSON. Does some data deduplication.
|
|
52
|
+
function formatReport(rawScanResults) {
|
|
53
|
+
var _a = __assign({}, rawScanResults), summary = _a.summary, appMapMetadata = _a.appMapMetadata, findings = _a.findings;
|
|
54
|
+
// remove metadata that's common between appmaps
|
|
55
|
+
var filter = metadataFilter(summary.appMapMetadata);
|
|
56
|
+
var metadata = Object.fromEntries(Object.entries(appMapMetadata).map(function (_a) {
|
|
57
|
+
var _b = __read(_a, 2), id = _b[0], metadata = _b[1];
|
|
58
|
+
return [id, filter(metadata)];
|
|
59
|
+
}));
|
|
60
|
+
// only keep one finding of the same hash
|
|
61
|
+
var uniqueFindings = __spreadArray([], __read(uniq(findings, function (_a) {
|
|
62
|
+
var hash = _a.hash;
|
|
63
|
+
return hash;
|
|
64
|
+
})), false);
|
|
65
|
+
return JSON.stringify(__assign(__assign({}, rawScanResults), { summary: __assign(__assign({}, summary), { numFindings: uniqueFindings.length }), appMapMetadata: metadata, findings: uniqueFindings }), null, 2);
|
|
66
|
+
}
|
|
67
|
+
exports.formatReport = formatReport;
|
|
68
|
+
function metadataFilter(_a) {
|
|
69
|
+
var apps = _a.apps.length, clients = _a.clients.length, frameworks = _a.frameworks.length, git = _a.git.length, languages = _a.languages.length, recorders = _a.recorders.length;
|
|
70
|
+
var filtered = Object.entries({
|
|
71
|
+
app: apps < 2,
|
|
72
|
+
client: clients < 2,
|
|
73
|
+
git: git < 2,
|
|
74
|
+
language: languages < 2,
|
|
75
|
+
recorder: recorders < 2,
|
|
76
|
+
})
|
|
77
|
+
.filter(function (_a) {
|
|
78
|
+
var _b = __read(_a, 2), v = _b[1];
|
|
79
|
+
return v;
|
|
80
|
+
})
|
|
81
|
+
.map(function (_a) {
|
|
82
|
+
var _b = __read(_a, 1), k = _b[0];
|
|
83
|
+
return k;
|
|
84
|
+
});
|
|
85
|
+
return function (metadata) {
|
|
86
|
+
return Object.fromEntries(Object.entries(metadata).filter(function (_a) {
|
|
87
|
+
var _b = __read(_a, 2), k = _b[0], v = _b[1];
|
|
88
|
+
if (filtered.includes(k))
|
|
89
|
+
return false;
|
|
90
|
+
if (k === 'frameworks')
|
|
91
|
+
return (v || []).length !== frameworks;
|
|
92
|
+
return true;
|
|
93
|
+
}));
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
function uniq(entries, key) {
|
|
97
|
+
var e_1, _a;
|
|
98
|
+
var result = new Map();
|
|
99
|
+
try {
|
|
100
|
+
for (var entries_1 = __values(entries), entries_1_1 = entries_1.next(); !entries_1_1.done; entries_1_1 = entries_1.next()) {
|
|
101
|
+
var entry = entries_1_1.value;
|
|
102
|
+
var k = key(entry);
|
|
103
|
+
if (result.has(k))
|
|
104
|
+
continue;
|
|
105
|
+
result.set(k, entry);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
109
|
+
finally {
|
|
110
|
+
try {
|
|
111
|
+
if (entries_1_1 && !entries_1_1.done && (_a = entries_1.return)) _a.call(entries_1);
|
|
112
|
+
}
|
|
113
|
+
finally { if (e_1) throw e_1.error; }
|
|
114
|
+
}
|
|
115
|
+
return result.values();
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=formatReport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formatReport.js","sourceRoot":"","sources":["../../../src/cli/scan/formatReport.ts"],"names":[],"mappings":"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"}
|