@appland/appmap 3.99.3 → 3.100.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 +9 -0
- package/built/cli.js +19 -34
- package/built/cli.js.map +1 -1
- package/built/cmds/compare/ChangeReporter.js.map +1 -1
- package/built/cmds/compare/detectRevisions.js +6 -1
- package/built/cmds/compare/detectRevisions.js.map +1 -1
- package/built/cmds/compare-report/MarkdownReport.js +1 -1
- package/built/cmds/compare-report/ReportSection.js +4 -5
- package/built/cmds/compare-report/ReportSection.js.map +1 -1
- package/built/cmds/compare-report/compareReport.js.map +1 -1
- package/built/cmds/inventory/DependencyMap.js +18 -0
- package/built/cmds/inventory/DependencyMap.js.map +1 -0
- package/built/cmds/inventory/Report.js +3 -0
- package/built/cmds/inventory/Report.js.map +1 -0
- package/built/cmds/inventory/inventory.js +225 -0
- package/built/cmds/inventory/inventory.js.map +1 -0
- package/built/cmds/inventory-report/MarkdownReport.js +124 -0
- package/built/cmds/inventory-report/MarkdownReport.js.map +1 -0
- package/built/cmds/inventory-report/inventoryReport.js +58 -0
- package/built/cmds/inventory-report/inventoryReport.js.map +1 -0
- package/built/html/appmap.js +91 -91
- package/built/html/appmap.js.map +3 -3
- package/built/html/sequenceDiagram.js +91 -91
- package/built/html/sequenceDiagram.js.map +3 -3
- package/built/utils.js +1 -1
- package/built/utils.js.map +1 -1
- package/package.json +2 -2
- package/resources/inventory-report/default/inventory.hbs +89 -0
- package/resources/inventory-report/welcome/welcome.hbs +115 -0
- package/built/cmds/compare/ArchiveAnalyzer.js +0 -69
- package/built/cmds/compare/ArchiveAnalyzer.js.map +0 -1
- package/built/inventoryCommand.js +0 -44
- package/built/inventoryCommand.js.map +0 -1
|
@@ -0,0 +1,124 @@
|
|
|
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.ReportTemplate = exports.WelcomeReport = exports.DefaultReport = void 0;
|
|
7
|
+
const handlebars_1 = __importDefault(require("handlebars"));
|
|
8
|
+
const path_1 = require("path");
|
|
9
|
+
const promises_1 = require("fs/promises");
|
|
10
|
+
const assert_1 = __importDefault(require("assert"));
|
|
11
|
+
const fs_1 = require("fs");
|
|
12
|
+
const TemplateDirectory = [
|
|
13
|
+
'../../../resources/inventory-report',
|
|
14
|
+
'../../../../resources/inventory-report', // In development
|
|
15
|
+
]
|
|
16
|
+
.map((dirName) => (0, path_1.join)(__dirname, dirName))
|
|
17
|
+
.find((dirName) => (0, fs_1.existsSync)(dirName));
|
|
18
|
+
(0, assert_1.default)(TemplateDirectory, "Report template directory 'inventory-report' not found");
|
|
19
|
+
var TemplateName;
|
|
20
|
+
(function (TemplateName) {
|
|
21
|
+
TemplateName["Default"] = "default";
|
|
22
|
+
TemplateName["Welcome"] = "welcome";
|
|
23
|
+
})(TemplateName || (TemplateName = {}));
|
|
24
|
+
async function generateReport(templateName, report) {
|
|
25
|
+
let reportTemplate;
|
|
26
|
+
switch (templateName) {
|
|
27
|
+
case TemplateName.Default:
|
|
28
|
+
reportTemplate = new DefaultReport();
|
|
29
|
+
break;
|
|
30
|
+
case TemplateName.Welcome:
|
|
31
|
+
reportTemplate = new WelcomeReport();
|
|
32
|
+
break;
|
|
33
|
+
}
|
|
34
|
+
return reportTemplate.generateReport(report);
|
|
35
|
+
}
|
|
36
|
+
exports.default = generateReport;
|
|
37
|
+
class DefaultReport {
|
|
38
|
+
async generateReport(reportData) {
|
|
39
|
+
(0, assert_1.default)(TemplateDirectory);
|
|
40
|
+
const templateFile = (0, path_1.join)(TemplateDirectory, 'default', 'inventory.hbs');
|
|
41
|
+
const template = await ReportTemplate.build(templateFile);
|
|
42
|
+
return template.generateMarkdown(reportData);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
exports.DefaultReport = DefaultReport;
|
|
46
|
+
class WelcomeReport {
|
|
47
|
+
async generateReport(reportData) {
|
|
48
|
+
(0, assert_1.default)(TemplateDirectory);
|
|
49
|
+
const templateFile = (0, path_1.join)(TemplateDirectory, 'welcome', 'welcome.hbs');
|
|
50
|
+
const template = await ReportTemplate.build(templateFile);
|
|
51
|
+
return template.generateMarkdown(reportData);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
exports.WelcomeReport = WelcomeReport;
|
|
55
|
+
class ReportTemplate {
|
|
56
|
+
constructor(template) {
|
|
57
|
+
this.template = template;
|
|
58
|
+
}
|
|
59
|
+
generateMarkdown(report) {
|
|
60
|
+
return this.template(report, {
|
|
61
|
+
helpers: ReportTemplate.helpers(),
|
|
62
|
+
allowProtoPropertiesByDefault: true,
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
static helpers() {
|
|
66
|
+
const inspect = (value) => {
|
|
67
|
+
return new handlebars_1.default.SafeString(JSON.stringify(value, null, 2));
|
|
68
|
+
};
|
|
69
|
+
const length = (...list) => {
|
|
70
|
+
const _fn = list.pop();
|
|
71
|
+
let result = 0;
|
|
72
|
+
for (const item of list) {
|
|
73
|
+
if (Array.isArray(item)) {
|
|
74
|
+
result += item.length;
|
|
75
|
+
}
|
|
76
|
+
else if (item.constructor === Map) {
|
|
77
|
+
result += item.size;
|
|
78
|
+
}
|
|
79
|
+
else if (typeof item === 'object') {
|
|
80
|
+
result += Object.keys(item).length;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
return result;
|
|
84
|
+
};
|
|
85
|
+
const coalesce = (...list) => {
|
|
86
|
+
const _fn = list.pop();
|
|
87
|
+
return list.find((item) => item !== undefined && item !== '');
|
|
88
|
+
};
|
|
89
|
+
const select_values_by_key_range = (data, keyMin, keyMax) => {
|
|
90
|
+
if (typeof keyMax === 'object')
|
|
91
|
+
keyMax = undefined;
|
|
92
|
+
const result = Object.keys(data)
|
|
93
|
+
.map((k) => parseInt(k, 10))
|
|
94
|
+
.filter((k) => k >= keyMin && (keyMax === undefined || k < keyMax))
|
|
95
|
+
.map((k) => data[k]);
|
|
96
|
+
return result;
|
|
97
|
+
};
|
|
98
|
+
const extractArrayValue = (args) => (Array.isArray(args[0]) ? args[0] : args);
|
|
99
|
+
const sum_values_by_key_range = (data, keyMin, keyMax) => {
|
|
100
|
+
const values = select_values_by_key_range(data, keyMin, keyMax);
|
|
101
|
+
return values.reduce((a, b) => a + (b || 0), 0);
|
|
102
|
+
};
|
|
103
|
+
const sum = () => {
|
|
104
|
+
const args = [...arguments];
|
|
105
|
+
const _fn = args.pop();
|
|
106
|
+
const values = extractArrayValue(args);
|
|
107
|
+
return values.reduce((a, b) => a + (b || 0), 0);
|
|
108
|
+
};
|
|
109
|
+
return {
|
|
110
|
+
coalesce,
|
|
111
|
+
inspect,
|
|
112
|
+
length,
|
|
113
|
+
select_values_by_key_range,
|
|
114
|
+
sum,
|
|
115
|
+
sum_values_by_key_range,
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
static async build(templateFile) {
|
|
119
|
+
const template = handlebars_1.default.compile(await (0, promises_1.readFile)(templateFile, 'utf8'));
|
|
120
|
+
return new ReportTemplate(template);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
exports.ReportTemplate = ReportTemplate;
|
|
124
|
+
//# sourceMappingURL=MarkdownReport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MarkdownReport.js","sourceRoot":"","sources":["../../../src/cmds/inventory-report/MarkdownReport.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
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.handler = exports.builder = exports.describe = exports.command = void 0;
|
|
7
|
+
const utils_1 = require("../../utils");
|
|
8
|
+
const handleWorkingDirectory_1 = require("../../lib/handleWorkingDirectory");
|
|
9
|
+
const promises_1 = require("fs/promises");
|
|
10
|
+
const MarkdownReport_1 = __importDefault(require("./MarkdownReport"));
|
|
11
|
+
const console_1 = require("console");
|
|
12
|
+
const process_1 = require("process");
|
|
13
|
+
const path_1 = require("path");
|
|
14
|
+
exports.command = 'inventory-report <report-json-file> [output-file]';
|
|
15
|
+
exports.describe = 'Generate a report document describing the current state of a repository.';
|
|
16
|
+
const builder = (args) => {
|
|
17
|
+
args.positional('report-json-file', {
|
|
18
|
+
type: 'string',
|
|
19
|
+
describe: `JSON report file to read. This file is generated by the 'inventory' command.`,
|
|
20
|
+
demandOption: true,
|
|
21
|
+
});
|
|
22
|
+
args.positional('template-name', {
|
|
23
|
+
type: 'string',
|
|
24
|
+
describe: `Template name.`,
|
|
25
|
+
default: 'default',
|
|
26
|
+
choices: ['default', 'welcome'],
|
|
27
|
+
alias: 't',
|
|
28
|
+
});
|
|
29
|
+
args.positional('output-file', {
|
|
30
|
+
type: 'string',
|
|
31
|
+
describe: `Markdown output file. If not specified, the report is written to stdout.`,
|
|
32
|
+
demandOption: true,
|
|
33
|
+
});
|
|
34
|
+
args.option('directory', {
|
|
35
|
+
describe: 'program working directory',
|
|
36
|
+
type: 'string',
|
|
37
|
+
alias: 'd',
|
|
38
|
+
});
|
|
39
|
+
return args.strict();
|
|
40
|
+
};
|
|
41
|
+
exports.builder = builder;
|
|
42
|
+
const handler = async (argv) => {
|
|
43
|
+
(0, utils_1.verbose)(argv.verbose);
|
|
44
|
+
const { directory } = argv;
|
|
45
|
+
(0, handleWorkingDirectory_1.handleWorkingDirectory)(directory);
|
|
46
|
+
const { reportJsonFile, outputFile, templateName } = argv;
|
|
47
|
+
const report = JSON.parse(await (0, promises_1.readFile)(reportJsonFile, 'utf-8'));
|
|
48
|
+
const reportMD = await (0, MarkdownReport_1.default)(templateName, report);
|
|
49
|
+
if (outputFile) {
|
|
50
|
+
await (0, promises_1.writeFile)(outputFile, reportMD);
|
|
51
|
+
(0, console_1.warn)(`Report written to ${(0, path_1.join)((0, process_1.cwd)(), outputFile)}`);
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
console.log(reportMD);
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
exports.handler = handler;
|
|
58
|
+
//# sourceMappingURL=inventoryReport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inventoryReport.js","sourceRoot":"","sources":["../../../src/cmds/inventory-report/inventoryReport.ts"],"names":[],"mappings":";;;;;;AACA,uCAAsC;AACtC,6EAA0E;AAC1E,0CAAkD;AAClD,sEAA8C;AAC9C,qCAA+B;AAC/B,qCAA8B;AAC9B,+BAA4B;AAEf,QAAA,OAAO,GAAG,mDAAmD,CAAC;AAC9D,QAAA,QAAQ,GAAG,0EAA0E,CAAC;AAE5F,MAAM,OAAO,GAAG,CAAC,IAAgB,EAAE,EAAE;IAC1C,IAAI,CAAC,UAAU,CAAC,kBAAkB,EAAE;QAClC,IAAI,EAAE,QAAQ;QACd,QAAQ,EAAE,8EAA8E;QACxF,YAAY,EAAE,IAAI;KACnB,CAAC,CAAC;IAEH,IAAI,CAAC,UAAU,CAAC,eAAe,EAAE;QAC/B,IAAI,EAAE,QAAQ;QACd,QAAQ,EAAE,gBAAgB;QAC1B,OAAO,EAAE,SAAS;QAClB,OAAO,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC;QAC/B,KAAK,EAAE,GAAG;KACX,CAAC,CAAC;IAEH,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE;QAC7B,IAAI,EAAE,QAAQ;QACd,QAAQ,EAAE,0EAA0E;QACpF,YAAY,EAAE,IAAI;KACnB,CAAC,CAAC;IAEH,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE;QACvB,QAAQ,EAAE,2BAA2B;QACrC,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,GAAG;KACX,CAAC,CAAC;IAEH,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC;AACvB,CAAC,CAAC;AA5BW,QAAA,OAAO,WA4BlB;AAEK,MAAM,OAAO,GAAG,KAAK,EAAE,IAAS,EAAE,EAAE;IACzC,IAAA,eAAO,EAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACtB,MAAM,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC;IAC3B,IAAA,+CAAsB,EAAC,SAAS,CAAC,CAAC;IAElC,MAAM,EAAE,cAAc,EAAE,UAAU,EAAE,YAAY,EAAE,GAAG,IAAI,CAAC;IAE1D,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,IAAA,mBAAQ,EAAC,cAAc,EAAE,OAAO,CAAC,CAAC,CAAC;IAEnE,MAAM,QAAQ,GAAG,MAAM,IAAA,wBAAc,EAAC,YAAY,EAAE,MAAM,CAAC,CAAC;IAC5D,IAAI,UAAU,EAAE;QACd,MAAM,IAAA,oBAAS,EAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;QACtC,IAAA,cAAI,EAAC,qBAAqB,IAAA,WAAI,EAAC,IAAA,aAAG,GAAE,EAAE,UAAU,CAAC,EAAE,CAAC,CAAC;KACtD;SAAM;QACL,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;KACvB;AACH,CAAC,CAAC;AAhBW,QAAA,OAAO,WAgBlB"}
|