Skip to content

Commit

Permalink
feat(ESLint): ESLintのシンプルな実装を追加
Browse files Browse the repository at this point in the history
  • Loading branch information
azu committed Sep 1, 2015
1 parent 4930977 commit df717bd
Show file tree
Hide file tree
Showing 4 changed files with 68 additions and 0 deletions.
2 changes: 2 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,8 @@
"eslint": "^1.3.0",
"eslint-plugin-markdown": "git://github.com/eslint/eslint-plugin-markdown.git",
"espower-babel": "^3.3.0",
"esprima": "^2.5.0",
"estraverse": "^4.1.0",
"gitbook-cli": "^0.3.4",
"gitbook-plugin-richquotes": "0.0.5",
"gitbook-summary-to-path": "^1.0.1",
Expand Down
41 changes: 41 additions & 0 deletions src/ESLint/MyLint.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
// LICENSE : MIT
"use strict";
import {parse} from "esprima";
import {traverse} from "estraverse";
import {EventEmitter} from "events";
class RuleContext extends EventEmitter {
report(node, message) {
this.emit("report", message);
}
}
export default class MyLint extends EventEmitter {
constructor() {
super();
this._emitter = new EventEmitter();
this._ruleContext = new RuleContext();
this._ruleContext.on("report", (message) => {
this.emit("report", message);
});
}

loadPlugin(plugin) {
var rule = plugin(this._ruleContext);
// on(nodeType, nodeTypeCallback);
Object.keys(rule).forEach(nodeType => {
this._emitter.on(nodeType, rule[nodeType]);
});
}


lint(code) {
var ast = parse(code);
traverse(ast, {
enter: (node) => {
this._emitter.emit(node.type, node);
},
leave: (node) => {
this._emitter.emit(`${node.type}:exit`, node);
}
});
}
}
10 changes: 10 additions & 0 deletions src/ESLint/no-console.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
"use strict";
module.exports = function (context) {
return {
"MemberExpression": function (node) {
if (node.object.name === "console") {
context.report(node, "Unexpected console statement.");
}
}
};
};
15 changes: 15 additions & 0 deletions test/ESLint/MyLint-test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
// LICENSE : MIT
"use strict";
import assert from "power-assert";
import MyLint from "../../src/ESLint/MyLint";
import noConsole from "../../src/ESLint/no-console";
describe("MyLint", function () {
it("should load and lint", function () {
let lint = new MyLint();
lint.loadPlugin(noConsole);
lint.on("report", (message)=> {
assert.equal(message, "Unexpected console statement.");
});
lint.lint(`console.log("test")`);
});
});

0 comments on commit df717bd

Please sign in to comment.