-
Notifications
You must be signed in to change notification settings - Fork 0
/
maker.js
135 lines (101 loc) · 3.03 KB
/
maker.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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
#!/usr/bin/env node
const clear = require('clear');
const inquirer = require('inquirer');
const parser = require('./src/parser');
const runner = require('./src/runner');
const history = require('./src/history');
const ui = require('./src/ui');
const hotkeys = require('./src/hotkeys');
const getMakefileCommands = (targets) => {
let commands = [];
for (let i = 0; i < targets.length; i++) {
commands = commands.concat(targets[i].name);
}
return commands;
}
const makeMenuActions = (targets) => {
let choices = [];
for (let i = 0; i < targets.length; i++) {
const command = targets[i];
choices = choices.concat({
name: command.name + ' ' + command.firstComment,
value: command.name
});
}
choices = choices.concat([
new inquirer.Separator(),
'Exit',
]);
return choices;
};
const getDefaultActionIndex = (targets) => {
const lastExecutedCommand = history.getLastExecutedCommand();
if (lastExecutedCommand === null) {
return null;
}
const flatCommands = getMakefileCommands(targets);
for (let i = 0; i < flatCommands.length; i++) {
if (flatCommands[i] === lastExecutedCommand) {
return i;
}
}
return null;
}
const selectAction = async (actions, defaultActionIndex) => {
const question = {
type: 'list',
name: 'action',
message: 'Make',
choices: actions,
pageSize: 50
};
if (defaultActionIndex !== null) {
question.default = defaultActionIndex;
}
let results = await inquirer.prompt([question]);
ui.newline();
return results.action;
};
const excludeFakeTarget = (targets) => {
let result = [];
for (let i = 0; i < targets.length; i++) {
if (targets[i].name === 'no-command') {
continue;
}
result.push(targets[i]);
}
return result;
}
const mainLoop = async () => {
const makefilePath = './Makefile';
const existsMakefile = await parser.existsMakefile(makefilePath);
if (!existsMakefile) {
console.log('Makefile not found, nothing to do.');
return;
}
history.init(makefilePath);
hotkeys.init();
const allTargets = await parser.getTargets(makefilePath);
const targets = excludeFakeTarget(allTargets);
const menuActions = makeMenuActions(targets);
const flatCommands = getMakefileCommands(targets);
let running = true;
while (running) {
clear();
const defaultActionIndex = getDefaultActionIndex(targets);
const selectedAction = await selectAction(menuActions, defaultActionIndex);
if (flatCommands.includes(selectedAction)) {
history.setLastExecutedCommand(selectedAction);
const output = await runner.run(selectedAction);
console.log(output);
}
if (selectedAction === 'Exit') {
running = false;
}
if (running) {
await ui.keypress();
}
}
clear();
};
mainLoop().then();