Skip to content

Commit 478d87d

Browse files
committed
Allow stack to be chosen from a modal wizard if not provided
1 parent ec0f79e commit 478d87d

File tree

3 files changed

+87
-18
lines changed

3 files changed

+87
-18
lines changed

src/index.js

+27-15
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@ import {
1515
checkLogsForErrors,
1616
} from "./services/processEventLogs";
1717
import { getLogEvents } from "./services/awsCloudwatchLogs";
18-
import { clargsWizardModal } from "./modals/clargsWizardModal";
18+
import { regionWizardModal } from "./modals/regionWizardModal";
19+
import { stackWizardModal } from "./modals/stackWizardModal";
1920

2021
const blessed = require("blessed");
2122
const contrib = require("blessed-contrib");
@@ -86,13 +87,6 @@ if (program.sam) {
8687
}
8788
}
8889

89-
if (!program.stackName) {
90-
console.error(
91-
"error: required option '-n, --stack-name <stackName>' not specified"
92-
);
93-
process.exit(1);
94-
}
95-
9690
AWS.config.credentials = getAWSCredentials();
9791

9892
let cloudformation;
@@ -492,15 +486,33 @@ class Main {
492486
}
493487
}
494488

489+
function promptStackName() {
490+
const stackTable = stackWizardModal(screen, program, cloudformation);
491+
stackTable.key(["enter"], () => {
492+
program.stackName = stackTable.ritems[stackTable.selected];
493+
new Main().render();
494+
});
495+
}
496+
497+
function promptRegion() {
498+
const regionTable = regionWizardModal(screen, program);
499+
regionTable.key(["enter"], () => {
500+
program.region = regionTable.ritems[regionTable.selected];
501+
AWS.config.region = program.region;
502+
updateAWSServices();
503+
if (!program.stackName) {
504+
promptStackName();
505+
} else {
506+
new Main().render();
507+
}
508+
});
509+
}
510+
495511
function startTool() {
496512
if (!program.region) {
497-
const regionTable = clargsWizardModal(screen, program);
498-
regionTable.key(["enter"], () => {
499-
program.region = regionTable.ritems[regionTable.selected];
500-
AWS.config.region = program.region;
501-
updateAWSServices();
502-
new Main().render();
503-
});
513+
promptRegion();
514+
} else if (!program.stackName) {
515+
promptStackName();
504516
} else {
505517
new Main().render();
506518
}

src/modals/clargsWizardModal.js renamed to src/modals/regionWizardModal.js

+3-3
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ function updateRegionTable(table) {
99
table.setItems(regions);
1010
}
1111

12-
const clargsWizardModal = (screen, program) => {
12+
const regionWizardModal = (screen, program) => {
1313
let region = "";
1414
const wizardLayout = new ModalLayout(screen, 112, 27, true);
1515

@@ -18,7 +18,7 @@ const clargsWizardModal = (screen, program) => {
1818
program.region = region;
1919
};
2020

21-
new ModalTitle(wizardLayout, 110, "Select your stack/region");
21+
new ModalTitle(wizardLayout, 110, "Select your region");
2222

2323
const regionTable = new InteractiveList(wizardLayout, 110, 20, "Regions");
2424

@@ -41,4 +41,4 @@ const clargsWizardModal = (screen, program) => {
4141
return regionTable;
4242
};
4343

44-
module.exports = { clargsWizardModal };
44+
module.exports = { regionWizardModal };

src/modals/stackWizardModal.js

+57
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
import { Box } from "../components/box";
2+
import { ModalLayout } from "../components/modalLayout";
3+
import { ModalTitle } from "../components/modalTitle";
4+
import { InteractiveList } from "../components/interactiveList";
5+
6+
function updateStackTable(table, stacks) {
7+
table.setItems(stacks);
8+
}
9+
10+
function updateStackNames(api, table, screen) {
11+
api.describeStacks({}, (err, data) => {
12+
if (err) {
13+
console.error(err);
14+
} else {
15+
const stacks = [];
16+
data.Stacks.forEach((stack) => {
17+
stacks.push(stack.StackName);
18+
});
19+
updateStackTable(table, stacks);
20+
screen.render();
21+
}
22+
});
23+
}
24+
25+
const stackWizardModal = (screen, program, cloudformation) => {
26+
let stack = "";
27+
const wizardLayout = new ModalLayout(screen, 112, 27, true);
28+
29+
const closeModal = () => {
30+
program.stackName = stack;
31+
wizardLayout.destroy();
32+
};
33+
34+
new ModalTitle(wizardLayout, 110, "Select your stack");
35+
36+
const stackTable = new InteractiveList(wizardLayout, 110, 20, "Stacks");
37+
38+
new Box(
39+
wizardLayout,
40+
110,
41+
4,
42+
"Arrow keys to navigate | ENTER to select stack"
43+
);
44+
45+
updateStackNames(cloudformation, stackTable, screen);
46+
stackTable.focus();
47+
48+
stackTable.key(["enter"], () => {
49+
stack = stackTable.ritems[stackTable.selected];
50+
closeModal();
51+
});
52+
53+
screen.render();
54+
return stackTable;
55+
};
56+
57+
module.exports = { stackWizardModal };

0 commit comments

Comments
 (0)