@appland/appmap 3.85.0 → 3.86.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 (54) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/built/cli.js +4 -0
  3. package/built/cli.js.map +1 -1
  4. package/built/cmds/archive/analyze.js.map +1 -1
  5. package/built/cmds/archive/analyzeWorker.js +3 -3
  6. package/built/cmds/archive/analyzeWorker.js.map +1 -1
  7. package/built/cmds/compare/ArchiveAnalyzer.js +69 -0
  8. package/built/cmds/compare/ArchiveAnalyzer.js.map +1 -0
  9. package/built/cmds/compare/ChangeReport.js +3 -0
  10. package/built/cmds/compare/ChangeReport.js.map +1 -0
  11. package/built/cmds/compare/ChangeReporter.js +398 -0
  12. package/built/cmds/compare/ChangeReporter.js.map +1 -0
  13. package/built/cmds/compare/Digests.js +50 -0
  14. package/built/cmds/compare/Digests.js.map +1 -0
  15. package/built/cmds/compare/Paths.js +45 -0
  16. package/built/cmds/compare/Paths.js.map +1 -0
  17. package/built/cmds/compare/RevisionName.js +10 -0
  18. package/built/cmds/compare/RevisionName.js.map +1 -0
  19. package/built/cmds/compare/SequenceDiagramDigest.js +20 -0
  20. package/built/cmds/compare/SequenceDiagramDigest.js.map +1 -0
  21. package/built/cmds/compare/ValidationError.js +7 -0
  22. package/built/cmds/compare/ValidationError.js.map +1 -0
  23. package/built/cmds/compare/checkout.js +36 -0
  24. package/built/cmds/compare/checkout.js.map +1 -0
  25. package/built/cmds/compare/compare.js +121 -0
  26. package/built/cmds/compare/compare.js.map +1 -0
  27. package/built/cmds/compare/detectRevisions.js +19 -0
  28. package/built/cmds/compare/detectRevisions.js.map +1 -0
  29. package/built/cmds/compare/loadFindings.js +45 -0
  30. package/built/cmds/compare/loadFindings.js.map +1 -0
  31. package/built/cmds/compare/loadSequenceDiagram.js +11 -0
  32. package/built/cmds/compare/loadSequenceDiagram.js.map +1 -0
  33. package/built/cmds/compare/mapToRecord.js +11 -0
  34. package/built/cmds/compare/mapToRecord.js.map +1 -0
  35. package/built/cmds/compare/prepareOutputDir.js +34 -0
  36. package/built/cmds/compare/prepareOutputDir.js.map +1 -0
  37. package/built/cmds/compare/ui.js +38 -0
  38. package/built/cmds/compare/ui.js.map +1 -0
  39. package/built/cmds/compare-report/MarkdownReport.js +197 -0
  40. package/built/cmds/compare-report/MarkdownReport.js.map +1 -0
  41. package/built/cmds/compare-report/Report.js +3 -0
  42. package/built/cmds/compare-report/Report.js.map +1 -0
  43. package/built/cmds/compare-report/compareReport.js +47 -0
  44. package/built/cmds/compare-report/compareReport.js.map +1 -0
  45. package/built/html/appmap.js +6 -6
  46. package/built/html/appmap.js.map +1 -1
  47. package/built/html/sequenceDiagram.js +6 -6
  48. package/built/html/sequenceDiagram.js.map +1 -1
  49. package/built/lib/findings.js +6 -0
  50. package/built/lib/findings.js.map +1 -0
  51. package/package.json +4 -1
  52. package/resources/change-report.hbs +259 -0
  53. package/built/cmds/archive/updateSequenceDiagrams.js +0 -49
  54. package/built/cmds/archive/updateSequenceDiagrams.js.map +0 -1
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Digests = void 0;
4
+ const async_1 = require("async");
5
+ const RevisionName_1 = require("./RevisionName");
6
+ const SequenceDiagramDigest_1 = require("./SequenceDiagramDigest");
7
+ class Digests {
8
+ constructor(paths) {
9
+ this.paths = paths;
10
+ // All digests for the base and head revisions.
11
+ this.digests = {
12
+ [RevisionName_1.RevisionName.Base]: new Set(),
13
+ [RevisionName_1.RevisionName.Head]: new Set(),
14
+ };
15
+ // Index of AppMap name to digest for both revisions.
16
+ this.appmapsByDigest = {
17
+ [RevisionName_1.RevisionName.Base]: new Map(),
18
+ [RevisionName_1.RevisionName.Head]: new Map(),
19
+ };
20
+ // Index of digest to AppMap name for both revisions.
21
+ this.digestsByAppMap = {
22
+ [RevisionName_1.RevisionName.Base]: new Map(),
23
+ [RevisionName_1.RevisionName.Head]: new Map(),
24
+ };
25
+ }
26
+ async build() {
27
+ const baseAppMaps = await this.paths.appmaps(RevisionName_1.RevisionName.Base);
28
+ const headAppMaps = await this.paths.appmaps(RevisionName_1.RevisionName.Head);
29
+ if (baseAppMaps.length === 0 && headAppMaps.length === 0)
30
+ return;
31
+ const q = (0, async_1.queue)(async ({ revisionName, appmap }) => {
32
+ const digest = await new SequenceDiagramDigest_1.SequenceDiagramDigest(this.paths, revisionName, appmap).digest();
33
+ this.digests[revisionName].add(digest);
34
+ if (!this.appmapsByDigest[revisionName].has(digest))
35
+ this.appmapsByDigest[revisionName].set(digest, new Set());
36
+ this.appmapsByDigest[revisionName].get(digest).add(appmap);
37
+ this.digestsByAppMap[revisionName].set(appmap, digest);
38
+ }, 5);
39
+ q.error(console.warn);
40
+ baseAppMaps.forEach((appmap) => q.push({ revisionName: RevisionName_1.RevisionName.Base, appmap }));
41
+ headAppMaps.forEach((appmap) => q.push({ revisionName: RevisionName_1.RevisionName.Head, appmap }));
42
+ if (q.length())
43
+ await q.drain();
44
+ }
45
+ appmapDigest(revisionName, appmap) {
46
+ return this.digestsByAppMap[revisionName].get(appmap);
47
+ }
48
+ }
49
+ exports.Digests = Digests;
50
+ //# sourceMappingURL=Digests.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Digests.js","sourceRoot":"","sources":["../../../src/cmds/compare/Digests.ts"],"names":[],"mappings":";;;AAAA,iCAA8B;AAG9B,iDAA8C;AAC9C,mEAAgE;AAEhE,MAAa,OAAO;IAiBlB,YAAmB,KAAY;QAAZ,UAAK,GAAL,KAAK,CAAO;QAhB/B,+CAA+C;QAC/C,YAAO,GAAG;YACR,CAAC,2BAAY,CAAC,IAAI,CAAC,EAAE,IAAI,GAAG,EAAgB;YAC5C,CAAC,2BAAY,CAAC,IAAI,CAAC,EAAE,IAAI,GAAG,EAAgB;SAC7C,CAAC;QACF,qDAAqD;QACrD,oBAAe,GAAG;YAChB,CAAC,2BAAY,CAAC,IAAI,CAAC,EAAE,IAAI,GAAG,EAAiC;YAC7D,CAAC,2BAAY,CAAC,IAAI,CAAC,EAAE,IAAI,GAAG,EAAiC;SAC9D,CAAC;QACF,qDAAqD;QACrD,oBAAe,GAAG;YAChB,CAAC,2BAAY,CAAC,IAAI,CAAC,EAAE,IAAI,GAAG,EAA4B;YACxD,CAAC,2BAAY,CAAC,IAAI,CAAC,EAAE,IAAI,GAAG,EAA4B;SACzD,CAAC;IAEgC,CAAC;IAEnC,KAAK,CAAC,KAAK;QACT,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,2BAAY,CAAC,IAAI,CAAC,CAAC;QAChE,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,2BAAY,CAAC,IAAI,CAAC,CAAC;QAChE,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAEjE,MAAM,CAAC,GAAG,IAAA,aAAK,EAAC,KAAK,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,EAAE,EAAE;YACjD,MAAM,MAAM,GAAG,MAAM,IAAI,6CAAqB,CAAC,IAAI,CAAC,KAAK,EAAE,YAAY,EAAE,MAAM,CAAC,CAAC,MAAM,EAAE,CAAC;YAC1F,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAEvC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC;gBACjD,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;YAC5D,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,MAAM,CAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAC5D,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACzD,CAAC,EAAE,CAAC,CAAC,CAAC;QACN,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACtB,WAAW,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,YAAY,EAAE,2BAAY,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;QACrF,WAAW,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,YAAY,EAAE,2BAAY,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;QACrF,IAAI,CAAC,CAAC,MAAM,EAAE;YAAE,MAAM,CAAC,CAAC,KAAK,EAAE,CAAC;IAClC,CAAC;IAED,YAAY,CAAC,YAA0B,EAAE,MAAkB;QACzD,OAAO,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,MAAM,CAAE,CAAC;IACzD,CAAC;CACF;AA1CD,0BA0CC"}
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Paths = void 0;
4
+ const glob_1 = require("glob");
5
+ const path_1 = require("path");
6
+ const util_1 = require("util");
7
+ const RevisionName_1 = require("./RevisionName");
8
+ class Paths {
9
+ constructor(workingDir) {
10
+ this.workingDir = workingDir;
11
+ }
12
+ async appmaps(revisionName) {
13
+ const metadataPaths = await (0, util_1.promisify)(glob_1.glob)((0, path_1.join)(this.workingDir, revisionName, '**/metadata.json'));
14
+ return metadataPaths.map((path) => (0, path_1.relative)((0, path_1.join)(this.workingDir, revisionName), (0, path_1.dirname)(path)));
15
+ }
16
+ manifestPath(revisionName) {
17
+ return (0, path_1.join)(this.revisionPath(revisionName), 'appmap_archive.json');
18
+ }
19
+ findingsPath(revisionName) {
20
+ return (0, path_1.join)(this.workingDir, revisionName, 'appmap-findings.json');
21
+ }
22
+ revisionPath(revisionName) {
23
+ return (0, path_1.join)(this.workingDir, revisionName);
24
+ }
25
+ openapiPath(revisionName) {
26
+ return (0, path_1.join)(this.workingDir, revisionName, 'openapi.yml');
27
+ }
28
+ appmapPath(revisionName, appmap) {
29
+ return (0, path_1.join)(this.workingDir, revisionName, appmap);
30
+ }
31
+ metadataPath(revisionName, appmap) {
32
+ return (0, path_1.join)(this.workingDir, revisionName, appmap, 'metadata.json');
33
+ }
34
+ classMapPath(revisionName, appmap) {
35
+ return (0, path_1.join)(this.workingDir, revisionName, appmap, 'classMap.json');
36
+ }
37
+ sequenceDiagramPath(revisionName, appmap) {
38
+ return (0, path_1.join)(this.workingDir, revisionName, appmap, 'sequence.json');
39
+ }
40
+ sequenceDiagramDiffPath(appmap) {
41
+ return (0, path_1.join)(this.workingDir, RevisionName_1.RevisionName.Diff, [appmap, 'diff.sequence.json'].join('.'));
42
+ }
43
+ }
44
+ exports.Paths = Paths;
45
+ //# sourceMappingURL=Paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Paths.js","sourceRoot":"","sources":["../../../src/cmds/compare/Paths.ts"],"names":[],"mappings":";;;AAAA,+BAA4B;AAC5B,+BAA+C;AAC/C,+BAAiC;AAEjC,iDAA8C;AAE9C,MAAa,KAAK;IAChB,YAAmB,UAAkB;QAAlB,eAAU,GAAV,UAAU,CAAQ;IAAG,CAAC;IAEzC,KAAK,CAAC,OAAO,CAAC,YAA0B;QACtC,MAAM,aAAa,GAAG,MAAM,IAAA,gBAAS,EAAC,WAAI,CAAC,CACzC,IAAA,WAAI,EAAC,IAAI,CAAC,UAAU,EAAE,YAAY,EAAE,kBAAkB,CAAC,CACxD,CAAC;QACF,OAAO,aAAa,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAChC,IAAA,eAAQ,EAAC,IAAA,WAAI,EAAC,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC,EAAE,IAAA,cAAO,EAAC,IAAI,CAAC,CAAC,CAC7D,CAAC;IACJ,CAAC;IAED,YAAY,CAAC,YAA0B;QACrC,OAAO,IAAA,WAAI,EAAC,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,EAAE,qBAAqB,CAAC,CAAC;IACtE,CAAC;IAED,YAAY,CAAC,YAA0B;QACrC,OAAO,IAAA,WAAI,EAAC,IAAI,CAAC,UAAU,EAAE,YAAY,EAAE,sBAAsB,CAAC,CAAC;IACrE,CAAC;IAED,YAAY,CAAC,YAA0B;QACrC,OAAO,IAAA,WAAI,EAAC,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;IAC7C,CAAC;IAED,WAAW,CAAC,YAA0B;QACpC,OAAO,IAAA,WAAI,EAAC,IAAI,CAAC,UAAU,EAAE,YAAY,EAAE,aAAa,CAAC,CAAC;IAC5D,CAAC;IAED,UAAU,CAAC,YAA0B,EAAE,MAAc;QACnD,OAAO,IAAA,WAAI,EAAC,IAAI,CAAC,UAAU,EAAE,YAAY,EAAE,MAAM,CAAC,CAAC;IACrD,CAAC;IAED,YAAY,CAAC,YAA0B,EAAE,MAAc;QACrD,OAAO,IAAA,WAAI,EAAC,IAAI,CAAC,UAAU,EAAE,YAAY,EAAE,MAAM,EAAE,eAAe,CAAC,CAAC;IACtE,CAAC;IAED,YAAY,CAAC,YAA0B,EAAE,MAAc;QACrD,OAAO,IAAA,WAAI,EAAC,IAAI,CAAC,UAAU,EAAE,YAAY,EAAE,MAAM,EAAE,eAAe,CAAC,CAAC;IACtE,CAAC;IAED,mBAAmB,CAAC,YAA0B,EAAE,MAAc;QAC5D,OAAO,IAAA,WAAI,EAAC,IAAI,CAAC,UAAU,EAAE,YAAY,EAAE,MAAM,EAAE,eAAe,CAAC,CAAC;IACtE,CAAC;IAED,uBAAuB,CAAC,MAAc;QACpC,OAAO,IAAA,WAAI,EAAC,IAAI,CAAC,UAAU,EAAE,2BAAY,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5F,CAAC;CACF;AA/CD,sBA+CC"}
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RevisionName = void 0;
4
+ var RevisionName;
5
+ (function (RevisionName) {
6
+ RevisionName["Base"] = "base";
7
+ RevisionName["Head"] = "head";
8
+ RevisionName["Diff"] = "diff";
9
+ })(RevisionName = exports.RevisionName || (exports.RevisionName = {}));
10
+ //# sourceMappingURL=RevisionName.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RevisionName.js","sourceRoot":"","sources":["../../../src/cmds/compare/RevisionName.ts"],"names":[],"mappings":";;;AAAA,IAAY,YAIX;AAJD,WAAY,YAAY;IACtB,6BAAa,CAAA;IACb,6BAAa,CAAA;IACb,6BAAa,CAAA;AACf,CAAC,EAJW,YAAY,GAAZ,oBAAY,KAAZ,oBAAY,QAIvB"}
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SequenceDiagramDigest = void 0;
4
+ const crypto_1 = require("crypto");
5
+ const loadSequenceDiagram_1 = require("./loadSequenceDiagram");
6
+ class SequenceDiagramDigest {
7
+ constructor(paths, revisionName, appmap) {
8
+ this.paths = paths;
9
+ this.revisionName = revisionName;
10
+ this.appmap = appmap;
11
+ }
12
+ async digest() {
13
+ const digest = (0, crypto_1.createHash)('sha256');
14
+ const diagram = await (0, loadSequenceDiagram_1.loadSequenceDiagram)(this.paths.sequenceDiagramPath(this.revisionName, this.appmap));
15
+ diagram.rootActions.forEach((action) => digest.update(action.subtreeDigest));
16
+ return digest.digest('hex');
17
+ }
18
+ }
19
+ exports.SequenceDiagramDigest = SequenceDiagramDigest;
20
+ //# sourceMappingURL=SequenceDiagramDigest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SequenceDiagramDigest.js","sourceRoot":"","sources":["../../../src/cmds/compare/SequenceDiagramDigest.ts"],"names":[],"mappings":";;;AAAA,mCAAoC;AAGpC,+DAA4D;AAE5D,MAAa,qBAAqB;IAChC,YAAmB,KAAY,EAAS,YAA0B,EAAS,MAAc;QAAtE,UAAK,GAAL,KAAK,CAAO;QAAS,iBAAY,GAAZ,YAAY,CAAc;QAAS,WAAM,GAAN,MAAM,CAAQ;IAAG,CAAC;IAE7F,KAAK,CAAC,MAAM;QACV,MAAM,MAAM,GAAG,IAAA,mBAAU,EAAC,QAAQ,CAAC,CAAC;QACpC,MAAM,OAAO,GAAG,MAAM,IAAA,yCAAmB,EACvC,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,CAC/D,CAAC;QACF,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC;QAC7E,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;CACF;AAXD,sDAWC"}
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ValidationError = void 0;
4
+ class ValidationError extends Error {
5
+ }
6
+ exports.ValidationError = ValidationError;
7
+ //# sourceMappingURL=ValidationError.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ValidationError.js","sourceRoot":"","sources":["../../../src/cmds/compare/ValidationError.ts"],"names":[],"mappings":";;;AAAA,MAAa,eAAgB,SAAQ,KAAK;CAAG;AAA7C,0CAA6C"}
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.checkout = void 0;
27
+ const executeCommand_1 = require("../../lib/executeCommand");
28
+ const UI = __importStar(require("./ui"));
29
+ async function checkout(revisionName, revision) {
30
+ console.log();
31
+ console.log(UI.actionStyle(`Switching to ${revisionName} revision: ${revision}`));
32
+ await (0, executeCommand_1.executeCommand)(`git checkout ${revision}`, true, true, true);
33
+ console.log();
34
+ }
35
+ exports.checkout = checkout;
36
+ //# sourceMappingURL=checkout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checkout.js","sourceRoot":"","sources":["../../../src/cmds/compare/checkout.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,6DAA0D;AAC1D,yCAA2B;AAEpB,KAAK,UAAU,QAAQ,CAAC,YAAoB,EAAE,QAAgB;IACnE,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,CAAC,gBAAgB,YAAY,cAAc,QAAQ,EAAE,CAAC,CAAC,CAAC;IAClF,MAAM,IAAA,+BAAc,EAAC,gBAAgB,QAAQ,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IACnE,OAAO,CAAC,GAAG,EAAE,CAAC;AAChB,CAAC;AALD,4BAKC"}
@@ -0,0 +1,121 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __importDefault = (this && this.__importDefault) || function (mod) {
26
+ return (mod && mod.__esModule) ? mod : { "default": mod };
27
+ };
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ exports.handler = exports.builder = exports.describe = exports.command = void 0;
30
+ const readline_1 = __importDefault(require("readline"));
31
+ const path_1 = require("path");
32
+ const promises_1 = require("fs/promises");
33
+ const handleWorkingDirectory_1 = require("../../lib/handleWorkingDirectory");
34
+ const detectRevisions_1 = __importDefault(require("./detectRevisions"));
35
+ const prepareOutputDir_1 = require("./prepareOutputDir");
36
+ const utils_1 = require("../../utils");
37
+ const loadAppMapConfig_1 = __importDefault(require("../../lib/loadAppMapConfig"));
38
+ const ChangeReporter_1 = __importStar(require("./ChangeReporter"));
39
+ exports.command = 'compare';
40
+ exports.describe = 'Compare runtime code behavior between base and head revisions';
41
+ const builder = (args) => {
42
+ args.option('directory', {
43
+ describe: 'program working directory',
44
+ type: 'string',
45
+ alias: 'd',
46
+ });
47
+ args.option('base-revision', {
48
+ describe: 'base revision name or commit SHA.',
49
+ alias: ['b', 'base'],
50
+ demandOption: true,
51
+ });
52
+ args.option('head-revision', {
53
+ describe: 'head revision name or commit SHA. By default, use the current commit.',
54
+ alias: ['h', 'head'],
55
+ });
56
+ args.option('output-dir', {
57
+ describe: 'directory in which to save the report files. Default is ./.appmap/change-report/<base-revision>-<head-revision>.',
58
+ });
59
+ args.option('clobber-output-dir', {
60
+ describe: 'remove the output directory if it exists',
61
+ type: 'boolean',
62
+ default: false,
63
+ });
64
+ args.option('source-dir', {
65
+ describe: 'root directory of the application source code',
66
+ type: 'string',
67
+ default: '.',
68
+ });
69
+ args.option('delete-unreferenced', {
70
+ describe: 'whether to delete AppMaps from base and head that are unreferenced by the change report',
71
+ default: true,
72
+ alias: 'delete-unchanged',
73
+ });
74
+ args.option('report-removed', {
75
+ describe: 'whether to report removed findings, such as removed API routes, resolved findings, etc',
76
+ default: true,
77
+ });
78
+ return args.strict();
79
+ };
80
+ exports.builder = builder;
81
+ const handler = async (argv) => {
82
+ (0, utils_1.verbose)(argv.verbose);
83
+ const rl = readline_1.default.createInterface({
84
+ input: process.stdin,
85
+ output: process.stdout,
86
+ });
87
+ const { directory, sourceDir: srcDir, baseRevision: baseRevisionArg, outputDir: outputDirArg, headRevision: headRevisionArg, deleteUnreferenced, reportRemoved, } = argv;
88
+ try {
89
+ (0, handleWorkingDirectory_1.handleWorkingDirectory)(directory);
90
+ const appmapConfig = await (0, loadAppMapConfig_1.default)();
91
+ if (!appmapConfig)
92
+ throw new Error(`Unable to load appmap.yml config file`);
93
+ let scannerConfig;
94
+ try {
95
+ scannerConfig = await (0, promises_1.readFile)((0, path_1.join)(srcDir, 'appmap-scanner.yml'), 'utf-8');
96
+ console.debug(`Using scanner configuration from appmap-scanner.yml`);
97
+ }
98
+ catch (e) {
99
+ console.debug(`Unable to load appmap-scanner.yml. Will use default scanner configuration.`);
100
+ }
101
+ const { baseRevision, headRevision } = await (0, detectRevisions_1.default)(baseRevisionArg, headRevisionArg);
102
+ const outputDir = await (0, prepareOutputDir_1.prepareOutputDir)(outputDirArg, baseRevision, headRevision, argv.clobberOutputDir, rl);
103
+ const changeReporter = new ChangeReporter_1.default(baseRevision, headRevision, outputDir, srcDir);
104
+ await changeReporter.initialize();
105
+ const options = new ChangeReporter_1.ChangeReportOptions();
106
+ options.reportRemoved = reportRemoved;
107
+ const report = await changeReporter.report(options);
108
+ if (deleteUnreferenced) {
109
+ await changeReporter.deleteUnreferencedAppMaps();
110
+ }
111
+ await (0, promises_1.writeFile)((0, path_1.join)(outputDir, 'change-report.json'), JSON.stringify(report, null, 2));
112
+ }
113
+ catch (e) {
114
+ throw e;
115
+ }
116
+ finally {
117
+ rl.close();
118
+ }
119
+ };
120
+ exports.handler = handler;
121
+ //# sourceMappingURL=compare.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compare.js","sourceRoot":"","sources":["../../../src/cmds/compare/compare.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const executeCommand_1 = require("../../lib/executeCommand");
4
+ const ui_1 = require("./ui");
5
+ const ValidationError_1 = require("./ValidationError");
6
+ async function detectRevisions(baseRevision, headArg) {
7
+ let headRevision = headArg;
8
+ if (!headRevision) {
9
+ let currentBranch = (await (0, executeCommand_1.executeCommand)(`git rev-parse HEAD`)).trim().split('\n')[0];
10
+ headRevision = currentBranch;
11
+ }
12
+ console.log((0, ui_1.prominentStyle)(`Current revision is: ${headRevision}`));
13
+ if (baseRevision === headRevision) {
14
+ throw new ValidationError_1.ValidationError(`Base and head revisions are the same: ${baseRevision}`);
15
+ }
16
+ return { baseRevision, headRevision };
17
+ }
18
+ exports.default = detectRevisions;
19
+ //# sourceMappingURL=detectRevisions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detectRevisions.js","sourceRoot":"","sources":["../../../src/cmds/compare/detectRevisions.ts"],"names":[],"mappings":";;AAAA,6DAA0D;AAC1D,6BAAsC;AACtC,uDAAoD;AAErC,KAAK,UAAU,eAAe,CAC3C,YAAoB,EACpB,OAAe;IAEf,IAAI,YAAY,GAAG,OAAO,CAAC;IAC3B,IAAI,CAAC,YAAY,EAAE;QACjB,IAAI,aAAa,GAAG,CAAC,MAAM,IAAA,+BAAc,EAAC,oBAAoB,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QAEvF,YAAY,GAAG,aAAa,CAAC;KAC9B;IAED,OAAO,CAAC,GAAG,CAAC,IAAA,mBAAc,EAAC,wBAAwB,YAAY,EAAE,CAAC,CAAC,CAAC;IAEpE,IAAI,YAAY,KAAK,YAAY,EAAE;QACjC,MAAM,IAAI,iCAAe,CAAC,yCAAyC,YAAY,EAAE,CAAC,CAAC;KACpF;IAED,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,CAAC;AACxC,CAAC;AAlBD,kCAkBC"}
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const assert_1 = __importDefault(require("assert"));
7
+ const semver_1 = require("semver");
8
+ const executeCommand_1 = require("../../lib/executeCommand");
9
+ const promises_1 = require("fs/promises");
10
+ const utils_1 = require("../../utils");
11
+ async function loadFindings(paths, revisionName, appMapDir) {
12
+ const manifest = JSON.parse(await (0, promises_1.readFile)(paths.manifestPath(revisionName), 'utf-8'));
13
+ const findings = new Array();
14
+ const collectFindings = (findings) => {
15
+ return async (findingsFile) => {
16
+ const findingsData = JSON.parse(await (0, promises_1.readFile)(findingsFile, 'utf-8'));
17
+ findings.push(...findingsData.findings);
18
+ };
19
+ };
20
+ let archiveVersion = manifest.versions.archive;
21
+ (0, assert_1.default)(archiveVersion);
22
+ if (archiveVersion.split('.').length === 2)
23
+ archiveVersion += '.0';
24
+ if (new semver_1.SemVer(archiveVersion).compare('1.3.0') < 0) {
25
+ const workingDir = paths.revisionPath(revisionName);
26
+ console.info(`Scanning ${revisionName} revision for findings (archive version: ${archiveVersion}).`);
27
+ let command = `npx @appland/scanner@latest scan -d ${workingDir} --all`;
28
+ await (0, executeCommand_1.executeCommand)(command);
29
+ // Pre-1.3.0 archive. Scan and load findings the old way.
30
+ const scanResults = JSON.parse(await (0, promises_1.readFile)(paths.findingsPath(revisionName), 'utf-8'));
31
+ findings.push(...(scanResults.findings || []));
32
+ }
33
+ else {
34
+ await (0, utils_1.processNamedFiles)(paths.revisionPath(revisionName), 'appmap-findings.json', collectFindings(findings));
35
+ }
36
+ console.info(`Found ${findings.length} findings for ${revisionName} revision`);
37
+ for (const finding of findings) {
38
+ if (finding.appMapFile.startsWith(appMapDir)) {
39
+ finding.appMapFile = finding.appMapFile.slice(appMapDir.length + 1);
40
+ }
41
+ }
42
+ return findings;
43
+ }
44
+ exports.default = loadFindings;
45
+ //# sourceMappingURL=loadFindings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loadFindings.js","sourceRoot":"","sources":["../../../src/cmds/compare/loadFindings.ts"],"names":[],"mappings":";;;;;AAAA,oDAA4B;AAK5B,mCAAgC;AAChC,6DAA0D;AAC1D,0CAAuC;AACvC,uCAAgD;AAEjC,KAAK,UAAU,YAAY,CACxC,KAAY,EACZ,YAA0B,EAC1B,SAAiB;IAEjB,MAAM,QAAQ,GAAoB,IAAI,CAAC,KAAK,CAC1C,MAAM,IAAA,mBAAQ,EAAC,KAAK,CAAC,YAAY,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC,CAC1D,CAAC;IAEF,MAAM,QAAQ,GAAG,IAAI,KAAK,EAAW,CAAC;IAEtC,MAAM,eAAe,GAAG,CAAC,QAAmB,EAA6C,EAAE;QACzF,OAAO,KAAK,EAAE,YAAoB,EAAE,EAAE;YACpC,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,IAAA,mBAAQ,EAAC,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC;YACvE,QAAQ,CAAC,IAAI,CAAC,GAAI,YAAY,CAAC,QAAsB,CAAC,CAAC;QACzD,CAAC,CAAC;IACJ,CAAC,CAAC;IAEF,IAAI,cAAc,GAAG,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC;IAC/C,IAAA,gBAAM,EAAC,cAAc,CAAC,CAAC;IACvB,IAAI,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,KAAK,CAAC;QAAE,cAAc,IAAI,IAAI,CAAC;IACnE,IAAI,IAAI,eAAM,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;QACnD,MAAM,UAAU,GAAG,KAAK,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC;QACpD,OAAO,CAAC,IAAI,CACV,YAAY,YAAY,4CAA4C,cAAc,IAAI,CACvF,CAAC;QACF,IAAI,OAAO,GAAG,uCAAuC,UAAU,QAAQ,CAAC;QACxE,MAAM,IAAA,+BAAc,EAAC,OAAO,CAAC,CAAC;QAE9B,yDAAyD;QACzD,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,IAAA,mBAAQ,EAAC,KAAK,CAAC,YAAY,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;QAC1F,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,CAAC;KAChD;SAAM;QACL,MAAM,IAAA,yBAAiB,EACrB,KAAK,CAAC,YAAY,CAAC,YAAY,CAAC,EAChC,sBAAsB,EACtB,eAAe,CAAC,QAAQ,CAAC,CAC1B,CAAC;KACH;IAED,OAAO,CAAC,IAAI,CAAC,SAAS,QAAQ,CAAC,MAAM,iBAAiB,YAAY,WAAW,CAAC,CAAC;IAE/E,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE;QAC9B,IAAI,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE;YAC5C,OAAO,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;SACrE;KACF;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAhDD,+BAgDC"}
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.loadSequenceDiagram = void 0;
4
+ const promises_1 = require("fs/promises");
5
+ const sequence_diagram_1 = require("@appland/sequence-diagram");
6
+ async function loadSequenceDiagram(path) {
7
+ const diagramData = JSON.parse(await (0, promises_1.readFile)(path, 'utf-8'));
8
+ return (0, sequence_diagram_1.unparseDiagram)(diagramData);
9
+ }
10
+ exports.loadSequenceDiagram = loadSequenceDiagram;
11
+ //# sourceMappingURL=loadSequenceDiagram.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loadSequenceDiagram.js","sourceRoot":"","sources":["../../../src/cmds/compare/loadSequenceDiagram.ts"],"names":[],"mappings":";;;AAAA,0CAAuC;AACvC,gEAAuF;AAEhF,KAAK,UAAU,mBAAmB,CAAC,IAAY;IACpD,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,IAAA,mBAAQ,EAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;IAC9D,OAAO,IAAA,iCAAc,EAAC,WAAW,CAAC,CAAC;AACrC,CAAC;AAHD,kDAGC"}
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ function mapToRecord(map) {
4
+ return [...map.entries()].reduce((memo, entry) => {
5
+ const [key, value] = entry;
6
+ memo[key] = value;
7
+ return memo;
8
+ }, {});
9
+ }
10
+ exports.default = mapToRecord;
11
+ //# sourceMappingURL=mapToRecord.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mapToRecord.js","sourceRoot":"","sources":["../../../src/cmds/compare/mapToRecord.ts"],"names":[],"mappings":";;AAAA,SAAwB,WAAW,CACjC,GAA2B;IAE3B,OAAO,CAAC,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;QAC/C,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,KAAK,CAAC;QAC3B,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QAClB,OAAO,IAAI,CAAC;IACd,CAAC,EAAE,EAAE,CAAC,CAAC;AACT,CAAC;AARD,8BAQC"}
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.prepareOutputDir = void 0;
4
+ const promises_1 = require("fs/promises");
5
+ const path_1 = require("path");
6
+ const utils_1 = require("../../utils");
7
+ const RevisionName_1 = require("./RevisionName");
8
+ const ui_1 = require("./ui");
9
+ const ValidationError_1 = require("./ValidationError");
10
+ async function prepareOutputDir(outputDirArg, baseRevision, headRevision, clobberOutputDir, rl) {
11
+ let outputDir = outputDirArg;
12
+ if (!outputDir) {
13
+ outputDir = `.appmap/change-report/${(0, ui_1.sanitizeRevision)(baseRevision)}-${(0, ui_1.sanitizeRevision)(headRevision)}`;
14
+ }
15
+ for (const revision of [RevisionName_1.RevisionName.Base, RevisionName_1.RevisionName.Head]) {
16
+ if (!(await (0, utils_1.exists)((0, path_1.join)(outputDir, revision))))
17
+ throw new ValidationError_1.ValidationError(`${revision} revision data (${(0, path_1.join)(outputDir, revision)}) does not exist`);
18
+ }
19
+ const diffDir = (0, path_1.join)(outputDir, RevisionName_1.RevisionName.Diff);
20
+ if (await (0, utils_1.exists)(diffDir)) {
21
+ if (!clobberOutputDir &&
22
+ process.stdout.isTTY &&
23
+ !(await (0, ui_1.confirm)(`Delete existing 'diff' in ${diffDir}?`, rl))) {
24
+ throw new ValidationError_1.ValidationError(`The 'diff' data directory ${diffDir} exists and you chose not to delete it`);
25
+ }
26
+ await (0, promises_1.rm)(diffDir, { recursive: true, force: true });
27
+ // Rapid rm and then mkdir will silently fail in practice.
28
+ await new Promise((resolve) => setTimeout(resolve, 100));
29
+ }
30
+ await (0, promises_1.mkdir)((0, path_1.join)(outputDir, RevisionName_1.RevisionName.Diff), { recursive: true });
31
+ return outputDir;
32
+ }
33
+ exports.prepareOutputDir = prepareOutputDir;
34
+ //# sourceMappingURL=prepareOutputDir.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prepareOutputDir.js","sourceRoot":"","sources":["../../../src/cmds/compare/prepareOutputDir.ts"],"names":[],"mappings":";;;AAAA,0CAAwC;AACxC,+BAA4B;AAE5B,uCAAqC;AACrC,iDAA8C;AAC9C,6BAAiD;AACjD,uDAAoD;AAE7C,KAAK,UAAU,gBAAgB,CACpC,YAAiB,EACjB,YAAoB,EACpB,YAAoB,EACpB,gBAAyB,EACzB,EAAsB;IAEtB,IAAI,SAAS,GAAG,YAAY,CAAC;IAC7B,IAAI,CAAC,SAAS,EAAE;QACd,SAAS,GAAG,yBAAyB,IAAA,qBAAgB,EAAC,YAAY,CAAC,IAAI,IAAA,qBAAgB,EACrF,YAAY,CACb,EAAE,CAAC;KACL;IAED,KAAK,MAAM,QAAQ,IAAI,CAAC,2BAAY,CAAC,IAAI,EAAE,2BAAY,CAAC,IAAI,CAAC,EAAE;QAC7D,IAAI,CAAC,CAAC,MAAM,IAAA,cAAM,EAAC,IAAA,WAAI,EAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC;YAC5C,MAAM,IAAI,iCAAe,CACvB,GAAG,QAAQ,mBAAmB,IAAA,WAAI,EAAC,SAAS,EAAE,QAAQ,CAAC,kBAAkB,CAC1E,CAAC;KACL;IAED,MAAM,OAAO,GAAG,IAAA,WAAI,EAAC,SAAS,EAAE,2BAAY,CAAC,IAAI,CAAC,CAAC;IACnD,IAAI,MAAM,IAAA,cAAM,EAAC,OAAO,CAAC,EAAE;QACzB,IACE,CAAC,gBAAgB;YACjB,OAAO,CAAC,MAAM,CAAC,KAAK;YACpB,CAAC,CAAC,MAAM,IAAA,YAAO,EAAC,6BAA6B,OAAO,GAAG,EAAE,EAAE,CAAC,CAAC,EAC7D;YACA,MAAM,IAAI,iCAAe,CACvB,6BAA6B,OAAO,wCAAwC,CAC7E,CAAC;SACH;QACD,MAAM,IAAA,aAAE,EAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACpD,0DAA0D;QAC1D,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;KAChE;IAED,MAAM,IAAA,gBAAK,EAAC,IAAA,WAAI,EAAC,SAAS,EAAE,2BAAY,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAErE,OAAO,SAAS,CAAC;AACnB,CAAC;AAxCD,4CAwCC"}
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.sanitizeRevision = exports.mutedStyle = exports.prominentStyle = exports.actionStyle = exports.confirm = exports.ask = void 0;
7
+ const chalk_1 = __importDefault(require("chalk"));
8
+ async function ask(rl, q) {
9
+ return new Promise((resolve) => {
10
+ rl.question(q, resolve);
11
+ });
12
+ }
13
+ exports.ask = ask;
14
+ async function confirm(prompt, rl) {
15
+ let response = '';
16
+ while (!['y', 'n'].includes(response)) {
17
+ response = await ask(rl, `${prompt} (y/n) `);
18
+ }
19
+ return response === 'y';
20
+ }
21
+ exports.confirm = confirm;
22
+ function actionStyle(message) {
23
+ return chalk_1.default.bold(chalk_1.default.green(message));
24
+ }
25
+ exports.actionStyle = actionStyle;
26
+ function prominentStyle(message) {
27
+ return chalk_1.default.bold(message);
28
+ }
29
+ exports.prominentStyle = prominentStyle;
30
+ function mutedStyle(message) {
31
+ return chalk_1.default.dim(message);
32
+ }
33
+ exports.mutedStyle = mutedStyle;
34
+ function sanitizeRevision(revision) {
35
+ return revision.replace(/[^a-zA-Z0-9_]/g, '_');
36
+ }
37
+ exports.sanitizeRevision = sanitizeRevision;
38
+ //# sourceMappingURL=ui.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui.js","sourceRoot":"","sources":["../../../src/cmds/compare/ui.ts"],"names":[],"mappings":";;;;;;AAAA,kDAA0B;AAGnB,KAAK,UAAU,GAAG,CAAC,EAAsB,EAAE,CAAS;IACzD,OAAO,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,EAAE;QACrC,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;AACL,CAAC;AAJD,kBAIC;AAEM,KAAK,UAAU,OAAO,CAAC,MAAc,EAAE,EAAsB;IAClE,IAAI,QAAQ,GAAG,EAAE,CAAC;IAClB,OAAO,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE;QACrC,QAAQ,GAAG,MAAM,GAAG,CAAC,EAAE,EAAE,GAAG,MAAM,SAAS,CAAC,CAAC;KAC9C;IACD,OAAO,QAAQ,KAAK,GAAG,CAAC;AAC1B,CAAC;AAND,0BAMC;AAED,SAAgB,WAAW,CAAC,OAAe;IACzC,OAAO,eAAK,CAAC,IAAI,CAAC,eAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;AAC1C,CAAC;AAFD,kCAEC;AAED,SAAgB,cAAc,CAAC,OAAe;IAC5C,OAAO,eAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAC7B,CAAC;AAFD,wCAEC;AAED,SAAgB,UAAU,CAAC,OAAe;IACxC,OAAO,eAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AAC5B,CAAC;AAFD,gCAEC;AAED,SAAgB,gBAAgB,CAAC,QAAgB;IAC/C,OAAO,QAAQ,CAAC,OAAO,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAC;AACjD,CAAC;AAFD,4CAEC"}