Skip to content

Commit 9378c2b

Browse files
Merge pull request #22 from saurabhdaware/no-inquirer
Got rid of inquirer
2 parents ac3f7d2 + 1679669 commit 9378c2b

File tree

5 files changed

+144
-226
lines changed

5 files changed

+144
-226
lines changed

lib/action.js

+91-49
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
// external dependencies
2-
const inquirer = require('inquirer');
2+
const prompts = require('prompts');
33

44
// internal modules
55
const path = require('path');
@@ -8,8 +8,10 @@ const util = require('util');
88
const exec = util.promisify(require('child_process').exec);
99
const os = require('os');
1010

11+
1112
// helper functions
1213
const color = require('./colors.js');
14+
// require('./helpers.js');
1315

1416
// Default settings.
1517
const settingsData = {
@@ -66,53 +68,78 @@ function writeSettings(data, command = '<command>', successMessage = "Settings u
6668
})
6769
}
6870

71+
async function openURL(url) {
72+
let stderr;
73+
switch (process.platform) {
74+
case "darwin":
75+
({stderr} = await exec(`open ${url}`));
76+
break;
77+
case "win32":
78+
({stderr} = await exec(`start ${url}`));
79+
break;
80+
default:
81+
({stderr} = await exec(`xdg-open ${url}`));
82+
break;
83+
}
84+
console.log('here ',stderr)
85+
return stderr;
86+
}
87+
88+
const suggestFilter = (input,choices) => {
89+
return Promise.resolve(
90+
choices.filter(choice =>
91+
choice.title.toLowerCase().includes(input.toLowerCase())
92+
)
93+
)
94+
}
95+
96+
97+
const onCancel = () => {
98+
console.error("See ya ('__') /");
99+
process.exit();
100+
return false;
101+
}
102+
103+
function getChoices() {
104+
const projects = [...settings.projects];
105+
const result = projects.map(({...project}) => { // Spreading project to make it immutable
106+
project.title = project.name;
107+
project.value = {name: project.name, path: project.path};
108+
if (project.editor && project.editor !== settings.commandToOpen) {
109+
project.title += color.grey(` (${color.boldGrey('editor:')} ${color.grey(project.editor+')')}`);
110+
project.value.editor = project.editor;
111+
}
112+
return project;
113+
});
114+
115+
return result;
116+
}
117+
69118
async function selectProject(projectName, action) {
70119
let selectedProject;
71120
if (!projectName) {
72-
const projects = [...settings.projects];
73121
// Ask which project he wants to open
74122
const questions = [
75123
{
76-
type: 'list',
124+
type: 'autocomplete',
77125
message: `Select project to ${action} :`,
78126
name: 'selectedProject',
79-
choices: projects.map(({...project}) => { // Spreading project to make it immutable
80-
project.value = {name: project.name, path: project.path};
81-
if (project.editor && project.editor !== settings.commandToOpen) {
82-
project.name += color.grey(` (${color.boldGrey('editor:')} ${project.editor})`);
83-
project.value.editor = project.editor;
84-
}
85-
return project;
86-
})
127+
choices:getChoices(),
128+
limit:40,
129+
suggest:suggestFilter
87130
}
88131
];
132+
89133
// Redirecting to stderr in order for it to be used with command substitution
90-
var promptModule = inquirer.createPromptModule({output: process.stderr});
91-
({selectedProject} = await promptModule(questions));
134+
({selectedProject} = await prompts(questions,{onCancel}));
135+
92136
} else {
93137
// If project name is mentioned then open directly
94138
selectedProject = settings.projects.find(project => project.name.toLowerCase() == projectName.toLowerCase());
95139
}
96140
return selectedProject;
97141
}
98142

99-
async function openURL(url) {
100-
let stderr;
101-
switch (process.platform) {
102-
case "darwin":
103-
({stderr} = await exec(`open ${url}`));
104-
break;
105-
case "win32":
106-
({stderr} = await exec(`start ${url}`));
107-
break;
108-
default:
109-
({stderr} = await exec(`xdg-open ${url}`));
110-
break;
111-
}
112-
console.log('here ',stderr)
113-
return stderr;
114-
}
115-
116143
// Helper funcitions [END]
117144

118145
// oncmd: projectman open [projectName]
@@ -178,12 +205,12 @@ async function addProject(projectDirectory = '.', cmdObj = undefined) {
178205
name = newProject.path.split(path.sep).pop();
179206
}
180207

181-
({finalName: newProject.name} = await inquirer.prompt([{
182-
type: 'input',
208+
({finalName: newProject.name} = await prompts([{
209+
type: 'text',
183210
message: 'Project Name :',
184211
name: 'finalName',
185-
default: name
186-
}]));
212+
initial: name
213+
}],{onCancel}));
187214

