uxp-linter-test-app
Version:
UXP LINTER is useful for linting your code with ESLint rules and guidelines.
191 lines (174 loc) • 8.28 kB
JavaScript
;
require("v8-compile-cache");
var readline = require("readline"),
rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
const utils = require('./utils'),
uxpLinter = require('./uxp-linter-config'),
htmlLinter = require('./html-linter-config'),
cssLinter = require('./css-linter-config'),
prettier = require('./prettier-config'),
constants = require('./constants');
// Linter type option: lint-html, lint-css
const { allOptions, allowedFormats, allowedCSSFormats } = constants;
async function runCommands() {
var nodeArgs = require('minimist')(process.argv.slice(2));
let filterOptions = [];
if (await uxpLinter.isJsLinterInstalled()) {
filterOptions.push(allOptions[0]);
}
if (await htmlLinter.isHtmlLinterInstalled()) {
filterOptions.push(allOptions[1]);
}
if (await cssLinter.isCssLinterInstalled()) {
filterOptions.push(allOptions[2]);
}
if (nodeArgs._.indexOf('report') === -1) {
if (await prettier.isPrettierInstalled()) {
filterOptions.push(allOptions[3]);
}
}
let options = [];
if (filterOptions.length == 1) {
options.push(filterOptions[0].option);
}
else if (filterOptions.length > 1) {
let initMessage = `Please select one or multiple services from following options:`;
for (let i = 0; i < filterOptions.length; i++) {
initMessage += '\n' + (i + 1) + '. ' + filterOptions[i].text;
}
initMessage += `\nPlease enter multiple options separated by comma(,) : `;
let questionForOptionSelection = function () {
return new Promise(async function (resolve, reject) {
rl.question(initMessage, async function (initInput) {
let selectOptions = initInput.split(',').map(function (opt) {
let parseOption = parseInt(opt.trim(), 10);
//Validation for invalid option selection
if (!(parseOption > 0 && parseOption <= filterOptions.length)) {
console.log('\x1b[31m%s\x1b[0m', '\nPlease select valid options.');
process.exit();
}
return parseOption;
});
for (let i = 0; i < selectOptions.length; i++) {
let filterOpt = filterOptions[(selectOptions[i] - 1)];
options.push(filterOpt.option);
}
resolve(true);
});
});
}
await questionForOptionSelection();
} else {
if (
(nodeArgs._.indexOf('report') != -1) && (nodeArgs._[1] && nodeArgs._[1].toLowerCase() === 'sonar')
) {
console.error('\x1b[31m%s\x1b[0m', `Please install UXP Linter before using this command.`);
process.exit();
}
console.error('\x1b[31m%s\x1b[0m', `Please install atleast one service before using this command.`);
return;
}
for (let i = 0; i < options.length; i++) {
let opt = options[i];
let isJsLint = false, isHtmlLint = false, isCssLint = false, isPrettier = false;
let currentOptionText = '';
let currentLinter = '';
switch (opt) {
case 0:
currentOptionText = allOptions[0].text;
isJsLint = true;
currentLinter = allOptions[0].type;
break;
case 1:
currentOptionText = allOptions[1].text;
isHtmlLint = true;
currentLinter = allOptions[1].type;
break;
case 2:
currentOptionText = allOptions[2].text;
isCssLint = true;
currentLinter = allOptions[2].type;
break;
case 3:
currentOptionText = allOptions[3].text;
isPrettier = true;
currentLinter = allOptions[3].type;
break;
default:
console.error('\x1b[31m%s\x1b[0m', '\nInvalid option received - ' + opt + '');
return;
}
let execCommand = '';
let linterProfile = utils.readLinterConfig('linterProfile');
if ((nodeArgs._.indexOf('run') != -1) || (nodeArgs._.indexOf('fix') != -1)) {
let isFixCmd = (nodeArgs._.indexOf('fix') != -1);
console.log('\x1b[32m%s\x1b[0m', `Analyzing ${linterProfile} profile with ${currentOptionText}...\n`);
execCommand = await utils.getLintCommand(currentLinter, 'Lint');
if (isPrettier) {
execCommand = execCommand + (isFixCmd ? ' --write' : ' --check');
} else {
execCommand = execCommand + (isFixCmd ? ' --fix' : '');
}
} else if (nodeArgs._.indexOf('report') != -1) {
console.log('\x1b[32m%s\x1b[0m', `Analyzing ${linterProfile} profile with ${currentOptionText}...\n`);
let directArgs = [...nodeArgs._];
let reportTypeArr = allowedFormats.filter(obj => directArgs.includes(obj.type));
let selectedType = (reportTypeArr && reportTypeArr.length > 0) ? reportTypeArr[0].type : '';
let allReportTypeArr = [...allowedFormats];
if (isCssLint) {
allReportTypeArr = [...allowedCSSFormats];
let cssReportTypeArr = allowedCSSFormats.filter(obj => directArgs.includes(obj.type));
selectedType = (cssReportTypeArr && cssReportTypeArr.length > 0) ? cssReportTypeArr[0].type : '';
}
if (!selectedType || selectedType.length <= 0) {
let questionForReportType = function () {
return new Promise(async function (resolve, reject) {
let reportTypeQuestion = `\nPlease select one of the following report types for ${currentOptionText}`;
for (let i = 0; i < allReportTypeArr.length; i++) {
reportTypeQuestion += '\n' + (i + 1) + '. ' + allReportTypeArr[i].type;
}
reportTypeQuestion += `\nPlease provide any one option for ${currentOptionText} report : `;
rl.question(reportTypeQuestion, async function (initInput) {
if (initInput.trim().length > 0) {
let parseOption = parseInt(initInput.trim(), 10);
//Validation for invalid option selection
if (!(parseOption > 0 && parseOption <= allReportTypeArr.length)) {
selectedType = 'invalid';
} else {
selectedType = allReportTypeArr[parseOption - 1].type;
}
}
resolve(true);
});
});
}
await questionForReportType();
}
if (isHtmlLint) {
// allReportTypeArr = allReportTypeArr.filter(obj => obj.type !== 'sonar')
execCommand = `uxp-linter-report ${selectedType} --ext html`;
} else if (isCssLint) {
execCommand = `uxp-css-linter-report ${selectedType}`;
} else if (isJsLint) {
execCommand = `uxp-linter-report ${selectedType} --ext js`;
}
execCommand = execCommand + ' ' + selectedType;
} else if (nodeArgs._.indexOf('update') != -1) {
console.log('\x1b[32m%s\x1b[0m', `Updating UXP Linter Config...`);
execCommand = 'npm i -D eslint-config-impetus-basetest@latest';
} else {
console.log('Error with commands');
}
if (execCommand) {
await utils.executeCommand(execCommand, false);
} else {
console.error('\x1b[31m%s\x1b[0m', '\nError: Please enter a valid command!');
}
}
process.exit();
}
module.exports = runCommands();