@appland/scanner 1.40.3 → 1.44.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 (151) hide show
  1. package/README.md +63 -39
  2. package/built/appMapIndex.js +40 -0
  3. package/built/appMapIndex.js.map +1 -0
  4. package/built/check.js +3 -3
  5. package/built/check.js.map +1 -1
  6. package/built/checkInstance.js +4 -4
  7. package/built/checkInstance.js.map +1 -1
  8. package/built/cli/ci/command.js +21 -26
  9. package/built/cli/ci/command.js.map +1 -1
  10. package/built/cli/fail.js +13 -0
  11. package/built/cli/fail.js.map +1 -0
  12. package/built/cli/merge/command.js +101 -0
  13. package/built/cli/merge/command.js.map +1 -0
  14. package/built/cli/merge/options.js +3 -0
  15. package/built/cli/merge/options.js.map +1 -0
  16. package/built/cli/reportUploadURL.js +11 -0
  17. package/built/cli/reportUploadURL.js.map +1 -0
  18. package/built/cli/scan/command.js +5 -1
  19. package/built/cli/scan/command.js.map +1 -1
  20. package/built/cli/scan/scanner.js +2 -2
  21. package/built/cli/scan/scanner.js.map +1 -1
  22. package/built/cli/scan.js +4 -2
  23. package/built/cli/scan.js.map +1 -1
  24. package/built/cli/updateCommitStatus.js +65 -0
  25. package/built/cli/updateCommitStatus.js.map +1 -0
  26. package/built/cli/upload/command.js +10 -5
  27. package/built/cli/upload/command.js.map +1 -1
  28. package/built/cli.js +2 -0
  29. package/built/cli.js.map +1 -1
  30. package/built/database/index.js +136 -161
  31. package/built/database/index.js.map +1 -1
  32. package/built/integration/appland/{fetchStatus.js → app/listFindingStatus.js} +1 -1
  33. package/built/integration/appland/app/listFindingStatus.js.map +1 -0
  34. package/built/integration/appland/{appMap.js → appMap/create.js} +43 -48
  35. package/built/integration/appland/appMap/create.js.map +1 -0
  36. package/built/integration/appland/location.js +3 -0
  37. package/built/integration/appland/location.js.map +1 -0
  38. package/built/integration/appland/{mapset.js → mapset/create.js} +41 -46
  39. package/built/integration/appland/mapset/create.js.map +1 -0
  40. package/built/integration/appland/{upload.js → scannerJob/create.js} +27 -19
  41. package/built/integration/appland/scannerJob/create.js.map +1 -0
  42. package/built/integration/appland/scannerJob/merge.js +92 -0
  43. package/built/integration/appland/scannerJob/merge.js.map +1 -0
  44. package/built/integration/appland/scannerJob.js +3 -0
  45. package/built/integration/appland/scannerJob.js.map +1 -0
  46. package/built/report/summaryReport.js +1 -1
  47. package/built/report/summaryReport.js.map +1 -1
  48. package/built/ruleChecker.js +12 -11
  49. package/built/ruleChecker.js.map +1 -1
  50. package/built/rules/authzBeforeAuthn.js +6 -0
  51. package/built/rules/authzBeforeAuthn.js.map +1 -1
  52. package/built/rules/circularDependency.js +4 -0
  53. package/built/rules/circularDependency.js.map +1 -1
  54. package/built/rules/deserializationOfUntrustedData.js +8 -0
  55. package/built/rules/deserializationOfUntrustedData.js.map +1 -1
  56. package/built/rules/http500.js +7 -0
  57. package/built/rules/http500.js.map +1 -1
  58. package/built/rules/illegalPackageDependency.js +7 -0
  59. package/built/rules/illegalPackageDependency.js.map +1 -1
  60. package/built/rules/incompatibleHttpClientRequest.js +7 -0
  61. package/built/rules/incompatibleHttpClientRequest.js.map +1 -1
  62. package/built/rules/insecureCompare.js +4 -0
  63. package/built/rules/insecureCompare.js.map +1 -1
  64. package/built/rules/jobNotCancelled.js +3 -0
  65. package/built/rules/jobNotCancelled.js.map +1 -1
  66. package/built/rules/lib/matchEvent.js +3 -4
  67. package/built/rules/lib/matchEvent.js.map +1 -1
  68. package/built/rules/lib/parseRuleDescription.js +18 -0
  69. package/built/rules/lib/parseRuleDescription.js.map +1 -0
  70. package/built/rules/logoutWithoutSessionReset.js +8 -0
  71. package/built/rules/logoutWithoutSessionReset.js.map +1 -1
  72. package/built/rules/missingAuthentication.js +6 -0
  73. package/built/rules/missingAuthentication.js.map +1 -1
  74. package/built/rules/missingContentType.js +6 -0
  75. package/built/rules/missingContentType.js.map +1 -1
  76. package/built/rules/nPlusOneQuery.js +8 -2
  77. package/built/rules/nPlusOneQuery.js.map +1 -1
  78. package/built/rules/queryFromInvalidPackage.js +6 -0
  79. package/built/rules/queryFromInvalidPackage.js.map +1 -1
  80. package/built/rules/queryFromView.js +6 -0
  81. package/built/rules/queryFromView.js.map +1 -1
  82. package/built/rules/rpcWithoutCircuitBreaker.js +6 -0
  83. package/built/rules/rpcWithoutCircuitBreaker.js.map +1 -1
  84. package/built/rules/saveWithoutValidation.js +6 -0
  85. package/built/rules/saveWithoutValidation.js.map +1 -1
  86. package/built/rules/secretInLog.js +3 -0
  87. package/built/rules/secretInLog.js.map +1 -1
  88. package/built/rules/slowFunctionCall.js +6 -0
  89. package/built/rules/slowFunctionCall.js.map +1 -1
  90. package/built/rules/slowHttpServerRequest.js +6 -0
  91. package/built/rules/slowHttpServerRequest.js.map +1 -1
  92. package/built/rules/slowQuery.js +6 -0
  93. package/built/rules/slowQuery.js.map +1 -1
  94. package/built/rules/tooManyJoins.js +9 -3
  95. package/built/rules/tooManyJoins.js.map +1 -1
  96. package/built/rules/tooManyUpdates.js +6 -0
  97. package/built/rules/tooManyUpdates.js.map +1 -1
  98. package/built/rules/unbatchedMaterializedQuery.js +9 -4
  99. package/built/rules/unbatchedMaterializedQuery.js.map +1 -1
  100. package/built/rules/updateInGetRequest.js +6 -0
  101. package/built/rules/updateInGetRequest.js.map +1 -1
  102. package/built/scope/sqlTransactionScope.js +3 -2
  103. package/built/scope/sqlTransactionScope.js.map +1 -1
  104. package/built/sqlWarning.js +56 -0
  105. package/built/sqlWarning.js.map +1 -0
  106. package/doc/architecture.md +48 -0
  107. package/doc/labels/audit.md +7 -0
  108. package/doc/labels/dao.materialize.md +12 -0
  109. package/doc/labels/deserialize.safe.md +9 -0
  110. package/doc/labels/deserialize.unsafe.md +12 -0
  111. package/doc/labels/http.session.clear.md +7 -0
  112. package/doc/labels/job.cancel.md +11 -0
  113. package/doc/labels/job.create.md +13 -0
  114. package/doc/labels/log.md +12 -0
  115. package/doc/labels/public.md +8 -0
  116. package/doc/labels/rpc.circuit_breaker.md +16 -0
  117. package/doc/labels/sanitize.md +29 -0
  118. package/doc/labels/secret.md +11 -0
  119. package/doc/labels/security.authentication.md +10 -0
  120. package/doc/labels/security.authorization.md +9 -0
  121. package/doc/labels/security.logout.md +9 -0
  122. package/doc/labels/string.equals.md +18 -0
  123. package/doc/rules/authzBeforeAuthn.md +47 -0
  124. package/doc/rules/circularDependency.md +57 -0
  125. package/doc/rules/deserializationOfUntrustedData.md +55 -0
  126. package/doc/rules/http500.md +36 -0
  127. package/doc/rules/illegalPackageDependency.md +50 -0
  128. package/doc/rules/incompatibleHttpClientRequest.md +35 -0
  129. package/doc/rules/insecureCompare.md +59 -0
  130. package/doc/rules/jobNotCancelled.md +49 -0
  131. package/doc/rules/logoutWithoutSessionReset.md +40 -0
  132. package/doc/rules/missingAuthentication.md +59 -0
  133. package/doc/rules/missingContentType.md +33 -0
  134. package/doc/rules/nPlusOneQuery.md +52 -0
  135. package/doc/rules/queryFromInvalidPackage.md +45 -0
  136. package/doc/rules/queryFromView.md +42 -0
  137. package/doc/rules/rpcWithoutCircuitBreaker.md +44 -0
  138. package/doc/rules/saveWithoutValidation.md +33 -0
  139. package/doc/rules/secretInLog.md +49 -0
  140. package/doc/rules/slowFunctionCall.md +39 -0
  141. package/doc/rules/slowHttpServerRequest.md +34 -0
  142. package/doc/rules/slowQuery.md +33 -0
  143. package/doc/rules/tooManyJoins.md +40 -0
  144. package/doc/rules/tooManyUpdates.md +46 -0
  145. package/doc/rules/unbatchedMaterializedQuery.md +54 -0
  146. package/doc/rules/updateInGetRequest.md +44 -0
  147. package/package.json +10 -6
  148. package/built/integration/appland/appMap.js.map +0 -1
  149. package/built/integration/appland/fetchStatus.js.map +0 -1
  150. package/built/integration/appland/mapset.js.map +0 -1
  151. package/built/integration/appland/upload.js.map +0 -1
