@appland/appmap 3.70.0 → 3.71.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/CHANGELOG.md CHANGED
@@ -1,3 +1,14 @@
1
+ # [@appland/appmap-v3.71.0](https://github.com/getappmap/appmap-js/compare/@appland/appmap-v3.70.0...@appland/appmap-v3.71.0) (2023-03-21)
2
+
3
+
4
+ ### Features
5
+
6
+ * add --directory option to prune command ([1ec6551](https://github.com/getappmap/appmap-js/commit/1ec655147378e0cce49e3cb1446438eb95f2c787))
7
+ * add ability to prune functions by fqid ([d358dac](https://github.com/getappmap/appmap-js/commit/d358dacd4852530da6e01278e3591808dae352bd))
8
+ * better output for prune command ([47ed85f](https://github.com/getappmap/appmap-js/commit/47ed85f53154bb1edbb7883e768700cde69e42b7))
9
+ * update prune cli command ([e6472ab](https://github.com/getappmap/appmap-js/commit/e6472ab8877fcded10c1a22927c43837f5793753))
10
+ * use base64url-encoded filter state for pruning ([2a1c3d9](https://github.com/getappmap/appmap-js/commit/2a1c3d9ffa8e0b95186f886418e49493a022fa19))
11
+
1
12
  # [@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
13
 
3
14
 
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const fs_1 = __importDefault(require("fs"));
7
7
  const JSONStream_1 = __importDefault(require("JSONStream"));
8
8
  const path_1 = require("path");
9
+ const handleWorkingDirectory_1 = require("../../lib/handleWorkingDirectory");
9
10
  const pruneAppMap_1 = require("./pruneAppMap");
10
11
  async function fromFile(filePath) {
11
12
  let data = { events: [] };
@@ -40,29 +41,86 @@ function parseSize(size) {
40
41
  }
41
42
  return Number(byteStr) * p;
42
43
  }
44
+ function messageWhenUsingFilter(filters) {
45
+ let exclusions = [];
46
+ if ('hideUnlabeled' in filters)
47
+ exclusions.push('All unlabeled functions');
48
+ if ('hideMediaRequests' in filters)
49
+ exclusions.push('All media requests');
50
+ if ('hideExternalPaths' in filters)
51
+ exclusions.push('All external paths');
52
+ if ('hideElapsedTimeUnder' in filters && filters.hideElapsedTimeUnder !== false)
53
+ exclusions.push(`All functions with elapsed time under ${filters.hideElapsedTimeUnder} ms`);
54
+ if ('hideName' in filters)
55
+ exclusions = [...exclusions, ...filters.hideName];
56
+ return `The following was pruned from the map: \n ${exclusions.join('\n ')}`;
57
+ }
58
+ function displayMessage(appMap, format, usesFilter) {
59
+ let message;
60
+ if (usesFilter) {
61
+ const filters = appMap.data.exclusions;
62
+ message =
63
+ format === 'json' ? JSON.stringify({ filters }, null, 2) : messageWhenUsingFilter(filters);
64
+ }
65
+ else {
66
+ const exclusions = Array.from(appMap.data.exclusions.values());
67
+ message =
68
+ format === 'json'
69
+ ? JSON.stringify({ exclusions }, null, 2)
70
+ : `The following was pruned from the map:\n ${exclusions.join('\n ')}`;
71
+ }
72
+ console.log(message);
73
+ }
43
74
  exports.default = {
44
- command: 'prune <file> <size>',
45
- describe: 'Prune an appmap file down to the given size',
75
+ command: 'prune <file>',
76
+ describe: 'Make an appmap file smaller by removing events',
46
77
  builder: (argv) => {
47
78
  argv.option('output-dir', {
48
- describe: 'Specifies the output directory. Pruned files will be written here.',
79
+ describe: 'Specifies the output directory',
49
80
  type: 'string',
50
81
  default: '.',
51
82
  alias: 'o',
52
83
  });
84
+ argv.option('format', {
85
+ describe: 'How to format the output',
86
+ choices: ['json', 'text'],
87
+ default: 'text',
88
+ });
53
89
  argv.positional('file', {
54
90
  describe: 'AppMap to prune',
55
91
  });
56
- argv.positional('size', {
92
+ argv.option('size', {
57
93
  describe: 'Prune input file to this size',
94
+ default: '15mb',
95
+ type: 'string',
96
+ alias: 's',
97
+ });
98
+ argv.option('directory', {
99
+ describe: 'Working directory for the command',
100
+ type: 'string',
101
+ alias: 'd',
102
+ });
103
+ argv.option('filter', {
104
+ describe: 'Filter to use to prune the map',
105
+ type: 'string',
58
106
  });
59
107
  },
60
108
  handler: async (argv) => {
61
- const size = parseSize(argv.size);
62
- const appMap = (0, pruneAppMap_1.pruneAppMap)(await fromFile(argv.file), size);
109
+ (0, handleWorkingDirectory_1.handleWorkingDirectory)(argv.directory);
110
+ const map = await fromFile(argv.file);
111
+ let appMap;
112
+ if (argv.filter) {
113
+ appMap = (0, pruneAppMap_1.pruneWithFilter)(map, argv.filter);
114
+ }
115
+ else if (argv.size) {
116
+ appMap = (0, pruneAppMap_1.pruneAppMap)(map, parseSize(argv.size));
117
+ }
118
+ else {
119
+ throw Error('Invalid usage');
120
+ }
63
121
  const outputPath = `${argv.outputDir}/${(0, path_1.basename)(argv.file)}`;
64
122
  fs_1.default.writeFileSync(outputPath, JSON.stringify(appMap));
65
- console.log('done');
123
+ displayMessage(appMap, argv.format, !!argv.filter);
66
124
  },
67
125
  };
68
126
  //# sourceMappingURL=prune.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"prune.js","sourceRoot":"","sources":["../../../src/cmds/prune/prune.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"prune.js","sourceRoot":"","sources":["../../../src/cmds/prune/prune.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,22 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.pruneAppMap = void 0;
3
+ exports.pruneWithFilter = exports.pruneAppMap = void 0;
4
4
  const models_1 = require("@appland/models");
5
5
  const pruneAppMap = (appMap, size) => {
6
6
  return (0, models_1.buildAppMap)().source(appMap).prune(size).normalize().build();
7
7
  };
8
8
  exports.pruneAppMap = pruneAppMap;
9
+ const pruneWithFilter = (appMap, serializedFilter) => {
10
+ const fullMap = (0, models_1.buildAppMap)().source(appMap).normalize().build();
11
+ const filterOrState = (0, models_1.deserializeAppmapState)(serializedFilter);
12
+ const filters = 'filters' in filterOrState ? filterOrState.filters : filterOrState;
13
+ const appmapFilter = new models_1.AppMapFilter();
14
+ appmapFilter.declutter.limitRootEvents.on = false;
15
+ appmapFilter.declutter.hideMediaRequests.on = false;
16
+ appmapFilter.apply(filters);
17
+ const prunedMap = appmapFilter.filter(fullMap, []);
18
+ prunedMap.data = Object.assign(Object.assign({}, prunedMap.data), { exclusions: filters });
19
+ return prunedMap;
20
+ };
21
+ exports.pruneWithFilter = pruneWithFilter;
9
22
  //# sourceMappingURL=pruneAppMap.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"pruneAppMap.js","sourceRoot":"","sources":["../../../src/cmds/prune/pruneAppMap.ts"],"names":[],"mappings":";;;AAAA,4CAA8C;AAQvC,MAAM,WAAW,GAAG,CAAC,MAAc,EAAE,IAAY,EAAO,EAAE;IAC/D,OAAO,IAAA,oBAAW,GAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,CAAC;AACtE,CAAC,CAAC;AAFW,QAAA,WAAW,eAEtB"}
1
+ {"version":3,"file":"pruneAppMap.js","sourceRoot":"","sources":["../../../src/cmds/prune/pruneAppMap.ts"],"names":[],"mappings":";;;AAAA,4CAAoF;AAQ7E,MAAM,WAAW,GAAG,CAAC,MAAc,EAAE,IAAY,EAAO,EAAE;IAC/D,OAAO,IAAA,oBAAW,GAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,CAAC;AACtE,CAAC,CAAC;AAFW,QAAA,WAAW,eAEtB;AAEK,MAAM,eAAe,GAAG,CAAC,MAAc,EAAE,gBAAwB,EAAO,EAAE;IAC/E,MAAM,OAAO,GAAG,IAAA,oBAAW,GAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,CAAC;IAEjE,MAAM,aAAa,GAAG,IAAA,+BAAsB,EAAC,gBAAgB,CAAC,CAAC;IAC/D,MAAM,OAAO,GAAG,SAAS,IAAI,aAAa,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC;IAEnF,MAAM,YAAY,GAAG,IAAI,qBAAY,EAAE,CAAC;IACxC,YAAY,CAAC,SAAS,CAAC,eAAe,CAAC,EAAE,GAAG,KAAK,CAAC;IAClD,YAAY,CAAC,SAAS,CAAC,iBAAiB,CAAC,EAAE,GAAG,KAAK,CAAC;IACpD,YAAY,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAE5B,MAAM,SAAS,GAAG,YAAY,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,CAAQ,CAAC;IAC1D,SAAS,CAAC,IAAI,mCAAQ,SAAS,CAAC,IAAI,KAAE,UAAU,EAAE,OAAO,GAAE,CAAC;IAC5D,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC;AAdW,QAAA,eAAe,mBAc1B"}