@appland/scanner 1.56.0 → 1.59.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.
Files changed (247) hide show
  1. package/CHANGELOG.md +29 -0
  2. package/built/algorithms/dataStructures/graph/Graph.js +53 -62
  3. package/built/algorithms/dataStructures/graph/GraphEdge.js +13 -16
  4. package/built/algorithms/dataStructures/graph/GraphVertex.js +37 -42
  5. package/built/algorithms/dataStructures/linked-list/LinkedList.js +33 -38
  6. package/built/algorithms/dataStructures/linked-list/LinkedListNode.js +6 -10
  7. package/built/algorithms/graph/depth-first-search/index.js +7 -8
  8. package/built/algorithms/graph/detect-cycle/index.js +15 -16
  9. package/built/algorithms/utils/Comparator.js +19 -21
  10. package/built/analyzer/recordSecrets.js +7 -30
  11. package/built/analyzer/secretsRegexes.js +8 -9
  12. package/built/appMapIndex.js +19 -21
  13. package/built/check.js +17 -21
  14. package/built/checkInstance.js +26 -48
  15. package/built/cli/ci/command.js +61 -156
  16. package/built/cli/ci/options.js +0 -1
  17. package/built/cli/codeVersionArgs.js +0 -1
  18. package/built/cli/exitCode.js +0 -1
  19. package/built/cli/fail.js +2 -3
  20. package/built/cli/merge/command.js +21 -63
  21. package/built/cli/merge/options.js +0 -1
  22. package/built/cli/reportUploadURL.js +2 -3
  23. package/built/cli/resolveAppId.js +34 -85
  24. package/built/cli/scan/command.js +52 -94
  25. package/built/cli/scan/formatReport.js +16 -89
  26. package/built/cli/scan/options.js +0 -1
  27. package/built/cli/scan/scanner.js +38 -117
  28. package/built/cli/scan/singleScan.js +61 -109
  29. package/built/cli/scan/watchScan.js +53 -85
  30. package/built/cli/scan.js +39 -132
  31. package/built/cli/scanArgs.js +0 -1
  32. package/built/cli/scanOptions.js +0 -1
  33. package/built/cli/updateCommitStatus.js +10 -47
  34. package/built/cli/upload/command.js +20 -64
  35. package/built/cli/upload/options.js +0 -1
  36. package/built/cli/upload/pruneAppMap.js +20 -0
  37. package/built/cli/upload.js +93 -172
  38. package/built/cli/validateFile.js +13 -52
  39. package/built/cli.js +34 -21
  40. package/built/configuration/configurationProvider.js +151 -233
  41. package/built/configuration/schema/options.json +76 -76
  42. package/built/configuration/types/checkConfig.js +0 -1
  43. package/built/configuration/types/configuration.js +0 -1
  44. package/built/configuration/types/matchEventConfig.js +0 -1
  45. package/built/configuration/types/matchPatternConfig.js +0 -1
  46. package/built/database/index.js +35 -128
  47. package/built/database/visit.js +20 -68
  48. package/built/errors.js +4 -30
  49. package/built/eventUtil.js +10 -35
  50. package/built/findings.js +3 -4
  51. package/built/integration/appland/app/exists.js +33 -76
  52. package/built/integration/appland/app/listFindingStatus.js +3 -36
  53. package/built/integration/appland/appMap/create.js +38 -89
  54. package/built/integration/appland/location.js +0 -1
  55. package/built/integration/appland/mapset/create.js +34 -85
  56. package/built/integration/appland/retry.js +10 -11
  57. package/built/integration/appland/retryOptions.js +0 -1
  58. package/built/integration/appland/scannerJob/create.js +34 -84
  59. package/built/integration/appland/scannerJob/merge.js +28 -74
  60. package/built/integration/appland/scannerJob.js +0 -1
  61. package/built/integration/github/commitStatus.js +3 -4
  62. package/built/integration/vars.js +1 -2
  63. package/built/openapi/index.js +39 -83
  64. package/built/report/appMapMetadata.js +0 -1
  65. package/built/report/findingSummary.js +0 -1
  66. package/built/report/findingsReport.js +14 -16
  67. package/built/report/scanResults.js +50 -72
  68. package/built/report/scanSummary.js +0 -1
  69. package/built/report/summaryReport.js +12 -13
  70. package/built/ruleChecker.js +146 -297
  71. package/built/rules/authzBeforeAuthn.js +25 -59
  72. package/built/rules/circularDependency.js +69 -101
  73. package/built/rules/deserializationOfUntrustedData.js +29 -63
  74. package/built/rules/execOfUntrustedCommand.js +28 -62
  75. package/built/rules/http-500/metadata.js +0 -1
  76. package/built/rules/http-500/rule.js +2 -3
  77. package/built/rules/illegalPackageDependency.js +16 -18
  78. package/built/rules/incompatibleHttpClientRequest.js +30 -69
  79. package/built/rules/insecureCompare.js +12 -13
  80. package/built/rules/jobNotCancelled.js +13 -45
  81. package/built/rules/lib/hasParameterOrReceiver.js +4 -7
  82. package/built/rules/lib/matchEvent.js +12 -13
  83. package/built/rules/lib/matchPattern.js +6 -7
  84. package/built/rules/lib/metadata.js +0 -1
  85. package/built/rules/lib/parseRuleDescription.js +5 -6
  86. package/built/rules/lib/precedingEvents.js +7 -75
  87. package/built/rules/lib/rpcWithoutProtection.js +5 -28
  88. package/built/rules/lib/sanitizesData.js +0 -1
  89. package/built/rules/lib/util.js +34 -73
  90. package/built/rules/logoutWithoutSessionReset.js +24 -58
  91. package/built/rules/missingAuthentication.js +28 -28
  92. package/built/rules/missingContentType.js +8 -9
  93. package/built/rules/nPlusOneQuery.js +35 -87
  94. package/built/rules/queryFromInvalidPackage.js +17 -19
  95. package/built/rules/queryFromView.js +13 -16
  96. package/built/rules/rpcWithoutCircuitBreaker.js +14 -84
  97. package/built/rules/saveWithoutValidation.js +8 -9
  98. package/built/rules/secretInLog.js +29 -92
  99. package/built/rules/slowFunctionCall.js +16 -20
  100. package/built/rules/slowHttpServerRequest.js +9 -11
  101. package/built/rules/slowQuery.js +9 -12
  102. package/built/rules/tooManyJoins.js +26 -51
  103. package/built/rules/tooManyUpdates.js +25 -105
  104. package/built/rules/unbatchedMaterializedQuery.js +26 -30
  105. package/built/rules/updateInGetRequest.js +30 -45
  106. package/built/scope/commandScope.js +24 -144
  107. package/built/scope/httpClientRequestScope.js +11 -98
  108. package/built/scope/httpServerRequestScope.js +11 -98
  109. package/built/scope/rootScope.js +11 -98
  110. package/built/scope/scopeImpl.js +10 -82
  111. package/built/scope/scopeIterator.js +6 -10
  112. package/built/scope/sqlTransactionScope.js +24 -122
  113. package/built/sqlWarning.js +9 -35
  114. package/built/telemetry.js +215 -0
  115. package/built/wellKnownLabels.js +0 -1
  116. package/package.json +7 -3
  117. package/built/algorithms/dataStructures/graph/Graph.js.map +0 -1
  118. package/built/algorithms/dataStructures/graph/GraphEdge.js.map +0 -1
  119. package/built/algorithms/dataStructures/graph/GraphVertex.js.map +0 -1
  120. package/built/algorithms/dataStructures/linked-list/LinkedList.js.map +0 -1
  121. package/built/algorithms/dataStructures/linked-list/LinkedListNode.js.map +0 -1
  122. package/built/algorithms/graph/depth-first-search/index.js.map +0 -1
  123. package/built/algorithms/graph/detect-cycle/index.js.map +0 -1
  124. package/built/algorithms/utils/Comparator.js.map +0 -1
  125. package/built/analyzer/recordSecrets.js.map +0 -1
  126. package/built/analyzer/secretsRegexes.js.map +0 -1
  127. package/built/appMapIndex.js.map +0 -1
  128. package/built/check.js.map +0 -1
  129. package/built/checkInstance.js.map +0 -1
  130. package/built/cli/ci/command.js.map +0 -1
  131. package/built/cli/ci/options.js.map +0 -1
  132. package/built/cli/codeVersionArgs.js.map +0 -1
  133. package/built/cli/exitCode.js.map +0 -1
  134. package/built/cli/fail.js.map +0 -1
  135. package/built/cli/merge/command.js.map +0 -1
  136. package/built/cli/merge/options.js.map +0 -1
  137. package/built/cli/reportUploadURL.js.map +0 -1
  138. package/built/cli/resolveAppId.js.map +0 -1
  139. package/built/cli/scan/command.js.map +0 -1
  140. package/built/cli/scan/formatReport.js.map +0 -1
  141. package/built/cli/scan/options.js.map +0 -1
  142. package/built/cli/scan/scanner.js.map +0 -1
  143. package/built/cli/scan/singleScan.js.map +0 -1
  144. package/built/cli/scan/watchScan.js.map +0 -1
  145. package/built/cli/scan.js.map +0 -1
  146. package/built/cli/scanArgs.js.map +0 -1
  147. package/built/cli/scanOptions.js.map +0 -1
  148. package/built/cli/updateCommitStatus.js.map +0 -1
  149. package/built/cli/upload/command.js.map +0 -1
  150. package/built/cli/upload/options.js.map +0 -1
  151. package/built/cli/upload.js.map +0 -1
  152. package/built/cli/validateFile.js.map +0 -1
  153. package/built/cli.js.map +0 -1
  154. package/built/configuration/configurationProvider.js.map +0 -1
  155. package/built/configuration/types/checkConfig.js.map +0 -1
  156. package/built/configuration/types/configuration.js.map +0 -1
  157. package/built/configuration/types/matchEventConfig.js.map +0 -1
  158. package/built/configuration/types/matchPatternConfig.js.map +0 -1
  159. package/built/database/index.js.map +0 -1
  160. package/built/database/visit.js.map +0 -1
  161. package/built/errors.js.map +0 -1
  162. package/built/eventUtil.js.map +0 -1
  163. package/built/findings.js.map +0 -1
  164. package/built/integration/appland/app/exists.js.map +0 -1
  165. package/built/integration/appland/app/listFindingStatus.js.map +0 -1
  166. package/built/integration/appland/appMap/create.js.map +0 -1
  167. package/built/integration/appland/location.js.map +0 -1
  168. package/built/integration/appland/mapset/create.js.map +0 -1
  169. package/built/integration/appland/retry.js.map +0 -1
  170. package/built/integration/appland/retryOptions.js.map +0 -1
  171. package/built/integration/appland/scannerJob/create.js.map +0 -1
  172. package/built/integration/appland/scannerJob/merge.js.map +0 -1
  173. package/built/integration/appland/scannerJob.js.map +0 -1
  174. package/built/integration/github/commitStatus.js.map +0 -1
  175. package/built/integration/vars.js.map +0 -1
  176. package/built/openapi/index.js.map +0 -1
  177. package/built/openapi/method.js +0 -120
  178. package/built/openapi/method.js.map +0 -1
  179. package/built/openapi/model.js +0 -49
  180. package/built/openapi/model.js.map +0 -1
  181. package/built/openapi/path.js +0 -36
  182. package/built/openapi/path.js.map +0 -1
  183. package/built/openapi/provider.js +0 -133
  184. package/built/openapi/provider.js.map +0 -1
  185. package/built/openapi/response.js +0 -59
  186. package/built/openapi/response.js.map +0 -1
  187. package/built/openapi/rpcRequest.js +0 -130
  188. package/built/openapi/rpcRequest.js.map +0 -1
  189. package/built/openapi/schema.js +0 -42
  190. package/built/openapi/schema.js.map +0 -1
  191. package/built/openapi/securitySchemes.js +0 -32
  192. package/built/openapi/securitySchemes.js.map +0 -1
  193. package/built/openapi/statusCodes.js +0 -68
  194. package/built/openapi/statusCodes.js.map +0 -1
  195. package/built/openapi/util.js +0 -91
  196. package/built/openapi/util.js.map +0 -1
  197. package/built/report/appMapMetadata.js.map +0 -1
  198. package/built/report/findingSummary.js.map +0 -1
  199. package/built/report/findingsReport.js.map +0 -1
  200. package/built/report/scanResults.js.map +0 -1
  201. package/built/report/scanSummary.js.map +0 -1
  202. package/built/report/summaryReport.js.map +0 -1
  203. package/built/ruleChecker.js.map +0 -1
  204. package/built/rules/authzBeforeAuthn.js.map +0 -1
  205. package/built/rules/circularDependency.js.map +0 -1
  206. package/built/rules/deserializationOfUntrustedData.js.map +0 -1
  207. package/built/rules/execOfUntrustedCommand.js.map +0 -1
  208. package/built/rules/http-500/metadata.js.map +0 -1
  209. package/built/rules/http-500/rule.js.map +0 -1
  210. package/built/rules/illegalPackageDependency.js.map +0 -1
  211. package/built/rules/incompatibleHttpClientRequest.js.map +0 -1
  212. package/built/rules/insecureCompare.js.map +0 -1
  213. package/built/rules/jobNotCancelled.js.map +0 -1
  214. package/built/rules/lib/hasParameterOrReceiver.js.map +0 -1
  215. package/built/rules/lib/matchEvent.js.map +0 -1
  216. package/built/rules/lib/matchPattern.js.map +0 -1
  217. package/built/rules/lib/metadata.js.map +0 -1
  218. package/built/rules/lib/parseRuleDescription.js.map +0 -1
  219. package/built/rules/lib/precedingEvents.js.map +0 -1
  220. package/built/rules/lib/rpcWithoutProtection.js.map +0 -1
  221. package/built/rules/lib/sanitizesData.js.map +0 -1
  222. package/built/rules/lib/util.js.map +0 -1
  223. package/built/rules/logoutWithoutSessionReset.js.map +0 -1
  224. package/built/rules/missingAuthentication.js.map +0 -1
  225. package/built/rules/missingContentType.js.map +0 -1
  226. package/built/rules/nPlusOneQuery.js.map +0 -1
  227. package/built/rules/queryFromInvalidPackage.js.map +0 -1
  228. package/built/rules/queryFromView.js.map +0 -1
  229. package/built/rules/rpcWithoutCircuitBreaker.js.map +0 -1
  230. package/built/rules/saveWithoutValidation.js.map +0 -1
  231. package/built/rules/secretInLog.js.map +0 -1
  232. package/built/rules/slowFunctionCall.js.map +0 -1
  233. package/built/rules/slowHttpServerRequest.js.map +0 -1
  234. package/built/rules/slowQuery.js.map +0 -1
  235. package/built/rules/tooManyJoins.js.map +0 -1
  236. package/built/rules/tooManyUpdates.js.map +0 -1
  237. package/built/rules/unbatchedMaterializedQuery.js.map +0 -1
  238. package/built/rules/updateInGetRequest.js.map +0 -1
  239. package/built/scope/commandScope.js.map +0 -1
  240. package/built/scope/httpClientRequestScope.js.map +0 -1
  241. package/built/scope/httpServerRequestScope.js.map +0 -1
  242. package/built/scope/rootScope.js.map +0 -1
  243. package/built/scope/scopeImpl.js.map +0 -1
  244. package/built/scope/scopeIterator.js.map +0 -1
  245. package/built/scope/sqlTransactionScope.js.map +0 -1
  246. package/built/sqlWarning.js.map +0 -1
  247. package/built/wellKnownLabels.js.map +0 -1
