Repository: jlongster/prettier (js)

Issue:
Support sending data via Stdin
Example:

```
cat test.js | prettier
```

Pull request:
Enable reading from stdin
Replaces #83 and fixes #59 

Patch:
diff --git a/README.md b/README.md
index 8ee5e736a..2bfb30c29 100644
--- a/README.md
+++ b/README.md
@@ -144,6 +144,17 @@ Emacs users should see [this
 folder](https://github.com/jlongster/prettier/tree/master/editors/emacs)
 for on-demand formatting.
 
+### Vim
+
+Vim users can add the following to their `.vimrc`:
+
+```
+autocmd FileType javascript set formatprg=prettier\ --stdin
+```
+
+This makes Prettier power the [`gq` command](http://vimdoc.sourceforge.net/htmldoc/change.html#gq)
+for automatic formatting without any plugins.
+
 More editors are coming soon.
 
 ## Language Support
diff --git a/bin/prettier.js b/bin/prettier.js
index 2832476ed..77331acd6 100755
--- a/bin/prettier.js
+++ b/bin/prettier.js
@@ -2,11 +2,12 @@
 "use strict";
 
 const fs = require("fs");
+const getStdin = require("get-stdin");
 const minimist = require("minimist");
 const jscodefmt = require("../index");
 
 const argv = minimist(process.argv.slice(2), {
-  boolean: ["write", "flow-parser", "bracket-spacing", "single-quote", "trailing-comma"],
+  boolean: ["write", "stdin", "flow-parser", "bracket-spacing", "single-quote", "trailing-comma"],
   default: {
     "bracket-spacing": true
   }
@@ -14,12 +15,14 @@ const argv = minimist(process.argv.slice(2), {
 
 const filenames = argv["_"];
 const write = argv["write"];
+const stdin = argv["stdin"];
 
-if (!filenames.length) {
+if (!filenames.length && !stdin) {
   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" +
     "  --flow-parser        Use the flow parser instead of babylon\n" +
@@ -30,45 +33,61 @@ if (!filenames.length) {
   process.exit(1);
 }
 
-filenames.forEach(filename => {
-  fs.readFile(filename, "utf8", (err, input) => {
-    if (write) {
-      console.log(file);
-    }
-
-    if (err) {
-      console.error("Unable to read file: " + filename + "\n" + err);
-      // Don't exit the process if one file failed
-      process.exitCode = 2;
-      return;
-    }
+function format(input) {
+  return jscodefmt.format(input, {
+    printWidth: argv["print-width"],
+    tabWidth: argv["tab-width"],
+    bracketSpacing: argv["bracket-spacing"],
+    useFlowParser: argv["flow-parser"],
+    singleQuote: argv["single-quote"],
+    trailingComma: argv["trailing-comma"]
+  });
+}
 
-    let output;
+if (stdin) {
+  getStdin().then(input => {
     try {
-      output = jscodefmt.format(input, {
-        printWidth: argv["print-width"],
-        tabWidth: argv["tab-width"],
-        bracketSpacing: argv["bracket-spacing"],
-        useFlowParser: argv["flow-parser"],
-        singleQuote: argv["single-quote"],
-        trailingComma: argv["trailing-comma"]
-      });
+      console.log(format(input));
     } catch (e) {
       process.exitCode = 2;
       console.error(e);
       return;
     }
+  });
+} else {
+  filenames.forEach(filename => {
+    fs.readFile(filename, "utf8", (err, input) => {
+      if (write) {
+        console.log(filename);
+      }
 
-    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 {
-      console.log(output);
-    }
+      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);
+      } catch (e) {
+        process.exitCode = 2;
+        console.error(e);
+        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 {
+        console.log(output);
+      }
+    });
   });
-});
+}
diff --git a/package.json b/package.json
index dce8675b7..5e7a8cb65 100644
--- a/package.json
+++ b/package.json
@@ -9,6 +9,7 @@
     "ast-types": "git+https://github.com/jlongster/ast-types.git",
     "babylon": "^6.15.0",
     "flow-parser": "^0.37.0",
+    "get-stdin": "^5.0.1",
     "minimist": "^1.2.0",
     "private": "^0.1.6",
     "recast": "^0.11.18",
diff --git a/src/printer.js b/src/printer.js
index 9e41a6a39..52b5adeee 100644
--- a/src/printer.js
+++ b/src/printer.js
@@ -336,10 +336,10 @@ function genericPrintNoParens(path, options, print) {
       ])));
     }
 
-    parts.push(" =>");
+    parts.push(" => ");
 
     return conditionalGroup([
-      concat([ concat(parts), " ", path.call(print, "body") ]),
+      concat([ concat(parts), path.call(print, "body") ]),
       concat([ concat(parts),
                indent(options.tabWidth,
                       concat([line, path.call(print, "body")]))])


Test patch:
diff --git a/tests/predicates-parsing/__snapshots__/jsfmt.spec.js.snap b/tests/predicates-parsing/__snapshots__/jsfmt.spec.js.snap
index 0bb77ba91..9b27dbfff 100644
--- a/tests/predicates-parsing/__snapshots__/jsfmt.spec.js.snap
+++ b/tests/predicates-parsing/__snapshots__/jsfmt.spec.js.snap
@@ -113,7 +113,7 @@ var a1 = (x: mixed): %checks => x !== null;
 
 (x): %checks => x !== null;
 
-const insert_a_really_big_predicated_arrow_function_name_here = (x): %checks =>
+const insert_a_really_big_predicated_arrow_function_name_here = (x): %checks => 
   x !== null;
 
 declare var x;