1 | const taskList = require("./taskList");
|
2 | const separator = " ~ ";
|
3 | const Conf = require("conf");
|
4 | const config = new Conf();
|
5 | const moment = require("moment");
|
6 | const chalk = require("chalk");
|
7 | const parseScriptFile = require("./parseScriptsMd.js");
|
8 | const parsePackageFile = require("./parseScriptsPackage.js");
|
9 | const runCLICommand = require("./runCLICommand");
|
10 | const { prompt } = require("enquirer");
|
11 |
|
12 | const taskListAutoComplete = async tasks => {
|
13 | try {
|
14 | let { answer } = await prompt({
|
15 | type: "autocomplete",
|
16 | message: `${chalk.green.bold.underline("Choose task to run")}`,
|
17 | choices: tasks,
|
18 | name: `answer`
|
19 | });
|
20 | return answer.split(separator)[0].trim();
|
21 | } catch (e) {
|
22 | return false;
|
23 | }
|
24 | };
|
25 |
|
26 | const startScripts = async (categories = true) => {
|
27 | console.clear();
|
28 | const FcScripts = await parseScriptFile();
|
29 | if (FcScripts === false) {
|
30 | return false;
|
31 | }
|
32 | let recentTasks = config.get("recentTasks", {});
|
33 | let recentTaskArr = Object.keys(recentTasks)
|
34 | .map(taskName => {
|
35 | let task = recentTasks[taskName];
|
36 | return { name: taskName, lastExecuted: task.lastExecuted };
|
37 | })
|
38 | .sort((a, b) =>
|
39 | a.lastExecuted > b.lastExecuted ? 1 : b.lastExecuted > a.lastExecuted ? -1 : 0
|
40 | )
|
41 | .reverse()
|
42 | .slice(0, 3);
|
43 | let recentTaskOptions = recentTaskArr.map(task => {
|
44 | return task.name + separator + moment(task.lastExecuted).calendar();
|
45 | });
|
46 | let taskToRun;
|
47 | if (categories) {
|
48 | taskToRun = await taskList(FcScripts, recentTaskOptions);
|
49 | } else {
|
50 | let tasks = FcScripts.allTasks;
|
51 |
|
52 | taskToRun = await taskListAutoComplete(
|
53 | tasks.map(task => {
|
54 | return `${task.name}${separator}${task.description}`;
|
55 | })
|
56 | );
|
57 | }
|
58 | if (recentTasks[taskToRun] === undefined) {
|
59 | recentTasks[taskToRun] = { lastExecuted: Date.now() };
|
60 | } else {
|
61 | recentTasks[taskToRun].lastExecuted = Date.now();
|
62 | }
|
63 | config.set("recentTasks", recentTasks);
|
64 | let taskIndex = FcScripts.allTasks.findIndex(t => t.name === taskToRun);
|
65 | let script = FcScripts.allTasks[taskIndex].script;
|
66 | let params = script.split(" ");
|
67 | let type = params.shift();
|
68 | await runCLICommand({
|
69 | task: { name: taskToRun },
|
70 | script: {
|
71 | type: type,
|
72 | rest: params
|
73 | }
|
74 | });
|
75 | };
|
76 |
|
77 | const startPackageScripts = async () => {
|
78 | console.clear();
|
79 | const packageScripts = await parsePackageFile();
|
80 | let tasks = Object.keys(packageScripts).map(e => {
|
81 | return { name: e, script: packageScripts[e] };
|
82 | });
|
83 |
|
84 | let taskToRun = await taskListAutoComplete(
|
85 | tasks.map(task => {
|
86 | return `${task.name}${separator}${task.script}`;
|
87 | })
|
88 | );
|
89 | if (taskToRun === false) {
|
90 | console.log(chalk.green.bold("See you soon!"));
|
91 | return false;
|
92 | }
|
93 | await runCLICommand({
|
94 | task: { name: taskToRun },
|
95 | script: {
|
96 | type: "yarn",
|
97 | rest: [taskToRun]
|
98 | }
|
99 | });
|
100 | };
|
101 |
|
102 | const clearRecent = async () => {
|
103 | config.set("recentTasks", {});
|
104 | };
|
105 | module.exports = {
|
106 | startScripts,
|
107 | taskListAutoComplete,
|
108 | clearRecent,
|
109 | startPackageScripts
|
110 | };
|