@appland/scanner 1.54.1 → 1.57.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 +31 -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 +18 -20
  13. package/built/check.js +16 -18
  14. package/built/checkInstance.js +26 -48
  15. package/built/cli/ci/command.js +61 -147
  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 +58 -233
  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 +84 -0
  30. package/built/cli/scan.js +39 -132
  31. package/built/cli/scanArgs.js +2 -4
  32. package/built/cli/scanOptions.js +0 -1
  33. package/built/cli/updateCommitStatus.js +10 -47
  34. package/built/cli/upload/command.js +21 -65
  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 +148 -227
  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 +33 -127
  47. package/built/database/visit.js +16 -66
  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 +18 -45
  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 +48 -25
  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 -4
  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,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
@@ -1,155 +1,35 @@
1
1
  "use strict";
2
- var __extends = (this && this.__extends) || (function () {
3
- var extendStatics = function (d, b) {
4
- extendStatics = Object.setPrototypeOf ||
5
- ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
6
- function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
7
- return extendStatics(d, b);
8
- };
9
- return function (d, b) {
10
- if (typeof b !== "function" && b !== null)
11
- throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
12
- extendStatics(d, b);
13
- function __() { this.constructor = d; }
14
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
15
- };
16
- })();
17
- var __generator = (this && this.__generator) || function (thisArg, body) {
18
- var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
19
- return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
20
- function verb(n) { return function (v) { return step([n, v]); }; }
21
- function step(op) {
22
- if (f) throw new TypeError("Generator is already executing.");
23
- while (_) try {
24
- 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;
25
- if (y = 0, t) op = [op[0] & 2, t.value];
26
- switch (op[0]) {
27
- case 0: case 1: t = op; break;
28
- case 4: _.label++; return { value: op[1], done: false };
29
- case 5: _.label++; y = op[1]; op = [0]; continue;
30
- case 7: op = _.ops.pop(); _.trys.pop(); continue;
31
- default:
32
- if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
33
- if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
34
- if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
35
- if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
36
- if (t[2]) _.ops.pop();
37
- _.trys.pop(); continue;
38
- }
39
- op = body.call(thisArg, _);
40
- } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
41
- if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
42
- }
43
- };
44
- var __values = (this && this.__values) || function(o) {
45
- var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
46
- if (m) return m.call(o);
47
- if (o && typeof o.length === "number") return {
48
- next: function () {
49
- if (o && i >= o.length) o = void 0;
50
- return { value: o && o[i++], done: !o };
51
- }
52
- };
53
- throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
54
- };
55
2
  var __importDefault = (this && this.__importDefault) || function (mod) {
56
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
57
4
  };
58
5
  Object.defineProperty(exports, "__esModule", { value: true });
59
- var models_1 = require("@appland/models");
60
- var scopeIterator_1 = __importDefault(require("./scopeIterator"));
61
- var ScopeImpl = /** @class */ (function () {
62
- function ScopeImpl(event) {
6
+ const models_1 = require("@appland/models");
7
+ const scopeIterator_1 = __importDefault(require("./scopeIterator"));
8
+ class ScopeImpl {
9
+ constructor(event) {
63
10
  this.scope = event;
64
11
  this.descendants = new models_1.EventNavigator(event);
65
12
  }
66
- ScopeImpl.prototype.events = function () {
67
- var _a, _b, event, e_1_1;
68
- var e_1, _c;
69
- return __generator(this, function (_d) {
70
- switch (_d.label) {
71
- case 0: return [4 /*yield*/, this.scope];
72
- case 1:
73
- _d.sent();
74
- _d.label = 2;
75
- case 2:
76
- _d.trys.push([2, 7, 8, 9]);
77
- _a = __values(this.descendants.descendants()), _b = _a.next();
78
- _d.label = 3;
79
- case 3:
80
- if (!!_b.done) return [3 /*break*/, 6];
81
- event = _b.value;
82
- return [4 /*yield*/, event.event];
83
- case 4:
84
- _d.sent();
85
- _d.label = 5;
86
- case 5:
87
- _b = _a.next();
88
- return [3 /*break*/, 3];
89
- case 6: return [3 /*break*/, 9];
90
- case 7:
91
- e_1_1 = _d.sent();
92
- e_1 = { error: e_1_1 };
93
- return [3 /*break*/, 9];
94
- case 8:
95
- try {
96
- if (_b && !_b.done && (_c = _a.return)) _c.call(_a);
97
- }
98
- finally { if (e_1) throw e_1.error; }
99
- return [7 /*endfinally*/];
100
- case 9: return [2 /*return*/];
101
- }
102
- });
103
- };
104
- return ScopeImpl;
105
- }());
106
- var Command = 'command.perform';
107
- var Job = 'job.perform';
108
- var CommandScope = /** @class */ (function (_super) {
109
- __extends(CommandScope, _super);
110
- function CommandScope() {
111
- return _super !== null && _super.apply(this, arguments) || this;
13
+ *events() {
14
+ yield this.scope;
15
+ for (const event of this.descendants.descendants()) {
16
+ yield event.event;
17
+ }
112
18
  }
113
- CommandScope.prototype.scopes = function (events) {
114
- var events_1, events_1_1, event, e_2_1;
115
- var e_2, _a;
116
- return __generator(this, function (_b) {
117
- switch (_b.label) {
118
- case 0:
119
- _b.trys.push([0, 5, 6, 7]);
120
- events_1 = __values(events), events_1_1 = events_1.next();
121
- _b.label = 1;
122
- case 1:
123
- if (!!events_1_1.done) return [3 /*break*/, 4];
124
- event = events_1_1.value;
125
- if (!(event.isCall() &&
126
- (event.codeObject.labels.has(Command) ||
127
- event.codeObject.labels.has(Job) ||
128
- event.httpServerRequest))) return [3 /*break*/, 3];
129
- return [4 /*yield*/, new ScopeImpl(event)];
130
- case 2:
131
- _b.sent();
132
- this.advanceToReturnEvent(event, events);
133
- _b.label = 3;
134
- case 3:
135
- events_1_1 = events_1.next();
136
- return [3 /*break*/, 1];
137
- case 4: return [3 /*break*/, 7];
138
- case 5:
139
- e_2_1 = _b.sent();
140
- e_2 = { error: e_2_1 };
141
- return [3 /*break*/, 7];
142
- case 6:
143
- try {
144
- if (events_1_1 && !events_1_1.done && (_a = events_1.return)) _a.call(events_1);
145
- }
146
- finally { if (e_2) throw e_2.error; }
147
- return [7 /*endfinally*/];
148
- case 7: return [2 /*return*/];
19
+ }
20
+ const Command = 'command.perform';
21
+ const Job = 'job.perform';
22
+ class CommandScope extends scopeIterator_1.default {
23
+ *scopes(events) {
24
+ for (const event of events) {
25
+ if (event.isCall() &&
26
+ (event.codeObject.labels.has(Command) ||
27
+ event.codeObject.labels.has(Job) ||
28
+ event.httpServerRequest)) {
29
+ yield new ScopeImpl(event);
30
+ this.advanceToReturnEvent(event, events);
149
31
  }
150
- });
151
- };
152
- return CommandScope;
153
- }(scopeIterator_1.default));
32
+ }
33
+ }
34
+ }
154
35
  exports.default = CommandScope;
155
- //# sourceMappingURL=commandScope.js.map