@appland/appmap 3.68.1 → 3.70.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 (30) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/built/cmds/open/openers.js +3 -3
  3. package/built/cmds/open/openers.js.map +1 -1
  4. package/built/cmds/open/showAppMap.js +1 -8
  5. package/built/cmds/open/showAppMap.js.map +1 -1
  6. package/built/cmds/sequenceDiagram/browserRenderer.js +42 -0
  7. package/built/cmds/sequenceDiagram/browserRenderer.js.map +1 -0
  8. package/built/cmds/sequenceDiagram.js +57 -18
  9. package/built/cmds/sequenceDiagram.js.map +1 -1
  10. package/built/cmds/stats/directory/statsForDirectory.js +261 -0
  11. package/built/cmds/stats/directory/statsForDirectory.js.map +1 -0
  12. package/built/cmds/stats/directory/statsForMap.js +121 -0
  13. package/built/cmds/stats/directory/statsForMap.js.map +1 -0
  14. package/built/cmds/stats/stats.js +69 -247
  15. package/built/cmds/stats/stats.js.map +1 -1
  16. package/built/html/{page.css → appmap.css} +1 -1
  17. package/built/html/appmap.html +1 -1
  18. package/built/html/appmap.js +357 -0
  19. package/built/html/appmap.js.map +7 -0
  20. package/built/html/sequenceDiagram.css +2 -0
  21. package/built/html/sequenceDiagram.css.map +7 -0
  22. package/built/html/sequenceDiagram.html +1 -0
  23. package/built/html/{page.js → sequenceDiagram.js} +49 -49
  24. package/built/html/{page.js.map → sequenceDiagram.js.map} +4 -4
  25. package/built/lib/serveAndOpen.js +124 -0
  26. package/built/lib/serveAndOpen.js.map +1 -0
  27. package/package.json +9 -6
  28. package/built/cmds/open/serveAndOpenAppMap.js +0 -91
  29. package/built/cmds/open/serveAndOpenAppMap.js.map +0 -1
  30. /package/built/html/{page.css.map → appmap.css.map} +0 -0
