1 | import {configObject} from "./config.js";
|
2 | import {join} from "path";
|
3 | import Preset from "./preset.js";
|
4 | import Rule from "./rule.js";
|
5 | export const inquirer = importLazy("inquirer");
|
6 | const readdir = importLazy("recursive-readdir");
|
7 |
|
8 | let hasAutoCompletePrompt = false;
|
9 | export function addAutoCompletePrompt(){
|
10 | if(hasAutoCompletePrompt) return
|
11 | hasAutoCompletePrompt = true;
|
12 | inquirer.registerPrompt("autocomplete", require("inquirer-autocomplete-prompt"));
|
13 | }
|
14 |
|
15 | export 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 |
|
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 |
|
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 |
|
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 | }
|
73 | export async function $chalk(propArray){
|
74 | return {chalk: await askQuestion("Would you like chalk enabled (Adds coloring)?")};
|
75 | }
|
76 | export async function $restrictUAT(propArray){
|
77 | return {restrictUAT: await askQuestion("Would you like to protect UAT?")};
|
78 | }
|
79 | export 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 |
|
88 | export 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 |
|
97 | export 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 |
|
105 | export 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 |
|
115 | export 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 |
|
137 | export 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 |
|
144 | export 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 |
|
169 | export async function selectPreset({purpose = "preset", canSelectNone}){
|
170 | return selectLocal("silo-presets", purpose, Preset, canSelectNone);
|
171 | }
|
172 | export async function selectRule({purpose = "rule", canSelectNone}){
|
173 | return selectLocal("silo-rules", purpose, Rule, canSelectNone);
|
174 | }
|
175 |
|
176 | export 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 |
|
185 | export async function askQuestion(question){
|
186 | return (await inquirer.prompt([{
|
187 | type: "confirm",
|
188 | name: "ok",
|
189 | message: question,
|
190 | }])).ok;
|
191 | }
|