/
tabCompletion.js
78 lines (72 loc) · 2.82 KB
/
tabCompletion.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
'use strict';
const path = require('path');
const os = require('os');
const fs = require('fs');
const chalk = require('chalk');
const BbPromise = require('bluebird');
const requireUncached = require('ncjsm/require-uncached');
const resolve = require('ncjsm/resolve/sync');
const configUtils = require('@serverless/utils/config');
const muteConsoleLog = require('../../utils/log/muteConsoleLog');
const isTabTabCompletionSupported = require('../../utils/tabCompletion/isSupported');
const tabtabOptions = require('../../utils/tabCompletion/tabtabOptions');
const promptDisabledConfigPropertyName = require('../../utils/tabCompletion/promptDisabledConfigPropertyName');
const inquirer = require('@serverless/utils/inquirer');
const { confirm } = require('./utils');
BbPromise.promisifyAll(fs);
module.exports = {
check() {
return BbPromise.try(() => {
if (!isTabTabCompletionSupported) return false;
const shellExtension = require('tabtab/lib/utils/systemShell')();
return fs
.statAsync(path.resolve(os.homedir(), `.config/tabtab/serverless.${shellExtension}`))
.then(
() => false,
error => {
if (error.code !== 'ENOENT') throw error;
return !configUtils.get(promptDisabledConfigPropertyName);
}
);
});
},
run() {
return BbPromise.try(() => {
return confirm('Would you like to setup a command line <tab> completion?', {
name: 'shouldSetupTabCompletion',
}).then(isConfirmed => {
if (!isConfirmed) {
configUtils.set(promptDisabledConfigPropertyName, true);
return null;
}
const promptPath = require.resolve('tabtab/lib/prompt');
const tabtabsInquirerPath = resolve(path.dirname(promptPath), 'inquirer').realPath;
// Hack tabtabs prompt to use our inquirer customization
const prompt = requireUncached([promptPath, tabtabsInquirerPath], () => {
require(tabtabsInquirerPath);
require.cache[tabtabsInquirerPath].exports = inquirer;
return require(promptPath);
});
const { install } = require('tabtab/lib/installer');
return prompt().then(({ location }) =>
muteConsoleLog(() =>
tabtabOptions.reduce(
(previousOperation, options) =>
previousOperation.then(() => install(Object.assign({ location }, options))),
BbPromise.resolve()
)
).then(() =>
process.stdout.write(
`\n${chalk.green(
`Command line <tab> completion was successfully setup. ${chalk.bold(
'Make sure to reload your SHELL'
)}.\n` +
'You may uninstall it by running: serverless config tabcompletion uninstall'
)}\n`
)
)
);
});
});
},
};