Skip to content

Commit

Permalink
New: ESLint v4 (#241)
Browse files Browse the repository at this point in the history
  • Loading branch information
gyandeeps authored and fkling committed Jun 21, 2017
1 parent 6354dcc commit 099d653
Show file tree
Hide file tree
Showing 7 changed files with 96 additions and 0 deletions.
1 change: 1 addition & 0 deletions website/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@
"eslint1": "file:packages/eslint1",
"eslint2": "file:packages/eslint2",
"eslint3": "file:packages/eslint3",
"eslint4": "file:packages/eslint4",
"espree": "^3.1.0",
"esprima": "^3.1.3",
"flow-parser": "^0.47.0",
Expand Down
1 change: 1 addition & 0 deletions website/packages/eslint4/eslint4-package.js
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
module.exports = require('eslint/package.json');
9 changes: 9 additions & 0 deletions website/packages/eslint4/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
// Explicitly require just the stuff we care about to avoid loading
// RuleTester and CLIEngine, which are unnecessary and bloat out the
// package size.
const Linter = require('eslint/lib/linter');

module.exports = {
eslint: new Linter(),
sourceCode: require('eslint/lib/util/source-code')
};
9 changes: 9 additions & 0 deletions website/packages/eslint4/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{
"name": "eslint4",
"version": "1.0.0",
"description": "Wrapper for ESLint 4",
"main": "index.js",
"dependencies": {
"eslint": "^4.0.0"
}
}
7 changes: 7 additions & 0 deletions website/src/parsers/js/transformers/eslint4/codeExample.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
export default function(context) {
return {
TemplateLiteral(node) {
context.report(node, 'Do not use template literals');
}
};
};
25 changes: 25 additions & 0 deletions website/src/parsers/js/transformers/eslint4/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
import pkg from 'eslint4/eslint4-package';

const ID = 'eslint-v4';
const name = 'ESLint v4';

export default {
id: ID,
displayName: name,
version: pkg.version,
homepage: pkg.homepage,

defaultParserID: 'babel-eslint',

loadTransformer(callback) {
require(
['eslint4', '../../utils/eslint4Utils'],
(eslint, utils) => callback({...eslint, utils})
);
},

transform({ eslint, sourceCode, utils }, transformCode, code) {
utils.defineRule(eslint, transformCode);
return utils.runRule(code, eslint, sourceCode);
},
};
44 changes: 44 additions & 0 deletions website/src/parsers/js/utils/eslint4Utils.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
import compileModule from '../../utils/compileModule';
import {parseNoPatch} from 'babel-eslint';

export function formatResults(results) {
return results.length === 0
? 'Lint rule not fired.'
: results.map(formatResult).join('').trim();
}

export function formatResult(result) {
var pointer = '-'.repeat(result.column - 1) + '^';
return `
// ${result.message} (at ${result.line}:${result.column})
${result.source}
// ${pointer}
`;
}

export function defineRule(eslint, code) {
// Compile the transform code and install it as an ESLint rule. The rule
// name doesn't really matter here, so we'll just use a hard-coded name.
const rule = compileModule(code);
eslint.defineRule('astExplorerRule', rule.default || rule);
}

export function runRule(code, eslint, sourceCode) {
// Run the ESLint rule on the AST of the provided code.
// Reference: http://eslint.org/docs/developer-guide/nodejs-api
const ast = parseNoPatch(code, {
sourceType: 'module',
});
const results = eslint.verify(new sourceCode(code, ast), {
env: {es6: true},
parserOptions: {
ecmaVersion: 8,
sourceType: 'module',
ecmaFeatures: {experimentalObjectRestSpread: true},
},
rules: {
astExplorerRule: 2,
},
});
return formatResults(results);
}

0 comments on commit 099d653

Please sign in to comment.