prettier/bin/prettier.js

169 lines
4.8 KiB
JavaScript
Raw Normal View History

2016-11-29 20:14:10 +03:00
#!/usr/bin/env node
2017-01-10 20:18:22 +03:00
"use strict";
2016-11-29 20:14:10 +03:00
const fs = require("fs");
2017-01-11 18:57:16 +03:00
const getStdin = require("get-stdin");
const glob = require("glob");
const minimist = require("minimist");
2017-01-22 03:42:13 +03:00
const prettier = require("../index");
2016-11-29 20:14:10 +03:00
const argv = minimist(process.argv.slice(2), {
2017-01-13 23:03:53 +03:00
boolean: [
"write",
"stdin",
"single-quote",
"trailing-comma",
"bracket-spacing",
// The supports-color package (a sub sub dependency) looks directly at
// `process.argv` for `--no-color` and such-like options. The reason it is
// listed here is to avoid "Ignored unknown option: --no-color" warnings.
// See https://github.com/chalk/supports-color/#info for more information.
"color",
"version",
"debug-print-doc",
// Deprecated in 0.0.10
"flow-parser"
],
string: [ "print-width", "tab-width", "parser" ],
default: { color: true, "bracket-spacing": true, parser: "babylon" },
unknown: param => {
if (param.startsWith("-")) {
console.warn("Ignored unknown option: " + param + "\n");
}
}
});
if (argv["version"]) {
2017-01-22 03:42:13 +03:00
console.log(prettier.version);
process.exit(0);
}
const filepatterns = argv["_"];
2017-01-10 23:45:04 +03:00
const write = argv["write"];
2017-01-11 18:57:16 +03:00
const stdin = argv["stdin"];
2016-11-29 20:14:10 +03:00
if (!filepatterns.length && !stdin) {
2017-01-10 07:03:35 +03:00
console.log(
"Usage: prettier [opts] [filename ...]\n\n" +
"Available options:\n" +
" --write Edit the file in-place. (Beware!)\n" +
" --stdin Read input from stdin.\n" +
" --print-width <int> Specify the length of line that the printer will wrap on. Defaults to 80.\n" +
" --tab-width <int> Specify the number of spaces per indentation-level. Defaults to 2.\n" +
" --single-quote Use single quotes instead of double.\n" +
" --trailing-comma Print trailing commas wherever possible.\n" +
" --bracket-spacing Put spaces between brackets. Defaults to true.\n" +
" --parser <flow|babylon> Specify which parse to use. Defaults to babylon.\n" +
" --color Colorize error messages. Defaults to true.\n" +
" --version Print prettier version.\n" +
"\n" +
"Boolean options can be turned off like this:\n" +
" --no-bracket-spacing\n" +
" --bracket-spacing=false"
2017-01-10 07:03:35 +03:00
);
process.exit(1);
}
function getParser() {
// For backward compatibility. Deprecated in 0.0.10
if (argv["flow-parser"]) {
console.warn("`--flow-parser` is deprecated. Use `--parser flow` instead.");
return "flow";
}
if (argv["parser"] === "flow") {
return "flow";
}
return "babylon";
}
const options = {
2017-01-25 00:07:05 +03:00
printWidth: argv["print-width"] && parseInt(argv["print-width"]),
tabWidth: argv["tab-width"] && parseInt(argv["tab-width"]),
bracketSpacing: argv["bracket-spacing"],
parser: getParser(),
singleQuote: argv["single-quote"],
trailingComma: argv["trailing-comma"]
};
2017-01-11 18:57:16 +03:00
function format(input) {
if (argv["debug-print-doc"]) {
2017-01-22 03:42:13 +03:00
const doc = prettier.__debug.printToDoc(input, options);
return prettier.__debug.formatDoc(doc);
}
2017-01-22 03:42:13 +03:00
return prettier.format(input, options);
2017-01-11 18:57:16 +03:00
}
2017-01-10 07:03:35 +03:00
2017-01-11 18:57:16 +03:00
if (stdin) {
getStdin().then(input => {
try {
// Don't use `console.log` here since it adds an extra newline at the end.
process.stdout.write(format(input));
} catch (e) {
process.exitCode = 2;
console.error("stdin: " + e);
return;
}
2017-01-11 18:57:16 +03:00
});
} else {
eachFilename(filepatterns, filename => {
2017-01-11 18:57:16 +03:00
fs.readFile(filename, "utf8", (err, input) => {
if (write) {
console.log(filename);
}
2017-01-11 18:57:16 +03:00
if (err) {
console.error("Unable to read file: " + filename + "\n" + err);
// Don't exit the process if one file failed
process.exitCode = 2;
return;
}
let output;
try {
output = format(input);
2017-01-11 18:57:16 +03:00
} catch (e) {
process.exitCode = 2;
if(e.loc) {
console.error(filename + ": " + e);
}
else {
console.error(filename + ":", e);
}
2017-01-11 18:57:16 +03:00
return;
}
if (write) {
fs.writeFile(filename, output, "utf8", err => {
if (err) {
console.error("Unable to write file: " + filename + "\n" + err);
// Don't exit the process if one file failed
process.exitCode = 2;
}
});
} else {
// Don't use `console.log` here since it adds an extra newline at the end.
process.stdout.write(output);
2017-01-11 18:57:16 +03:00
}
});
2017-01-10 23:45:04 +03:00
});
2017-01-11 18:57:16 +03:00
}
function eachFilename(patterns, callback) {
patterns.forEach(pattern => {
glob(pattern, (err, filenames) => {
if (err) {
console.error("Unable to expand glob pattern: " + pattern + "\n" + err);
// Don't exit the process if one pattern failed
process.exitCode = 2;
return;
}
filenames.forEach(filename => {
callback(filename);
});
});
});
}