forked from ljacobsson/cfn-diagram
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.js
executable file
·91 lines (85 loc) · 2.85 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
#!/usr/bin/env node
const mxGenerator = require("./mxgraph/MxGenerator");
const program = require("commander");
const YAML = require("yaml-cfn");
const fs = require("fs");
const path = require("path");
const jsonUtil = require("./resources/JsonUtil");
const inquirer = require("inquirer");
const prompt = inquirer.createPromptModule();
const package = JSON.parse(fs.readFileSync(path.join(__dirname, "package.json")));
const actionOption = {
FilterResourceTypes: "Filter resources by type",
FilterResourceName: "Filter resources by name",
ChangeLayout: "Change layout"
}
program.version(package.version, "-v, --vers", "output the current version");
program
.command("generate")
.alias("g")
.option(
"-t, --template-file [templateFile]",
"Path to template",
"template.yml"
)
.option("-o, --output-file [outputFile]", "Output file", "template.drawio")
.description("Generates a draw.io diagram from a CloudFormation template")
.action(async (cmd) => {
let templateString = "";
try {
templateString = fs.readFileSync(cmd.templateFile);
} catch {
console.log(
`Can't find ${cmd.templateFile}. Specify location with -t flag, for example 'evb-local test-rule -t serverless.template'`
);
process.exit(1);
}
const parser = jsonUtil.isJson(templateString)
? JSON.parse
: YAML.yamlParse;
const template = parser(templateString);
const resources = [...Object.keys(template.Resources)].sort();
let types = [];
for (const resource of resources) {
types.push(template.Resources[resource].Type);
}
types = [...new Set(types)].sort();
let resourceTypes = { answer: types };
let resourceNames = { answer: resources };
let actionChoice = {};
while (true) {
const xml = mxGenerator.renderTemplate(template, resourceTypes.answer, resourceNames.answer);
fs.writeFileSync(cmd.outputFile, xml);
actionChoice = await prompt({
message: "Options",
choices: [
actionOption.FilterResourceTypes,
actionOption.FilterResourceName,
//actionOption.ChangeLayout
],
type: "list",
name: "answer",
});
switch (actionChoice.answer) {
case actionOption.FilterResourceTypes:
resourceTypes = await prompt({
message: "Select resource types to include",
choices: types,
default: resourceTypes.answer,
type: "checkbox",
name: "answer",
});
break;
case actionOption.FilterResourceName:
resourceNames = await prompt({
message: "Select resources to include",
choices: resources,
default: resourceNames.answer,
type: "checkbox",
name: "answer",
});
break;
}
}
});
program.parse(process.argv);