@appland/scanner 1.40.2 → 1.43.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.
- package/README.md +63 -39
- package/built/appMapIndex.js +40 -0
- package/built/appMapIndex.js.map +1 -0
- package/built/check.js +3 -3
- package/built/check.js.map +1 -1
- package/built/checkInstance.js +4 -4
- package/built/checkInstance.js.map +1 -1
- package/built/cli/ci/command.js +21 -26
- package/built/cli/ci/command.js.map +1 -1
- package/built/cli/fail.js +13 -0
- package/built/cli/fail.js.map +1 -0
- package/built/cli/merge/command.js +101 -0
- package/built/cli/merge/command.js.map +1 -0
- package/built/cli/merge/options.js +3 -0
- package/built/cli/merge/options.js.map +1 -0
- package/built/cli/reportUploadURL.js +11 -0
- package/built/cli/reportUploadURL.js.map +1 -0
- package/built/cli/scan/command.js +5 -1
- package/built/cli/scan/command.js.map +1 -1
- package/built/cli/scan/scanner.js +2 -2
- package/built/cli/scan/scanner.js.map +1 -1
- package/built/cli/scan.js +4 -2
- package/built/cli/scan.js.map +1 -1
- package/built/cli/updateCommitStatus.js +65 -0
- package/built/cli/updateCommitStatus.js.map +1 -0
- package/built/cli/upload/command.js +10 -5
- package/built/cli/upload/command.js.map +1 -1
- package/built/cli.js +2 -0
- package/built/cli.js.map +1 -1
- package/built/database/index.js +136 -161
- package/built/database/index.js.map +1 -1
- package/built/eventUtil.js +61 -0
- package/built/eventUtil.js.map +1 -0
- package/built/integration/appland/{fetchStatus.js → app/listFindingStatus.js} +1 -1
- package/built/integration/appland/app/listFindingStatus.js.map +1 -0
- package/built/integration/appland/{appMap.js → appMap/create.js} +43 -48
- package/built/integration/appland/appMap/create.js.map +1 -0
- package/built/integration/appland/location.js +3 -0
- package/built/integration/appland/location.js.map +1 -0
- package/built/integration/appland/{mapset.js → mapset/create.js} +41 -46
- package/built/integration/appland/mapset/create.js.map +1 -0
- package/built/integration/appland/{upload.js → scannerJob/create.js} +27 -19
- package/built/integration/appland/scannerJob/create.js.map +1 -0
- package/built/integration/appland/scannerJob/merge.js +92 -0
- package/built/integration/appland/scannerJob/merge.js.map +1 -0
- package/built/integration/appland/scannerJob.js +3 -0
- package/built/integration/appland/scannerJob.js.map +1 -0
- package/built/report/summaryReport.js +1 -1
- package/built/report/summaryReport.js.map +1 -1
- package/built/ruleChecker.js +16 -14
- package/built/ruleChecker.js.map +1 -1
- package/built/rules/authzBeforeAuthn.js +6 -0
- package/built/rules/authzBeforeAuthn.js.map +1 -1
- package/built/rules/circularDependency.js +4 -0
- package/built/rules/circularDependency.js.map +1 -1
- package/built/rules/deserializationOfUntrustedData.js +8 -0
- package/built/rules/deserializationOfUntrustedData.js.map +1 -1
- package/built/rules/http500.js +7 -0
- package/built/rules/http500.js.map +1 -1
- package/built/rules/illegalPackageDependency.js +7 -0
- package/built/rules/illegalPackageDependency.js.map +1 -1
- package/built/rules/incompatibleHttpClientRequest.js +7 -0
- package/built/rules/incompatibleHttpClientRequest.js.map +1 -1
- package/built/rules/insecureCompare.js +4 -0
- package/built/rules/insecureCompare.js.map +1 -1
- package/built/rules/jobNotCancelled.js +3 -0
- package/built/rules/jobNotCancelled.js.map +1 -1
- package/built/rules/lib/matchEvent.js +3 -4
- package/built/rules/lib/matchEvent.js.map +1 -1
- package/built/rules/lib/parseRuleDescription.js +18 -0
- package/built/rules/lib/parseRuleDescription.js.map +1 -0
- package/built/rules/logoutWithoutSessionReset.js +8 -0
- package/built/rules/logoutWithoutSessionReset.js.map +1 -1
- package/built/rules/missingAuthentication.js +6 -0
- package/built/rules/missingAuthentication.js.map +1 -1
- package/built/rules/missingContentType.js +6 -0
- package/built/rules/missingContentType.js.map +1 -1
- package/built/rules/nPlusOneQuery.js +8 -2
- package/built/rules/nPlusOneQuery.js.map +1 -1
- package/built/rules/queryFromInvalidPackage.js +6 -0
- package/built/rules/queryFromInvalidPackage.js.map +1 -1
- package/built/rules/queryFromView.js +6 -0
- package/built/rules/queryFromView.js.map +1 -1
- package/built/rules/rpcWithoutCircuitBreaker.js +6 -0
- package/built/rules/rpcWithoutCircuitBreaker.js.map +1 -1
- package/built/rules/saveWithoutValidation.js +6 -0
- package/built/rules/saveWithoutValidation.js.map +1 -1
- package/built/rules/secretInLog.js +3 -0
- package/built/rules/secretInLog.js.map +1 -1
- package/built/rules/slowFunctionCall.js +6 -0
- package/built/rules/slowFunctionCall.js.map +1 -1
- package/built/rules/slowHttpServerRequest.js +6 -0
- package/built/rules/slowHttpServerRequest.js.map +1 -1
- package/built/rules/slowQuery.js +6 -0
- package/built/rules/slowQuery.js.map +1 -1
- package/built/rules/tooManyJoins.js +9 -3
- package/built/rules/tooManyJoins.js.map +1 -1
- package/built/rules/tooManyUpdates.js +6 -0
- package/built/rules/tooManyUpdates.js.map +1 -1
- package/built/rules/unbatchedMaterializedQuery.js +9 -4
- package/built/rules/unbatchedMaterializedQuery.js.map +1 -1
- package/built/rules/updateInGetRequest.js +6 -0
- package/built/rules/updateInGetRequest.js.map +1 -1
- package/built/scope/sqlTransactionScope.js +3 -2
- package/built/scope/sqlTransactionScope.js.map +1 -1
- package/built/sqlWarning.js +56 -0
- package/built/sqlWarning.js.map +1 -0
- package/doc/architecture.md +48 -0
- package/doc/labels/audit.md +7 -0
- package/doc/labels/dao.materialize.md +12 -0
- package/doc/labels/deserialize.safe.md +9 -0
- package/doc/labels/deserialize.unsafe.md +12 -0
- package/doc/labels/http.session.clear.md +7 -0
- package/doc/labels/job.cancel.md +11 -0
- package/doc/labels/job.create.md +13 -0
- package/doc/labels/log.md +12 -0
- package/doc/labels/public.md +8 -0
- package/doc/labels/rpc.circuit_breaker.md +16 -0
- package/doc/labels/sanitize.md +29 -0
- package/doc/labels/secret.md +11 -0
- package/doc/labels/security.authentication.md +10 -0
- package/doc/labels/security.authorization.md +9 -0
- package/doc/labels/security.logout.md +9 -0
- package/doc/labels/string.equals.md +18 -0
- package/doc/rules/authzBeforeAuthn.md +47 -0
- package/doc/rules/circularDependency.md +57 -0
- package/doc/rules/deserializationOfUntrustedData.md +55 -0
- package/doc/rules/http500.md +36 -0
- package/doc/rules/illegalPackageDependency.md +50 -0
- package/doc/rules/incompatibleHttpClientRequest.md +35 -0
- package/doc/rules/insecureCompare.md +59 -0
- package/doc/rules/jobNotCancelled.md +49 -0
- package/doc/rules/logoutWithoutSessionReset.md +40 -0
- package/doc/rules/missingAuthentication.md +59 -0
- package/doc/rules/missingContentType.md +33 -0
- package/doc/rules/nPlusOneQuery.md +52 -0
- package/doc/rules/queryFromInvalidPackage.md +45 -0
- package/doc/rules/queryFromView.md +42 -0
- package/doc/rules/rpcWithoutCircuitBreaker.md +44 -0
- package/doc/rules/saveWithoutValidation.md +33 -0
- package/doc/rules/secretInLog.md +49 -0
- package/doc/rules/slowFunctionCall.md +39 -0
- package/doc/rules/slowHttpServerRequest.md +34 -0
- package/doc/rules/slowQuery.md +33 -0
- package/doc/rules/tooManyJoins.md +40 -0
- package/doc/rules/tooManyUpdates.md +46 -0
- package/doc/rules/unbatchedMaterializedQuery.md +54 -0
- package/doc/rules/updateInGetRequest.md +44 -0
- package/package.json +10 -6
- package/built/integration/appland/appMap.js.map +0 -1
- package/built/integration/appland/fetchStatus.js.map +0 -1
- package/built/integration/appland/mapset.js.map +0 -1
- 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,
|
|
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);
|
package/built/cli/scan.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scan.js","sourceRoot":"","sources":["../../src/cli/scan.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,wCAAuC;AACvC,0CAAwD;AAGxD,+DAAyC;AAGzC,wEAAkD;
|
|
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
|
|
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,
|
|
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,
|
|
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;
|
|
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"}
|
package/built/database/index.js
CHANGED
|
@@ -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.
|
|
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
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
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
|
|
74
|
+
return str.slice(0, 1).toUpperCase() + str.slice(1).toLowerCase();
|
|
142
75
|
}
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
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
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
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
|
|
92
|
+
return label;
|
|
181
93
|
}
|
|
182
|
-
exports.
|
|
183
|
-
|
|
184
|
-
|
|
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.
|
|
168
|
+
exports.getSqlLabelFromString = getSqlLabelFromString;
|
|
187
169
|
function isSelect(sql) {
|
|
188
|
-
return
|
|
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.
|
|
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
|
|
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(
|
|
241
|
-
|
|
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":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/database/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __read = (this && this.__read) || function (o, n) {
|
|
3
|
+
var m = typeof Symbol === "function" && o[Symbol.iterator];
|
|
4
|
+
if (!m) return o;
|
|
5
|
+
var i = m.call(o), r, ar = [], e;
|
|
6
|
+
try {
|
|
7
|
+
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
|
|
8
|
+
}
|
|
9
|
+
catch (error) { e = { error: error }; }
|
|
10
|
+
finally {
|
|
11
|
+
try {
|
|
12
|
+
if (r && !r.done && (m = i["return"])) m.call(i);
|
|
13
|
+
}
|
|
14
|
+
finally { if (e) throw e.error; }
|
|
15
|
+
}
|
|
16
|
+
return ar;
|
|
17
|
+
};
|
|
18
|
+
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
|
19
|
+
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
|
20
|
+
if (ar || !(i in from)) {
|
|
21
|
+
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
|
|
22
|
+
ar[i] = from[i];
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
return to.concat(ar || Array.prototype.slice.call(from));
|
|
26
|
+
};
|
|
27
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
28
|
+
exports.cloneEvent = exports.cloneCodeObject = void 0;
|
|
29
|
+
var models_1 = require("@appland/models");
|
|
30
|
+
function cloneCodeObject(sourceObject) {
|
|
31
|
+
var codeObjects = __spreadArray([
|
|
32
|
+
sourceObject
|
|
33
|
+
], __read(sourceObject.ancestors()), false);
|
|
34
|
+
var currentSourceObject = codeObjects.pop();
|
|
35
|
+
var lastClonedObject;
|
|
36
|
+
while (currentSourceObject) {
|
|
37
|
+
lastClonedObject = new models_1.CodeObject(currentSourceObject.data, lastClonedObject);
|
|
38
|
+
currentSourceObject = codeObjects.pop();
|
|
39
|
+
}
|
|
40
|
+
return lastClonedObject;
|
|
41
|
+
}
|
|
42
|
+
exports.cloneCodeObject = cloneCodeObject;
|
|
43
|
+
// FIXME: These methods should live in @appland/models. Perhaps via Event#clone.
|
|
44
|
+
function cloneEvent(sourceEvent) {
|
|
45
|
+
// We need to clone both the sourceEvent and the 'linkedEvent'. The linkedEvent will be a return
|
|
46
|
+
// if `sourceEvent` is a call and vice versa. Some accessors on the Event will use the linkedEvent
|
|
47
|
+
// as a convienence, so we may run into errors if we don't restore this relationship. For example,
|
|
48
|
+
// accessing `elapsedTime` on a call event will retrieve the value from the associated return
|
|
49
|
+
// event.
|
|
50
|
+
var linkedEvent = new models_1.Event(sourceEvent.linkedEvent);
|
|
51
|
+
var event = new models_1.Event(sourceEvent);
|
|
52
|
+
event.linkedEvent = linkedEvent;
|
|
53
|
+
// The codeObject is used as well so it'll need a clone.
|
|
54
|
+
var codeObject = cloneCodeObject(sourceEvent.codeObject);
|
|
55
|
+
if (codeObject) {
|
|
56
|
+
event.codeObject = codeObject;
|
|
57
|
+
}
|
|
58
|
+
return event;
|
|
59
|
+
}
|
|
60
|
+
exports.cloneEvent = cloneEvent;
|
|
61
|
+
//# sourceMappingURL=eventUtil.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eventUtil.js","sourceRoot":"","sources":["../src/eventUtil.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,0CAAoD;AAWpD,SAAgB,eAAe,CAAC,YAAwB;IACtD,IAAM,WAAW;QACf,YAAY;cACR,YAAY,CAAC,SAA2C,EAAE,SAC/D,CAAC;IACF,IAAI,mBAAmB,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;IAC5C,IAAI,gBAAgB,CAAC;IAErB,OAAO,mBAAmB,EAAE;QAC1B,gBAAgB,GAAG,IAAK,mBAAoC,CACzD,mBAAoD,CAAC,IAAI,EAC1D,gBAAgB,CACjB,CAAC;QACF,mBAAmB,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;KACzC;IAED,OAAO,gBAAgB,CAAC;AAC1B,CAAC;AAjBD,0CAiBC;AAED,gFAAgF;AAEhF,SAAgB,UAAU,CAAC,WAAkB;IAC3C,gGAAgG;IAChG,kGAAkG;IAClG,kGAAkG;IAClG,6FAA6F;IAC7F,SAAS;IACT,IAAM,WAAW,GAAG,IAAK,cAA0B,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;IAC7E,IAAM,KAAK,GAAG,IAAK,cAA0B,CAAC,WAAW,CAAC,CAAC;IAC3D,KAAK,CAAC,WAAW,GAAG,WAAW,CAAC;IAEhC,wDAAwD;IACxD,IAAM,UAAU,GAAG,eAAe,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;IAC3D,IAAI,UAAU,EAAE;QACd,KAAK,CAAC,UAAU,GAAG,UAAU,CAAC;KAC/B;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAjBD,gCAiBC"}
|