@appland/scanner 1.55.0 → 1.58.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 (244) 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 +57 -242
  25. package/built/cli/scan/formatReport.js +44 -0
  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 +80 -0
  29. package/built/cli/scan/watchScan.js +102 -0
  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 +16 -0
  37. package/built/cli/upload.js +91 -172
  38. package/built/cli/validateFile.js +13 -48
  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 +5 -38
  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 +30 -93
  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 +10 -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/options.js.map +0 -1
  141. package/built/cli/scan/scanner.js.map +0 -1
  142. package/built/cli/scan.js.map +0 -1
  143. package/built/cli/scanArgs.js.map +0 -1
  144. package/built/cli/scanOptions.js.map +0 -1
  145. package/built/cli/updateCommitStatus.js.map +0 -1
  146. package/built/cli/upload/command.js.map +0 -1
  147. package/built/cli/upload/options.js.map +0 -1
  148. package/built/cli/upload.js.map +0 -1
  149. package/built/cli/validateFile.js.map +0 -1
  150. package/built/cli.js.map +0 -1
  151. package/built/configuration/configurationProvider.js.map +0 -1
  152. package/built/configuration/types/checkConfig.js.map +0 -1
  153. package/built/configuration/types/configuration.js.map +0 -1
  154. package/built/configuration/types/matchEventConfig.js.map +0 -1
  155. package/built/configuration/types/matchPatternConfig.js.map +0 -1
  156. package/built/database/index.js.map +0 -1
  157. package/built/database/visit.js.map +0 -1
  158. package/built/errors.js.map +0 -1
  159. package/built/eventUtil.js.map +0 -1
  160. package/built/findings.js.map +0 -1
  161. package/built/integration/appland/app/exists.js.map +0 -1
  162. package/built/integration/appland/app/listFindingStatus.js.map +0 -1
  163. package/built/integration/appland/appMap/create.js.map +0 -1
  164. package/built/integration/appland/location.js.map +0 -1
  165. package/built/integration/appland/mapset/create.js.map +0 -1
  166. package/built/integration/appland/retry.js.map +0 -1
  167. package/built/integration/appland/retryOptions.js.map +0 -1
  168. package/built/integration/appland/scannerJob/create.js.map +0 -1
  169. package/built/integration/appland/scannerJob/merge.js.map +0 -1
  170. package/built/integration/appland/scannerJob.js.map +0 -1
  171. package/built/integration/github/commitStatus.js.map +0 -1
  172. package/built/integration/vars.js.map +0 -1
  173. package/built/openapi/index.js.map +0 -1
  174. package/built/openapi/method.js +0 -120
  175. package/built/openapi/method.js.map +0 -1
  176. package/built/openapi/model.js +0 -49
  177. package/built/openapi/model.js.map +0 -1
  178. package/built/openapi/path.js +0 -36
  179. package/built/openapi/path.js.map +0 -1
  180. package/built/openapi/provider.js +0 -133
  181. package/built/openapi/provider.js.map +0 -1
  182. package/built/openapi/response.js +0 -59
  183. package/built/openapi/response.js.map +0 -1
  184. package/built/openapi/rpcRequest.js +0 -130
  185. package/built/openapi/rpcRequest.js.map +0 -1
  186. package/built/openapi/schema.js +0 -42
  187. package/built/openapi/schema.js.map +0 -1
  188. package/built/openapi/securitySchemes.js +0 -32
  189. package/built/openapi/securitySchemes.js.map +0 -1
  190. package/built/openapi/statusCodes.js +0 -68
  191. package/built/openapi/statusCodes.js.map +0 -1
  192. package/built/openapi/util.js +0 -91
  193. package/built/openapi/util.js.map +0 -1
  194. package/built/report/appMapMetadata.js.map +0 -1
  195. package/built/report/findingSummary.js.map +0 -1
  196. package/built/report/findingsReport.js.map +0 -1
  197. package/built/report/scanResults.js.map +0 -1
  198. package/built/report/scanSummary.js.map +0 -1
  199. package/built/report/summaryReport.js.map +0 -1
  200. package/built/ruleChecker.js.map +0 -1
  201. package/built/rules/authzBeforeAuthn.js.map +0 -1
  202. package/built/rules/circularDependency.js.map +0 -1
  203. package/built/rules/deserializationOfUntrustedData.js.map +0 -1
  204. package/built/rules/execOfUntrustedCommand.js.map +0 -1
  205. package/built/rules/http-500/metadata.js.map +0 -1
  206. package/built/rules/http-500/rule.js.map +0 -1
  207. package/built/rules/illegalPackageDependency.js.map +0 -1
  208. package/built/rules/incompatibleHttpClientRequest.js.map +0 -1
  209. package/built/rules/insecureCompare.js.map +0 -1
  210. package/built/rules/jobNotCancelled.js.map +0 -1
  211. package/built/rules/lib/hasParameterOrReceiver.js.map +0 -1
  212. package/built/rules/lib/matchEvent.js.map +0 -1
  213. package/built/rules/lib/matchPattern.js.map +0 -1
  214. package/built/rules/lib/metadata.js.map +0 -1
  215. package/built/rules/lib/parseRuleDescription.js.map +0 -1
  216. package/built/rules/lib/precedingEvents.js.map +0 -1
  217. package/built/rules/lib/rpcWithoutProtection.js.map +0 -1
  218. package/built/rules/lib/sanitizesData.js.map +0 -1
  219. package/built/rules/lib/util.js.map +0 -1
  220. package/built/rules/logoutWithoutSessionReset.js.map +0 -1
  221. package/built/rules/missingAuthentication.js.map +0 -1
  222. package/built/rules/missingContentType.js.map +0 -1
  223. package/built/rules/nPlusOneQuery.js.map +0 -1
  224. package/built/rules/queryFromInvalidPackage.js.map +0 -1
  225. package/built/rules/queryFromView.js.map +0 -1
  226. package/built/rules/rpcWithoutCircuitBreaker.js.map +0 -1
  227. package/built/rules/saveWithoutValidation.js.map +0 -1
  228. package/built/rules/secretInLog.js.map +0 -1
  229. package/built/rules/slowFunctionCall.js.map +0 -1
  230. package/built/rules/slowHttpServerRequest.js.map +0 -1
  231. package/built/rules/slowQuery.js.map +0 -1
  232. package/built/rules/tooManyJoins.js.map +0 -1
  233. package/built/rules/tooManyUpdates.js.map +0 -1
  234. package/built/rules/unbatchedMaterializedQuery.js.map +0 -1
  235. package/built/rules/updateInGetRequest.js.map +0 -1
  236. package/built/scope/commandScope.js.map +0 -1
  237. package/built/scope/httpClientRequestScope.js.map +0 -1
  238. package/built/scope/httpServerRequestScope.js.map +0 -1
  239. package/built/scope/rootScope.js.map +0 -1
  240. package/built/scope/scopeImpl.js.map +0 -1
  241. package/built/scope/scopeIterator.js.map +0 -1
  242. package/built/scope/sqlTransactionScope.js.map +0 -1
  243. package/built/sqlWarning.js.map +0 -1
  244. package/built/wellKnownLabels.js.map +0 -1
