diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..d93ead2 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,16 @@ +# editorconfig.org +root = true + +[*] +indent_style = tab +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true + +[{package.json,.travis.yml,bower.json,.eslintrc}] +indent_style = space +indent_size = 2 + +[*.md] +trim_trailing_whitespace = false diff --git a/.eslintrc b/.eslintrc index f07dc1d..89dd237 100644 --- a/.eslintrc +++ b/.eslintrc @@ -1,202 +1,3 @@ { - "env": { - "browser": true, - "jquery": true, - "node": true, - "es6": true - }, - "parserOptions": { - "ecmaFeatures": { - "arrowFunctions": true, - "blockBindings": true, - "classes": true, - "destructuring": true, - "forOf": true, - "generators": true, - "modules": true, - "objectLiteralComputedProperties": true, - "objectLiteralShorthandMethods": true, - "objectLiteralShorthandProperties": true, - "templateStrings": true - } - }, - "globals": { - "require": true, - "describe": true, - "description": true, - "module": true, - "chai": true, - "it": true - }, - "rules": { - "accessor-pairs": [2], - "block-scoped-var": [2], - "brace-style": [2], - "callback-return": [2, ["callback", "cb", "next"]], - "camelcase": [2], - "comma-dangle": [2], - "comma-spacing": [2, {"before": false, "after": true}], - "comma-style": [2, "last"], - "complexity": [2, 20], - "consistent-return": [0], - "consistent-this": [2, "self"], - "constructor-super": [2], - "curly": [2], - "default-case": [2], - "dot-notation": [2], - "dot-location": [2], - "eqeqeq": [2], - "eol-last": [2], - "func-style": [2, "expression"], - "global-require": [2], - "guard-for-in": [0], - "handle-callback-err": [2, "^err(or)?$"], - "id-length": [0], - "id-match": [2, ""], - "indent": [2, "tab", {"SwitchCase": 1}], - "init-declarations": [0], - "keyword-spacing": [2], - "max-depth": [2, 6], - "max-len": [2, 100, 4], - "max-nested-callbacks": [0], - "max-params": [2, 3], - "max-statements": [0], - "new-cap": [0], - "new-parens": [2], - "newline-after-var": [2], - "no-alert": [2], - "no-array-constructor": [2], - "no-bitwise": [0], - "no-caller": [2], - "no-case-declarations": [2], - "no-catch-shadow": [2], - "no-class-assign": [2], - "no-cond-assign": [2], - "no-console": [2], - "no-const-assign": [1], - "no-constant-condition": [0], - "no-continue": [0], - "no-control-regex": [2], - "no-debugger": [2], - "no-delete-var": [2], - "no-div-regex": [0], - "no-dupe-args": [2], - "no-dupe-class-members": [2], - "no-dupe-keys": [2], - "no-duplicate-case": [2], - "no-else-return": [0], - "no-empty-character-class": [2], - "no-empty-pattern": [2], - "no-empty": [2], - "no-eq-null": [2], - "no-eval": [2], - "no-ex-assign": [2], - "no-extend-native": [2], - "no-extra-bind": [2], - "no-extra-boolean-cast": [2], - "no-extra-parens": [2], - "no-extra-semi": [2], - "no-fallthrough": [2], - "no-floating-decimal": [2], - "no-func-assign": [2], - "no-implicit-coercion": [2], - "no-implicit-globals": [0], - "no-implied-eval": [2], - "no-inline-comments": [0], - "no-inner-declarations": [2], - "no-invalid-regexp": [2], - "no-invalid-this": [0], - "no-irregular-whitespace": [2], - "no-iterator": [2], - "no-label-var": [2], - "no-labels": [0], - "no-lone-blocks": [2], - "no-lonely-if": [2], - "no-loop-func": [2], - "no-magic-numbers": [0], - "no-mixed-requires": [0], - "no-multi-spaces": [2], - "no-mixed-spaces-and-tabs": [2], - "no-multi-str": [2], - "no-multiple-empty-lines": [2], - "no-native-reassign": [2], - "no-negated-condition": [0], - "no-negated-in-lhs": [2], - "no-nested-ternary": [2], - "no-new-func": [0], - "no-new-object": [2], - "no-new-require": [0], - "no-new-wrappers": [2], - "no-new": [2], - "no-obj-calls": [2], - "no-octal-escape": [2], - "no-octal": [2], - "no-param-reassign": [0], - "no-path-concat": [2], - "no-plusplus": [0], - "no-process-env": [2], - "no-process-exit": [0], - "no-proto": [2], - "no-redeclare": [2], - "no-regex-spaces": [2], - "no-restricted-imports": [0], - "no-restricted-syntax": [0], - "no-return-assign": [2], - "no-script-url": [2], - "no-self-compare": [2], - "no-sequences": [2], - "no-shadow-restricted-names": [2], - "no-shadow": [2], - "no-spaced-func": [2], - "no-sparse-arrays": [2], - "no-sync": [0], - "no-ternary": [0], - "no-this-before-super": [2], - "no-throw-literal": [2], - "no-trailing-spaces": [2], - "no-undef-init": [2], - "no-undef": [2], - "no-undefined": [0], - "no-unexpected-multiline": [2], - "no-unneeded-ternary": [2], - "no-unreachable": [2], - "no-unused-expressions": [2], - "no-unused-vars": [2], - "no-use-before-define": [0], - "no-useless-call": [2], - "no-useless-concat": [2], - "no-var": [0], - "no-void": [0], - "no-with": [2], - "no-warning-comments": [2], - "object-shorthand": [0], - "one-var": [0], - "operator-assignment": [2, "always"], - "prefer-arrow-callback": [0], - "prefer-const": [0], - "prefer-reflect": [0], - "prefer-rest-params": [0], - "prefer-spread": [0], - "prefer-template": [0], - "quotes": [2, "single"], - "quote-props": [0], - "require-yield": [0], - "semi-spacing": [2], - "semi": [2, "always"], - "sort-imports": [0], - "sort-vars": [0], - "space-before-blocks": [2], - "space-before-function-paren": [2, "never"], - "space-in-parens": [2, "always"], - "space-infix-ops": [2], - "space-unary-ops": [2], - "strict": [2, "safe"], - "use-isnan": [2], - "valid-jsdoc": [2], - "valid-typeof": [2], - "vars-on-top": [0], - "wrap-iife": [2, "any"], - "wrap-regex": [2], - "yoda": [2, "always"] - } -} + "extends": "./index.js" +} \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..83f54fc --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +node_modules/ +.DS_Store +npm-debug.log +.idea/ diff --git a/index.js b/index.js new file mode 100644 index 0000000..2d6c655 --- /dev/null +++ b/index.js @@ -0,0 +1,23 @@ +module.exports = { + + extends: [ + './rules/best-practices', + './rules/errors', + './rules/node', + './rules/style', + './rules/variables', + './rules/es6', + './rules/imports', + ].map(require.resolve), + + parserOptions: { + ecmaVersion: 2017, + sourceType: 'module', + ecmaFeatures: { + experimentalObjectRestSpread: true, + }, + }, + rules: { + strict: 'error', + }, +}; \ No newline at end of file diff --git a/package.json b/package.json index bcd903c..158d532 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "eslint-config-allenmoore", "version": "1.1.0", "description": "A shareable ESLint configuration", - "main": ".eslintrc", + "main": "index.js", "repository": { "type": "git", "url": "git+https://github.com/allenmoore/eslint-config.git" @@ -16,10 +16,19 @@ "keywords": [ "eslint", "eslint-config", - "allenmoore" + "allenmoore", + "javascript", + "config", + "styleguide" ], "devDependencies": { - "eslint": "^2.0.0" + "eslint": "^3.14.0", + "eslint-find-rules": "^1.14.3", + "eslint-plugin-import": "^2.2.0" + }, + "peerDependencies": { + "eslint": "^3.14.0", + "eslint-plugin-import": "^2.2.0" }, "eslintContig": { "extends": "./.eslintrc" diff --git a/rules/best-practices.js b/rules/best-practices.js new file mode 100644 index 0000000..b8db92e --- /dev/null +++ b/rules/best-practices.js @@ -0,0 +1,107 @@ +module.exports = { + rules: { + 'accessor-pairs': 'off', + 'block-scoped-var': 'error', + 'complexity': ['off', 11], + 'class-methods-use-this': 'error', + 'consistent-return': 'error', + 'curly': ['error', 'all'], + 'default-case': ['error', { commentPattern: '^no default$' }], + 'dot-notation': ['error', { allowKeywords: true }], + 'dot-location': ['error', 'property'], + 'eqeqeq': ['error', 'always'], + 'guard-for-in': 'off', + 'no-alert': 'error', + 'no-caller': 'error', + 'no-case-declarations': 'error', + 'no-div-regex': 'error', + 'no-else-return': 'error', + 'no-empty-function': ['error', { + allow: ['arrowFunctions', 'functions', 'methods'] + }], + 'no-empty-pattern': 'error', + 'no-eq-null': 'error', + 'no-eval': 'error', + 'no-extend-native': 'error', + 'no-extra-bind': 'error', + 'no-extra-label': 'error', + 'no-fallthrough': 'error', + 'no-floating-decimal': 'error', + 'no-global-assign': ['error', {exceptions: []}], + 'no-implicit-coercion': ['off', { + boolean: true, + number: true, + string: true, + allow: [] + }], + 'no-implicit-globals': 'off', + 'no-implied-eval': 'error', + 'no-invalid-this': 'off', + 'no-iterator': 'error', + 'no-labels': ['error', { + allowLoop: false, + allowSwitch: false + }], + 'no-lone-blocks': 'error', + 'no-loop-func': 'error', + 'no-magic-numbers': ['off', { + ignore: [], + ignoreArrayIndexes: true, + enforceConst: true, + detectObjects: false, + }], + 'no-multi-str': 'error', + 'no-native-reassign': 'error', + 'no-new': 'error', + 'no-new-func': 'error', + 'no-new-wrappers': 'error', + 'no-octal': 'error', + 'no-octal-escape': 'error', + 'no-param-reassign': ['error', { + props: true + }], + 'no-proto': 'error', + 'no-redeclare': 'error', + 'no-restricted-properties': ['error', { + object: 'arguments', + property: 'callee', + message: 'arguments.callee is deprecated', + }, { + property: '__defineGetter__', + message: 'Please use Object.defineProperty instead.', + }, { + property: '__defineSetter__', + message: 'Please use Object.defineProperty instead.', + }, { + object: 'Math', + property: 'pow', + message: 'Use the exponentiation operator (**) instead.', + }], + 'no-return-assign': 'error', + 'no-return-await': 'error', + 'no-script-url': 'error', + 'no-self-assign': 'error', + 'no-self-compare': 'error', + 'no-sequences': 'error', + 'no-throw-literal': 'error', + 'no-unmodified-loop-condition': 'error', + 'no-unused-expressions': ['error', { + allowShortCircuit: false, + allowTernary: false + }], + 'no-unused-labels': 'error', + 'no-useless-call': 'error', + 'no-useless-concat': 'error', + 'no-useless-escape': 'error', + 'no-useless-return': 'error', + 'no-void': 'error', + 'no-with': 'error', + 'radix': 'error', + 'require-await': 'off', + 'vars-on-top': 'error', + 'wrap-iife': ['error', 'any', { + functionPrototypeMethods: false + }], + 'yoda': ['error', 'always'] + } +}; \ No newline at end of file diff --git a/rules/errors.js b/rules/errors.js new file mode 100644 index 0000000..3745450 --- /dev/null +++ b/rules/errors.js @@ -0,0 +1,38 @@ +module.exports = { + rules: { + 'comma-dangle': ['error', 'never'], + 'no-await-in-loop': 'error', + 'no-cond-assign': ['error', 'always'], + 'no-console': 'error', + 'no-constant-condition': 'warn', + 'no-control-regex': 'error', + 'no-debugger': 'error', + 'no-dupe-args': 'error', + 'no-dupe-keys': 'error', + 'no-duplicate-case': 'error', + 'no-empty': 'error', + 'no-empty-character-class': 'error', + 'no-ex-assign': 'error', + 'no-extra-boolean-cast': 'error', + 'no-extra-parens': 'error', + 'no-extra-semi': 'error', + 'no-func-assign': 'error', + 'no-inner-declarations': 'error', + 'no-invalid-regexp': 'error', + 'no-irregular-whitespace': 'error', + 'no-obj-calls': 'error', + 'no-prototype-builtins': 'error', + 'no-regex-spaces': 'error', + 'no-sparse-array': 'off', + 'no-template-curly-in-string': 'error', + 'no-unexpected-multiline': 'error', + 'no-unreachable': 'error', + 'no-unsafe-finally': 'error', + 'no-unsafe-negation': 'error', + 'use-isnan': 'error', + 'valid-jsdoc': 'error', + 'valid-typeof': ['error', { + requireStringLiterals: true + }] + } +}; diff --git a/rules/es6.js b/rules/es6.js new file mode 100644 index 0000000..424abba --- /dev/null +++ b/rules/es6.js @@ -0,0 +1,65 @@ +module.exports = { + rules: { + 'arrow-body-style': ['error', 'as-needed', { + requireReturnForObjectLiteral: false, + }], + 'arrow-parens': ['error', 'as-needed', { + requireForBlockBody: true, + }], + 'arrow-spacing': ['error', { before: true, after: true }], + 'constructor-super': 'error', + 'generator-star-spacing': ['error', { before: false, after: true }], + 'no-class-assign': 'error', + 'no-confusing-arrow': ['error', { + allowParens: true, + }], + 'no-const-assign': 'error', + 'no-dupe-class-members': 'error', + 'no-duplicate-imports': 'off', + 'no-new-symbol': 'error', + 'no-restricted-imports': 'off', + 'no-this-before-super': 'error', + 'no-useless-computed-key': 'error', + 'no-useless-constructor': 'error', + 'no-useless-rename': ['error', { + ignoreDestructuring: false, + ignoreImport: false, + ignoreExport: false, + }], + 'no-var': 'error', + 'object-shorthand': ['error', 'always', { + ignoreConstructors: false, + avoidQuotes: true, + }], + 'prefer-arrow-callback': ['error', { + allowNamedFunctions: false, + allowUnboundThis: true, + }], + 'prefer-const': ['error', { + destructuring: 'any', + ignoreReadBeforeAssign: true, + }], + + 'prefer-destructuring': ['off', { + array: true, + object: true, + }, { + enforceForRenamedProperties: false, + }], + 'prefer-numeric-literals': 'error', + 'prefer-reflect': 'off', + 'prefer-rest-params': 'error', + 'prefer-spread': 'error', + 'prefer-template': 'error', + 'require-yield': 'error', + 'rest-spread-spacing': ['error', 'never'], + 'sort-imports': ['off', { + ignoreCase: false, + ignoreMemberSort: false, + memberSyntaxSortOrder: ['none', 'all', 'multiple', 'single'], + }], + 'symbol-description': 'error', + 'template-curly-spacing': 'error', + 'yield-star-spacing': ['error', 'after'] + } +}; \ No newline at end of file diff --git a/rules/imports.js b/rules/imports.js new file mode 100644 index 0000000..2fd3c83 --- /dev/null +++ b/rules/imports.js @@ -0,0 +1,86 @@ +module.exports = { + env: { + es6: true + }, + + parserOptions: { + ecmaVersion: 6, + sourceType: 'module' + }, + + plugins: [ + 'import' + ], + + settings: { + 'import/resolver': { + node: { + extensions: ['.js', '.json'] + } + }, + 'import/extensions': [ + '.js', + '.jsx', + ], + 'import/core-modules': [], + 'import/ignore': [ + 'node_modules', + '\\.(coffee|scss|css|less|hbs|svg|json)$', + ], + }, + + rules: { + 'import/no-unresolved': ['error', {commonjs: true, caseSensitive: true}], + 'import/named': 'off', + 'import/default': 'off', + 'import/namespace': 'off', + 'import/export': 'error', + 'import/no-named-as-default': 'error', + 'import/no-named-as-default-member': 'error', + 'import/no-deprecated': 'off', + 'import/no-extraneous-dependencies': ['error', { + devDependencies: [ + 'test/**', + 'tests/**', + 'test.js', + 'test-*.js', + '**/*.test.js', + '**/webpack.config.js', + '**/webpack.config.*.js', + '**/Gulpfile.js', + '**/gulpfile.*.js', + '**/Gruntfile.js' + ], + optionalDependencies: false, + }], + 'import/no-mutable-exports': 'error', + 'import/no-commonjs': 'off', + 'import/no-amd': 'error', + 'import/no-nodejs-modules': 'off', + 'import/first': ['error', 'absolute-first'], + 'import/imports-first': 'off', + 'import/no-duplicates': 'error', + 'import/no-namespace': 'off', + 'import/extensions': ['error', 'always', { + js: 'never', + jsx: 'never', + }], + 'import/order': ['off', { + groups: ['builtin', 'external', 'internal', 'parent', 'sibling', 'index'], + 'newlines-between': 'never', + }], + 'import/newline-after-import': 'error', + 'import/prefer-default-export': 'error', + 'import/no-restricted-paths': 'off', + 'import/max-dependencies': ['off', { max: 10 }], + 'import/no-absolute-path': 'error', + 'import/no-dynamic-require': 'error', + 'import/no-internal-modules': ['off', { + allow: [], + }], + 'import/unambiguous': 'off', + 'import/no-webpack-loader-syntax': 'error', + 'import/no-unassigned-import': 'off', + 'import/no-named-default': 'error', + } +}; \ No newline at end of file diff --git a/rules/node.js b/rules/node.js new file mode 100644 index 0000000..924d0bd --- /dev/null +++ b/rules/node.js @@ -0,0 +1,18 @@ +module.exports = { + env: { + node: true + }, + + rules: { + 'callback-return': ['error', ['callback', 'cb', 'next']], + 'global-require': 'error', + 'handle-callback-err': ['error', '^err(or)?$'], + 'no-mixed-requires': ['off', false], + 'no-new-require': 'error', + 'no-path-concat': 'error', + 'no-process-env': 'error', + 'no-process-exit': 'off', + 'no-restricted-modules': 'off', + 'no-sync': 'off', + } +}; \ No newline at end of file diff --git a/rules/strict.js b/rules/strict.js new file mode 100644 index 0000000..0bc7bc0 --- /dev/null +++ b/rules/strict.js @@ -0,0 +1,5 @@ +module.exports = { + rules: { + strict: ['error', 'safe'] + } +}; \ No newline at end of file diff --git a/rules/style.js b/rules/style.js new file mode 100644 index 0000000..386f350 --- /dev/null +++ b/rules/style.js @@ -0,0 +1,153 @@ +module.exports = { + rules: { + 'array-bracket-spacing': ['error', 'never'], + 'brace-style': ['error', '1tbs', { allowSingleLine: false }], + 'camelcase': ['error', { properties: 'always' }], + 'capitalized-comments': ['error', 'always', { + line: { + ignorePattern: '.*', + ignoreInlineComments: false, + ignoreConsecutiveComments: true, + }, + block: { + ignorePattern: '.*', + ignoreInlineComments: false, + ignoreConsecutiveComments: true, + }, + }], + 'comma-spacing': ['error', { before: false, after: true }], + 'comma-style': ['error', 'last'], + 'computed-property-spacing': ['error', 'never'], + 'consistent-this': ['error', 'self'], + 'eol-last': ['error', 'always'], + 'func-call-spacing': ['error', 'never'], + 'func-name-matching': ['error', 'always'], + 'func-names': 'warn', + 'func-style': ['warn', 'expression'], + 'id-blacklist': ['error', 'data', 'err', 'callback'], + 'id-length': 'off', + 'id-match': 'off', + 'indent': ['error', 'tab'], + 'jsx-quotes': ['error', 'prefer-double'], + 'key-spacing': ['error', { beforeColon: false, afterColon: true }], + 'keyword-spacing': ['error', { + before: true, + after: true, + overrides: { + return: { after: true }, + throw: { after: true }, + case: { after: true } + } + }], + 'line-comment-position': ['off', { + position: 'above', + ignorePattern: '', + applyDefaultPatterns: true, + }], + 'linebreak-style': ['error', 'unix'], + 'lines-around-comment': 'off', + 'lines-around-directive': ['error', { + before: 'always', + after: 'always', + }], + 'max-depth': ['error', 6], + 'max-len': ['error', 100, 4, { + ignoreUrls: true, + ignoreComments: false, + ignoreRegExpLiterals: true, + ignoreStrings: true, + ignoreTemplateLiterals: true, + }], + 'max-lines': 'off', + 'max-nested-callbacks': 'off', + 'max-params': ['error', 3], + 'max-statements': ['off', 10], + 'max-statements-per-line': ['error', { max: 1 }], + 'multiline-ternary': ['off', 'never'], + 'new-cap': ['error', { + newIsCap: true, + newIsCapExceptions: [], + capIsNew: false + }], + 'new-parens': 'error', + 'newline-after-var': ['error', 'always'], + 'newline-before-return': 'error', + 'newline-per-chained-call': ['error', { ignoreChainWithDepth: 4 }], + 'no-array-constructor': 'error', + 'no-bitwise': 'error', + 'no-continue': 'error', + 'no-inline-comments': 'off', + 'no-lonely-if': 'error', + 'no-mixed-operators': ['error', { + groups: [ + ['+', '-', '*', '/', '%', '**'], + ['&', '|', '^', '~', '<<', '>>', '>>>'], + ['==', '!=', '===', '!==', '>', '>=', '<', '<='], + ['&&', '||'], + ['in', 'instanceof'] + ], + allowSamePrecedence: false + }], + 'no-mixed-spaces-and-tabs': 'error', + 'no-multiple-empty-lines': 'error', + 'no-negated-condition': 'off', + 'no-nested-ternary': 'error', + 'no-new-object': 'error', + 'no-plusplus': ['error', { allowForLoopAfterthoughts: true }], + 'no-spaced-func': 'error', + 'no-ternary': 'off', + 'no-trailing-spaces': ['error', { skipBlankLines: true }], + 'no-unneeded-ternary': ['error', { defaultAssignment: false }], + 'no-whitespace-before-property': 'error', + 'object-curly-spacing': ['error', 'never'], + 'object-curly-newline': ['error', { multiline: true }], + 'object-property-newline': 'error', + 'one-var': ['error', 'always'], + 'one-var-declaration-per-line': ['error', 'always'], + 'operator-assignment': ['error', 'always'], + 'operator-linebreak': 'off', + 'padded-blocks': ['error', 'never'], + 'quote-props': ['error', 'as-needed', { + keywords: false, + unnecessary: true, + numbers: false + }], + 'quotes': ['error', 'single', { avoidEscape: true }], + 'require-jsdoc': ['error', { + 'require': { + 'FunctionDeclaration': true, + 'MethodDefinition': true, + 'ClassDeclaration': true, + 'ArrowFunctionExpression': true + } + }], + 'semi': ['error', 'always'], + 'semi-spacing': ['error', { + before: false, + after: true + }], + 'sort-keys': 'off', + 'sort-vars': 'off', + 'space-before-blocks': 'error', + 'space-before-function-paren': ['error', 'never'], + 'space-in-parens': ['error', 'always'], + 'space-infix-ops': 'error', + 'space-unary-ops': ['error', { + words: true, + nonwords: false, + }], + 'spaced-comment': ['error', 'always', { + line: { + exceptions: ['-', '+'], + markers: ['=', '!'], + }, + block: { + exceptions: ['-', '+'], + markers: ['=', '!'], + balanced: false, + } + }], + 'unicode-bom': ['error', 'never'], + 'wrap-regex': 'error' + } +}; diff --git a/rules/variables.js b/rules/variables.js new file mode 100644 index 0000000..2cd8b7f --- /dev/null +++ b/rules/variables.js @@ -0,0 +1,16 @@ +module.exports = { + rules: { + 'init-declarations': 'off', + 'no-catch-shadow': 'error', + 'no-delete-var': 'error', + 'no-label-var': 'error', + 'no-restricted-globals': 'off', + 'no-shadow': 'error', + 'no-shadow-restricted-names': 'error', + 'no-undef': 'error', + 'no-undef-init': 'error', + 'no-undefined': 'off', + 'no-unused-vars': 'error', + 'no-use-before-define': 'error' + } +}; \ No newline at end of file