import-sort-cli
Version:
Sort ES2015 (aka ES6) imports from the command line.
113 lines (111 loc) • 3.66 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const fs_1 = require("fs");
const path = require("path");
const globby = require("globby");
const import_sort_1 = require("import-sort");
const import_sort_config_1 = require("import-sort-config");
const yargs = require("yargs");
yargs
.usage(`
Usage: import-sort [OPTION]... [FILE/GLOB]...
`.trim())
.describe("list-different", "Print the names of files that are not sorted.")
.boolean("list-different")
.alias("list-different", "l")
.describe("write", "Edit files in-place.")
.boolean("write")
.describe("with-node-modules", "Process files inside 'node_modules' directory..")
.boolean("with-node-modules")
// tslint:disable-next-line:no-var-requires
.version(require("../package.json").version)
.alias("version", "v")
.help()
.alias("help", "h");
const { argv } = yargs;
let filePatterns = argv._;
const listDifferent = argv["list-different"];
const writeFiles = argv.write;
const ignoreNodeModules = !argv["with-node-modules"];
if (filePatterns.length === 0) {
yargs.showHelp();
process.exit(1);
}
if (ignoreNodeModules) {
filePatterns = filePatterns.concat([
"!**/node_modules/**",
"!./node_modules/**",
]);
}
let filePaths;
try {
filePaths = globby
// @ts-ignore
.sync(filePatterns, { dot: true, expandDirectories: false })
.map(filePath => path.relative(process.cwd(), filePath));
}
catch (e) {
console.error("Invalid file patterns");
process.exit(2);
}
if (filePaths.length === 0) {
console.error(`No files found for the given patterns: ${filePatterns.join(", ")}`);
process.exit(2);
}
for (const filePath of filePaths) {
let config;
try {
config = getAndCheckConfig(path.extname(filePath), path.dirname(filePath));
}
catch (e) {
handleFilePathError(filePath, e);
continue;
}
const unsortedCode = fs_1.readFileSync(filePath).toString("utf8");
const { parser, style, config: rawConfig } = config;
let sortResult;
try {
sortResult = import_sort_1.default(unsortedCode, parser, style, filePath, rawConfig.options);
}
catch (e) {
handleFilePathError(filePath, e);
continue;
}
const { code: sortedCode, changes } = sortResult;
const isDifferent = changes.length > 0;
if (writeFiles && isDifferent) {
fs_1.writeFileSync(filePath, sortedCode, { encoding: "utf-8" });
}
if (listDifferent && isDifferent) {
process.exitCode = 1;
console.log(filePath);
}
if (!writeFiles && !listDifferent) {
process.stdout.write(sortedCode);
}
}
function getAndCheckConfig(extension, fileDirectory) {
const resolvedConfig = import_sort_config_1.getConfig(extension, fileDirectory);
if (!resolvedConfig) {
throw new Error(`No configuration found for file type ${extension}`);
}
const rawParser = resolvedConfig.config.parser;
const rawStyle = resolvedConfig.config.style;
throwIf(!rawParser, `No parser defined for file type ${extension}`);
throwIf(!rawStyle, `No style defined for file type ${extension}`);
const { parser, style } = resolvedConfig;
throwIf(!parser, `Parser "${rawParser}" could not be resolved`);
throwIf(!style, `Style "${rawStyle}" could not be resolved`);
return resolvedConfig;
}
function handleFilePathError(filePath, e) {
console.error(`${filePath}:`);
console.error(e.toString());
process.exitCode = 2;
}
function throwIf(condition, message) {
if (condition) {
throw new Error(message);
}
}