UNPKG

5.85 kBJavaScriptView Raw
1import {configObject} from "./config.js";
2import {join} from "path";
3import Preset from "./preset.js";
4import Rule from "./rule.js";
5export const inquirer = importLazy("inquirer");
6const readdir = importLazy("recursive-readdir");
7
8let hasAutoCompletePrompt = false;
9export function addAutoCompletePrompt(){
10 if(hasAutoCompletePrompt) return
11 hasAutoCompletePrompt = true;
12 inquirer.registerPrompt("autocomplete", require("inquirer-autocomplete-prompt"));
13}
14
15export async function $api(propArray){
16 let q;
17 q = await inquirer.prompt([{
18 type: "input",
19 name: "company",
20 message: `What is your company?`,
21 default: `discovery`,
22 }]);
23
24 let company = q.company;
25
26 const defaults = {
27 DEV: `https://${company}-dev.sdvi.com/api/v2`,
28 UAT: `https://${company}-uat.sdvi.com/api/v2`,
29 QA: `https://${company}-qa.sdvi.com/api/v2`,
30 PROD: `https://${company}.sdvi.com/api/v2`,
31 };
32
33 if(propArray && propArray[1]){
34 q = {envs: [propArray[1]]};
35 }else{
36 //Create a checkbox prompt to choose enviornments
37 q = await inquirer.prompt([{
38 type: "checkbox",
39 name: "envs",
40 message: `What enviornments would you like to configure?`,
41 choices: Object.keys(defaults).map(name => ({name, checked:true})),
42 }]);
43 }
44
45 //Each env should ask 2 for two things: The url and the key.
46 let questions = q.envs.map(env => {
47 let defaultKey = process.env[`rally_api_key_${env}`];
48 if(configObject && configObject.api && configObject.api[env]){
49 defaultKey = configObject.api[env].key;
50 }
51
52 return [{
53 type: "input",
54 name: `api.${env}.url`,
55 message: `What is the api endpoint for ${env}?`,
56 default: defaults[env],
57 }, {
58 type: "input",
59 name: `api.${env}.key`,
60 message: `What is your api key for ${env}?`,
61 default: defaultKey,
62 }];
63 });
64
65 //flatten and ask
66 questions = [].concat(...questions);
67 q = await inquirer.prompt(questions);
68 if(propArray){
69 q.api = {...configObject.api, ...q.api};
70 }
71 return q;
72}
73export async function $chalk(propArray){
74 return {chalk: await askQuestion("Would you like chalk enabled (Adds coloring)?")};
75}
76export async function $restrictUAT(propArray){
77 return {restrictUAT: await askQuestion("Would you like to protect UAT?")};
78}
79export async function $repodir(propArray){
80 return await inquirer.prompt([{
81 type: "input",
82 name: `repodir`,
83 message: `Where is your rally repository?`,
84 default: process.env["rally_repo_path"],
85 }]);
86}
87
88export async function $appName(propArray){
89 let defaultAppName = "cmdline-" + (process.env.USERNAME || process.env.LOGNAME);
90 let project = await askInput("Application name?", defaultAppName);
91 if(project === "none" || project === "-" || project === "" || !project){
92 project = null
93 }
94 return {appName: project};
95}
96
97export async function $project(propArray){
98 let project = await askInput("Subproject directory?");
99 if(project === "none" || project === "-" || project === "" || !project){
100 project = null
101 }
102 return {project};
103}
104
105export async function $defaultEnv(propArray){
106 return await inquirer.prompt([{
107 type: "input",
108 name: `defaultEnv`,
109 message: `Default enviornment?`,
110 default: "DEV",
111 }]);
112}
113
114//Internal usage/testing
115export async function selectProvider(providers, autoDefault = false){
116 addAutoCompletePrompt();
117 let defaultProvider = providers.findByName("SdviEvaluate");
118 if(autoDefault){
119 return defaultProvider;
120 }else{
121 let choices = providers.arr.map(x => ({
122 name: x.chalkPrint(true),
123 value: x,
124 }))
125 let q = await inquirer.prompt([{
126 type: "autocomplete",
127 name: "provider",
128 default: defaultProvider,
129 source: async (sofar, input) => {
130 return choices.filter(x => input ? x.value.name.toLowerCase().includes(input.toLowerCase()) : true);
131 },
132 }]);
133 return q.provider;
134 }
135}
136
137export async function loadLocals(path, Class){
138 let basePath = configObject.repodir;
139 let f = await readdir(basePath);
140 let objs = f.filter(name => name.includes(path)).map(name => new Class({path: name}));
141 return objs;
142}
143
144export async function selectLocal(path, typeName, Class, canSelectNone = true){
145 addAutoCompletePrompt();
146 let objs = loadLocals(path, Class);
147 let objsMap = objs.map(x => ({
148 name: x.chalkPrint(true),
149 value: x,
150 }));
151 let none = {
152 name: (chalk` {red None}: {red None}`),
153 value: null,
154 };
155
156 if(canSelectNone) objsMap.unshift(none);
157
158 let q = await inquirer.prompt([{
159 type: "autocomplete",
160 name: "obj",
161 message: `What ${typeName} do you want?`,
162 source: async (sofar, input) => {
163 return objsMap.filter(x => input ? x.name.toLowerCase().includes(input.toLowerCase()) : true);
164 },
165 }]);
166 return q.obj;
167}
168
169export async function selectPreset({purpose = "preset", canSelectNone}){
170 return selectLocal("silo-presets", purpose, Preset, canSelectNone);
171}
172export async function selectRule({purpose = "rule", canSelectNone}){
173 return selectLocal("silo-rules", purpose, Rule, canSelectNone);
174}
175
176export async function askInput(question, def){
177 return (await inquirer.prompt([{
178 type: "input",
179 name: "ok",
180 message: question,
181 default: def,
182 }])).ok;
183}
184
185export async function askQuestion(question){
186 return (await inquirer.prompt([{
187 type: "confirm",
188 name: "ok",
189 message: question,
190 }])).ok;
191}