serverless/lib/utils/autocomplete.js
2019-12-18 09:36:52 +01:00

57 lines
1.7 KiB
JavaScript

'use strict';
const Serverless = require('../Serverless');
const crypto = require('crypto');
const getCacheFile = require('./getCacheFile');
const getServerlessConfigFile = require('./getServerlessConfigFile').getServerlessConfigFile;
const getSuggestions = (commands, env) => {
if (!env.complete) return;
const tokens = env.line.split(/\s+/);
const { log } = require('tabtab');
switch (tokens.length) {
case 1:
case 2:
log(Object.keys(commands).filter(commandName => !commands[commandName].isHidden));
return;
case 3:
if (commands[env.prev]) log(commands[env.prev]);
return;
default:
return;
}
};
const cacheFileValid = (serverlessConfigFile, validationHash) => {
const serverlessConfigFileHash = crypto
.createHash('sha256')
.update(JSON.stringify(serverlessConfigFile))
.digest('hex');
return validationHash === serverlessConfigFileHash;
};
const autocomplete = () => {
const servicePath = process.cwd();
return getServerlessConfigFile({ processedInput: { options: {} }, config: { servicePath } }).then(
serverlessConfigFile =>
getCacheFile(servicePath)
.then(cacheFile => {
if (!cacheFile || !cacheFileValid(serverlessConfigFile, cacheFile.validationHash)) {
const serverless = new Serverless();
return serverless.init().then(() => getCacheFile(servicePath));
}
return cacheFile;
})
.then(cacheFile => {
if (!cacheFile || !cacheFileValid(serverlessConfigFile, cacheFile.validationHash)) {
return null;
}
return getSuggestions(cacheFile.commands, require('tabtab').parseEnv(process.env));
})
);
};
module.exports = autocomplete;