@@ -8,48 +8,21 @@ 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 promises_1 = require("fs/promises");
43
- var util_1 = require("../../rules/lib/util");
44
- var validateFile_1 = __importDefault(require("../validateFile"));
45
- var resolveAppId_1 = __importDefault(require("../resolveAppId"));
46
- var reportUploadURL_1 = __importDefault(require("../reportUploadURL"));
47
- var upload_1 = __importDefault(require("../upload"));
48
- var codeVersionArgs_1 = __importDefault(require("../codeVersionArgs"));
15
+ const promises_1 = require("fs/promises");
16
+ const util_1 = require("../../rules/lib/util");
17
+ const validateFile_1 = __importDefault(require("../validateFile"));
18
+ const resolveAppId_1 = __importDefault(require("../resolveAppId"));
19
+ const reportUploadURL_1 = __importDefault(require("../reportUploadURL"));
20
+ const upload_1 = __importDefault(require("../upload"));
21
+ const codeVersionArgs_1 = __importDefault(require("../codeVersionArgs"));
49
22
  exports.default = {
50
23
  command: 'upload',
51
24
  describe: 'Upload Findings to the AppMap Server',
52
- builder: function (args) {
25
+ builder(args) {
53
26
  (0, codeVersionArgs_1.default)(args);
54
27
  args.option('appmap-dir', {
55
28
  describe: 'base directory of AppMaps',
@@ -67,36 +40,19 @@ exports.default = {
67
40
  });
68
41
  return args.strict();
69
42
  },
70
- handler: function (options) {
71
- return __awaiter(this, void 0, void 0, function () {
72
- var _a, isVerbose, reportFile, appmapDir, appIdArg, mergeKey, branch, commit, environment, appId, scanResults, _b, _c, uploadResponse;
73
- return __generator(this, function (_d) {
74
- switch (_d.label) {
75
- case 0:
76
- _a = options, isVerbose = _a.verbose, reportFile = _a.reportFile, appmapDir = _a.appmapDir, appIdArg = _a.app, mergeKey = _a.mergeKey, branch = _a.branch, commit = _a.commit, environment = _a.environment;
77
- if (isVerbose) {
78
- (0, util_1.verbose)(true);
79
- }
80
- return [4 /*yield*/, (0, validateFile_1.default)('directory', appmapDir)];
81
- case 1:
82
- _d.sent();
83
- return [4 /*yield*/, (0, resolveAppId_1.default)(appIdArg, appmapDir)];
84
- case 2:
85
- appId = _d.sent();
86
- _c = (_b = JSON).parse;
87
- return [4 /*yield*/, (0, promises_1.readFile)(reportFile)];
88
- case 3:
89
- scanResults = _c.apply(_b, [(_d.sent()).toString()]);
90
- return [4 /*yield*/, (0, upload_1.default)(scanResults, appId, appmapDir, mergeKey, { branch: branch, commit: commit, environment: environment }, {
91
- maxRetries: 3,
92
- })];
93
- case 4:
94
- uploadResponse = _d.sent();
95
- (0, reportUploadURL_1.default)(uploadResponse.summary.numFindings, uploadResponse.url);
96
- return [2 /*return*/];
97
- }
43
+ handler(options) {
44
+ return __awaiter(this, void 0, void 0, function* () {
45
+ const { verbose: isVerbose, reportFile, appmapDir, app: appIdArg, mergeKey, branch, commit, environment, } = options;
46
+ if (isVerbose) {
47
+ (0, util_1.verbose)(true);
48
+ }
49
+ yield (0, validateFile_1.default)('directory', appmapDir);
50
+ const appId = yield (0, resolveAppId_1.default)(appIdArg, appmapDir);
51
+ const scanResults = JSON.parse((yield (0, promises_1.readFile)(reportFile)).toString());
52
+ const uploadResponse = yield (0, upload_1.default)(scanResults, appId, appmapDir, mergeKey, { branch, commit, environment }, {
53
+ maxRetries: 3,
98
54
  });
55
+ (0, reportUploadURL_1.default)(uploadResponse.summary.numFindings, uploadResponse.url);
99
56
  });
100
57
  },
101
58
  };
102
- //# sourceMappingURL=command.js.map
@@ -1,3 +1,2 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- //# sourceMappingURL=options.js.map
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.pruneAppMap = exports.maxAppMapSize = void 0;
4
+ const models_1 = require("@appland/models");
5
+ const APPMAP_UPLOAD_MAX_SIZE = parseInt(process.env.APPMAP_UPLOAD_MAX_SIZE || '40960') * 1024;
6
+ if (!APPMAP_UPLOAD_MAX_SIZE) {
7
+ throw Error(`Failed parsing APPMAP_UPLOAD_MAX_SIZE: "${process.env.APPMAP_UPLOAD_MAX_SIZE}"`);
8
+ }
9
+ function maxAppMapSize() {
10
+ return APPMAP_UPLOAD_MAX_SIZE;
11
+ }
12
+ exports.maxAppMapSize = maxAppMapSize;
13
+ function pruneAppMap(appMapJson, maxSize) {
14
+ return (0, models_1.buildAppMap)().source(appMapJson).prune(maxSize).normalize().build();
15
+ }
16
+ exports.pruneAppMap = pruneAppMap;
@@ -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,103 @@ 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
+ let metadata = appMapJson.metadata;
60
+ if (buffer.byteLength > maxSize) {
61
+ console.warn(`${fullPath} is larger than ${maxSize / 1024}K, pruning it`);
62
+ const prunedAppMap = (0, pruneAppMap_1.pruneAppMap)(appMapJson, maxSize);
63
+ metadata = prunedAppMap.metadata;
64
+ buffer = Buffer.from(JSON.stringify(prunedAppMap));
65
+ }
66
+ return { metadata, buffer };
67
+ })
68
+ .then(({ metadata, buffer }) => {
69
+ var _a, _b;
70
+ const branch = (_a = metadata.git) === null || _a === void 0 ? void 0 : _a.branch;
71
+ const commit = (_b = metadata.git) === null || _b === void 0 ? void 0 : _b.commit;
72
+ if (branch) {
73
+ branchCount[branch] || (branchCount[branch] = 1);
74
+ branchCount[branch] += 1;
75
+ }
76
+ if (commit) {
77
+ commitCount[commit] || (commitCount[commit] = 1);
78
+ commitCount[commit] += 1;
79
+ }
80
+ return (0, create_1.create)(buffer, Object.assign(retryOptions, Object.assign(Object.assign({}, createAppMapOptions), { metadata })));
81
+ })
82
+ .then((appMap) => {
83
+ if (appMap) {
84
+ appMapUUIDByFileName[filePath] = appMap.uuid;
85
+ }
86
+ })
87
+ .then(() => callback(null))
88
+ .catch(callback);
89
+ }), 3);
90
+ q.error((err, filePath) => {
91
+ console.error(`An error occurred uploading ${filePath}: ${err}`);
187
92
  });
93
+ if ((0, util_1.verbose)())
94
+ console.log(`Uploading ${relevantFilePaths.length} AppMaps`);
95
+ q.push(relevantFilePaths);
96
+ yield q.drain();
97
+ const mostFrequent = (counts) => {
98
+ if (Object.keys(counts).length === 0)
99
+ return;
100
+ const maxCount = Object.values(counts).reduce((max, count) => Math.max(max, count), 0);
101
+ return Object.entries(counts).find((e) => e[1] === maxCount)[0];
102
+ };
103
+ mapsetOptions.branch || (mapsetOptions.branch = (0, vars_1.branch)() || mostFrequent(branchCount));
104
+ mapsetOptions.commit || (mapsetOptions.commit = (0, vars_1.sha)() || mostFrequent(commitCount));
105
+ const mapset = yield (0, create_2.create)(appId, Object.values(appMapUUIDByFileName), mapsetOptions, retryOptions);
106
+ console.warn('Uploading findings');
107
+ return (0, create_3.create)(scanResults, mapset.id, appMapUUIDByFileName, { mergeKey }, retryOptions);
188
108
  });
189
109
  }
190
110
  exports.default = create;
191
- //# sourceMappingURL=upload.js.map
@@ -8,59 +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
- _b.trys.push([0, 2, , 3]);
53
- return [4 /*yield*/, (0, promises_1.access)(path, fs_1.constants.R_OK)];
54
- case 1:
55
- _b.sent();
56
- return [3 /*break*/, 3];
57
- case 2:
58
- _a = _b.sent();
59
- throw new errors_1.ValidationError("AppMap ".concat(kind, " ").concat(chalk_1.default.red(path), " does not exist, or is not readable."));
60
- case 3: return [2 /*return*/];
61
- }
62
- });
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
+ }
63
29
  });
64
30
  }
65
31
  exports.default = default_1;
66
- //# 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);