@@ -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) {
@@ -19,173 +8,105 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
19
8
  step((generator = generator.apply(thisArg, _arguments || [])).next());
20
9
  });
21
10
  };
22
- var __generator = (this && this.__generator) || function (thisArg, body) {
23
- var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
24
- return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
25
- function verb(n) { return function (v) { return step([n, v]); }; }
26
- function step(op) {
27
- if (f) throw new TypeError("Generator is already executing.");
28
- while (_) try {
29
- if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
30
- if (y = 0, t) op = [op[0] & 2, t.value];
31
- switch (op[0]) {
32
- case 0: case 1: t = op; break;
33
- case 4: _.label++; return { value: op[1], done: false };
34
- case 5: _.label++; y = op[1]; op = [0]; continue;
35
- case 7: op = _.ops.pop(); _.trys.pop(); continue;
36
- default:
37
- if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
38
- if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
39
- if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
40
- if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
41
- if (t[2]) _.ops.pop();
42
- _.trys.pop(); continue;
43
- }
44
- op = body.call(thisArg, _);
45
- } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
46
- if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
47
- }
48
- };
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 {
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ const async_1 = require("async");
13
+ const promises_1 = require("fs/promises");
14
+ const util_1 = require("../rules/lib/util");
15
+ const create_1 = require("../integration/appland/appMap/create");
16
+ const create_2 = require("../integration/appland/mapset/create");
17
+ const create_3 = require("../integration/appland/scannerJob/create");
18
+ const vars_1 = require("../integration/vars");
19
+ const promises_2 = require("fs/promises");
20
+ const path_1 = require("path");
21
+ const pruneAppMap_1 = require("./upload/pruneAppMap");
22
+ function fileExists(file) {
23
+ return __awaiter(this, void 0, void 0, function* () {
58
24
  try {
59
- if (r && !r.done && (m = i["return"])) m.call(i);
25
+ yield (0, promises_2.stat)(file);
26
+ return true;
60
27
  }
61
- finally { if (e) throw e.error; }
62
- }
63
- return ar;
64
- };
65
- var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
66
- if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
67
- if (ar || !(i in from)) {
68
- if (!ar) ar = Array.prototype.slice.call(from, 0, i);
69
- ar[i] = from[i];
28
+ catch (e) {
29
+ return false;
70
30
  }
71
- }
72
- return to.concat(ar || Array.prototype.slice.call(from));
73
- };
74
- Object.defineProperty(exports, "__esModule", { value: true });
75
- var async_1 = require("async");
76
- var promises_1 = require("fs/promises");
77
- var util_1 = require("../rules/lib/util");
78
- var create_1 = require("../integration/appland/appMap/create");
79
- var create_2 = require("../integration/appland/mapset/create");
80
- var create_3 = require("../integration/appland/scannerJob/create");
81
- var vars_1 = require("../integration/vars");
82
- var promises_2 = require("fs/promises");
83
- var path_1 = require("path");
84
- function fileExists(file) {
85
- return __awaiter(this, void 0, void 0, function () {
86
- var e_1;
87
- return __generator(this, function (_a) {
88
- switch (_a.label) {
89
- case 0:
90
- _a.trys.push([0, 2, , 3]);
91
- return [4 /*yield*/, (0, promises_2.stat)(file)];
92
- case 1:
93
- _a.sent();
94
- return [2 /*return*/, true];
95
- case 2:
96
- e_1 = _a.sent();
97
- return [2 /*return*/, false];
98
- case 3: return [2 /*return*/];
99
- }
100
- });
101
31
  });
102
32
  }
103
- function create(scanResults, appId, appMapDir, mergeKey, mapsetOptions, retryOptions) {
104
- if (mapsetOptions === void 0) { mapsetOptions = {}; }
105
- if (retryOptions === void 0) { retryOptions = {}; }
106
- return __awaiter(this, void 0, void 0, function () {
107
- var findings, relevantFilePaths, appMapUUIDByFileName, branchCount, commitCount, createAppMapOptions, q, mostFrequent, mapset;
108
- var _this = this;
109
- return __generator(this, function (_a) {
110
- switch (_a.label) {
111
- case 0:
112
- if ((0, util_1.verbose)())
113
- console.log("Uploading AppMaps and findings to application '".concat(appId, "'"));
114
- findings = scanResults.findings;
115
- relevantFilePaths = __spreadArray([], __read(new Set(findings.filter(function (f) { return f.appMapFile; }).map(function (f) { return f.appMapFile; }))), false);
116
- appMapUUIDByFileName = {};
117
- branchCount = {};
118
- commitCount = {};
119
- createAppMapOptions = {
120
- app: appId,
121
- };
122
- q = (0, async_1.queue)(function (filePath, callback) { return __awaiter(_this, void 0, void 0, function () {
123
- var filePaths, filePathsExist, fullPath;
124
- return __generator(this, function (_a) {
125
- switch (_a.label) {
126
- case 0:
127
- if ((0, util_1.verbose)())
128
- console.log("Uploading AppMap ".concat(filePath));
129
- filePaths = [filePath, (0, path_1.join)(appMapDir, filePath)];
130
- return [4 /*yield*/, Promise.all(filePaths.map(fileExists))];
131
- case 1:
132
- filePathsExist = _a.sent();
133
- fullPath = filePaths.find(function (_, fileIndex) { return filePathsExist[fileIndex]; });
134
- if (!fullPath)
135
- throw new Error("File ".concat(filePath, " not found"));
136
- (0, promises_1.readFile)(fullPath)
137
- .then(function (buffer) {
138
- var _a, _b;
139
- var appMapStruct = JSON.parse(buffer.toString());
140
- var metadata = appMapStruct.metadata;
141
- var branch = (_a = appMapStruct.metadata.git) === null || _a === void 0 ? void 0 : _a.branch;
142
- var commit = (_b = appMapStruct.metadata.git) === null || _b === void 0 ? void 0 : _b.commit;
143
- if (branch) {
144
- branchCount[branch] || (branchCount[branch] = 1);
145
- branchCount[branch] += 1;
146
- }
147
- if (commit) {
148
- commitCount[commit] || (commitCount[commit] = 1);
149
- commitCount[commit] += 1;
150
- }
151
- return (0, create_1.create)(buffer, Object.assign(retryOptions, __assign(__assign({}, createAppMapOptions), { metadata: metadata })));
152
- })
153
- .then(function (appMap) {
154
- if (appMap) {
155
- appMapUUIDByFileName[filePath] = appMap.uuid;
156
- }
157
- })
158
- .then(function () { return callback(null); })
159
- .catch(callback);
160
- return [2 /*return*/];
161
- }
162
- });
163
- }); }, 3);
164
- q.error(function (err, filePath) {
165
- console.error("An error occurred uploading ".concat(filePath, ": ").concat(err));
166
- });
167
- if ((0, util_1.verbose)())
168
- console.log("Uploading ".concat(relevantFilePaths.length, " AppMaps"));
169
- q.push(relevantFilePaths);
170
- return [4 /*yield*/, q.drain()];
171
- case 1:
172
- _a.sent();
173
- mostFrequent = function (counts) {
174
- if (Object.keys(counts).length === 0)
175
- return;
176
- var maxCount = Object.values(counts).reduce(function (max, count) { return Math.max(max, count); }, 0);
177
- return Object.entries(counts).find(function (e) { return e[1] === maxCount; })[0];
178
- };
179
- mapsetOptions.branch || (mapsetOptions.branch = (0, vars_1.branch)() || mostFrequent(branchCount));
180
- mapsetOptions.commit || (mapsetOptions.commit = (0, vars_1.sha)() || mostFrequent(commitCount));
181
- return [4 /*yield*/, (0, create_2.create)(appId, Object.values(appMapUUIDByFileName), mapsetOptions, retryOptions)];
182
- case 2:
183
- mapset = _a.sent();
184
- console.warn('Uploading findings');
185
- return [2 /*return*/, (0, create_3.create)(scanResults, mapset.id, appMapUUIDByFileName, { mergeKey: mergeKey }, retryOptions)];
186
- }
33
+ function create(scanResults, appId, appMapDir, mergeKey, mapsetOptions = {}, retryOptions = {}) {
34
+ return __awaiter(this, void 0, void 0, function* () {
35
+ if ((0, util_1.verbose)())
36
+ console.log(`Uploading AppMaps and findings to application '${appId}'`);
37
+ const { findings } = scanResults;
38
+ const relevantFilePaths = [
39
+ ...new Set(findings.filter((f) => f.appMapFile).map((f) => f.appMapFile)),
40
+ ];
41
+ const appMapUUIDByFileName = {};
42
+ const branchCount = {};
43
+ const commitCount = {};
44
+ const createAppMapOptions = {
45
+ app: appId,
46
+ };
47
+ const q = (0, async_1.queue)((filePath, callback) => __awaiter(this, void 0, void 0, function* () {
48
+ if ((0, util_1.verbose)())
49
+ console.log(`Uploading AppMap ${filePath}`);
50
+ const filePaths = [filePath, (0, path_1.join)(appMapDir, filePath)];
51
+ const filePathsExist = yield Promise.all(filePaths.map(fileExists));
52
+ const fullPath = filePaths.find((_, fileIndex) => filePathsExist[fileIndex]);
53
+ if (!fullPath)
54
+ throw new Error(`File ${filePath} not found`);
55
+ (0, promises_1.readFile)(fullPath)
56
+ .then((buffer) => {
57
+ const maxSize = (0, pruneAppMap_1.maxAppMapSize)();
58
+ const appMapJson = JSON.parse(buffer.toString());
59
+ const builder = (0, pruneAppMap_1.buildAppMap)(appMapJson);
60
+ let metadata = appMapJson.metadata;
61
+ if (buffer.byteLength > maxSize) {
62
+ console.warn(`${fullPath} is larger than ${maxSize / 1024}K, pruning it`);
63
+ (0, pruneAppMap_1.pruneAppMap)(builder, maxSize);
64
+ }
65
+ const prunedAppMap = builder.normalize().build();
66
+ metadata = prunedAppMap.metadata;
67
+ buffer = Buffer.from(JSON.stringify(prunedAppMap));
68
+ return { metadata, buffer };
69
+ })
70
+ .then(({ metadata, buffer }) => {
71
+ var _a, _b;
72
+ const branch = (_a = metadata.git) === null || _a === void 0 ? void 0 : _a.branch;
73
+ const commit = (_b = metadata.git) === null || _b === void 0 ? void 0 : _b.commit;
74
+ if (branch) {
75
+ branchCount[branch] || (branchCount[branch] = 1);
76
+ branchCount[branch] += 1;
77
+ }
78
+ if (commit) {
79
+ commitCount[commit] || (commitCount[commit] = 1);
80
+ commitCount[commit] += 1;
81
+ }
82
+ return (0, create_1.create)(buffer, Object.assign(retryOptions, Object.assign(Object.assign({}, createAppMapOptions), { metadata })));
83
+ })
84
+ .then((appMap) => {
85
+ if (appMap) {
86
+ appMapUUIDByFileName[filePath] = appMap.uuid;
87
+ }
88
+ })
89
+ .then(() => callback(null))
90
+ .catch(callback);
91
+ }), 3);
92
+ q.error((err, filePath) => {
93
+ console.error(`An error occurred uploading ${filePath}: ${err}`);
187
94
  });
95
+ if ((0, util_1.verbose)())
96
+ console.log(`Uploading ${relevantFilePaths.length} AppMaps`);
97
+ q.push(relevantFilePaths);
98
+ yield q.drain();
99
+ const mostFrequent = (counts) => {
100
+ if (Object.keys(counts).length === 0)
101
+ return;
102
+ const maxCount = Object.values(counts).reduce((max, count) => Math.max(max, count), 0);
103
+ return Object.entries(counts).find((e) => e[1] === maxCount)[0];
104
+ };
105
+ mapsetOptions.branch || (mapsetOptions.branch = (0, vars_1.branch)() || mostFrequent(branchCount));
106
+ mapsetOptions.commit || (mapsetOptions.commit = (0, vars_1.sha)() || mostFrequent(commitCount));
107
+ const mapset = yield (0, create_2.create)(appId, Object.values(appMapUUIDByFileName), mapsetOptions, retryOptions);
108
+ console.warn('Uploading findings');
109
+ return (0, create_3.create)(scanResults, mapset.id, appMapUUIDByFileName, { mergeKey }, retryOptions);
188
110
  });
189
111
  }
190
112
  exports.default = create;
191
- //# sourceMappingURL=upload.js.map
@@ -8,63 +8,24 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
8
8
  step((generator = generator.apply(thisArg, _arguments || [])).next());
9
9
  });
10
10
  };
11
- var __generator = (this && this.__generator) || function (thisArg, body) {
12
- var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
13
- return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
14
- function verb(n) { return function (v) { return step([n, v]); }; }
15
- function step(op) {
16
- if (f) throw new TypeError("Generator is already executing.");
17
- while (_) try {
18
- if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
19
- if (y = 0, t) op = [op[0] & 2, t.value];
20
- switch (op[0]) {
21
- case 0: case 1: t = op; break;
22
- case 4: _.label++; return { value: op[1], done: false };
23
- case 5: _.label++; y = op[1]; op = [0]; continue;
24
- case 7: op = _.ops.pop(); _.trys.pop(); continue;
25
- default:
26
- if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
27
- if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
28
- if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
29
- if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
30
- if (t[2]) _.ops.pop();
31
- _.trys.pop(); continue;
32
- }
33
- op = body.call(thisArg, _);
34
- } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
35
- if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
36
- }
37
- };
38
11
  var __importDefault = (this && this.__importDefault) || function (mod) {
39
12
  return (mod && mod.__esModule) ? mod : { "default": mod };
40
13
  };
41
14
  Object.defineProperty(exports, "__esModule", { value: true });
42
- var chalk_1 = __importDefault(require("chalk"));
43
- var fs_1 = require("fs");
44
- var promises_1 = require("fs/promises");
45
- var errors_1 = require("../errors");
15
+ const chalk_1 = __importDefault(require("chalk"));
16
+ const fs_1 = require("fs");
17
+ const promises_1 = require("fs/promises");
18
+ const errors_1 = require("../errors");
46
19
  function default_1(kind, path) {
47
- return __awaiter(this, void 0, void 0, function () {
48
- var _a;
49
- return __generator(this, function (_b) {
50
- switch (_b.label) {
51
- case 0:
52
- if (path === '.')
53
- return [2 /*return*/];
54
- _b.label = 1;
55
- case 1:
56
- _b.trys.push([1, 3, , 4]);
57
- return [4 /*yield*/, (0, promises_1.access)(path, fs_1.constants.R_OK)];
58
- case 2:
59
- _b.sent();
60
- return [3 /*break*/, 4];
61
- case 3:
62
- _a = _b.sent();
63
- throw new errors_1.ValidationError("AppMap ".concat(kind, " ").concat(chalk_1.default.red(path), " does not exist, or is not readable."));
64
- case 4: return [2 /*return*/];
65
- }
66
- });
20
+ return __awaiter(this, void 0, void 0, function* () {
21
+ if (path === '.')
22
+ return;
23
+ try {
24
+ yield (0, promises_1.access)(path, fs_1.constants.R_OK);
25
+ }
26
+ catch (_a) {
27
+ throw new errors_1.ValidationError(`AppMap ${kind} ${chalk_1.default.red(path)} does not exist, or is not readable.`);
28
+ }
67
29
  });
68
30
  }
69
31
  exports.default = default_1;
70
- //# sourceMappingURL=validateFile.js.map
package/built/cli.js CHANGED
@@ -4,14 +4,34 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  return (mod && mod.__esModule) ? mod : { "default": mod };
5
5
  };
6
6
  Object.defineProperty(exports, "__esModule", { value: true });
7
- var yargs_1 = __importDefault(require("yargs"));
8
- var command_1 = __importDefault(require("./cli/scan/command"));
9
- var command_2 = __importDefault(require("./cli/upload/command"));
10
- var command_3 = __importDefault(require("./cli/ci/command"));
11
- var command_4 = __importDefault(require("./cli/merge/command"));
12
- var util_1 = require("./rules/lib/util");
13
- var errors_1 = require("./errors");
14
- var exitCode_1 = require("./cli/exitCode");
7
+ const yargs_1 = __importDefault(require("yargs"));
8
+ const command_1 = __importDefault(require("./cli/scan/command"));
9
+ const command_2 = __importDefault(require("./cli/upload/command"));
10
+ const command_3 = __importDefault(require("./cli/ci/command"));
11
+ const command_4 = __importDefault(require("./cli/merge/command"));
12
+ const util_1 = require("./rules/lib/util");
13
+ const errors_1 = require("./errors");
14
+ const exitCode_1 = require("./cli/exitCode");
15
+ const telemetry_1 = __importDefault(require("./telemetry"));
16
+ function errorInfo(err) {
17
+ if (err instanceof errors_1.ValidationError)
18
+ return { label: 'validation-error', code: exitCode_1.ExitCode.ValidationError };
19
+ else if (err instanceof errors_1.AbortError)
20
+ return { label: 'abort', code: exitCode_1.ExitCode.AbortError };
21
+ else
22
+ return { label: 'error', code: exitCode_1.ExitCode.RuntimeError };
23
+ }
24
+ function handleError(err) {
25
+ const { label, code } = errorInfo(err);
26
+ process.exitCode = code;
27
+ const telemetry = {
28
+ name: [process.argv[2], label].join(':'),
29
+ properties: { error: err.message },
30
+ };
31
+ if (label === 'error')
32
+ telemetry.properties.errorStack = err.stack;
33
+ telemetry_1.default.sendEvent(telemetry);
34
+ }
15
35
  (0, yargs_1.default)(process.argv.slice(2))
16
36
  .option('verbose', {
17
37
  describe: 'Show verbose output',
@@ -21,7 +41,7 @@ var exitCode_1 = require("./cli/exitCode");
21
41
  .command(command_2.default)
22
42
  .command(command_3.default)
23
43
  .command(command_4.default)
24
- .fail(function (msg, err, yargs) {
44
+ .fail((msg, err, yargs) => {
25
45
  if (msg) {
26
46
  console.warn(yargs.help());
27
47
  console.warn(msg);
@@ -33,19 +53,12 @@ var exitCode_1 = require("./cli/exitCode");
33
53
  else {
34
54
  console.error(err.message);
35
55
  }
36
- if (err instanceof errors_1.ValidationError) {
37
- process.exit(exitCode_1.ExitCode.ValidationError);
38
- }
39
- if (err instanceof errors_1.AbortError) {
40
- process.exit(exitCode_1.ExitCode.AbortError);
41
- }
42
- if (err instanceof Error) {
43
- process.exit(exitCode_1.ExitCode.RuntimeError);
44
- }
45
56
  }
46
- process.exit(1);
57
+ process.exitCode = exitCode_1.ExitCode.ValidationError;
47
58
  })
59
+ .exitProcess(false)
48
60
  .strict()
49
61
  .demandCommand()
50
- .help().argv;
51
- //# sourceMappingURL=cli.js.map
62
+ .help()
63
+ .parseAsync()
64
+ .catch(handleError);