@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
@@ -1,65 +1,41 @@
1
1
  "use strict";
2
- var __values = (this && this.__values) || function(o) {
3
- var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
4
- if (m) return m.call(o);
5
- if (o && typeof o.length === "number") return {
6
- next: function () {
7
- if (o && i >= o.length) o = void 0;
8
- return { value: o && o[i++], done: !o };
9
- }
10
- };
11
- throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
12
- };
13
2
  var __importDefault = (this && this.__importDefault) || function (mod) {
14
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
15
4
  };
16
5
  Object.defineProperty(exports, "__esModule", { value: true });
17
- var database_1 = require("../database");
18
- var url_1 = require("url");
19
- var parseRuleDescription_1 = __importDefault(require("./lib/parseRuleDescription"));
20
- var Options = /** @class */ (function () {
21
- function Options() {
6
+ const database_1 = require("../database");
7
+ const url_1 = require("url");
8
+ const parseRuleDescription_1 = __importDefault(require("./lib/parseRuleDescription"));
9
+ class Options {
10
+ constructor() {
22
11
  this.warningLimit = 5;
23
12
  }
24
- return Options;
25
- }());
13
+ }
26
14
  // TODO: clean up (https://github.com/applandinc/scanner/issues/43)
27
- function build(options) {
28
- if (options === void 0) { options = new Options(); }
29
- var joinCount = {};
15
+ function build(options = new Options()) {
16
+ const joinCount = {};
30
17
  function matcher(command, appMapIndex, eventFilter) {
31
- var e_1, _a;
32
- try {
33
- for (var _b = __values((0, database_1.sqlStrings)(command, appMapIndex, eventFilter)), _c = _b.next(); !_c.done; _c = _b.next()) {
34
- var sqlEvent = _c.value;
35
- var occurrence = joinCount[sqlEvent.sql];
36
- if (!occurrence) {
37
- occurrence = {
38
- count: 1,
39
- joins: (0, database_1.countJoins)(appMapIndex.sqlAST(sqlEvent.event)),
40
- events: [sqlEvent.event],
41
- };
42
- joinCount[sqlEvent.sql] = occurrence;
43
- }
44
- else {
45
- occurrence.count += 1;
46
- occurrence.events.push(sqlEvent.event);
47
- }
18
+ for (const sqlEvent of (0, database_1.sqlStrings)(command, appMapIndex, eventFilter)) {
19
+ let occurrence = joinCount[sqlEvent.sql];
20
+ if (!occurrence) {
21
+ occurrence = {
22
+ count: 1,
23
+ joins: (0, database_1.countJoins)(appMapIndex.sqlAST(sqlEvent.event)),
24
+ events: [sqlEvent.event],
25
+ };
26
+ joinCount[sqlEvent.sql] = occurrence;
48
27
  }
49
- }
50
- catch (e_1_1) { e_1 = { error: e_1_1 }; }
51
- finally {
52
- try {
53
- if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
28
+ else {
29
+ occurrence.count += 1;
30
+ occurrence.events.push(sqlEvent.event);
54
31
  }
55
- finally { if (e_1) throw e_1.error; }
56
32
  }
57
- return Object.keys(joinCount).reduce(function (matchResults, sql) {
58
- var occurrence = joinCount[sql];
33
+ return Object.keys(joinCount).reduce((matchResults, sql) => {
34
+ const occurrence = joinCount[sql];
59
35
  if (occurrence.joins >= options.warningLimit) {
60
36
  matchResults.push({
61
37
  event: occurrence.events[0],
62
- message: "".concat(occurrence.joins, " join").concat(occurrence.joins > 1 ? 's' : '', " in SQL \"").concat(sql, "\""),
38
+ message: `${occurrence.joins} join${occurrence.joins > 1 ? 's' : ''} in SQL "${sql}"`,
63
39
  relatedEvents: occurrence.events,
64
40
  });
65
41
  }
@@ -67,7 +43,7 @@ function build(options) {
67
43
  }, []);
68
44
  }
69
45
  return {
70
- matcher: matcher,
46
+ matcher,
71
47
  };
72
48
  }
73
49
  exports.default = {
@@ -80,7 +56,6 @@ exports.default = {
80
56
  },
81
57
  description: (0, parseRuleDescription_1.default)('tooManyJoins'),
82
58
  url: 'https://appland.com/docs/analysis/rules-reference.html#too-many-joins',
83
- Options: Options,
84
- build: build,
59
+ Options,
60
+ build,
85
61
  };
86
- //# sourceMappingURL=tooManyJoins.js.map
@@ -1,67 +1,28 @@
1
1
  "use strict";
2
- var __generator = (this && this.__generator) || function (thisArg, body) {
3
- var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
4
- return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
5
- function verb(n) { return function (v) { return step([n, v]); }; }
6
- function step(op) {
7
- if (f) throw new TypeError("Generator is already executing.");
8
- while (_) try {
9
- 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;
10
- if (y = 0, t) op = [op[0] & 2, t.value];
11
- switch (op[0]) {
12
- case 0: case 1: t = op; break;
13
- case 4: _.label++; return { value: op[1], done: false };
14
- case 5: _.label++; y = op[1]; op = [0]; continue;
15
- case 7: op = _.ops.pop(); _.trys.pop(); continue;
16
- default:
17
- if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
18
- if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
19
- if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
20
- if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
21
- if (t[2]) _.ops.pop();
22
- _.trys.pop(); continue;
23
- }
24
- op = body.call(thisArg, _);
25
- } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
26
- if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
27
- }
28
- };
29
- var __values = (this && this.__values) || function(o) {
30
- var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
31
- if (m) return m.call(o);
32
- if (o && typeof o.length === "number") return {
33
- next: function () {
34
- if (o && i >= o.length) o = void 0;
35
- return { value: o && o[i++], done: !o };
36
- }
37
- };
38
- throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
39
- };
40
2
  var __importDefault = (this && this.__importDefault) || function (mod) {
41
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
42
4
  };
43
5
  Object.defineProperty(exports, "__esModule", { value: true });
44
- var models_1 = require("@appland/models");
45
- var url_1 = require("url");
46
- var parseRuleDescription_1 = __importDefault(require("./lib/parseRuleDescription"));
6
+ const models_1 = require("@appland/models");
7
+ const url_1 = require("url");
8
+ const parseRuleDescription_1 = __importDefault(require("./lib/parseRuleDescription"));
47
9
  // TODO: Use the Query AST for this.
48
- var QueryIncludes = [/\bINSERT\b/i, /\bUPDATE\b/i];
49
- var UpdateMethods = ['put', 'post', 'patch'];
50
- var Options = /** @class */ (function () {
51
- function Options() {
10
+ const QueryIncludes = [/\bINSERT\b/i, /\bUPDATE\b/i];
11
+ const UpdateMethods = ['put', 'post', 'patch'];
12
+ class Options {
13
+ constructor() {
52
14
  this.warningLimit = 20;
53
15
  }
54
- return Options;
55
- }());
16
+ }
56
17
  function build(options) {
57
- var isUpdate = function (event) {
58
- var isSQLUpdate = function () {
18
+ const isUpdate = (event) => {
19
+ const isSQLUpdate = () => {
59
20
  if (!event.sqlQuery) {
60
21
  return false;
61
22
  }
62
- return QueryIncludes.some(function (pattern) { return pattern.test(event.sqlQuery); });
23
+ return QueryIncludes.some((pattern) => pattern.test(event.sqlQuery));
63
24
  };
64
- var isRPCUpdate = function () {
25
+ const isRPCUpdate = () => {
65
26
  if (!event.httpClientRequest) {
66
27
  return false;
67
28
  }
@@ -69,63 +30,23 @@ function build(options) {
69
30
  };
70
31
  return isSQLUpdate() || isRPCUpdate();
71
32
  };
72
- var updateEvents = function (event) {
73
- var _a, _b, e, e_1_1;
74
- var e_1, _c;
75
- return __generator(this, function (_d) {
76
- switch (_d.label) {
77
- case 0:
78
- _d.trys.push([0, 5, 6, 7]);
79
- _a = __values(new models_1.EventNavigator(event).descendants()), _b = _a.next();
80
- _d.label = 1;
81
- case 1:
82
- if (!!_b.done) return [3 /*break*/, 4];
83
- e = _b.value;
84
- if (!isUpdate(e.event)) {
85
- return [3 /*break*/, 3];
86
- }
87
- return [4 /*yield*/, e.event];
88
- case 2:
89
- _d.sent();
90
- _d.label = 3;
91
- case 3:
92
- _b = _a.next();
93
- return [3 /*break*/, 1];
94
- case 4: return [3 /*break*/, 7];
95
- case 5:
96
- e_1_1 = _d.sent();
97
- e_1 = { error: e_1_1 };
98
- return [3 /*break*/, 7];
99
- case 6:
100
- try {
101
- if (_b && !_b.done && (_c = _a.return)) _c.call(_a);
102
- }
103
- finally { if (e_1) throw e_1.error; }
104
- return [7 /*endfinally*/];
105
- case 7: return [2 /*return*/];
33
+ const updateEvents = function* (event) {
34
+ for (const e of new models_1.EventNavigator(event).descendants()) {
35
+ if (!isUpdate(e.event)) {
36
+ continue;
106
37
  }
107
- });
38
+ yield e.event;
39
+ }
108
40
  };
109
41
  function matcher(command) {
110
- var e_2, _a;
111
- var events = [];
112
- try {
113
- for (var _b = __values(updateEvents(command)), _c = _b.next(); !_c.done; _c = _b.next()) {
114
- var updateEvent = _c.value;
115
- events.push(updateEvent);
116
- }
117
- }
118
- catch (e_2_1) { e_2 = { error: e_2_1 }; }
119
- finally {
120
- try {
121
- if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
122
- }
123
- finally { if (e_2) throw e_2.error; }
42
+ const events = [];
43
+ for (const updateEvent of updateEvents(command)) {
44
+ events.push(updateEvent);
124
45
  }
125
46
  if (events.length > options.warningLimit) {
126
47
  return [
127
48
  {
128
- message: "Command performs ".concat(events.length, " SQL and RPC updates"),
49
+ message: `Command performs ${events.length} SQL and RPC updates`,
129
50
  event: events[0],
130
51
  relatedEvents: events,
131
52
  },
@@ -133,7 +54,7 @@ function build(options) {
133
54
  }
134
55
  }
135
56
  return {
136
- matcher: matcher,
57
+ matcher,
137
58
  };
138
59
  }
139
60
  exports.default = {
@@ -147,7 +68,6 @@ exports.default = {
147
68
  },
148
69
  description: (0, parseRuleDescription_1.default)('tooManyUpdates'),
149
70
  url: 'https://appland.com/docs/analysis/rules-reference.html#too-many-updates',
150
- Options: Options,
151
- build: build,
71
+ Options,
72
+ build,
152
73
  };
153
- //# sourceMappingURL=tooManyUpdates.js.map
@@ -3,50 +3,47 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- var visit_1 = require("../database/visit");
7
- var url_1 = require("url");
8
- var parseRuleDescription_1 = __importDefault(require("./lib/parseRuleDescription"));
6
+ const visit_1 = require("../database/visit");
7
+ const url_1 = require("url");
8
+ const parseRuleDescription_1 = __importDefault(require("./lib/parseRuleDescription"));
9
9
  function isMaterialized(e) {
10
- return e.ancestors().some(function (_a) {
11
- var labels = _a.labels;
12
- return labels.has(DAOMaterialize);
13
- });
10
+ return e.ancestors().some(({ labels }) => labels.has(DAOMaterialize));
14
11
  }
15
12
  function isApplicable(e, appMapIndex) {
16
13
  try {
17
- var ast = appMapIndex.sqlAST(e);
18
- var isSelect_1 = false;
19
- var isCount_1 = false;
20
- var hasLimitClause_1 = false;
21
- var isMetadataQuery_1 = false;
14
+ const ast = appMapIndex.sqlAST(e);
15
+ let isSelect = false;
16
+ let isCount = false;
17
+ let hasLimitClause = false;
18
+ let isMetadataQuery = false;
22
19
  if (ast) {
23
- var metadataTableNames_1 = ['sqlite_master'];
20
+ const metadataTableNames = ['sqlite_master'];
24
21
  (0, visit_1.visit)(ast, {
25
- 'statement.select': function (statement) {
26
- isSelect_1 = true;
22
+ 'statement.select': (statement) => {
23
+ isSelect = true;
27
24
  if (statement.result &&
28
25
  Array.isArray(statement.result) &&
29
26
  statement.result.length === 1 &&
30
27
  statement.result[0].type === 'function' &&
31
28
  statement.result[0].name.name === 'count') {
32
- isCount_1 = true;
29
+ isCount = true;
33
30
  }
34
31
  },
35
- 'expression.limit': function () {
36
- hasLimitClause_1 = true;
32
+ 'expression.limit': () => {
33
+ hasLimitClause = true;
37
34
  },
38
- 'identifier.table': function (identifier) {
39
- if (metadataTableNames_1.includes(identifier.name)) {
40
- isMetadataQuery_1 = true;
35
+ 'identifier.table': (identifier) => {
36
+ if (metadataTableNames.includes(identifier.name)) {
37
+ isMetadataQuery = true;
41
38
  }
42
39
  },
43
40
  });
44
41
  }
45
- var isBatched = hasLimitClause_1 || isCount_1 || isMetadataQuery_1;
46
- return isSelect_1 && !isBatched && isMaterialized(e);
42
+ const isBatched = hasLimitClause || isCount || isMetadataQuery;
43
+ return isSelect && !isBatched && isMaterialized(e);
47
44
  }
48
45
  catch (_) {
49
- console.warn("Unable to analyze query \"".concat(e.sqlQuery, "\""));
46
+ console.warn(`Unable to analyze query "${e.sqlQuery}"`);
50
47
  return false;
51
48
  }
52
49
  }
@@ -55,19 +52,19 @@ function matcher(event, appMapIndex) {
55
52
  return [
56
53
  {
57
54
  event: event,
58
- message: "Unbatched materialized SQL query: ".concat(event.sqlQuery),
55
+ message: `Unbatched materialized SQL query: ${event.sqlQuery}`,
59
56
  },
60
57
  ];
61
58
  }
62
59
  }
63
60
  function build() {
64
61
  return {
65
- matcher: matcher,
66
- where: function (e) { return !!e.sqlQuery; },
62
+ matcher,
63
+ where: (e) => !!e.sqlQuery,
67
64
  };
68
65
  }
69
66
  // Example: ActiveRecord::Relation#records
70
- var DAOMaterialize = 'dao.materialize';
67
+ const DAOMaterialize = 'dao.materialize';
71
68
  exports.default = {
72
69
  id: 'unbatched-materialized-query',
73
70
  title: 'Unbatched materialized SQL query',
@@ -79,6 +76,5 @@ exports.default = {
79
76
  },
80
77
  description: (0, parseRuleDescription_1.default)('unbatchedMaterializedQuery'),
81
78
  url: 'https://appland.com/docs/analysis/rules-reference.html#unbatched-materialized-query',
82
- build: build,
79
+ build,
83
80
  };
84
- //# sourceMappingURL=unbatchedMaterializedQuery.js.map
@@ -3,62 +3,48 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- var util_1 = require("./lib/util");
7
- var parseRuleDescription_1 = __importDefault(require("./lib/parseRuleDescription"));
8
- var Options = /** @class */ (function () {
9
- function Options(queryInclude, queryExclude) {
10
- if (queryInclude === void 0) { queryInclude = [/\binsert\b/i, /\bupdate\b/i]; }
11
- if (queryExclude === void 0) { queryExclude = []; }
6
+ const util_1 = require("./lib/util");
7
+ const parseRuleDescription_1 = __importDefault(require("./lib/parseRuleDescription"));
8
+ class Options {
9
+ constructor(queryInclude = [/\binsert\b/i, /\bupdate\b/i], queryExclude = []) {
12
10
  this._queryInclude = queryInclude;
13
11
  this._queryExclude = queryExclude;
14
12
  }
15
- Object.defineProperty(Options.prototype, "queryInclude", {
16
- get: function () {
17
- return this._queryInclude;
18
- },
19
- set: function (value) {
20
- this._queryInclude = (0, util_1.toRegExpArray)(value);
21
- },
22
- enumerable: false,
23
- configurable: true
24
- });
25
- Object.defineProperty(Options.prototype, "queryExclude", {
26
- get: function () {
27
- return this._queryExclude;
28
- },
29
- set: function (value) {
30
- this._queryExclude = (0, util_1.toRegExpArray)(value);
31
- },
32
- enumerable: false,
33
- configurable: true
34
- });
35
- return Options;
36
- }());
37
- function build(options) {
38
- if (options === void 0) { options = new Options(); }
13
+ get queryInclude() {
14
+ return this._queryInclude;
15
+ }
16
+ set queryInclude(value) {
17
+ this._queryInclude = (0, util_1.toRegExpArray)(value);
18
+ }
19
+ get queryExclude() {
20
+ return this._queryExclude;
21
+ }
22
+ set queryExclude(value) {
23
+ this._queryExclude = (0, util_1.toRegExpArray)(value);
24
+ }
25
+ }
26
+ function build(options = new Options()) {
39
27
  return {
40
- matcher: function (e) {
41
- var httpServerRequest;
28
+ matcher: (e) => {
29
+ let httpServerRequest;
42
30
  function hasHttpServerRequest() {
43
31
  httpServerRequest = e
44
32
  .ancestors()
45
- .find(function (ancestor) {
46
- return ancestor.httpServerRequest &&
47
- ['head', 'get'].includes(ancestor.httpServerRequest.request_method.toLowerCase());
48
- });
33
+ .find((ancestor) => ancestor.httpServerRequest &&
34
+ ['head', 'get'].includes(ancestor.httpServerRequest.request_method.toLowerCase()));
49
35
  return httpServerRequest !== undefined;
50
36
  }
51
- if (options.queryInclude.some(function (pattern) { return e.sqlQuery.match(pattern); }) &&
52
- !options.queryExclude.some(function (pattern) { return e.sqlQuery.match(pattern); }) &&
53
- !e.ancestors().some(function (ancestor) { return ancestor.codeObject.labels.has(Audit); }) &&
37
+ if (options.queryInclude.some((pattern) => e.sqlQuery.match(pattern)) &&
38
+ !options.queryExclude.some((pattern) => e.sqlQuery.match(pattern)) &&
39
+ !e.ancestors().some((ancestor) => ancestor.codeObject.labels.has(Audit)) &&
54
40
  hasHttpServerRequest()) {
55
- return "Data update performed in ".concat(httpServerRequest.route, ": ").concat(e.sqlQuery);
41
+ return `Data update performed in ${httpServerRequest.route}: ${e.sqlQuery}`;
56
42
  }
57
43
  },
58
- where: function (e) { return !!e.sqlQuery; },
44
+ where: (e) => !!e.sqlQuery,
59
45
  };
60
46
  }
61
- var Audit = 'audit';
47
+ const Audit = 'audit';
62
48
  exports.default = {
63
49
  id: 'update-in-get-request',
64
50
  title: 'Data update performed in GET or HEAD request',
@@ -67,7 +53,6 @@ exports.default = {
67
53
  impactDomain: 'Maintainability',
68
54
  description: (0, parseRuleDescription_1.default)('updateInGetRequest'),
69
55
  url: 'https://appland.com/docs/analysis/rules-reference.html#update-in-get-request',
70
- Options: Options,
71
- build: build,
56
+ Options,
57
+ build,
72
58
  };
73
- //# sourceMappingURL=updateInGetRequest.js.map