UNPKG

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
#!/usr/bin/env node "use strict"; 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();