188215
if (cmdObj.repo) {
189216
newProject.name = newProject.name.concat(` (${name.split('.')[0]})`)
@@ -213,7 +240,6 @@ async function removeProject(projectName) {
213240
writeSettings(settings, 'remove', "Project Removed");
214241
}
215242

216-
217243
// pm seteditor [command]
218244
async function setEditor(command, cmdObj = undefined) {
219245
let commandToOpen;
@@ -231,47 +257,47 @@ async function setEditor(command, cmdObj = undefined) {
231257
if (!command) {
232258
const questions = [
233259
{
234-
type: 'list',
260+
type: 'select',
235261
message: 'Select text editor',
236262
name: 'selectedEditor',
237263
choices: [
238264
{
239-
name: 'VSCode',
265+
title: 'VSCode',
240266
value: 'code'
241267
},
242268
{
243-
name: 'Sublime',
269+
title: 'Sublime',
244270
value: 'subl'
245271
},
246272
{
247-
name: 'Atom',
273+
title: 'Atom',
248274
value: 'atom'
249275
},
250276
{
251-
name: 'Vim',
277+
title: 'Vim',
252278
value: 'vim'
253279
},
254280
{
255-
name: 'Other',
281+
title: 'Other',
256282
value: 'other'
257283
}
258284
]
259285
}
260286
];
261-
const {selectedEditor} = await inquirer.prompt(questions);
287+
const {selectedEditor} = await prompts(questions,{onCancel});
262288
if (selectedEditor == 'other') {
263289
console.warn("Enter command that you use to open Editor from Terminal");
264290
console.log(`E.g With VSCode Installed, you can type ${color.yellow('code <directory>')} in terminal to open directory`);
265291
console.log(`In this case, the command would be ${color.yellow('code')}\n`);
266292
const question = {
267-
type: 'input',
293+
type: 'text',
268294
message: 'Enter command :',
269295
name: 'command',
270296
validate: function (val) {
271297
return val !== ''
272298
}
273299
}
274-
const {command} = await inquirer.prompt([question])
300+
const {command} = await prompts([question],{onCancel})
275301
commandToOpen = command;
276302
} else {
277303
commandToOpen = selectedEditor;
@@ -351,13 +377,29 @@ async function getProjectPath(projectName) {
351377
return;
352378
}
353379

354-
const selectedProject = await selectProject(projectName, "get directory");
355-
356-
if (!selectedProject) {
357-
console.error(`Project does not exist. Add it using ${color.yellow('pm add [projectPath]')} or cd till the project folder and type ${color.yellow('pm add')}`);
358-
return;
380+
if(!projectName){
381+
const question = {
382+
name:'selectedProject',
383+
message:'Enter number of project you want to cd to:',
384+
type:'autocomplete',
385+
out:process.stderr,
386+
choices:getChoices(),
387+
onRender:() => {
388+
process.stderr.write('\033c');
389+
}
390+
}
391+
392+
const {selectedProject} = await prompts([question],{onCancel})
393+
if (!selectedProject) {
394+
console.error(`Project does not exist. Add it using ${color.yellow('pm add [projectPath]')} or cd till the project folder and type ${color.yellow('pm add')}`);
395+
return;
396+
}
397+
398+
}else{
399+
selectedProject = settings.projects.find(project => project.name.toLowerCase() == projectName.toLowerCase());
359400
}
360401

402+
// Print path
361403
console.log(selectedProject.path);
362404
}
363405

lib/colors.js

+5-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
// Just some weird strings that color text inside it. You probably will not have to touch this file.
2+
13
exports.green = (message) => `\u001b[32m${message}\u001b[39m`;
24

35
exports.boldGreen = (message) => `\u001b[1m\u001b[32m${message}\u001b[39m\u001b[22m`;
@@ -10,4 +12,6 @@ exports.boldYellow = (message) => `\u001b[1m\u001b[33m${message}\u001b[39m\u001b
1012

1113
exports.grey = (message) => `\u001b[90m${message}\u001b[39m`;
1214

13-
exports.boldGrey = (message) => `\u001b[1m\u001b[90m${message}\u001b[39m\u001b[22m`;
15+
exports.boldGrey = (message) => `\u001b[1m\u001b[90m${message}\u001b[39m\u001b[22m`;
16+
17+
exports.bold = (message) => `\u001b[1m${message}\u001b[22m`;

lib/helper.js

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
const readline = require('readline');
2+
3+
readline.emitKeypressEvents(process.stdin);
4+
process.stdin.setRawMode(true);
5+
6+
process.stdin.on('keypress', (str, key) => {
7+
console.log(str)
8+
console.log(key)
9+
})

0 commit comments

Comments
 (0)