textlint
Version:
The pluggable linting tool for text and markdown.
183 lines • 7.72 kB
JavaScript
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.cli = void 0;
// LICENSE : MIT
const debug_1 = __importDefault(require("debug"));
const options_1 = require("./options");
const config_initializer_1 = require("./config/config-initializer");
const textlint_fixer_1 = require("./fixer/textlint-fixer");
const logger_1 = require("./util/logger");
const TextlintrcLoader_1 = require("./loader/TextlintrcLoader");
const CliLoader_1 = require("./loader/CliLoader");
const createLinter_1 = require("./createLinter");
const SeverityLevel_1 = require("./shared/type/SeverityLevel");
const cli_util_1 = require("./cli-util");
const formatter_1 = require("./formatter");
const debug = (0, debug_1.default)("textlint:cli");
const isStdinExecution = (executeOptions) => {
return "text" in executeOptions;
};
const loadDescriptor = async (cliOptions) => {
const cliDescriptor = await (0, CliLoader_1.loadCliDescriptor)(cliOptions);
debug("cliDescriptor: %j", cliDescriptor);
const textlintrcDescriptor = cliOptions.textlintrc
? await (0, TextlintrcLoader_1.loadTextlintrc)({
configFilePath: cliOptions.config,
node_modulesDir: cliOptions.rulesBaseDirectory
})
: await (0, TextlintrcLoader_1.loadBuiltinPlugins)();
debug("textlintrcDescriptor: %j", textlintrcDescriptor);
const mergedDescriptor = cliDescriptor.concat(textlintrcDescriptor);
debug("mergedDescriptor: %j", mergedDescriptor);
return mergedDescriptor;
};
/**
* Encapsulates all CLI behavior for eslint. Makes it easier to test as well as
* for other Node.js programs to effectively run the CLI.
*/
exports.cli = {
/**
* Executes the CLI based on an array of arguments that is passed in.
* @param {string|string[]} args The arguments to process.
* @param {string} [text] The text to lint (used for TTY).
* @returns {Promise<number>} The exit code for the operation.
*/
async execute(args, text) {
let currentOptions;
// version from package.json
const pkgConf = await import("read-pkg-up");
const version = pkgConf.sync({ cwd: __dirname }).pkg.version;
try {
currentOptions = options_1.options.parse(args);
}
catch (error) {
logger_1.Logger.error(error);
return Promise.resolve(1);
}
const files = currentOptions._;
debug("cliOptions: %j", currentOptions);
if (currentOptions.version) {
logger_1.Logger.log(`v${version}`);
}
else if (currentOptions.init) {
return (0, config_initializer_1.createConfigFile)({
dir: process.cwd(),
verbose: !currentOptions.quiet
});
}
else if (currentOptions.printConfig) {
const descriptor = await loadDescriptor(currentOptions);
logger_1.Logger.log(JSON.stringify(descriptor, null, 4));
return Promise.resolve(0);
}
else if (currentOptions.help || (!files.length && !text)) {
logger_1.Logger.log(options_1.options.generateHelp());
}
else {
// specify file name of stdin content
const stdinFilename = currentOptions.stdinFilename;
debug(`textlint --version: ${version}`);
debug(`Running on ${text ? "text" : "files"}, stdin-filename: ${stdinFilename}`);
if (text) {
if (!stdinFilename) {
throw new Error("Please specify --stdin-filename option");
}
return this.executeWithOptions({
cliOptions: currentOptions,
text,
stdinFilename
});
}
else {
return this.executeWithOptions({
cliOptions: currentOptions,
files
});
}
}
return Promise.resolve(0);
},
/**
* execute with cli options
* @returns {Promise<number>} exit status
*/
async executeWithOptions(executeOptions) {
const cliOptions = executeOptions.cliOptions;
// cli > textlintrc
// if cli and textlintrc have same option, cli option is prior.
const descriptor = await loadDescriptor(cliOptions);
const hasRuleAtLeastOne = descriptor.rule.lintableDescriptors.length > 0;
if (!hasRuleAtLeastOne) {
(0, cli_util_1.showEmptyRuleWarning)();
return Promise.resolve(1);
}
const linter = (0, createLinter_1.createLinter)({
cache: cliOptions.cache,
cacheLocation: cliOptions.cacheLocation,
quiet: cliOptions.quiet,
ignoreFilePath: cliOptions.ignorePath,
descriptor
});
if (cliOptions.fix) {
// --fix
const results = isStdinExecution(executeOptions)
? [await linter.fixText(executeOptions.text, executeOptions.stdinFilename)]
: await linter.fixFiles(executeOptions.files);
debug("fix results: %j", results);
const fixer = new textlint_fixer_1.TextLintFixer();
const formatter = await (0, formatter_1.loadFixerFormatter)({
formatterName: cliOptions.format,
color: cliOptions.color
});
const output = formatter.format(results);
// --dry-run
if (cliOptions.dryRun) {
debug("Enable dry-run mode");
return (0, cli_util_1.printResults)(output, cliOptions) ? Promise.resolve(0) : Promise.resolve(2);
}
// modify file and return exit status
await fixer.write(results);
if ((0, cli_util_1.printResults)(output, cliOptions)) {
if (cliOptions.outputFile) {
return 0; // if --output-file option is specified, exit status is always 0
}
// --fix result has remaining errors, return 1
const hasErrorMessage = results.some((result) => {
return result.remainingMessages.some((message) => message.severity === SeverityLevel_1.SeverityLevel.error);
});
return hasErrorMessage ? 1 : 0;
}
else {
return 2;
}
}
else {
// lint as default
const results = isStdinExecution(executeOptions)
? [await linter.lintText(executeOptions.text, executeOptions.stdinFilename)]
: await linter.lintFiles(executeOptions.files);
debug("lint results: %j", results);
const formatter = await (0, formatter_1.loadLinterFormatter)({
formatterName: cliOptions.format,
color: cliOptions.color
});
const output = formatter.format(results);
if ((0, cli_util_1.printResults)(output, cliOptions)) {
if (cliOptions.outputFile) {
return 0; // if --output-file option is specified, exit status is always 0
}
const hasErrorMessage = results.some((result) => {
return result.messages.some((message) => message.severity === SeverityLevel_1.SeverityLevel.error);
});
return hasErrorMessage ? 1 : 0;
}
else {
return 2;
}
}
}
};
//# sourceMappingURL=cli.js.map
;