package/CHANGELOG.md CHANGED
@@ -1,3 +1,23 @@
1
+ # [@appland/appmap-v3.70.0](https://github.com/getappmap/appmap-js/compare/@appland/appmap-v3.69.0...@appland/appmap-v3.70.0) (2023-03-20)
2
+
3
+
4
+ ### Features
5
+
6
+ * add --appmap-dir option ([778b31f](https://github.com/getappmap/appmap-js/commit/778b31f4b03488f17cdefb972d684462357728ba))
7
+ * stats for a single appmap ([34a4b67](https://github.com/getappmap/appmap-js/commit/34a4b672452755c356877e4ecae8f04d0f9e1994))
8
+
9
+ # [@appland/appmap-v3.69.0](https://github.com/getappmap/appmap-js/compare/@appland/appmap-v3.68.1...@appland/appmap-v3.69.0) (2023-03-20)
10
+
11
+
12
+ ### Features
13
+
14
+ * Specify puppeteer as an optional dependency ([ad49f57](https://github.com/getappmap/appmap-js/commit/ad49f57ca442eef9cbb379a1ac049746f4201ff8))
15
+
16
+
17
+ ### Reverts
18
+
19
+ * Revert "Revert "Merge pull request #1076 from getappmap/feat/sequence-diagram-png-format"" ([5164b7e](https://github.com/getappmap/appmap-js/commit/5164b7e92966e402ca441d1580a0dd44a953bed3)), closes [#1076](https://github.com/getappmap/appmap-js/issues/1076)
20
+
1
21
  # [@appland/appmap-v3.68.1](https://github.com/getappmap/appmap-js/compare/@appland/appmap-v3.68.0...@appland/appmap-v3.68.1) (2023-03-16)
2
22
 
3
23
 
@@ -4,7 +4,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.openInTool = exports.openInVSCode = exports.vscodeURL = exports.openInBrowser = exports.abspath = void 0;
7
- const serveAndOpenAppMap_1 = __importDefault(require("./serveAndOpenAppMap"));
7
+ const serveAndOpen_1 = require("../../lib/serveAndOpen");
8
8
  const supports_hyperlinks_1 = __importDefault(require("supports-hyperlinks"));
9
9
  const path_1 = require("path");
10
10
  // See also: https://github.com/getappmap/scanner/pull/9/files#diff-3294a832ea2276e554177e0b3007cc2d401c082912c7fbde49fa09141bf1aed1R1
@@ -21,8 +21,8 @@ function abspath(file) {
21
21
  return (0, path_1.resolve)(process.cwd(), file);
22
22
  }
23
23
  exports.abspath = abspath;
24
- async function openInBrowser(appMapFile) {
25
- await (0, serveAndOpenAppMap_1.default)(appMapFile);
24
+ async function openInBrowser(appMapFile, verifyInSubdir) {
25
+ await (0, serveAndOpen_1.serveAndOpenAppMap)(appMapFile, verifyInSubdir);
26
26
  }
27
27
  exports.openInBrowser = openInBrowser;
28
28
  function vscodeURL(appMapFile) {
@@ -1 +1 @@
1
- {"version":3,"file":"openers.js","sourceRoot":"","sources":["../../../src/cmds/open/openers.ts"],"names":[],"mappings":";;;;;;AAAA,8EAAsD;AACtD,8EAAqD;AACrD,+BAAqC;AAErC,sIAAsI;AACtI,SAAS,SAAS,CAAC,QAAgB,EAAE,IAAY;IAC/C,MAAM,GAAG,GAAG,SAAS,CAAC;IACtB,MAAM,GAAG,GAAG,QAAQ,CAAC;IACrB,MAAM,GAAG,GAAG,GAAG,CAAC;IAEhB,IAAI,CAAC,6BAAkB,CAAC,MAAM,EAAE;QAC9B,OAAO,QAAQ,CAAC;KACjB;IAED,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACrF,CAAC;AAED,SAAgB,OAAO,CAAC,IAAY;IAClC,OAAO,IAAA,cAAO,EAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC;AACtC,CAAC;AAFD,0BAEC;AAEM,KAAK,UAAU,aAAa,CAAC,UAAkB;IACpD,MAAM,IAAA,4BAAkB,EAAC,UAAU,CAAC,CAAC;AACvC,CAAC;AAFD,sCAEC;AAED,SAAgB,SAAS,CAAC,UAAkB;IAC1C,OAAO,IAAA,WAAI,EAAC,gBAAgB,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;AACrD,CAAC;AAFD,8BAEC;AAEM,KAAK,UAAU,YAAY,CAAC,UAAkB;IACnD,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,UAAU,EAAE,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;AAC5D,CAAC;AAFD,oCAEC;AAEM,KAAK,UAAU,UAAU,CAAC,UAAkB,EAAE,MAAe;IAClE,MAAM,IAAI,GAAG,GAAG,MAAM,gBAAgB,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;IAC5D,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,CAAC;AAC3C,CAAC;AAHD,gCAGC"}
1
+ {"version":3,"file":"openers.js","sourceRoot":"","sources":["../../../src/cmds/open/openers.ts"],"names":[],"mappings":";;;;;;AAAA,yDAA4D;AAC5D,8EAAqD;AACrD,+BAAqC;AAErC,sIAAsI;AACtI,SAAS,SAAS,CAAC,QAAgB,EAAE,IAAY;IAC/C,MAAM,GAAG,GAAG,SAAS,CAAC;IACtB,MAAM,GAAG,GAAG,QAAQ,CAAC;IACrB,MAAM,GAAG,GAAG,GAAG,CAAC;IAEhB,IAAI,CAAC,6BAAkB,CAAC,MAAM,EAAE;QAC9B,OAAO,QAAQ,CAAC;KACjB;IAED,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACrF,CAAC;AAED,SAAgB,OAAO,CAAC,IAAY;IAClC,OAAO,IAAA,cAAO,EAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC;AACtC,CAAC;AAFD,0BAEC;AAEM,KAAK,UAAU,aAAa,CAAC,UAAkB,EAAE,cAAuB;IAC7E,MAAM,IAAA,iCAAkB,EAAC,UAAU,EAAE,cAAc,CAAC,CAAC;AACvD,CAAC;AAFD,sCAEC;AAED,SAAgB,SAAS,CAAC,UAAkB;IAC1C,OAAO,IAAA,WAAI,EAAC,gBAAgB,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;AACrD,CAAC;AAFD,8BAEC;AAEM,KAAK,UAAU,YAAY,CAAC,UAAkB;IACnD,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,UAAU,EAAE,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;AAC5D,CAAC;AAFD,oCAEC;AAEM,KAAK,UAAU,UAAU,CAAC,UAAkB,EAAE,MAAe;IAClE,MAAM,IAAI,GAAG,GAAG,MAAM,gBAAgB,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;IAC5D,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,CAAC;AAC3C,CAAC;AAHD,gCAGC"}
@@ -6,20 +6,13 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const child_process_1 = require("child_process");
7
7
  const userInteraction_1 = __importDefault(require("../userInteraction"));
8
8
  const openers_1 = require("./openers");
9
- const Openers = [
10
- { name: 'Browser tab', fn: openers_1.openInBrowser },
11
- { name: 'VS Code', fn: openers_1.openInVSCode },
12
- { name: 'IntelliJ', toolId: 'idea', fn: openers_1.openInTool },
13
- { name: 'PyCharm', toolId: 'pycharm', fn: openers_1.openInTool },
14
- { name: 'RubyMine', toolId: 'x-mine', fn: openers_1.openInTool },
15
- ];
16
9
  async function showAppMap(appMapFile) {
17
10
  const termProgram = process.env.TERM_PROGRAM;
18
11
  if (process.platform === 'darwin' && termProgram === 'vscode') {
19
12
  (0, child_process_1.spawn)('code', [(0, openers_1.abspath)(appMapFile)]);
20
13
  }
21
14
  else {
22
- await (0, openers_1.openInBrowser)(appMapFile);
15
+ await (0, openers_1.openInBrowser)(appMapFile, false);
23
16
  }
24
17
  const { action } = await userInteraction_1.default.prompt({
25
18
  type: 'list',
@@ -1 +1 @@
1
- {"version":3,"file":"showAppMap.js","sourceRoot":"","sources":["../../../src/cmds/open/showAppMap.ts"],"names":[],"mappings":";;;;;AAAA,iDAAsC;AACtC,yEAAoC;AACpC,uCAA6E;AAQ7E,MAAM,OAAO,GAAa;IACxB,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE,EAAE,uBAAa,EAAE;IAC1C,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,sBAAY,EAAE;IACrC,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,oBAAU,EAAE;IACpD,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE,oBAAU,EAAE;IACtD,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE,oBAAU,EAAE;CACvD,CAAC;AAEa,KAAK,UAAU,UAAU,CAAC,UAAkB;IACzD,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;IAC7C,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ,IAAI,WAAW,KAAK,QAAQ,EAAE;QAC7D,IAAA,qBAAK,EAAC,MAAM,EAAE,CAAC,IAAA,iBAAO,EAAC,UAAU,CAAC,CAAC,CAAC,CAAC;KACtC;SAAM;QACL,MAAM,IAAA,uBAAa,EAAC,UAAU,CAAC,CAAC;KACjC;IAED,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,yBAAE,CAAC,MAAM,CAAC;QACjC,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,iCAAiC;QAC1C,OAAO,EAAE,CAAC,UAAU,UAAU,EAAE,EAAE,MAAM,CAAC;KAC1C,CAAC,CAAC;IACH,IAAI,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE;QAC/B,MAAM,UAAU,CAAC,UAAU,CAAC,CAAC;KAC9B;AACH,CAAC;AAjBD,6BAiBC"}
1
+ {"version":3,"file":"showAppMap.js","sourceRoot":"","sources":["../../../src/cmds/open/showAppMap.ts"],"names":[],"mappings":";;;;;AAAA,iDAAsC;AACtC,yEAAoC;AACpC,uCAA6E;AAE9D,KAAK,UAAU,UAAU,CAAC,UAAkB;IACzD,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;IAC7C,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ,IAAI,WAAW,KAAK,QAAQ,EAAE;QAC7D,IAAA,qBAAK,EAAC,MAAM,EAAE,CAAC,IAAA,iBAAO,EAAC,UAAU,CAAC,CAAC,CAAC,CAAC;KACtC;SAAM;QACL,MAAM,IAAA,uBAAa,EAAC,UAAU,EAAE,KAAK,CAAC,CAAC;KACxC;IAED,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,yBAAE,CAAC,MAAM,CAAC;QACjC,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,iCAAiC;QAC1C,OAAO,EAAE,CAAC,UAAU,UAAU,EAAE,EAAE,MAAM,CAAC;KAC1C,CAAC,CAAC;IACH,IAAI,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE;QAC/B,MAAM,UAAU,CAAC,UAAU,CAAC,CAAC;KAC9B;AACH,CAAC;AAjBD,6BAiBC"}
@@ -0,0 +1,42 @@
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 utils_1 = require("../../utils");
8
+ class BrowserRenderer {
9
+ constructor(showBrowser = false) {
10
+ this.showBrowser = showBrowser;
11
+ this.showBrowser = showBrowser;
12
+ this._browser = undefined;
13
+ }
14
+ async screenshot(url, outputPath) {
15
+ await this.initialize();
16
+ (0, assert_1.default)(this._browser);
17
+ const page = await this._browser.newPage();
18
+ if ((0, utils_1.verbose)())
19
+ page.on('console', (msg) => console.log('CONSOLE: ', msg.text()));
20
+ if ((0, utils_1.verbose)())
21
+ console.warn(`Rendering ${url} to ${outputPath}`);
22
+ await page.goto(url);
23
+ await page.waitForSelector('.sequence-diagram');
24
+ await page.screenshot({ path: outputPath, fullPage: true });
25
+ }
26
+ async close() {
27
+ if (this._browser) {
28
+ await this._browser.close();
29
+ this._browser = undefined;
30
+ }
31
+ }
32
+ async initialize() {
33
+ if (this._browser)
34
+ return this._browser;
35
+ const puppeteer = require('puppeteer');
36
+ if ((0, utils_1.verbose)())
37
+ console.warn(`Preparing browser for PNG rendering`);
38
+ this._browser = await puppeteer.launch({ timeout: 120 * 1000, headless: !this.showBrowser });
39
+ }
40
+ }
41
+ exports.default = BrowserRenderer;
42
+ //# sourceMappingURL=browserRenderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browserRenderer.js","sourceRoot":"","sources":["../../../src/cmds/sequenceDiagram/browserRenderer.ts"],"names":[],"mappings":";;;;;AAAA,oDAA4B;AAC5B,uCAAsC;AAetC,MAAqB,eAAe;IAGlC,YAAmB,cAAc,KAAK;QAAnB,gBAAW,GAAX,WAAW,CAAQ;QACpC,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC;IAC5B,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,GAAW,EAAE,UAAkB;QAC9C,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QACxB,IAAA,gBAAM,EAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAEtB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;QAC3C,IAAI,IAAA,eAAO,GAAE;YAAE,IAAI,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAEjF,IAAI,IAAA,eAAO,GAAE;YAAE,OAAO,CAAC,IAAI,CAAC,aAAa,GAAG,OAAO,UAAU,EAAE,CAAC,CAAC;QAEjE,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACrB,MAAM,IAAI,CAAC,eAAe,CAAC,mBAAmB,CAAC,CAAC;QAChD,MAAM,IAAI,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9D,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,IAAI,CAAC,QAAQ,EAAE;YACjB,MAAM,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;YAC5B,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC;SAC3B;IACH,CAAC;IAEO,KAAK,CAAC,UAAU;QACtB,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO,IAAI,CAAC,QAAQ,CAAC;QAExC,MAAM,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;QAEvC,IAAI,IAAA,eAAO,GAAE;YAAE,OAAO,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;QACnE,IAAI,CAAC,QAAQ,GAAG,MAAM,SAAS,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,GAAG,IAAI,EAAE,QAAQ,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;IAC/F,CAAC;CACF;AArCD,kCAqCC"}
@@ -1,4 +1,7 @@
1
1
  "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
2
5
  Object.defineProperty(exports, "__esModule", { value: true });
3
6
  exports.handler = exports.builder = exports.describe = exports.command = void 0;
4
7
  const promises_1 = require("fs/promises");
@@ -7,6 +10,9 @@ const handleWorkingDirectory_1 = require("../lib/handleWorkingDirectory");
7
10
  const utils_1 = require("../utils");
8
11
  const models_1 = require("@appland/models");
9
12
  const sequence_diagram_1 = require("@appland/sequence-diagram");
13
+ const serveAndOpen_1 = require("../lib/serveAndOpen");
14
+ const assert_1 = __importDefault(require("assert"));
15
+ const browserRenderer_1 = __importDefault(require("./sequenceDiagram/browserRenderer"));
10
16
  exports.command = 'sequence-diagram <appmap...>';
11
17
  exports.describe = 'Generate a sequence diagram for an AppMap';
12
18
  const builder = (args) => {
@@ -22,6 +28,11 @@ const builder = (args) => {
22
28
  args.option('output-dir', {
23
29
  describe: 'directory in which to save the sequence diagrams',
24
30
  });
31
+ args.option('show-browser', {
32
+ describe: 'when using a browser to render the diagram, show the browser window',
33
+ type: 'boolean',
34
+ default: false,
35
+ });
25
36
  args.option('loops', {
26
37
  describe: 'identify loops and collect under a Loop object',
27
38
  type: 'boolean',
@@ -30,8 +41,8 @@ const builder = (args) => {
30
41
  args.option('format', {
31
42
  describe: 'output format',
32
43
  alias: 'f',
33
- choices: ['plantuml', 'json'],
34
- default: 'plantuml',
44
+ choices: ['png', 'plantuml', 'json'],
45
+ default: 'png',
35
46
  });
36
47
  args.option('exclude', {
37
48
  describe: 'code objects to exclude from the diagram',
@@ -47,11 +58,15 @@ const handler = async (argv) => {
47
58
  process.exitCode = 1;
48
59
  return;
49
60
  }
50
- if (!sequence_diagram_1.Formatters.includes(argv.format)) {
61
+ if (argv.format !== 'png' && !sequence_diagram_1.Formatters.includes(argv.format)) {
51
62
  console.log(`Invalid format: ${argv.format}`);
52
63
  process.exitCode = 1;
53
64
  return;
54
65
  }
66
+ let browserRender;
67
+ if (argv.format === 'png') {
68
+ browserRender = new browserRenderer_1.default(argv.showBrowser);
69
+ }
55
70
  const generateDiagram = async (appmapFileName) => {
56
71
  const appmapData = JSON.parse(await (0, promises_1.readFile)(appmapFileName, 'utf-8'));
57
72
  const appmap = (0, models_1.buildAppMap)().source(appmapData).build();
@@ -60,28 +75,52 @@ const handler = async (argv) => {
60
75
  };
61
76
  if (argv.exclude)
62
77
  specOptions.exclude = Array.isArray(argv.exclude) ? argv.exclude : [argv.exclude];
63
- const specification = sequence_diagram_1.Specification.build(appmap, specOptions);
64
- const diagram = (0, sequence_diagram_1.buildDiagram)(appmapFileName, appmap, specification);
65
- const template = (0, sequence_diagram_1.format)(argv.format, diagram, appmapFileName);
66
78
  if (argv.outputDir)
67
79
  await (0, promises_1.mkdir)(argv.outputDir, { recursive: true });
68
- const outputFileName = [
69
- (0, path_1.basename)(appmapFileName, '.appmap.json'),
70
- '.sequence',
71
- template.extension,
72
- ].join('');
73
- let outputPath;
74
- if (argv.outputDir)
75
- outputPath = (0, path_1.join)(argv.outputDir, outputFileName);
76
- else
77
- outputPath = (0, path_1.join)((0, path_1.dirname)(appmapFileName), outputFileName);
78
- await (0, promises_1.writeFile)(outputPath, template.diagram);
79
- console.log(`Printed diagram ${outputPath}`);
80
+ const specification = sequence_diagram_1.Specification.build(appmap, specOptions);
81
+ const diagram = (0, sequence_diagram_1.buildDiagram)(appmapFileName, appmap, specification);
82
+ const printDiagram = async (format) => {
83
+ const template = (0, sequence_diagram_1.format)(format, diagram, appmapFileName);
84
+ const outputFileName = [
85
+ (0, path_1.basename)(appmapFileName, '.appmap.json'),
86
+ '.sequence',
87
+ template.extension,
88
+ ].join('');
89
+ let resultPath;
90
+ if (argv.outputDir)
91
+ resultPath = (0, path_1.join)(argv.outputDir, outputFileName);
92
+ else
93
+ resultPath = (0, path_1.join)((0, path_1.dirname)(appmapFileName), outputFileName);
94
+ await (0, promises_1.writeFile)(resultPath, template.diagram);
95
+ return resultPath;
96
+ };
97
+ if (argv.format === 'png') {
98
+ // PNG rendering is performed by loading the sequence
99
+ // diagram in a browser and taking a screenshot.
100
+ const diagramPath = await printDiagram(sequence_diagram_1.FormatType.JSON);
101
+ const outputPath = await new Promise((resolve) => (0, serveAndOpen_1.serveAndOpenSequenceDiagram)(diagramPath, false, async (url) => {
102
+ if ((0, utils_1.verbose)())
103
+ console.warn(`Rendering PNG`);
104
+ (0, assert_1.default)(browserRender, 'Browser not initialized');
105
+ const outputPath = (0, path_1.join)((0, path_1.dirname)(diagramPath), [(0, path_1.basename)(diagramPath, '.json'), '.png'].join(''));
106
+ await browserRender.screenshot(url, outputPath);
107
+ resolve(outputPath);
108
+ }));
109
+ console.warn(`Printed diagram ${outputPath}`);
110
+ }
111
+ else {
112
+ // Other forms of output are produced directly by the
113
+ // sequence diagram library.
114
+ const outputPath = await printDiagram(argv.format);
115
+ console.log(`Printed diagram ${outputPath}`);
116
+ }
80
117
  };
81
118
  for (let i = 0; i < argv.appmap.length; i++) {
82
119
  const appmapFile = argv.appmap[i];
83
120
  await generateDiagram(appmapFile);
84
121
  }
122
+ if (browserRender)
123
+ await browserRender.close();
85
124
  };
86
125
  exports.handler = handler;
87
126
  //# sourceMappingURL=sequenceDiagram.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"sequenceDiagram.js","sourceRoot":"","sources":["../../src/cmds/sequenceDiagram.ts"],"names":[],"mappings":";;;AAAA,0CAAyD;AACzD,+BAA+C;AAE/C,0EAAuE;AACvE,oCAAmC;AACnC,4CAA8C;AAC9C,gEAMmC;AAEtB,QAAA,OAAO,GAAG,8BAA8B,CAAC;AACzC,QAAA,QAAQ,GAAG,2CAA2C,CAAC;AAE7D,MAAM,OAAO,GAAG,CAAC,IAAgB,EAAE,EAAE;IAC1C,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE;QACxB,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,IAAI;KACZ,CAAC,CAAC;IAEH,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE;QACvB,QAAQ,EAAE,2BAA2B;QACrC,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,GAAG;KACX,CAAC,CAAC;IACH,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE;QACxB,QAAQ,EAAE,kDAAkD;KAC7D,CAAC,CAAC;IACH,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE;QACnB,QAAQ,EAAE,gDAAgD;QAC1D,IAAI,EAAE,SAAS;QACf,OAAO,EAAE,IAAI;KACd,CAAC,CAAC;IACH,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE;QACpB,QAAQ,EAAE,eAAe;QACzB,KAAK,EAAE,GAAG;QACV,OAAO,EAAE,CAAC,UAAU,EAAE,MAAM,CAAC;QAC7B,OAAO,EAAE,UAAU;KACpB,CAAC,CAAC;IACH,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE;QACrB,QAAQ,EAAE,0CAA0C;KACrD,CAAC,CAAC;IAEH,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC;AACvB,CAAC,CAAC;AA9BW,QAAA,OAAO,WA8BlB;AAEK,MAAM,OAAO,GAAG,KAAK,EAAE,IAAS,EAAE,EAAE;IACzC,IAAA,eAAO,EAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACtB,IAAA,+CAAsB,EAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAEvC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;QAChB,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;QAC3C,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;KACR;IAED,IAAI,CAAC,6BAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE;QACrC,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QAC9C,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;KACR;IAED,MAAM,eAAe,GAAG,KAAK,EAAE,cAAsB,EAAiB,EAAE;QACtE,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,IAAA,mBAAQ,EAAC,cAAc,EAAE,OAAO,CAAC,CAAC,CAAC;QACvE,MAAM,MAAM,GAAG,IAAA,oBAAW,GAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,KAAK,EAAE,CAAC;QAExD,MAAM,WAAW,GAAG;YAClB,KAAK,EAAE,IAAI,CAAC,KAAK;SACQ,CAAC;QAC5B,IAAI,IAAI,CAAC,OAAO;YACd,WAAW,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAEpF,MAAM,aAAa,GAAG,gCAAa,CAAC,KAAK,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;QAE/D,MAAM,OAAO,GAAG,IAAA,+BAAY,EAAC,cAAc,EAAE,MAAM,EAAE,aAAa,CAAC,CAAC;QACpE,MAAM,QAAQ,GAAG,IAAA,yBAAa,EAAC,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,cAAc,CAAC,CAAC;QAErE,IAAI,IAAI,CAAC,SAAS;YAAE,MAAM,IAAA,gBAAK,EAAC,IAAI,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAErE,MAAM,cAAc,GAAG;YACrB,IAAA,eAAQ,EAAC,cAAc,EAAE,cAAc,CAAC;YACxC,WAAW;YACX,QAAQ,CAAC,SAAS;SACnB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAEX,IAAI,UAAkB,CAAC;QACvB,IAAI,IAAI,CAAC,SAAS;YAAE,UAAU,GAAG,IAAA,WAAI,EAAC,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;;YACjE,UAAU,GAAG,IAAA,WAAI,EAAC,IAAA,cAAO,EAAC,cAAc,CAAC,EAAE,cAAc,CAAC,CAAC;QAEhE,MAAM,IAAA,oBAAS,EAAC,UAAU,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;QAE9C,OAAO,CAAC,GAAG,CAAC,mBAAmB,UAAU,EAAE,CAAC,CAAC;IAC/C,CAAC,CAAC;IAEF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QAC3C,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAClC,MAAM,eAAe,CAAC,UAAU,CAAC,CAAC;KACnC;AACH,CAAC,CAAC;AApDW,QAAA,OAAO,WAoDlB"}
1
+ {"version":3,"file":"sequenceDiagram.js","sourceRoot":"","sources":["../../src/cmds/sequenceDiagram.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,261 @@
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.statsForDirectory = exports.sizeInMB = void 0;
30
+ const fs = __importStar(require("fs"));
31
+ const userInteraction_1 = __importDefault(require("../../userInteraction"));
32
+ const telemetry_1 = __importDefault(require("../../../telemetry"));
33
+ const utils_1 = require("../../../utils");
34
+ const models_1 = require("@appland/models");
35
+ const chalk_1 = __importDefault(require("chalk"));
36
+ const path_1 = require("path");
37
+ const MINIMUM_APPMAP_SIZE = (1024 * 1024) / 1;
38
+ function sizeInMB(size) {
39
+ return Number((size / 1000 / 1000).toFixed(1));
40
+ }
41
+ exports.sizeInMB = sizeInMB;
42
+ async function statsForDirectory(appMapDir, format, limit, handlerCaller = 'from_stats') {
43
+ async function calculateAppMapSizes(appMapDir) {
44
+ const appMapSizes = {};
45
+ // This function is too verbose to be useful in this context.
46
+ const v = (0, utils_1.verbose)();
47
+ (0, utils_1.verbose)(false);
48
+ await (0, utils_1.listAppMapFiles)(appMapDir, (fileName) => {
49
+ const stats = fs.statSync(fileName);
50
+ appMapSizes[fileName] = {
51
+ path: (0, path_1.relative)(appMapDir, fileName),
52
+ size: stats.size,
53
+ };
54
+ });
55
+ (0, utils_1.verbose)(v);
56
+ return appMapSizes;
57
+ }
58
+ async function sortAppMapSizes(appMapSizes) {
59
+ let appMapSizesArray = [];
60
+ for (const key in appMapSizes) {
61
+ appMapSizesArray.push({
62
+ path: appMapSizes[key].path,
63
+ size: appMapSizes[key].size,
64
+ });
65
+ }
66
+ return appMapSizesArray.sort((a, b) => b.size - a.size);
67
+ }
68
+ async function calculateExecutionTimes(appMapDir) {
69
+ // now that all functions were collected, index them by function
70
+ // name, not by <thread_id,parent_id>
71
+ let totalFunctionExecutionTimes = {};
72
+ // This function is too verbose to be useful in this context.
73
+ const v = (0, utils_1.verbose)();
74
+ (0, utils_1.verbose)(false);
75
+ // Note that event#elapsed time does NOT include instrumentation overhead.
76
+ // So, instrumentation / elapsed can theoretically be greater than 1.
77
+ let totalTime = 0;
78
+ await (0, utils_1.listAppMapFiles)(appMapDir, (fileName) => {
79
+ const file = fs.readFileSync(fileName, 'utf-8');
80
+ const appmapData = JSON.parse(file.toString());
81
+ const appmap = (0, models_1.buildAppMap)(appmapData).build();
82
+ appmap.events.forEach((event) => {
83
+ if (event.isCall()) {
84
+ const eventReturn = event.returnEvent;
85
+ if (!eventReturn)
86
+ return;
87
+ const name = event.codeObject.fqid;
88
+ let elapsedInstrumentationTime = eventReturn.elapsedInstrumentationTime || 0;
89
+ let path = '';
90
+ // some paths are library functions but don't start with /. i.e.:
91
+ // <internal:pack>
92
+ // OpenSSL::Cipher#decrypt
93
+ // Kernel#eval
94
+ if (event.definedClass &&
95
+ event.path &&
96
+ (event.path[0] == '/' ||
97
+ event.path[0] == '<' ||
98
+ event.path.includes('::') ||
99
+ event.path.startsWith('Kernel'))) {
100
+ // Absolute path names generally signify a library function.
101
+ // Send library function data to help optimize AppMap;
102
+ // don't send user function data.
103
+ path = event.path;
104
+ }
105
+ // Total up the elapsed time of root events.
106
+ if (!event.parent && eventReturn.elapsedTime) {
107
+ totalTime += eventReturn.elapsedTime;
108
+ }
109
+ const existingRecord = totalFunctionExecutionTimes[name];
110
+ if (!existingRecord) {
111
+ totalFunctionExecutionTimes[name] = {
112
+ path,
113
+ numberOfCalls: 1,
114
+ elapsedInstrumentationTime,
115
+ };
116
+ }
117
+ else {
118
+ existingRecord.numberOfCalls += 1;
119
+ existingRecord.elapsedInstrumentationTime += elapsedInstrumentationTime;
120
+ if (existingRecord.path === '')
121
+ existingRecord.path = path;
122
+ }
123
+ }
124
+ });
125
+ });
126
+ (0, utils_1.verbose)(v);
127
+ // convert hash to array
128
+ let flatFunctionExecutionTimes = [];
129
+ for (const name in totalFunctionExecutionTimes) {
130
+ flatFunctionExecutionTimes.push({
131
+ name: name,
132
+ elapsedInstrumentationTime: totalFunctionExecutionTimes[name].elapsedInstrumentationTime,
133
+ numberOfCalls: totalFunctionExecutionTimes[name].numberOfCalls,
134
+ path: totalFunctionExecutionTimes[name].path,
135
+ });
136
+ }
137
+ return { totalTime, functions: flatFunctionExecutionTimes };
138
+ }
139
+ async function sortExecutionTimes(functionExecutionTimes) {
140
+ // sort the array
141
+ return functionExecutionTimes.sort((a, b) => b.elapsedInstrumentationTime - a.elapsedInstrumentationTime);
142
+ }
143
+ async function showStats() {
144
+ let biggestAppMapSizes = [];
145
+ // column names in JSON files use snakecase
146
+ let slowestExecutionTimes = [];
147
+ try {
148
+ userInteraction_1.default.status = `Computing AppMap stats...`;
149
+ const appMapSizes = await calculateAppMapSizes(appMapDir);
150
+ const sortedAppMapSizes = await sortAppMapSizes(appMapSizes);
151
+ userInteraction_1.default.success();
152
+ userInteraction_1.default.progress('');
153
+ userInteraction_1.default.progress(chalk_1.default.underline(`Largest AppMaps (which are bigger than ${MINIMUM_APPMAP_SIZE / 1024}kb)`));
154
+ sortedAppMapSizes
155
+ .filter((appmap) => appmap.size > MINIMUM_APPMAP_SIZE)
156
+ .slice(0, limit)
157
+ .forEach((appmap) => {
158
+ biggestAppMapSizes.push({
159
+ size: appmap.size,
160
+ path: appmap.path,
161
+ });
162
+ });
163
+ if (format === 'json') {
164
+ console.log(JSON.stringify(biggestAppMapSizes));
165
+ }
166
+ else {
167
+ biggestAppMapSizes.forEach((appmap) => {
168
+ console.log(sizeInMB(appmap.size) + 'MB ' + appmap.path);
169
+ });
170
+ }
171
+ userInteraction_1.default.progress('');
172
+ userInteraction_1.default.status = `Computing functions with highest AppMap overhead...`;
173
+ const executionTimes = await calculateExecutionTimes(appMapDir);
174
+ const sortedExecutionTimes = await sortExecutionTimes(executionTimes.functions);
175
+ let totalInstrumentationTime = 0;
176
+ sortedExecutionTimes.forEach((time) => (totalInstrumentationTime += time.elapsedInstrumentationTime));
177
+ userInteraction_1.default.success();
178
+ userInteraction_1.default.progress('');
179
+ // if there are no instrumentation data don't show this report
180
+ if (sortedExecutionTimes.length > 0 &&
181
+ sortedExecutionTimes[0].elapsedInstrumentationTime === 0) {
182
+ console.log("These AppMaps don't contain function overhead data. Please update your appmap package to the latest version.");
183
+ }
184
+ else {
185
+ sortedExecutionTimes.slice(0, limit).forEach((executionTime) => {
186
+ slowestExecutionTimes.push({
187
+ elapsed_instrumentation_time_total: Number(executionTime.elapsedInstrumentationTime.toFixed(6)),
188
+ num_calls: executionTime.numberOfCalls,
189
+ name: executionTime.name,
190
+ path: executionTime.path,
191
+ });
192
+ });
193
+ if (format === 'json') {
194
+ console.log(JSON.stringify(slowestExecutionTimes));
195
+ }
196
+ else {
197
+ userInteraction_1.default.progress(chalk_1.default.underline(`Total instrumentation time`));
198
+ console.log(`${Math.round(totalInstrumentationTime * 1000)}ms`);
199
+ userInteraction_1.default.progress('');
200
+ userInteraction_1.default.progress(chalk_1.default.underline(`Functions with highest AppMap overhead`));
201
+ console.log(chalk_1.default.underline([
202
+ 'Time'.padStart(9),
203
+ '%'.padStart(5),
204
+ 'Count'.padStart(7),
205
+ 'Function name'.padEnd(30),
206
+ ].join(' | ')));
207
+ slowestExecutionTimes.forEach((executionTime) => {
208
+ const displayMs = [
209
+ Math.round(executionTime.elapsed_instrumentation_time_total * 1000).toString(),
210
+ 'ms',
211
+ ].join('');
212
+ const displayPercent = `${(Math.round((executionTime.elapsed_instrumentation_time_total / totalInstrumentationTime) * 1000) / 10).toLocaleString('en-us', { maximumFractionDigits: 2, minimumFractionDigits: 0 })}%`;
213
+ console.log([
214
+ displayMs.padStart(9),
215
+ displayPercent.padStart(5),
216
+ executionTime.num_calls.toString().padStart(7),
217
+ executionTime.name.split(':').slice(1).join(':'),
218
+ ].join(' | '));
219
+ });
220
+ }
221
+ }
222
+ let telemetryMetrics = {};
223
+ let telemetryMetricsCounter = 1;
224
+ biggestAppMapSizes.forEach((appmap) => {
225
+ telemetryMetrics[`biggestAppmaps_${telemetryMetricsCounter}`] = appmap.size;
226
+ telemetryMetricsCounter += 1;
227
+ });
228
+ telemetryMetricsCounter = 1;
229
+ slowestExecutionTimes.forEach((executionTime) => {
230
+ telemetryMetrics[`slowestInstrumentationTimesTotal_${telemetryMetricsCounter}`] =
231
+ executionTime.elapsed_instrumentation_time_total;
232
+ telemetryMetrics[`slowestInstrumentationTimesPath_${telemetryMetricsCounter}`] =
233
+ executionTime.path;
234
+ telemetryMetricsCounter += 1;
235
+ });
236
+ telemetry_1.default.sendEvent({
237
+ name: `stats:${handlerCaller}:success`,
238
+ properties: {
239
+ path: appMapDir,
240
+ },
241
+ metrics: telemetryMetrics,
242
+ });
243
+ }
244
+ catch (err) {
245
+ let errorMessage = err.toString();
246
+ if (err instanceof Error) {
247
+ telemetry_1.default.sendEvent({
248
+ name: `stats:${handlerCaller}:error`,
249
+ properties: {
250
+ errorMessage,
251
+ errorStack: err.stack,
252
+ },
253
+ });
254
+ }
255
+ }
256
+ return [biggestAppMapSizes, slowestExecutionTimes];
257
+ }
258
+ return await showStats();
259
+ }
260
+ exports.statsForDirectory = statsForDirectory;
261
+ //# sourceMappingURL=statsForDirectory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"statsForDirectory.js","sourceRoot":"","sources":["../../../../src/cmds/stats/directory/statsForDirectory.ts"],"names":[],"mappings":"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"}