├── package.json ├── .editorconfig ├── .gitignore ├── README.md ├── terrible.js └── .eslintrc /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "eslint-rules-example", 3 | "version": "0.0.1", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "lint": "./node_modules/eslint/bin/eslint.js ./terrible.js" 8 | }, 9 | "author": "makotot", 10 | "license": "MIT", 11 | "dependencies": { 12 | "eslint": "^0.24.0" 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | end_of_line = lf 5 | indent_style = space 6 | indent_size = 2 7 | charset = utf-8 8 | [*.html] 9 | indent_style = tab 10 | indent_size = 4 11 | [*.hbs] 12 | indent_style = tab 13 | indent_size = 4 14 | [*.js] 15 | indent_style = space 16 | indent_size = 2 17 | [*.jsx] 18 | indent_style = space 19 | indent_size = 2 20 | [*.json] 21 | indent_style = space 22 | indent_size = 2 23 | [*.coffee] 24 | indent_style = space 25 | indent_size = 2 26 | [*.css] 27 | indent_style = space 28 | indent_size = 2 29 | [*.scss] 30 | indent_style = space 31 | indent_size = 2 32 | [*.less] 33 | indent_style = space 34 | indent_size = 2 35 | [*.py] 36 | indent_style = tab 37 | indent_size = 4 38 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | ### https://raw.github.com/github/gitignore/8646d7f7d7a49a08f7112b01be8bb547070aef6d/Node.gitignore 2 | 3 | # Logs 4 | logs 5 | *.log 6 | 7 | # Runtime data 8 | pids 9 | *.pid 10 | *.seed 11 | 12 | # Directory for instrumented libs generated by jscoverage/JSCover 13 | lib-cov 14 | 15 | # Coverage directory used by tools like istanbul 16 | coverage 17 | 18 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 19 | .grunt 20 | 21 | # node-waf configuration 22 | .lock-wscript 23 | 24 | # Compiled binary addons (http://nodejs.org/api/addons.html) 25 | build/Release 26 | 27 | # Dependency directory 28 | # https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git 29 | node_modules 30 | 31 | 32 | ### https://raw.github.com/github/gitignore/8646d7f7d7a49a08f7112b01be8bb547070aef6d/Global/Vim.gitignore 33 | 34 | [._]*.s[a-w][a-z] 35 | [._]s[a-w][a-z] 36 | *.un~ 37 | Session.vim 38 | .netrwhist 39 | *~ 40 | 41 | 42 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ESLint rules example 2 | 3 | 4 | ## Configuration 5 | 6 | ESLintのオプションの設定は以下2つのいずれかで。 7 | 8 | - JavaScriptのコメント 9 | - `.eslintrc`ファイルか`package.json`内の`eslintConfig`、もしくはCLIで設定ファイルを指定 10 | 11 | 12 | ## Configurable options 13 | 14 | - __Enviroments__ : どの環境で実行する想定か 15 | - __Globals__ : スクリプト実行時に追加するグローバル変数 16 | - __Rules__ : 有効にするルールとそのエラーレベル 17 | 18 | 19 | ## Language options 20 | 21 | JavaScriptの言語オプションを定義できる。デフォルトでは、ES5の構文のみサポート。設定でES6や[JSX](http://facebook.github.io/jsx/)のサポートを追加可能。 22 | `.eslintrc`で`ecmaFeatures`プロパティを使って設定する。設定できるオプションは以下。 23 | 全てのオプションがデフォルト`false`。 24 | 25 | - `arrowFunctions`: アロー関数を有効にする 26 | - `binaryLiterals`: 2進数リテラルを有効にする 27 | - `blockBindings`: `let`と`const`を有効にする 28 | - `classes`: クラスを有効にする 29 | - `defaultParams`: デフォルトパラメータを有効にする 30 | - `destructuring`: 分解代入を有効にする 31 | - `forOf`: `for of`ループを有効にする 32 | - `generators`: `generators`を有効にする 33 | - `modules`: モジュールとグローバルのstrictモードを有効にする 34 | - `objectLiteralComputedProperties`: 計算されたプロパティ名を有効にする 35 | - `objectLiteralDuplicateProperties`: strictモードでの重複したプロパティ名を有効にする 36 | - `objectLiteralShorthandMethods`: オブジェクトリテラルのメソッドのショートハンド記法を有効にする 37 | - `objectLiteralShorthandProperties`: オブジェクトリテラルのプロパティのショートハンド記法を有効にする 38 | - `octalLiterals`: 8進数リテラルを有効にする 39 | - `regexUFlag`: 正規表現での`u`フラグを有効にする 40 | - `regexYFlag`: 正規表現での`y`フラグを有効にする 41 | - `restParams`: 可変長引数を有効にする 42 | - `spread`: [spread operator](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Spread_operator)を有効にする 43 | - `superInFunctions`: 44 | - `templateStrings`: テンプレート文字列を有効にする 45 | - `unicodeCodePointEscapes`: コードポイントのエスケープを有効にする 46 | - `globalReturn`: グローバルスコープでの`return`を有効にする 47 | - `jsx`: [JSX](http://facebook.github.io/jsx/)を有効にする 48 | 49 | 50 | ## Parser 51 | 52 | デフォルトのパーサーは[Espree](https://github.com/eslint/espree)。以下の要件を満たすパーサーであればEspreeの代わりに利用可能。 53 | 54 | 1. ローカルにインストールできるnpm 55 | 2. [Esprima](http://esprima.org/)と互換性があるインターフェースを持ってる(`parse`メソッドが必要) 56 | 3. Esprimaと互換性があるASTとトークンオブジェクトを生成する 57 | 58 | パーサーに別の`npm`を利用するのであれば、`.eslintrc`で`parser`オプションを宣言する。 59 | ESLintに適合するパーサーは以下。 60 | 61 | - [Esprima](http://esprima.org/) 62 | - [Esprima-FB](https://www.npmjs.com/package/esprima-fb) 63 | - [Babel-ESLint](https://www.npmjs.com/package/babel-eslint) 64 | 65 | カスタムパーサーを使う場合でも、ES5に無いものは`ecmaFeatures`の設定が必須。 66 | 67 | 68 | ## Enviroments 69 | 70 | 定義済みのグローバル変数を設定するのとデフォルトで有効/無効にするルールを決める。使用できるenviromentsは以下。 71 | 72 | - `browser`: ブラウザのグローバル変数 73 | - `node`: Node.jsのグローバル変数とNode.jsに特化したルール 74 | - `worker`: workersのグローバル変数 75 | - `amd`: `amd`の仕様に従って`require()`と`define()`をグローバル変数として定義 76 | - `mocha`: すべてのMochaのテスト用グローバル変数 77 | - `jasmine`: すべてのJasmine(v1.3とv2.0)のテスト用グローバル変数 78 | - `phantomjs`: Phantomjsのグローバル変数 79 | - `jquery`: jqueryのグローバル変数 80 | - `prototypejs`: Prototype.jsのグローバル変数 81 | - `shelljs`: [ShellJS](http://documentup.com/arturadib/shelljs)のグローバル変数 82 | - `meteor`: [meteor](https://www.meteor.com/)のグローバル変数 83 | - `mongo`: [mongo](https://github.com/mongodb/mongo)のグローバル変数 84 | - `applescript`: [applescript](https://developer.apple.com/library/mac/documentation/AppleScript/Conceptual/AppleScriptX/Concepts/ScriptingOnOSX.html#//apple_ref/doc/uid/20000032-BABEBGCF)のグローバル変数 85 | - `es6`: モジュールを除いたすべてのES6の機能を有効にする 86 | 87 | JavaScriptのコメントでも設定ファイルの中でも、CLIの`env`オプションでも宣言可能。 88 | 89 | JavaScriptのコメントなら以下のようにする。 90 | ```js 91 | /* eslint-env node, mocha */ 92 | ``` 93 | 94 | 設定ファイルに記述するなら、`env`で。 95 | ``` 96 | { 97 | "env": { 98 | "browser": true, 99 | "node": true 100 | } 101 | } 102 | ``` 103 | 104 | `package.json`に記述するなら、 105 | ```json 106 | { 107 | ..., 108 | "eslintConfig": { 109 | "env": { 110 | "browser": true, 111 | "node": true 112 | } 113 | } 114 | } 115 | ``` 116 | 117 | 118 | ## Globals 119 | 120 | ESLintはデフォルトで、同じファイルで定義されてないけどアクセスしている変数に対して警告を出す。 121 | `globals`で許可するグローバル変数を定義できる。 122 | 123 | JavaScriptのコメントなら、以下で。 124 | ```js 125 | /* global foo, bar */ 126 | ``` 127 | 読み取り専用なら、`false`で。 128 | ```js 129 | /* global foo:false, bar:false */ 130 | ``` 131 | 132 | 設定ファイルに記述するのであれば、`globals`キーで定義する。上書き可能なら`true`で。読み取り専用なら`false`で。 133 | ``` 134 | { 135 | "globals": { 136 | "foo": true, 137 | "bar": false 138 | } 139 | } 140 | ``` 141 | 142 | 143 | ## Plugin 144 | 145 | サードパーティのプラグインも使えるようになってる。npmでインストールしないといけない。 146 | 設定ファイルに記述する場合、`plugins`キーを使う。`eslint-plugin-`プレフィックスは省略可能。 147 | ``` 148 | { 149 | "plugins": [ 150 | "plugin-name", 151 | "eslint-plugin-name" 152 | ] 153 | } 154 | ``` 155 | 156 | 157 | ## Rule 158 | 159 | ESLintは大量のルールを持っていて、それはデフォルトで無効だったり、有効だったりする。どのルールを利用して、どのルールを利用しないかは、JavaScriptのコメントか設定ファイルで定義すればいい。 160 | ルールの有効無効を切り替えるには、ルールのIDに対して0〜2の値を設定する。 161 | 162 | - __0__: 無効にする 163 | - __1__: 警告にする 164 | - __2__: エラーにする 165 | 166 | JavaScriptのコメントで書くなら、以下のようにする。 167 | ```js 168 | /* eslint: quotes: [2, "double"], curly: 1 */ 169 | ``` 170 | 171 | 設定ファイルの中で定義するなら、以下のようにする。 172 | ``` 173 | { 174 | "rules": { 175 | "quotes": [2, "double"] 176 | "curly": 1 177 | } 178 | } 179 | ``` 180 | 181 | 182 | ## Shared Settings 183 | 184 | 設定ファイルに共有設定を追加することができる。設定ファイルに`settings`オブジェクトを追加すれば、全てのルールで共有される。 185 | カスタムのルールを追加した時などに有用らしい。 186 | 187 | ``` 188 | { 189 | "settings": { 190 | "sharedData": "hoge" 191 | } 192 | } 193 | ``` 194 | 195 | ## Configuration File 196 | 197 | 設定ファイルを使う手段は2つ。いずれもデフォルトの設定を上書きする。 198 | 199 | - CLIで`-c`オプションをつけて設定ファイルを指定 200 | - `.eslintrc`か`package.json` 201 | 202 | 203 | ## Configuration Hierarcy 204 | 205 | 優先順位は以下の通り。 206 | 207 | 1. JavaScriptのコメント 208 | 1. `/* eslint-disable */`、`/* eslint-enable */` 209 | 2. `/* global */` 210 | 3. `/* eslint */` 211 | 4. `/* eslint-env */` 212 | 2. CLIオプション 213 | 1. `--global` 214 | 2. `--rule` 215 | 3. `--env` 216 | 4. `-c`、`--config` 217 | 3. プロジェクトの設定 218 | 1. Lint対象のファイルと同じディレクトリの`.eslintrc` 219 | 2. Lint対象のファイルと同じディレクトリの`package.json` 220 | 3. 親のディレクトリの`.eslintrc`、`package.json`を辿る 221 | 4. デフォルトの設定 222 | 1. `enviroments.json` 223 | 2. `eslint.json` 224 | 225 | 226 | ## Extending Configuration Files 227 | 228 | `extends`で設定ファイルの拡張ができる。 229 | 230 | 231 | ## Comments 232 | 233 | `package.json`以外の設定ファイルはコメントが書ける。 234 | 235 | 236 | ## Ignoring File/Dir 237 | 238 | プロジェクトのルートディレクトリに`.eslintignore`をつくれば、無視するファイル、ディレクトリを決められる。 239 | Lint対象外のパスのグロブパターンを1行毎に記述する。グロブパターンに使われているのは[minimatch](https://github.com/isaacs/minimatch)。 240 | 241 | - `#`始まりの行はコメント扱い 242 | - `!`始まりの行は、その前に無視リストに入れたパターンを否定するパターン 243 | - `{}`は複数のファイルパターンを参照する 244 | 245 | `node_modules/**`は常に無視される。 246 | 247 | 248 | --- 249 | 250 | ## Links 251 | 252 | - [Documentation - ESLint - Pluggable JavaScript linter](http://eslint.org/docs/user-guide/configuring) 253 | 254 | -------------------------------------------------------------------------------- /terrible.js: -------------------------------------------------------------------------------- 1 | var foo = { 2 | bar: 1, 3 | }; 4 | 5 | if (foo.bar = 0) { 6 | console.log(foo.bar); 7 | } 8 | 9 | var controlRegexPatternA = /\\x1f/; 10 | var controlRegexPatternB = new RegExp('\x20'); 11 | 12 | debugger; 13 | 14 | 15 | function hoge (a, b, a) { 16 | return a; 17 | } 18 | 19 | hoge(1, 2, 3); 20 | 21 | var obj = { 22 | a: 1, 23 | b: 2, 24 | a: 1 25 | }; 26 | 27 | switch (obj.a) { 28 | case 1: 29 | break; 30 | case 2: 31 | break; 32 | case 1: 33 | break; 34 | default: 35 | break; 36 | } 37 | 38 | var charClassPattern = /^[]/; 39 | 40 | if (obj.a) { 41 | } 42 | 43 | try { 44 | } catch (e) { 45 | e = 0; 46 | } 47 | 48 | if (!!obj.a) { 49 | } 50 | 51 | var extraParens = (1 * 0); 52 | 53 | function extraSemi () { 54 | }; 55 | 56 | function funcAssignA () { 57 | } 58 | 59 | function funcAssignB () { 60 | } 61 | 62 | funcAssignA = funcAssignB; 63 | 64 | if (obj.a) { 65 | function innerDeclaration () {} 66 | } 67 | 68 | 69 | var invalidPattern = RegExp('.', 'z'); 70 | 71 |   72 | if ((!a in obj)) { 73 | console.log(0); 74 | } 75 | 76 | Math(); 77 | 78 | var spaceInText = /foo bar/; 79 | 80 | var reservedKeys = { 81 | class: '' 82 | }; 83 | 84 | var sparseArray = [,,]; 85 | 86 | function unreachable () { 87 | var x = 0; 88 | 89 | return x; 90 | 91 | x = 1; 92 | } 93 | 94 | if (obj.a == NaN) { 95 | obj.a = 0; 96 | } 97 | 98 | /** 99 | * valid JSDoc 100 | */ 101 | function validJSDoc () { 102 | return 'valid'; 103 | } 104 | 105 | typeof "valid typeof" === "strin"; 106 | 107 | 108 | var accessorPairs = { 109 | set foo (val) { 110 | this.val = val; 111 | } 112 | }; 113 | 114 | 115 | function blockScoped () { 116 | if (obj.a) { 117 | var blockScopedVar = "var"; 118 | } 119 | 120 | console.log(blockScopedVar); 121 | } 122 | 123 | 124 | function complexity (opt) { 125 | if (opt) { 126 | return opt; 127 | } else if (!opt) { 128 | return 1; 129 | } else { 130 | return 0; 131 | } 132 | } 133 | 134 | function consistentReturn (x) { 135 | if (x) { 136 | return x; 137 | } else { 138 | return; 139 | } 140 | } 141 | 142 | if (obj) console.log(obj); 143 | 144 | switch (obj.a) { 145 | case 1: 146 | break; 147 | case 2: 148 | break; 149 | } 150 | 151 | var dotNotation = obj['a']; 152 | 153 | var dot = { 154 | location: function () { 155 | return this; 156 | } 157 | }; 158 | 159 | dot. 160 | location(); 161 | 162 | dot 163 | .location(); 164 | 165 | if (obj.a == 0) { 166 | console.log(obj.b); 167 | } 168 | 169 | for (key in obj) { 170 | console.log(key); 171 | } 172 | 173 | alert(this); 174 | 175 | function noArgumentsCall () { 176 | var arg = arguments.callee; 177 | } 178 | 179 | function lookLikeDivision () { 180 | return /=foo/; 181 | } 182 | 183 | function elseReturn (x) { 184 | if (x) { 185 | return x; 186 | } else { 187 | return; 188 | } 189 | } 190 | 191 | emptyLabel: 192 | var foobar = 0; 193 | 194 | if (obj == null) { 195 | console.log('null'); 196 | } 197 | 198 | eval(); 199 | 200 | String.prototype.extendNative = function () { 201 | return this; 202 | }; 203 | 204 | var extraBind = function () { 205 | console.log('extra'); 206 | }.bind(hoge); 207 | 208 | 209 | switch (obj.a) { 210 | case 1: 211 | obj.c = 100; 212 | default: 213 | obj.c = null; 214 | } 215 | 216 | var floatingDecimal = .5; 217 | 218 | setTimeout("console.log('implied!')", 100); 219 | 220 | 221 | function DisallowIterator () { 222 | } 223 | DisallowIterator.prototype.__iterator__ = function () { 224 | }; 225 | 226 | 227 | labeldStatement: 228 | break labeldStatement; 229 | 230 | {} 231 | 232 | for (var i = 0; i < 10; i++) { 233 | (function (n) { 234 | console.log(n); 235 | })(i); 236 | } 237 | 238 | var multispaces = 1; 239 | 240 | var multilineString = 'line\ 241 | line'; 242 | 243 | String = 'native object'; 244 | 245 | var funcConstructor = new Function (); 246 | 247 | var primitiveWrapper = new String('primitive'); 248 | 249 | function NoNew () { 250 | } 251 | 252 | new NoNew(); 253 | 254 | var octalEscape = '\251'; 255 | 256 | var octalLiteral = 011; 257 | 258 | var reassignParam = function (x) { 259 | x = 0; 260 | }; 261 | 262 | var env = process.env; 263 | 264 | var proto = obj.__proto__; 265 | 266 | var redeclearVar = 0; 267 | var redeclearVar = 1; 268 | 269 | function returnAssignment () { 270 | var assigned = 0; 271 | 272 | return assigned = 1; 273 | } 274 | 275 | location.href = 'javascript:void(0)'; 276 | 277 | var selfCompare = 10; 278 | 279 | if (selfCompare === selfCompare) { 280 | selfCompare = 0; 281 | } 282 | 283 | 284 | var noSequenceA = (3, 5); 285 | noSequenceA = noSequenceB += 5, noSequence + noSequenceB; 286 | 287 | function throwLiteral () { 288 | throw "no-throw-literal"; 289 | } 290 | 291 | "unused expressions"; 292 | 293 | void 0; 294 | 295 | // TODO: no-warning-comments 296 | 297 | with (obj) { 298 | console.log(this); 299 | } 300 | 301 | var radix = parseInt("001"); 302 | 303 | function varsOnTop (n) { 304 | var vars1 = 0; 305 | if (n) { 306 | return n; 307 | } 308 | 309 | var vars2 = 10; 310 | 311 | return vars1 + vars2 + n; 312 | } 313 | 314 | var wrapIife = function () { 315 | return {}; 316 | }(); 317 | 318 | 319 | var yoda = 1; 320 | 321 | if (1 === yoda) { 322 | console.log(yoda); 323 | } 324 | 325 | "use strict"; 326 | 327 | function useStrict () { 328 | "use strict"; 329 | } 330 | 331 | var shadowErr = 'err'; 332 | try { 333 | throw new Error(); 334 | } catch (shadowErr) { 335 | } 336 | 337 | var deleteVar; 338 | delete deleteVar; 339 | 340 | var labelVar = 0; 341 | function bar() { 342 | labelVar: 343 | for (;;) { 344 | break labelVar; 345 | } 346 | } 347 | 348 | var undefined; 349 | 350 | var shadow; 351 | 352 | function noShadow () { 353 | var shadow = 'shadow'; 354 | } 355 | 356 | var undefInit = undefined; 357 | 358 | var unusedVar; 359 | 360 | console.log(beforeDefine); 361 | var beforeDefine = 0; 362 | 363 | function handleCbErr (err, done) { 364 | done(); 365 | } 366 | 367 | var mixedRequire = require('./module'), 368 | mixed = 'mixed'; 369 | 370 | var NewRequire = new require('./module'); 371 | 372 | var pathConcat = __dirname + 'path.js'; 373 | 374 | function processExit () { 375 | process.exit(1); 376 | } 377 | 378 | var fs = require('fs'); 379 | 380 | fs.existsSync('./some-path'); 381 | 382 | var bracketSpaces = [ 1, 2 ]; 383 | 384 | if (obj) { 385 | obj.d = 0; 386 | } 387 | else { 388 | obj = {}; 389 | } 390 | 391 | var camel_case = ''; 392 | 393 | var space = 0 , arround = 1; 394 | 395 | var comma 396 | , style; 397 | 398 | var computedProp = { foo: 1 }; 399 | 400 | computedProp[ 'foo' ]; 401 | 402 | var self; 403 | 404 | setTimeout(function () { 405 | self = this; 406 | console.log(self); 407 | }, 0); 408 | 409 | var funcNames = function () {}; 410 | 411 | function funcStyleA () {} 412 | 413 | var funcStyleB = function () {}; 414 | 415 | var keySpacing = { 416 | space : [] 417 | }; 418 | 419 | var linesAroundCommentA; 420 | // lines around comment 421 | var linesAroundCommentB; 422 | 423 | 424 | function nestedCb (cbA) { 425 | cbA(function (cbB) { 426 | cbB(function (cbC) { 427 | cbC(function (cbD) { 428 | cbD(function () { 429 | }); 430 | }); 431 | }); 432 | }); 433 | } 434 | 435 | function newCap () {} 436 | 437 | var cap = new newCap(); 438 | 439 | function NewParens () {} 440 | 441 | var parens = new NewParens; 442 | 443 | var newLineAfterVar = 0; 444 | console.log(newLineAfterVar); 445 | 446 | var arrayConstructor = new Array(1, 2); 447 | 448 | for (var i = 0; i < 10; i++) { 449 | if (i < 5) { 450 | continue; 451 | } 452 | } 453 | 454 | var inlineComment = '';//inline 455 | 456 | if (obj.a) { 457 | } else { 458 | if (obj.b) { 459 | } 460 | } 461 | 462 | 463 | 464 | var nestedTernary = obj.a ? 0 : obj.b ? 1 : 2; 465 | 466 | var NewObj = new Object(); 467 | 468 | var spacedFn = function () {}; 469 | 470 | spacedFn (); 471 | 472 | var noTernary = obj ? 1 : 0; 473 | 474 | var trailingspaces; 475 | 476 | var _underscoreDangle; 477 | 478 | var unneededTernary = obj.a === 1 ? true : false; 479 | 480 | var curlySpace = { foo: 1 }; 481 | 482 | function oneVar () { 483 | var oneVarA; 484 | var oneVarB; 485 | } 486 | 487 | var operatorAssignment = 1; 488 | 489 | operatorAssignment = operatorAssignment + 1; 490 | 491 | var operatorLinebreak = 0 + 492 | 1; 493 | 494 | function paddedBlock () { 495 | 496 | console.log(this); 497 | } 498 | 499 | var quote = { 500 | prop: '' 501 | }; 502 | 503 | var quotes = "quotes quotes"; 504 | 505 | var semiSpacing ; 506 | 507 | var semi 508 | 509 | var sortVarsA, sortVarsC, sortVarsB; 510 | 511 | if(obj) { 512 | console.log('space after keywords'); 513 | } 514 | 515 | if (obj){ 516 | console.log('space before blocks'); 517 | } 518 | 519 | function spaceBeforeFnParen() {} 520 | 521 | ( function () { 522 | console.log('space in parens'); 523 | } )(); 524 | 525 | var spaceInfixOps = 1+1; 526 | 527 | function spaceReturnThrowCase () { 528 | return-1; 529 | } 530 | 531 | ++ obj.a; 532 | 533 | //spaced comment 534 | 535 | function wrapRegex () { 536 | return /regex/.test('regex'); 537 | } 538 | 539 | class MyClass { 540 | 541 | constructor () { 542 | super(); 543 | } 544 | } 545 | 546 | function*generators () { 547 | } 548 | 549 | class BeforeSuper extends MyClass { 550 | constructor () { 551 | this.name = ''; 552 | super(); 553 | } 554 | } 555 | 556 | var noVar; 557 | 558 | var objShorthand = { 559 | a: function () { 560 | } 561 | }; 562 | 563 | let preferConst = 0; 564 | 565 | function maxDepth (x, y) { 566 | for (var i = 0; i < 10; i++) { 567 | if (x) { 568 | if (y) { 569 | i++; 570 | } 571 | } 572 | } 573 | } 574 | 575 | var maxLen = 'maxlenmaxlenmaxlenmaxlenmaxlenmaxlenmaxlenmaxlenmaxlenmaxlenmaxlenmaxlenmaxlenmaxlenmaxlenmaxlenmaxlenmaxlenmaxlenmaxlenmaxlenmaxlenmaxlenmaxlenmaxlenmaxlenmaxlenmaxlenmaxlenmaxlenmaxlenmaxlenmaxlenmaxlenmaxlenmaxlenmaxlenmaxlenmaxlenmaxlenmaxlen'; 576 | 577 | function maxParams (a, b, c, d, e) { 578 | } 579 | 580 | function maxStatements () { 581 | var hogehoge = 1; 582 | var foobar = 2; 583 | var barfoo = 3; 584 | var fooo = 4; 585 | } 586 | 587 | var bitwise = obj.a ^ obj.b; 588 | 589 | var plusplus = 0; 590 | 591 | plusplus++; 592 | -------------------------------------------------------------------------------- /.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "ecmaFeatures": { 3 | "arrowFunctions": true,// アロー関数を有効にする 4 | "binaryLiterals": true,// 2進数リテラルを有効にする 5 | "blockBindings": true,// letとconstを有効にする 6 | "classes": true,// classを有効にする 7 | "defaultParams": true,// デフォルトパラメータを有効にする 8 | "destructuring": true,// 構造化代入を有効にする 9 | "forOf": true,// for-ofを有効にする 10 | "generators": true,// generatorsを有効にする 11 | "modules": false,// moduleを有効にして、globalのstrict modeにする 12 | "objectLiteralComputedProperties": true,// computedプロパティを有効にする 13 | "objectLiteralDuplicateProperties": true,// strict modeでのプロパティの重複を有効にする 14 | "objectLiteralShorthandMethods": true,// ショートハンドメソッドを有効にする 15 | "objectLiteralShorthandProperties": true,// ショートハンドプロパティを有効にする 16 | "octalLiterals": true,// 8進数リテラルを有効にする 17 | "regexUFlag": true,// 正規表現でのuフラグを有効にする 18 | "regexYFlag": true,// 正規表現でのyフラグを有効にする 19 | "restParams": true,// 可変長引数を有効にする 20 | "spread": true,// spread operatorを有効にする 21 | "superInFunctions": true,// 関数内のsuperを有効にする 22 | "templateStrings": true,// テンプレート文字列を有効にする 23 | "unicodeCodePointEscapes": true,// code point escapes を有効にする 24 | "globalReturn": true,// グローバルスコープでのreturnを有効にする 25 | "jsx": true// JSXを有効にする 26 | }, 27 | 28 | "env": { 29 | "browser": true,// ブラウザのグローバル変数を利用可能にする 30 | "node": true,// Node.jsのグローバル変数とNode.js特有のルールを追加する 31 | "worker": true,// web workersのグローバル変数を利用可能にする 32 | "amd": true,// AMDの仕様の通りにrequire()とdefine()をグローバル変数として有効にする 33 | "mocha": true,// mochaの全てのグローバル変数を有効にする 34 | "jasmine": true,// jasmine(v1.3, v2.0)の全てのグローバル変数を有効にする 35 | "phantomjs": true,// phantomjsのグローバル変数を有効にする 36 | "jquery": true,// jQueryのグローバル変数を有効にする 37 | "prototypejs": true,// prototype.jsのグローバル変数を有効にする 38 | "shelljs": true,// shelljsのグローバル変数を有効にする 39 | "meteor": true,// meteorのグローバル変数を有効にする 40 | "mongo": true,// mongoのグローバル変数を有効にする 41 | "applescript": true,// applescriptのグローバル変数を有効にする 42 | "es6": true// modulesを除くES6の仕様を有効にする 43 | }, 44 | 45 | "globals": { 46 | }, 47 | 48 | "rules": { 49 | // Possible Errors 50 | "comma-dangle": [2],// 不要なカンマを許可しない 51 | "no-cond-assign": [2],// 条件式での代入を許可しない 52 | "no-console": [2],// consoleの利用を許可しない。node環境ならデフォルトで無効 53 | "no-constant-condition": [2],// 条件式での定数式を許可しない 54 | "no-control-regex": [2],// 正規表現での制御文字の使用を許可しない 55 | "no-debugger": [2],// debuggerを許可しない, 56 | "no-dupe-args": [2],// 引数の重複を許可しない 57 | "no-dupe-keys": [2],// オブジェクトキーの重複を許可しない 58 | "no-duplicate-case": [2],// caseのラベルの重複を許可しない 59 | "no-empty-character-class": [2],// 空文字の正規表現を許可しない 60 | "no-empty": [2],// 空のブロック文を許可しない 61 | "no-ex-assign": [2],// 例外オブジェクトの上書きを許可しない 62 | "no-extra-boolean-cast": [2],// 式ですでに真偽値に強制変換されるようなコンテキストでの2重否定を許可しない 63 | "no-extra-parens": [2],// 不要な括弧を許可しない 64 | "no-extra-semi": [2],// 不要なセミコロンを許可しない 65 | "no-func-assign": [2],// 関数への代入、上書きを許可しない 66 | "no-inner-declarations": [2],// ファーストレベル以外での関数宣言を許可しない 67 | "no-invalid-regexp": [2],// 無効な正規表現を許可しない 68 | "no-irregular-whitespace": [2],// 無効なスペースを許可しない 69 | "no-negated-in-lhs": [2],// in演算子での左オペランドの否定を許可しない 70 | "no-obj-calls": [2],// グローバルオブジェクトを関数として呼び出すことを許可しない 71 | "no-regex-spaces": [2],// 正規表現リテラルで複数のスペースを許可しない 72 | "no-reserved-keys": [2],// オブジェクトのキーに予約語を使用することを許可しない 73 | "no-sparse-arrays": [2],// スカスカの配列を許可しない 74 | "no-unreachable": [2],// 決して到達することのないコードを許可しない 75 | "use-isnan": [2],// NaNでの比較を許可しない 76 | "valid-jsdoc": [2],// 無効な、不完全なJSDocコメントを許可しない 77 | "valid-typeof": [2],// 有効な文字列以外とtypeofの比較を許可しない 78 | 79 | // Best Practices 80 | "accessor-pairs": [2],// setterを持ってgetterを持たないオブジェクトの作成を許可しない 81 | "block-scoped-var": [2],// 宣言しているコンテキストの外で使用されている変数を許可しない 82 | "complexity": [2, 2],// 循環的複雑度と、その閾値 83 | "consistent-return": [2],// 何も値を返さない(undefined)ステートメントと値を返すステートメントの混在を許可しない 84 | "curly": [2],// 中括弧の省略を許可しない 85 | "default-case": [2],//Swith文でのdefaultの省略を許可しない 86 | "dot-notation": [2],//プロパティへのアクセスにブラケット記法を許可しない 87 | "dot-location": [2],// 一貫性のない改行前、改行後のドットを許可しない 88 | "eqeqeq": [2],// 等価演算子を許可しない 89 | "guard-for-in": [2],// プロトタイプチェーンで継承したプロパティをフィルタリングしないfor-inを許可しない 90 | "no-alert": [2],// alertの使用を許可しない 91 | "no-caller": [2],// arguments.callee、arguments.callerの使用を許可しない 92 | "no-div-regex": [2],// 除算のように見える正規表現を許可しない 93 | "no-else-return": [2],// 不要なelse節でのreturnを許可しない 94 | "no-empty-label": [2],//繰り返し処理やswitch文以外に対してのラベルの使用を許可しない 95 | "no-eq-null": [2],// 等価演算子でのnull比較を許可しない 96 | "no-eval": [2],// evalの使用を許可しない 97 | "no-extend-native": [2],// ネイティブオブジェクトの拡張を許可しない 98 | "no-extra-bind": [2],// 不要なbindの使用を許可しない 99 | "no-fallthrough": [2],// フォールスルーの不足を許可しない 100 | "no-floating-decimal": [2],// 浮動小数点のドットの前後の省略を許可しない 101 | "no-implied-eval": [2],// 暗黙のevalを許可しない 102 | "no-iterator": [2],// __iterator__の使用を許可しない 103 | "no-labels": [2],// ラベルをつけたステートメントを許可しない 104 | "no-lone-blocks": [2],// 不要なブロックを許可しない 105 | "no-loop-func": [2],// ループの中で関数をつくることを許可しない 106 | "no-multi-spaces": [2],// 複数のスペースを許可しない 107 | "no-multi-str": [2],// バックスラッシュつなぎの複数行の文字列を許可しない 108 | "no-native-reassign": [2],// ネイティブオブジェクトへの再代入を許可しない 109 | "no-new-func": [2],// Functionコンストラクタの使用を許可しない 110 | "no-new-wrappers": [2],// プリミティブ型のラッパーオブジェクトの使用を許可しない 111 | "no-new": [2],// 変数に代入せずnew演算子を使用することを許可しない 112 | "no-octal-escape": [2],// 8進数のエスケープシーケンスの使用を許可しない 113 | "no-octal": [2],// 8進数リテラルの使用を許可しない 114 | "no-param-reassign": [2],// 関数の引数に対する再代入を許可しない 115 | "no-process-env": [2],// Node.jsのprocess.envの使用を許可しない 116 | "no-proto": [2],// __proto__の使用を許可しない 117 | "no-redeclare": [2],// 同じ変数を繰り返し宣言することを許可しない 118 | "no-return-assign": [2],// returnステートメントでの代入を許可しない 119 | "no-script-url": [2],// javascript:URLの使用を許可しない 120 | "no-self-compare": [2],// 自分自身との比較を許可しない 121 | "no-sequences": [2],// カンマ演算子の使用を許可しない(for文初期化や括弧で囲われたシーケンスなどは例外) 122 | "no-throw-literal": [2],// リテラルを投げることを許可しない 123 | "no-unused-expressions": [2],// 使用することのない式を許可しない 124 | "no-void": [2],// voidの使用を許可しない 125 | "no-warning-comments": [2],// TODOやFIXMEのような開発中ととれるコメントを許可しない 126 | "no-with": [2],// withの使用を許可しない 127 | "radix": [2],// parseIntの引数の基数を省略することを許可しない 128 | "vars-on-top": [2],// 関数スコープの最上部で変数宣言をまとめないことを許可しない 129 | "wrap-iife": [2],// 即時関数を括弧で囲わないことを許可しない 130 | "yoda": [2],// 条件の値が左辺にくる条件式(ヨーダ)を許可しない 131 | 132 | // Strict Mode 133 | "strict": [2, "global"],// Strictモードのモード指定 134 | 135 | // Variables 136 | "no-catch-shadow": [2],// catch句の引数を上位スコープで変数宣言することを許可しない 137 | "no-delete-var": [2],// 変数に対するdeleteの使用を許可しない 138 | "no-label-var": [2],// 変数名をラベルに使用することを許可しない 139 | "no-shadow-restricted-names": [2],// グローバルオブジェクトのプロパティに対するシャドーイングを許可しない 140 | "no-shadow": [2],// シャドーイングを許可しない 141 | "no-undef-init": [2],// undefinedによる初期化を許可しない 142 | "no-unused-vars": [2],// 使用することのない変数を許可しない 143 | "no-use-before-define": [2],// 定義する前に使用することを許可しない 144 | 145 | // Node.js 146 | "handle-callback-err": [2],// コールバックパターンでのエラーハンドリングの省略を許可しない 147 | "no-mixed-requires": [2],// requireの変数と他の変数を一緒に変数宣言することを許可しない 148 | "no-new-require": [2],// requireしたものを直接new演算子で使わない 149 | "no-path-concat": [2],// __dirname/__filenameを使うとき、文字列の連結を許可しない 150 | "no-process-exit": [2],// process.exit()の使用を許可しない 151 | "no-restricted-modules": [2, "fs"],// 特定のモジュールの利用を許可しない 152 | "no-sync": [2],// 同期処理を許可しない 153 | 154 | // Stylistic Issues 155 | "array-bracket-spacing": [2, "never"],// []の中でスペースを許可する(always)/しない(never) 156 | "brace-style": [2],// 特定の波括弧のスタイルのみ許可する 157 | "camelcase": [2],// キャメルケースの命名のみ許可する 158 | "comma-spacing": [2, {// カンマ前後のスペースの有/無を許可する 159 | "before": false, 160 | "after": true 161 | }], 162 | "comma-style": [2, "last"],// カンマのスタイル(行頭/行末)を指定する 163 | "computed-property-spacing": [2, "never"],// computedプロパティの前後のスペースの有/無を許可する 164 | "consistent-this": [2],// 一貫性のないthisのエイリアスを許可しない 165 | "eol-last": [2],// ファイルの最後に空白行を要求する 166 | "func-names": [2],// 名前付き関数式を要求する 167 | "func-style": [2, "expression"],// 関数宣言か関数式かスタイルを統一することを要求する 168 | "indent": [2, "tab"],// インデントをタブかスペースn個かを指定する 169 | "key-spacing": [2, {// オブジェクトリテラルのコロンの前後にスペースの有/無を許可しない 170 | "beforeColon": false, 171 | "afterColon": true 172 | }], 173 | "lines-around-comment": [2, {// コメントの前後に空白行を入れることを要求する 174 | "beforeBlockComment": true, 175 | "beforeLineComment": true 176 | }], 177 | "linebreak-style": [2],// 改行コードの混合を許可しない 178 | "max-nested-callbacks": [2, 3],// コールバック関数のネストレベルをn以上許可しない 179 | "new-cap": [2],// 小文字始まりのコンストラクタ関数を許可しない 180 | "new-parens": [2],// 括弧付きでないコンストラクタの呼び出しを許可しない 181 | "newline-after-var": [2, "always"],// 変数宣言の直後に空白行を置くことを要求する 182 | "no-array-constructor": [2],// 複数の引数をもったArrayコンストラクタの使用を許可しない 183 | "no-continue": [2],// continueの使用を許可しない 184 | "no-inline-comments": [2],// コードと同じ行にコメントを書くことを許可しない 185 | "no-lonely-if": [2],// else if に置き換え可能なelseブロックの中でのif文を許可しない 186 | "no-mixed-spaces-and-tabs": [2],// スペースとタブの混合を許可しない 187 | "no-multiple-empty-lines": [2],// 連続した空白行を許可しない 188 | "no-nested-ternary": [2],// 三項演算子のネストを許可しない 189 | "no-new-object": [2],// Objectコンストラクタを許可しない 190 | "no-spaced-func": [2],// 関数を実行するとき、関数と括弧の間にスペースを入れることを許可しない 191 | "no-ternary": [2],// 三項演算子の使用を許可しない 192 | "no-trailing-spaces": [2],// 行末の不要なスペースを許可しない 193 | "no-underscore-dangle": [2],// 識別子の先頭・末尾の_を許可しない 194 | "no-unneeded-ternary": [2],// Booleanリテラルを返す、不要な三項演算子を許可しない 195 | "object-curly-spacing": [2, "never"],// オブジェクトリテラルの波括弧の中でスペースの有/無を許可しない 196 | "one-var": [2, "always"],// スコープ毎に変数宣言を1つしか許可しない 197 | "operator-assignment": [2],// 演算子でショートハンドに置き換え可能な場合に置き換えることを要求する 198 | "operator-linebreak": [2, "before"],// 演算子を改行前/後につけるスタイルに統一する 199 | "padded-blocks": [2, "always"],// ブロックの中で最初と最後に空白行を入れないことを許可しない 200 | "quote-props": [2, "always"],// オブジェクトのプロパティをクォーテーションで囲わないことを許可しない 201 | "quotes": [2, "single", "avoid-escape"],// クォーテーションのルールを指定する 202 | "semi-spacing": [2, {// セミコロン前後のスペース有無を指定する 203 | "before": false, 204 | "after": true 205 | }], 206 | "semi": [2, "always"],// セミコロンの省略を許可しない 207 | "sort-vars": [2],// まとめて宣言する変数がアルファベット順でないことを許可しない 208 | "space-after-keywords": [2],// ifやforのようなキーワードの直後にスペースを入れないことを許可しない 209 | "space-before-blocks": [2, "always"],// ブロックの括弧の直前にスペースを入れないことを許可しない 210 | "space-before-function-paren": [2, "always"],// 関数名かfunctionキーワードと開き括弧の間にスペース有無を指定する 211 | "space-in-parens": [2, "never"],// 括弧の中で最初と最後のスペース有無を指定する 212 | "space-infix-ops": [2],// 二項演算子の前後にスペースを入れないことを許可しない 213 | "space-return-throw-case": [2],//return、throw、caseの直後にスペースを入れないことを許可しない 214 | "space-unary-ops": [2],// 単項演算子の前後にスペース有無を指定する 215 | "spaced-comment": [2],// コメントの直前にスペースorタブの有無を指定する 216 | "wrap-regex": [2],// 括弧で囲われていない正規表現リテラルを許可しない 217 | 218 | // ES6 219 | "constructor-super": [2],// 無効なsuper()の呼び出しを許可しない 220 | "generator-star-spacing": [2, {// generatorsの*の前後のスペース有無を指定する 221 | "before": true, 222 | "after": false 223 | }], 224 | "no-this-before-super": [2],// super()を呼び出す前のthis/superを許可しない 225 | "no-var": [2],// varの使用を許可しない 226 | "object-shorthand": [2, "always"],// objectリテラルのショートハンドを強制する 227 | "prefer-const": [2],// letで宣言されている変数で、変更されることのないものに対してconstへの変更を強制する 228 | 229 | // Legacy 230 | "max-depth": [2, 2],// ブロックのネストをn個以上許可しない 231 | "max-len": [2, 80, 2],// 1行にn以上の文字数を許可しない 232 | "max-params": [2, 3],// n個以上の引数を許可しない 233 | "max-statements": [2, 3],// 関数内でn個以上のステートメントを許可しない 234 | "no-bitwise": [2],// ビット演算を許可しない 235 | "no-plusplus": [2]// ++/--の単項演算子の使用を許可しない 236 | } 237 | } 238 | --------------------------------------------------------------------------------