package/built/cli/scan.js CHANGED
@@ -68,6 +68,7 @@ var promises_1 = require("fs/promises");
68
68
  var models_1 = require("@appland/models");
69
69
  var ruleChecker_1 = __importDefault(require("../ruleChecker"));
70
70
  var progressReporter_1 = __importDefault(require("./progressReporter"));
71
+ var appMapIndex_1 = __importDefault(require("../appMapIndex"));
71
72
  function batch(items, size, process) {
72
73
  return __awaiter(this, void 0, void 0, function () {
73
74
  var left;
@@ -98,7 +99,7 @@ function scan(files, checks) {
98
99
  appMapMetadata = {};
99
100
  findings = [];
100
101
  return [4 /*yield*/, batch(files, 2, function (file) { return __awaiter(_this, void 0, void 0, function () {
101
- var appMapData, appMap;
102
+ var appMapData, appMap, appMapIndex;
102
103
  var _this = this;
103
104
  return __generator(this, function (_a) {
104
105
  switch (_a.label) {
@@ -113,6 +114,7 @@ function scan(files, checks) {
113
114
  case 1:
114
115
  appMapData = _a.sent();
115
116
  appMap = (0, models_1.buildAppMap)(appMapData).normalize().build();
117
+ appMapIndex = new appMapIndex_1.default(appMap);
116
118
  appMapMetadata[file] = appMap.metadata;
117
119
  return [4 /*yield*/, Promise.all(checks.map(function (check) { return __awaiter(_this, void 0, void 0, function () {
118
120
  var matchCount, newMatches;
@@ -120,7 +122,7 @@ function scan(files, checks) {
120
122
  switch (_a.label) {
121
123
  case 0:
122
124
  matchCount = findings.length;
123
- return [4 /*yield*/, checker.check(file, appMap, check, findings)];
125
+ return [4 /*yield*/, checker.check(file, appMapIndex, check, findings)];
124
126
  case 1:
125
127
  _a.sent();
126
128
  newMatches = findings.slice(matchCount, findings.length);
@@ -1 +1 @@
1
- {"version":3,"file":"scan.js","sourceRoot":"","sources":["../../src/cli/scan.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,wCAAuC;AACvC,0CAAwD;AAGxD,+DAAyC;AAGzC,wEAAkD;AAOlD,SAAe,KAAK,CAClB,KAAmB,EACnB,IAAY,EACZ,OAAmD;;;;;;oBAE7C,IAAI,4BAAO,KAAK,SAAC,CAAC;;;yBACjB,IAAI,CAAC,MAAM;oBAAE,qBAAM,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,EAAA;;oBAApD,SAAoD,CAAC;;;;;;CAC1E;AAED,SAA8B,IAAI,CAAC,KAAe,EAAE,MAAe;;;;;;;oBAC3D,OAAO,GAAG,IAAI,qBAAW,EAAE,CAAC;oBAC5B,cAAc,GAA6B,EAAE,CAAC;oBAC9C,QAAQ,GAAc,EAAE,CAAC;oBAE/B,qBAAM,KAAK,CAAC,KAAK,EAAE,CAAC,EAAE,UAAO,IAAY;;;;;;wCACvC,2DAA2D;wCAC3D,+FAA+F;wCAC/F,6BAA6B;wCAC7B,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE;4CAC5C,sBAAO,IAAI,EAAC;yCACb;wCACkB,qBAAM,IAAA,mBAAQ,EAAC,IAAI,EAAE,MAAM,CAAC,EAAA;;wCAAzC,UAAU,GAAG,SAA4B;wCACzC,MAAM,GAAG,IAAA,oBAAW,EAAC,UAAU,CAAC,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,CAAC;wCAC3D,cAAc,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC;wCAEvC,qBAAM,OAAO,CAAC,GAAG,CACf,MAAM,CAAC,GAAG,CAAC,UAAO,KAAK;;;;;4DACf,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC;4DACnC,qBAAM,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC,EAAA;;4DAAlD,SAAkD,CAAC;4DAC7C,UAAU,GAAG,QAAQ,CAAC,KAAK,CAAC,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;4DAC/D,UAAU,CAAC,OAAO,CAAC,UAAC,KAAK,IAAK,OAAA,CAAC,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC,EAAzB,CAAyB,CAAC,CAAC;4DACzD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAA,0BAAgB,EAAC,UAAU,CAAC,CAAC,CAAC;;;;iDACpD,CAAC,CACH,EAAA;;wCARD,SAQC,CAAC;;;;6BACH,CAAC,EAAA;;oBApBF,SAoBE,CAAC;oBAEH,sBAAO,EAAE,cAAc,gBAAA,EAAE,QAAQ,UAAA,EAAE,EAAC;;;;CACrC;AA5BD,uBA4BC"}
1
+ {"version":3,"file":"scan.js","sourceRoot":"","sources":["../../src/cli/scan.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,wCAAuC;AACvC,0CAAwD;AAGxD,+DAAyC;AAGzC,wEAAkD;AAClD,+DAAyC;AAOzC,SAAe,KAAK,CAClB,KAAmB,EACnB,IAAY,EACZ,OAAmD;;;;;;oBAE7C,IAAI,4BAAO,KAAK,SAAC,CAAC;;;yBACjB,IAAI,CAAC,MAAM;oBAAE,qBAAM,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,EAAA;;oBAApD,SAAoD,CAAC;;;;;;CAC1E;AAED,SAA8B,IAAI,CAAC,KAAe,EAAE,MAAe;;;;;;;oBAC3D,OAAO,GAAG,IAAI,qBAAW,EAAE,CAAC;oBAC5B,cAAc,GAA6B,EAAE,CAAC;oBAC9C,QAAQ,GAAc,EAAE,CAAC;oBAE/B,qBAAM,KAAK,CAAC,KAAK,EAAE,CAAC,EAAE,UAAO,IAAY;;;;;;wCACvC,2DAA2D;wCAC3D,+FAA+F;wCAC/F,6BAA6B;wCAC7B,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE;4CAC5C,sBAAO,IAAI,EAAC;yCACb;wCACkB,qBAAM,IAAA,mBAAQ,EAAC,IAAI,EAAE,MAAM,CAAC,EAAA;;wCAAzC,UAAU,GAAG,SAA4B;wCACzC,MAAM,GAAG,IAAA,oBAAW,EAAC,UAAU,CAAC,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,CAAC;wCACrD,WAAW,GAAG,IAAI,qBAAW,CAAC,MAAM,CAAC,CAAC;wCAC5C,cAAc,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC;wCAEvC,qBAAM,OAAO,CAAC,GAAG,CACf,MAAM,CAAC,GAAG,CAAC,UAAO,KAAK;;;;;4DACf,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC;4DACnC,qBAAM,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,QAAQ,CAAC,EAAA;;4DAAvD,SAAuD,CAAC;4DAClD,UAAU,GAAG,QAAQ,CAAC,KAAK,CAAC,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;4DAC/D,UAAU,CAAC,OAAO,CAAC,UAAC,KAAK,IAAK,OAAA,CAAC,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC,EAAzB,CAAyB,CAAC,CAAC;4DACzD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAA,0BAAgB,EAAC,UAAU,CAAC,CAAC,CAAC;;;;iDACpD,CAAC,CACH,EAAA;;wCARD,SAQC,CAAC;;;;6BACH,CAAC,EAAA;;oBArBF,SAqBE,CAAC;oBAEH,sBAAO,EAAE,cAAc,gBAAA,EAAE,QAAQ,UAAA,EAAE,EAAC;;;;CACrC;AA7BD,uBA6BC"}
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
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
+ var __importDefault = (this && this.__importDefault) || function (mod) {
39
+ return (mod && mod.__esModule) ? mod : { "default": mod };
40
+ };
41
+ Object.defineProperty(exports, "__esModule", { value: true });
42
+ var commitStatus_1 = __importDefault(require("../integration/github/commitStatus"));
43
+ function updateCommitStatus(numFindings, numChecks) {
44
+ return __awaiter(this, void 0, void 0, function () {
45
+ return __generator(this, function (_a) {
46
+ switch (_a.label) {
47
+ case 0:
48
+ if (!(numFindings > 0)) return [3 /*break*/, 2];
49
+ return [4 /*yield*/, (0, commitStatus_1.default)('failure', numChecks + " checks, " + numFindings + " findings. See CI job log for details.")];
50
+ case 1:
51
+ _a.sent();
52
+ console.log("Commit status updated to: failure (" + numFindings + " findings)");
53
+ return [3 /*break*/, 4];
54
+ case 2: return [4 /*yield*/, (0, commitStatus_1.default)('success', numChecks + " checks passed")];
55
+ case 3:
56
+ _a.sent();
57
+ console.log("Commit status updated to: success.");
58
+ _a.label = 4;
59
+ case 4: return [2 /*return*/];
60
+ }
61
+ });
62
+ });
63
+ }
64
+ exports.default = updateCommitStatus;
65
+ //# sourceMappingURL=updateCommitStatus.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"updateCommitStatus.js","sourceRoot":"","sources":["../../src/cli/updateCommitStatus.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,oFAAkE;AAElE,SAA8B,kBAAkB,CAC9C,WAAmB,EACnB,SAAiB;;;;;yBAEb,CAAA,WAAW,GAAG,CAAC,CAAA,EAAf,wBAAe;oBACjB,qBAAM,IAAA,sBAAgB,EACpB,SAAS,EACN,SAAS,iBAAY,WAAW,2CAAwC,CAC5E,EAAA;;oBAHD,SAGC,CAAC;oBACF,OAAO,CAAC,GAAG,CAAC,wCAAsC,WAAW,eAAY,CAAC,CAAC;;wBAE3E,qBAAM,IAAA,sBAAgB,EAAC,SAAS,EAAK,SAAS,mBAAgB,CAAC,EAAA;;oBAA/D,SAA+D,CAAC;oBAChE,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;;;;;;CAErD;AAdD,qCAcC"}
@@ -40,10 +40,11 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
40
40
  };
41
41
  Object.defineProperty(exports, "__esModule", { value: true });
42
42
  var promises_1 = require("fs/promises");
43
- var upload_1 = __importDefault(require("../../integration/appland/upload"));
43
+ var create_1 = require("../../integration/appland/scannerJob/create");
44
44
  var util_1 = require("../../rules/lib/util");
45
45
  var validateFile_1 = __importDefault(require("../validateFile"));
46
46
  var resolveAppId_1 = __importDefault(require("../resolveAppId"));
47
+ var reportUploadURL_1 = __importDefault(require("../reportUploadURL"));
47
48
  exports.default = {
48
49
  command: 'upload',
49
50
  describe: 'Upload Findings to the AppMap Server',
@@ -59,15 +60,18 @@ exports.default = {
59
60
  args.option('app', {
60
61
  describe: 'name of the app to publish the findings for. By default, this is determined by looking in appmap.yml',
61
62
  });
63
+ args.option('merge-key', {
64
+ describe: 'build job identifier. This is used to merge findings from parallelized scans',
65
+ });
62
66
  return args.strict();
63
67
  },
64
68
  handler: function (options) {
65
69
  return __awaiter(this, void 0, void 0, function () {
66
- var _a, isVerbose, reportFile, appmapDir, appIdArg, appId, scanResults, _b, _c;
70
+ var _a, isVerbose, reportFile, appmapDir, appIdArg, mergeKey, appId, scanResults, _b, _c, uploadResponse;
67
71
  return __generator(this, function (_d) {
68
72
  switch (_d.label) {
69
73
  case 0:
70
- _a = options, isVerbose = _a.verbose, reportFile = _a.reportFile, appmapDir = _a.appmapDir, appIdArg = _a.app;
74
+ _a = options, isVerbose = _a.verbose, reportFile = _a.reportFile, appmapDir = _a.appmapDir, appIdArg = _a.app, mergeKey = _a.mergeKey;
71
75
  if (isVerbose) {
72
76
  (0, util_1.verbose)(true);
73
77
  }
@@ -83,9 +87,10 @@ exports.default = {
83
87
  return [4 /*yield*/, (0, promises_1.readFile)(reportFile)];
84
88
  case 4:
85
89
  scanResults = _c.apply(_b, [(_d.sent()).toString()]);
86
- return [4 /*yield*/, (0, upload_1.default)(scanResults, appId)];
90
+ return [4 /*yield*/, (0, create_1.create)(scanResults, appId, mergeKey)];
87
91
  case 5:
88
- _d.sent();
92
+ uploadResponse = _d.sent();
93
+ (0, reportUploadURL_1.default)(uploadResponse.summary.numFindings, uploadResponse.url);
89
94
  return [2 /*return*/];
90
95
  }
91
96
  });
@@ -1 +1 @@
1
- {"version":3,"file":"command.js","sourceRoot":"","sources":["../../../src/cli/upload/command.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,wCAAuC;AAEvC,4EAAsD;AAEtD,6CAA+C;AAE/C,iEAA2C;AAG3C,iEAA2C;AAE3C,kBAAe;IACb,OAAO,EAAE,QAAQ;IACjB,QAAQ,EAAE,sCAAsC;IAChD,OAAO,EAAP,UAAQ,IAAU;QAChB,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE;YACxB,QAAQ,EAAE,2BAA2B;YACrC,KAAK,EAAE,GAAG;SACX,CAAC,CAAC;QACH,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE;YACzB,QAAQ,EAAE,qCAAqC;YAC/C,OAAO,EAAE,uBAAuB;SACjC,CAAC,CAAC;QACH,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE;YACjB,QAAQ,EACN,sGAAsG;SACzG,CAAC,CAAC;QACH,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC;IACvB,CAAC;IACK,OAAO,EAAb,UAAc,OAAkB;;;;;;wBACxB,KAKF,OAAoC,EAJ7B,SAAS,aAAA,EAClB,UAAU,gBAAA,EACV,SAAS,eAAA,EACJ,QAAQ,SAAA,CAC0B;wBAEzC,IAAI,SAAS,EAAE;4BACb,IAAA,cAAO,EAAC,IAAI,CAAC,CAAC;yBACf;6BAEG,SAAS,EAAT,wBAAS;wBAAE,qBAAM,IAAA,sBAAY,EAAC,WAAW,EAAE,SAAU,CAAC,EAAA;;wBAA3C,SAA2C,CAAC;;4BAC7C,qBAAM,IAAA,sBAAY,EAAC,QAAQ,EAAE,SAAS,CAAC,EAAA;;wBAA/C,KAAK,GAAG,SAAuC;wBAEjC,KAAA,CAAA,KAAA,IAAI,CAAA,CAAC,KAAK,CAAA;wBAAE,qBAAM,IAAA,mBAAQ,EAAC,UAAU,CAAC,EAAA;;wBAApD,WAAW,GAAG,cAAW,CAAC,SAA0B,CAAC,CAAC,QAAQ,EAAE,EAAgB;wBACtF,qBAAM,IAAA,gBAAM,EAAC,WAAW,EAAE,KAAK,CAAC,EAAA;;wBAAhC,SAAgC,CAAC;;;;;KAClC;CACF,CAAC"}
1
+ {"version":3,"file":"command.js","sourceRoot":"","sources":["../../../src/cli/upload/command.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,wCAAuC;AAEvC,sEAAyF;AAEzF,6CAA+C;AAE/C,iEAA2C;AAG3C,iEAA2C;AAC3C,uEAAiD;AAEjD,kBAAe;IACb,OAAO,EAAE,QAAQ;IACjB,QAAQ,EAAE,sCAAsC;IAChD,OAAO,EAAP,UAAQ,IAAU;QAChB,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE;YACxB,QAAQ,EAAE,2BAA2B;YACrC,KAAK,EAAE,GAAG;SACX,CAAC,CAAC;QACH,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE;YACzB,QAAQ,EAAE,qCAAqC;YAC/C,OAAO,EAAE,uBAAuB;SACjC,CAAC,CAAC;QACH,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE;YACjB,QAAQ,EACN,sGAAsG;SACzG,CAAC,CAAC;QACH,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE;YACvB,QAAQ,EAAE,8EAA8E;SACzF,CAAC,CAAC;QACH,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC;IACvB,CAAC;IACK,OAAO,EAAb,UAAc,OAAkB;;;;;;wBACxB,KAMF,OAAoC,EAL7B,SAAS,aAAA,EAClB,UAAU,gBAAA,EACV,SAAS,eAAA,EACJ,QAAQ,SAAA,EACb,QAAQ,cAAA,CAC+B;wBAEzC,IAAI,SAAS,EAAE;4BACb,IAAA,cAAO,EAAC,IAAI,CAAC,CAAC;yBACf;6BAEG,SAAS,EAAT,wBAAS;wBAAE,qBAAM,IAAA,sBAAY,EAAC,WAAW,EAAE,SAAU,CAAC,EAAA;;wBAA3C,SAA2C,CAAC;;4BAC7C,qBAAM,IAAA,sBAAY,EAAC,QAAQ,EAAE,SAAS,CAAC,EAAA;;wBAA/C,KAAK,GAAG,SAAuC;wBAEjC,KAAA,CAAA,KAAA,IAAI,CAAA,CAAC,KAAK,CAAA;wBAAE,qBAAM,IAAA,mBAAQ,EAAC,UAAU,CAAC,EAAA;;wBAApD,WAAW,GAAG,cAAW,CAAC,SAA0B,CAAC,CAAC,QAAQ,EAAE,EAAgB;wBAC/D,qBAAM,IAAA,eAAgB,EAAC,WAAW,EAAE,KAAK,EAAE,QAAQ,CAAC,EAAA;;wBAArE,cAAc,GAAG,SAAoD;wBAE3E,IAAA,yBAAe,EAAC,cAAc,CAAC,OAAO,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,CAAC,CAAC;;;;;KACzE;CACF,CAAC"}
package/built/cli.js CHANGED
@@ -8,6 +8,7 @@ var yargs_1 = __importDefault(require("yargs"));
8
8
  var command_1 = __importDefault(require("./cli/scan/command"));
9
9
  var command_2 = __importDefault(require("./cli/upload/command"));
10
10
  var command_3 = __importDefault(require("./cli/ci/command"));
11
+ var command_4 = __importDefault(require("./cli/merge/command"));
11
12
  (0, yargs_1.default)(process.argv.slice(2))
12
13
  .option('verbose', {
13
14
  describe: 'Show verbose output',
@@ -16,6 +17,7 @@ var command_3 = __importDefault(require("./cli/ci/command"));
16
17
  .command(command_1.default)
17
18
  .command(command_2.default)
18
19
  .command(command_3.default)
20
+ .command(command_4.default)
19
21
  .fail(function (msg, err, yargs) {
20
22
  if (msg) {
21
23
  console.log(yargs.help());
package/built/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;;;;;AAEA,gDAA0B;AAC1B,+DAA6C;AAC7C,iEAAiD;AACjD,6DAAyC;AAEzC,IAAA,eAAK,EAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;KACzB,MAAM,CAAC,SAAS,EAAE;IACjB,QAAQ,EAAE,qBAAqB;IAC/B,KAAK,EAAE,GAAG;CACX,CAAC;KACD,OAAO,CAAC,iBAAW,CAAC;KACpB,OAAO,CAAC,iBAAa,CAAC;KACtB,OAAO,CAAC,iBAAS,CAAC;KAClB,IAAI,CAAC,UAAC,GAAG,EAAE,GAAG,EAAE,KAAK;IACpB,IAAI,GAAG,EAAE;QACP,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QAC1B,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;KAClB;SAAM,IAAI,GAAG,EAAE;QACd,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;KACpB;IACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC;KACD,MAAM,EAAE;KACR,aAAa,EAAE;KACf,IAAI,EAAE,CAAC,IAAI,CAAC"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;;;;;AAEA,gDAA0B;AAC1B,+DAA6C;AAC7C,iEAAiD;AACjD,6DAAyC;AACzC,gEAA+C;AAE/C,IAAA,eAAK,EAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;KACzB,MAAM,CAAC,SAAS,EAAE;IACjB,QAAQ,EAAE,qBAAqB;IAC/B,KAAK,EAAE,GAAG;CACX,CAAC;KACD,OAAO,CAAC,iBAAW,CAAC;KACpB,OAAO,CAAC,iBAAa,CAAC;KACtB,OAAO,CAAC,iBAAS,CAAC;KAClB,OAAO,CAAC,iBAAY,CAAC;KACrB,IAAI,CAAC,UAAC,GAAG,EAAE,GAAG,EAAE,KAAK;IACpB,IAAI,GAAG,EAAE;QACP,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QAC1B,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;KAClB;SAAM,IAAI,GAAG,EAAE;QACd,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;KACpB;IACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC;KACD,MAAM,EAAE;KACR,aAAa,EAAE;KACf,IAAI,EAAE,CAAC,IAAI,CAAC"}
@@ -1,6 +1,4 @@
1
1
  "use strict";
2
- // License: https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE
3
- // Apache License 2.0
4
2
  var __generator = (this && this.__generator) || function (thisArg, body) {
5
3
  var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
6
4
  return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
@@ -28,6 +26,31 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
28
26
  if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
29
27
  }
30
28
  };
29
+ var __read = (this && this.__read) || function (o, n) {
30
+ var m = typeof Symbol === "function" && o[Symbol.iterator];
31
+ if (!m) return o;
32
+ var i = m.call(o), r, ar = [], e;
33
+ try {
34
+ while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
35
+ }
36
+ catch (error) { e = { error: error }; }
37
+ finally {
38
+ try {
39
+ if (r && !r.done && (m = i["return"])) m.call(i);
40
+ }
41
+ finally { if (e) throw e.error; }
42
+ }
43
+ return ar;
44
+ };
45
+ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
46
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
47
+ if (ar || !(i in from)) {
48
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
49
+ ar[i] = from[i];
50
+ }
51
+ }
52
+ return to.concat(ar || Array.prototype.slice.call(from));
53
+ };
31
54
  var __values = (this && this.__values) || function(o) {
32
55
  var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
33
56
  if (m) return m.call(o);
@@ -40,155 +63,114 @@ var __values = (this && this.__values) || function(o) {
40
63
  throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
41
64
  };
42
65
  Object.defineProperty(exports, "__esModule", { value: true });
43
- exports.countJoins = exports.sqlStrings = exports.isSelect = exports.sqlNormalized = exports.obfuscate = void 0;
44
- // TODO: Copied and TypeScript-ified from @appland/models
45
- var visit_1 = require("./visit");
66
+ exports.countJoins = exports.sqlStrings = exports.isSelect = exports.getSqlLabelFromString = exports.getHttpLabel = exports.capitalizeString = void 0;
46
67
  var models_1 = require("@appland/models");
47
- var COMPONENTS_REGEXP_MAP = {
48
- single_quotes: /'(?:[^']|'')*?(?:\\'.*|'(?!'))/g,
49
- double_quotes: /"(?:[^"]|"")*?(?:\\".*|"(?!"))/g,
50
- dollar_quotes: /(\$(?!\d)[^$]*?\$).*?(?:\1|$)/g,
51
- uuids: /\{?(?:[0-9a-fA-F]-*){32}\}?/g,
52
- numeric_literals: /-?\b(?:[0-9]+\.)?[0-9]+([eE][+-]?[0-9]+)?\b/g,
53
- boolean_literals: /\b(?:true|false|null)\b/gi,
54
- hexadecimal_literals: /0x[0-9a-fA-F]+/g,
55
- comments: /(?:#|--).*?(?=\r|\n|$)/gi,
56
- multi_line_comments: /\/\*(?:[^/]|\/[^*])*?(?:\*\/|\/\*.*)/g,
57
- oracle_quoted_strings: /q'\[.*?(?:\]'|$)|q'\{.*?(?:\}'|$)|q'<.*?(?:>'|$)|q'\(.*?(?:\)'|$)/g,
58
- };
59
- // We use these to check whether the query contains any quote characters
60
- // after obfuscation. If so, that's a good indication that the original
61
- // query was malformed, and so our obfuscation can't reliably find
62
- // literals. In such a case, we'll replace the entire query with a
63
- // placeholder.
64
- var CLEANUP_REGEXP = {
65
- mysql: /'|"|\/\*|\*\//,
66
- mysql2: /'|"|\/\*|\*\//,
67
- postgres: /'|\/\*|\*\/|\$(?!\?)/,
68
- sqlite: /'|\/\*|\*\//,
69
- cassandra: /'|\/\*|\*\//,
70
- oracle: /'|\/\*|\*\//,
71
- oracle_enhanced: /'|\/\*|\*\//,
72
- };
73
- /**
74
- * @type {{string: string[]}}
75
- */
76
- var DIALECT_COMPONENTS = {
77
- fallback: Object.keys(COMPONENTS_REGEXP_MAP),
78
- mysql: [
79
- 'single_quotes',
80
- 'double_quotes',
81
- 'numeric_literals',
82
- 'boolean_literals',
83
- 'hexadecimal_literals',
84
- 'comments',
85
- 'multi_line_comments',
86
- ],
87
- postgres: [
88
- 'single_quotes',
89
- 'dollar_quotes',
90
- 'uuids',
91
- 'numeric_literals',
92
- 'boolean_literals',
93
- 'comments',
94
- 'multi_line_comments',
95
- ],
96
- sqlite: [
97
- 'single_quotes',
98
- 'numeric_literals',
99
- 'boolean_literals',
100
- 'hexadecimal_literals',
101
- 'comments',
102
- 'multi_line_comments',
103
- ],
104
- oracle: [
105
- 'single_quotes',
106
- 'oracle_quoted_strings',
107
- 'numeric_literals',
108
- 'comments',
109
- 'multi_line_comments',
110
- ],
111
- cassandra: [
112
- 'single_quotes',
113
- 'uuids',
114
- 'numeric_literals',
115
- 'boolean_literals',
116
- 'hexadecimal_literals',
117
- 'comments',
118
- 'multi_line_comments',
119
- ],
120
- };
121
- var PLACEHOLDER = '?';
122
- /**
123
- * @param {string} dialect
124
- * @returns {RegExp[]}
125
- */
126
- function generateRegexp(dialect) {
127
- var components = DIALECT_COMPONENTS[dialect];
128
- // No Regexp.union in JS
129
- return components.map(function (component) { return COMPONENTS_REGEXP_MAP[component]; });
130
- }
131
- var MYSQL_COMPONENTS_REGEXP = generateRegexp('mysql');
132
- var POSTGRES_COMPONENTS_REGEXP = generateRegexp('postgres');
133
- var SQLITE_COMPONENTS_REGEXP = generateRegexp('sqlite');
134
- var ORACLE_COMPONENTS_REGEXP = generateRegexp('oracle');
135
- var CASSANDRA_COMPONENTS_REGEXP = generateRegexp('cassandra');
136
- var FALLBACK_REGEXP = generateRegexp('fallback');
137
- function detectUnmatchedPairs(obfuscated, adapter) {
138
- if (CLEANUP_REGEXP[adapter]) {
139
- return CLEANUP_REGEXP[adapter].test(obfuscated);
68
+ var visit_1 = require("./visit");
69
+ var url_1 = require("url");
70
+ function capitalizeString(str) {
71
+ if (typeof str !== 'string') {
72
+ return '';
140
73
  }
141
- return CLEANUP_REGEXP.mysql.test(obfuscated);
74
+ return str.slice(0, 1).toUpperCase() + str.slice(1).toLowerCase();
142
75
  }
143
- var FAILED_TO_OBFUSCATE_MESSAGE = 'Failed to obfuscate SQL query - quote characters remained after obfuscation';
144
- /**
145
- * Replaces literal query parameters with parameter symbols (e.g. '?');
146
- *
147
- * @param {string} sql
148
- * @param {string} adapter
149
- * @returns {string}
150
- */
151
- function obfuscate(sql, adapter) {
152
- /** @type {RegExp[]} */ var regexp;
153
- switch (adapter) {
154
- case 'mysql':
155
- case 'mysql2':
156
- regexp = MYSQL_COMPONENTS_REGEXP;
157
- break;
158
- case 'postgres':
159
- regexp = POSTGRES_COMPONENTS_REGEXP;
160
- break;
161
- case 'sqlite':
162
- regexp = SQLITE_COMPONENTS_REGEXP;
163
- break;
164
- case 'oracle':
165
- case 'oracle_enhanced':
166
- regexp = ORACLE_COMPONENTS_REGEXP;
167
- break;
168
- case 'cassandra':
169
- regexp = CASSANDRA_COMPONENTS_REGEXP;
170
- break;
171
- default:
172
- regexp = FALLBACK_REGEXP;
76
+ exports.capitalizeString = capitalizeString;
77
+ function getHttpLabel(event) {
78
+ if (!event.httpServerRequest) {
79
+ return;
173
80
  }
174
- var obfuscated = sql;
175
- // eslint-disable-next-line no-return-assign
176
- regexp.forEach(function (re) { return (obfuscated = obfuscated.replace(re, PLACEHOLDER)); });
177
- if (detectUnmatchedPairs(obfuscated, adapter)) {
178
- obfuscated = FAILED_TO_OBFUSCATE_MESSAGE;
81
+ var requestMethod = event.httpServerRequest.request_method;
82
+ var pathInfo = event.httpServerRequest.path_info;
83
+ var label;
84
+ try {
85
+ // the url is fake, we only care about the path info anyway
86
+ var url = new url_1.URL(pathInfo, 'http://hostname');
87
+ label = requestMethod + " " + url.pathname;
88
+ }
89
+ catch (ex) {
90
+ label = 'HTTP Request';
179
91
  }
180
- return obfuscated;
92
+ return label;
181
93
  }
182
- exports.obfuscate = obfuscate;
183
- function sqlNormalized(query) {
184
- return obfuscate(query.sql, query.database_type);
94
+ exports.getHttpLabel = getHttpLabel;
95
+ var sqlLabels = new Set([
96
+ 'insert',
97
+ 'update',
98
+ 'select',
99
+ 'delete',
100
+ 'alter',
101
+ 'create',
102
+ 'drop',
103
+ 'rename',
104
+ 'truncate',
105
+ 'replace',
106
+ 'savepoint',
107
+ 'release',
108
+ 'rollback',
109
+ 'lock',
110
+ 'unlock',
111
+ 'set',
112
+ 'start',
113
+ 'call',
114
+ 'delete',
115
+ 'do',
116
+ 'perform',
117
+ 'handler',
118
+ 'load',
119
+ 'purge',
120
+ 'reset',
121
+ 'prepare',
122
+ 'execute',
123
+ 'deallocate',
124
+ 'xa',
125
+ ]);
126
+ function getSqlLabelFromString(sqlString) {
127
+ var sqlChars = __spreadArray([], __read(sqlString.trimLeft()), false);
128
+ if (sqlChars.length > 0 && sqlChars[0] === '(') {
129
+ // if the query is wrapped in parenthesis, drop the opening parenthesis
130
+ // it doesn't matter if we leave a hanging closing parenthesis.
131
+ // e.g. (SELECT 1);
132
+ sqlChars.shift();
133
+ }
134
+ // drop sub-queries and parenthesized expressions
135
+ var depth = 0;
136
+ var topLevelSql = sqlChars
137
+ .reduce(function (arr, c) {
138
+ if (c === '(') {
139
+ depth += 1;
140
+ }
141
+ if (depth === 0) {
142
+ arr.push(c);
143
+ }
144
+ if (c === ')') {
145
+ depth -= 1;
146
+ }
147
+ return arr;
148
+ }, [])
149
+ .join('');
150
+ var queryType;
151
+ if (topLevelSql.search(/\s/) === -1) {
152
+ // There's only a single token
153
+ // e.g. BEGIN, COMMIT, CHECKPOINT
154
+ queryType = topLevelSql;
155
+ }
156
+ else {
157
+ // convert non-word sequences to spaces and split by space
158
+ // find the first known token
159
+ queryType =
160
+ topLevelSql
161
+ .replace(/[^\w]+/g, ' ')
162
+ .toLowerCase()
163
+ .split(' ')
164
+ .find(function (t) { return sqlLabels.has(t); }) || 'unknown';
165
+ }
166
+ return ['SQL', capitalizeString(queryType) || null].join(' ');
185
167
  }
186
- exports.sqlNormalized = sqlNormalized;
168
+ exports.getSqlLabelFromString = getSqlLabelFromString;
187
169
  function isSelect(sql) {
188
- return (0, models_1.getSqlLabelFromString)(sql) === 'SQL Select';
170
+ return getSqlLabelFromString(sql) === 'SQL Select';
189
171
  }
190
172
  exports.isSelect = isSelect;
191
- function sqlStrings(event, filter) {
173
+ function sqlStrings(event, appMapIndex, filter) {
192
174
  var _a, _b, e, sql, e_1_1;
193
175
  var e_1, _c;
194
176
  if (filter === void 0) { filter = function () { return true; }; }
@@ -201,19 +183,19 @@ function sqlStrings(event, filter) {
201
183
  case 1:
202
184
  if (!!_b.done) return [3 /*break*/, 4];
203
185
  e = _b.value;
204
- if (!e.event.sqlQuery) {
186
+ if (!e.event.sql) {
205
187
  return [3 /*break*/, 3];
206
188
  }
207
- if (!filter(e.event)) {
189
+ if (!filter(e.event, appMapIndex)) {
208
190
  return [3 /*break*/, 3];
209
191
  }
210
192
  if (!isSelect(e.event.sqlQuery)) {
211
193
  return [3 /*break*/, 3];
212
194
  }
213
- if (!filter(event)) {
195
+ if (!filter(event, appMapIndex)) {
214
196
  return [3 /*break*/, 3];
215
197
  }
216
- sql = sqlNormalized(e.event.sql);
198
+ sql = appMapIndex.sqlNormalized(e.event);
217
199
  return [4 /*yield*/, { event: e.event, sql: sql }];
218
200
  case 2:
219
201
  _d.sent();
@@ -237,23 +219,16 @@ function sqlStrings(event, filter) {
237
219
  });
238
220
  }
239
221
  exports.sqlStrings = sqlStrings;
240
- function countJoins(normalizedSql) {
241
- try {
242
- var ast = (0, models_1.buildQueryAST)(normalizedSql);
243
- var joins_1 = 0;
244
- if (ast) {
245
- (0, visit_1.visit)(ast, {
246
- 'map.join': function (node) {
247
- joins_1 += node.map.length;
248
- },
249
- });
250
- }
251
- return joins_1;
252
- }
253
- catch (_) {
254
- console.warn("Unable to analyze query \"" + normalizedSql + "\"");
222
+ function countJoins(ast) {
223
+ if (!ast)
255
224
  return 0;
256
- }
225
+ var joins = 0;
226
+ (0, visit_1.visit)(ast, {
227
+ 'map.join': function (node) {
228
+ joins += node.map.length;
229
+ },
230
+ });
231
+ return joins;
257
232
  }
258
233
  exports.countJoins = countJoins;
259
234
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/database/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/database/index.ts"],"names":[],"mappings":"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"}
@@ -48,4 +48,4 @@ function default_1(appId) {
48
48
  });
49
49
  }
50
50
  exports.default = default_1;
51
- //# sourceMappingURL=fetchStatus.js.map
51
+ //# sourceMappingURL=listFindingStatus.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"listFindingStatus.js","sourceRoot":"","sources":["../../../../src/integration/appland/app/listFindingStatus.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,gDAAsE;AAEtE,mBAA+B,KAAa;;;;wBACnC,qBAAM,IAAI,SAAG,CAAC,KAAK,CAAC,CAAC,iBAAiB,EAAE,EAAA;wBAA/C,sBAAO,SAAwC,EAAC;;;;CACjD;AAFD,4BAEC"}