Skip to content

Commit

Permalink
Update: Resolve npm installed formatters (#5900)
Browse files Browse the repository at this point in the history
  • Loading branch information
Tom Erik Støwer committed Oct 21, 2017
1 parent 47e5f6f commit 2b23e6f
Show file tree
Hide file tree
Showing 5 changed files with 69 additions and 3 deletions.
11 changes: 11 additions & 0 deletions docs/user-guide/command-line-interface.md
Expand Up @@ -333,6 +333,17 @@ Example:

eslint -f ./customformat.js file.js

An npm-installed formatter is resolved with or without `eslint-formatter-` prefix.

Example:

npm install eslint-formatter-pretty

eslint -f pretty file.js

// equivalent:
eslint -f eslint-formatter-pretty file.js

When specified, the given format is output to the console. If you'd like to save that output into a file, you can do so on the command line like so:

eslint -f compact file.js > results.txt
Expand Down
23 changes: 20 additions & 3 deletions lib/cli-engine.js
Expand Up @@ -26,10 +26,14 @@ const fs = require("fs"),
validator = require("./config/config-validator"),
stringify = require("json-stable-stringify"),
hash = require("./util/hash"),
ModuleResolver = require("./util/module-resolver"),
Plugins = require("./config/plugins"),
pkg = require("../package.json");

const debug = require("debug")("eslint:cli-engine");

const resolver = new ModuleResolver();

//------------------------------------------------------------------------------
// Typedefs
//------------------------------------------------------------------------------
Expand Down Expand Up @@ -670,15 +674,28 @@ class CLIEngine {
// replace \ with / for Windows compatibility
format = format.replace(/\\/g, "/");

let cwd = this.options ? this.options.cwd : process.cwd();

const namespace = Plugins.getNamespace(format);

if (namespace) {
cwd = `${cwd}/${namespace}`;
format = Plugins.removeNamespace(format);
}

let formatterPath;

// if there's a slash, then it's a file
if (format.indexOf("/") > -1) {
const cwd = this.options ? this.options.cwd : process.cwd();

formatterPath = path.resolve(cwd, format);
} else {
formatterPath = `./formatters/${format}`;
const npmFormat = /^eslint-formatter-/.test(format) ? format : `eslint-formatter-${format}`;

try {
formatterPath = resolver.resolve(npmFormat, cwd);
} catch (_) {
formatterPath = `./formatters/${format}`;
}
}

try {
Expand Down
@@ -0,0 +1 @@
module.exports = function() {};
1 change: 1 addition & 0 deletions tests/fixtures/cli-engine/eslint-formatter-bar/index.js
@@ -0,0 +1 @@
module.exports = function() {};
36 changes: 36 additions & 0 deletions tests/lib/cli-engine.js
Expand Up @@ -2685,6 +2685,42 @@ describe("CLIEngine", () => {
assert.isFunction(formatter);
});

it("should return a function when a formatter prefixed with eslint-formatter is requested", () => {
const engine = new CLIEngine({
cwd: getFixturePath("cli-engine")
}),
formatter = engine.getFormatter("bar");

assert.isFunction(formatter);
});

it("should return a function when a formatter is requested, also when the eslint-formatter prefix is included in the format argument", () => {
const engine = new CLIEngine({
cwd: getFixturePath("cli-engine")
}),
formatter = engine.getFormatter("eslint-formatter-bar");

assert.isFunction(formatter);
});

it("should return a function when a formatter is requested within a scoped npm package", () => {
const engine = new CLIEngine({
cwd: getFixturePath("cli-engine")
}),
formatter = engine.getFormatter("@somenamespace/foo");

assert.isFunction(formatter);
});

it("should return a function when a formatter is requested within a scoped npm package, also when the eslint-formatter prefix is included in the format argument", () => {
const engine = new CLIEngine({
cwd: getFixturePath("cli-engine")
}),
formatter = engine.getFormatter("@somenamespace/eslint-formatter-foo");

assert.isFunction(formatter);
});

it("should return null when a customer formatter doesn't exist", () => {
const engine = new CLIEngine(),
formatterPath = getFixturePath("formatters", "doesntexist.js");
Expand Down

0 comments on commit 2b23e6f

Please sign in to comment.