blob: ba2c40d5124ff897707a7746c74d621cc9699361 [file] [log] [blame]
/**
* @license
* Copyright (C) 2020 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
// Do not add any bazel-specific properties in this file to keep it clean.
// Please add such properties to the .eslintrc-bazel.js file
const path = require('path');
module.exports = {
extends: ['eslint:recommended', 'google'],
parserOptions: {
ecmaVersion: 9,
sourceType: 'module',
},
env: {
browser: true,
es6: true,
},
rules: {
// https://eslint.org/docs/rules/no-confusing-arrow
'no-confusing-arrow': 'error',
// https://eslint.org/docs/rules/newline-per-chained-call
'newline-per-chained-call': ['error', {ignoreChainWithDepth: 2}],
// https://eslint.org/docs/rules/arrow-body-style
'arrow-body-style': ['error', 'as-needed',
{requireReturnForObjectLiteral: true}],
// https://eslint.org/docs/rules/arrow-parens
'arrow-parens': ['error', 'as-needed'],
// https://eslint.org/docs/rules/block-spacing
'block-spacing': ['error', 'always'],
// https://eslint.org/docs/rules/brace-style
'brace-style': ['error', '1tbs', {allowSingleLine: true}],
// https://eslint.org/docs/rules/camelcase
'camelcase': 'off',
// https://eslint.org/docs/rules/comma-dangle
'comma-dangle': ['error', {
arrays: 'always-multiline',
objects: 'always-multiline',
imports: 'always-multiline',
exports: 'always-multiline',
functions: 'never',
}],
// https://eslint.org/docs/rules/eol-last
'eol-last': 'off',
// https://eslint.org/docs/rules/indent
'indent': ['error', 2, {
MemberExpression: 2,
FunctionDeclaration: {body: 1, parameters: 2},
FunctionExpression: {body: 1, parameters: 2},
CallExpression: {arguments: 2},
ArrayExpression: 1,
ObjectExpression: 1,
SwitchCase: 1,
}],
// https://eslint.org/docs/rules/keyword-spacing
'keyword-spacing': ['error', {after: true, before: true}],
// https://eslint.org/docs/rules/lines-between-class-members
'lines-between-class-members': ['error', 'always'],
// https://eslint.org/docs/rules/max-len
'max-len': [
'error',
80,
2,
{
ignoreComments: true,
ignorePattern: '^import .*;$',
},
],
// https://eslint.org/docs/rules/new-cap
'new-cap': ['error', {
capIsNewExceptions: ['Polymer', 'GestureEventListeners'],
capIsNewExceptionPattern: '^.*Mixin$',
}],
// https://eslint.org/docs/rules/no-console
'no-console': [
'error',
{allow: ['warn', 'error', 'info', 'assert', 'group', 'groupEnd']},
],
// https://eslint.org/docs/rules/no-multiple-empty-lines
'no-multiple-empty-lines': ['error', {max: 1}],
// https://eslint.org/docs/rules/no-prototype-builtins
'no-prototype-builtins': 'off',
// https://eslint.org/docs/rules/no-redeclare
'no-redeclare': 'off',
// https://eslint.org/docs/rules/no-trailing-spaces
'no-trailing-spaces': 'error',
// https://eslint.org/docs/rules/no-irregular-whitespace
'no-irregular-whitespace': 'error',
// https://eslint.org/docs/rules/array-callback-return
'array-callback-return': ['error', {allowImplicit: true}],
// https://eslint.org/docs/rules/no-restricted-syntax
'no-restricted-syntax': [
'error',
{
selector: 'ExpressionStatement > CallExpression > ' +
'MemberExpression[object.name=\'test\'][property.name=\'only\']',
message: 'Remove test.only.',
},
{
selector: 'ExpressionStatement > CallExpression > ' +
'MemberExpression[object.name=\'suite\'][property.name=\'only\']',
message: 'Remove suite.only.',
},
],
// no-undef disables global variable.
// "globals" declares allowed global variables.
// https://eslint.org/docs/rules/no-undef
'no-undef': ['error'],
// https://eslint.org/docs/rules/no-useless-escape
'no-useless-escape': 'off',
// https://eslint.org/docs/rules/no-var
'no-var': 'error',
// https://eslint.org/docs/rules/operator-linebreak
'operator-linebreak': 'off',
// https://eslint.org/docs/rules/object-shorthand
'object-shorthand': ['error', 'always'],
// https://eslint.org/docs/rules/padding-line-between-statements
'padding-line-between-statements': [
'error',
{
blankLine: 'always',
prev: 'class',
next: '*',
},
{
blankLine: 'always',
prev: '*',
next: 'class',
},
],
// https://eslint.org/docs/rules/prefer-arrow-callback
'prefer-arrow-callback': 'error',
// https://eslint.org/docs/rules/prefer-const
'prefer-const': 'error',
// https://eslint.org/docs/rules/prefer-promise-reject-errors
'prefer-promise-reject-errors': 'error',
// https://eslint.org/docs/rules/prefer-spread
'prefer-spread': 'error',
// https://eslint.org/docs/rules/prefer-object-spread
'prefer-object-spread': 'error',
// https://eslint.org/docs/rules/quote-props
'quote-props': ['error', 'consistent-as-needed'],
// https://eslint.org/docs/rules/semi
'semi': ['error', 'always'],
// https://eslint.org/docs/rules/template-curly-spacing
'template-curly-spacing': 'error',
// https://eslint.org/docs/rules/require-jsdoc
'require-jsdoc': 0,
// https://eslint.org/docs/rules/valid-jsdoc
'valid-jsdoc': 0,
// https://github.com/gajus/eslint-plugin-jsdoc#eslint-plugin-jsdoc-rules-check-alignment
'jsdoc/check-alignment': 2,
// https://github.com/gajus/eslint-plugin-jsdoc#eslint-plugin-jsdoc-rules-check-examples
'jsdoc/check-examples': 0,
// https://github.com/gajus/eslint-plugin-jsdoc#eslint-plugin-jsdoc-rules-check-indentation
'jsdoc/check-indentation': 0,
// https://github.com/gajus/eslint-plugin-jsdoc#eslint-plugin-jsdoc-rules-check-param-names
'jsdoc/check-param-names': 0,
// https://github.com/gajus/eslint-plugin-jsdoc#eslint-plugin-jsdoc-rules-check-syntax
'jsdoc/check-syntax': 0,
// https://github.com/gajus/eslint-plugin-jsdoc#eslint-plugin-jsdoc-rules-check-tag-names
'jsdoc/check-tag-names': 0,
// https://github.com/gajus/eslint-plugin-jsdoc#eslint-plugin-jsdoc-rules-check-types
'jsdoc/check-types': 0,
// https://github.com/gajus/eslint-plugin-jsdoc#eslint-plugin-jsdoc-rules-implements-on-classes
'jsdoc/implements-on-classes': 2,
// https://github.com/gajus/eslint-plugin-jsdoc#eslint-plugin-jsdoc-rules-match-description
'jsdoc/match-description': 0,
// https://github.com/gajus/eslint-plugin-jsdoc#eslint-plugin-jsdoc-rules-newline-after-description
'jsdoc/newline-after-description': 2,
// https://github.com/gajus/eslint-plugin-jsdoc#eslint-plugin-jsdoc-rules-no-types
'jsdoc/no-types': 0,
// https://github.com/gajus/eslint-plugin-jsdoc#eslint-plugin-jsdoc-rules-no-undefined-types
'jsdoc/no-undefined-types': 0,
// https://github.com/gajus/eslint-plugin-jsdoc#eslint-plugin-jsdoc-rules-require-description
'jsdoc/require-description': 0,
// https://github.com/gajus/eslint-plugin-jsdoc#eslint-plugin-jsdoc-rules-require-description-complete-sentence
'jsdoc/require-description-complete-sentence': 0,
// https://github.com/gajus/eslint-plugin-jsdoc#eslint-plugin-jsdoc-rules-require-example
'jsdoc/require-example': 0,
// https://github.com/gajus/eslint-plugin-jsdoc#eslint-plugin-jsdoc-rules-require-hyphen-before-param-description
'jsdoc/require-hyphen-before-param-description': 0,
// https://github.com/gajus/eslint-plugin-jsdoc#eslint-plugin-jsdoc-rules-require-jsdoc
'jsdoc/require-jsdoc': 0,
// https://github.com/gajus/eslint-plugin-jsdoc#eslint-plugin-jsdoc-rules-require-param
'jsdoc/require-param': 0,
// https://github.com/gajus/eslint-plugin-jsdoc#eslint-plugin-jsdoc-rules-require-param-description
'jsdoc/require-param-description': 0,
// https://github.com/gajus/eslint-plugin-jsdoc#eslint-plugin-jsdoc-rules-require-param-name
'jsdoc/require-param-name': 2,
// https://github.com/gajus/eslint-plugin-jsdoc#eslint-plugin-jsdoc-rules-require-returns
'jsdoc/require-returns': 0,
// https://github.com/gajus/eslint-plugin-jsdoc#eslint-plugin-jsdoc-rules-require-returns-check
'jsdoc/require-returns-check': 0,
// https://github.com/gajus/eslint-plugin-jsdoc#eslint-plugin-jsdoc-rules-require-returns-description
'jsdoc/require-returns-description': 0,
// https://github.com/gajus/eslint-plugin-jsdoc#eslint-plugin-jsdoc-rules-valid-types
'jsdoc/valid-types': 2,
// https://github.com/gajus/eslint-plugin-jsdoc#eslint-plugin-jsdoc-rules-require-file-overview
'jsdoc/require-file-overview': ['error', {
tags: {
license: {
mustExist: true,
preventDuplicates: true,
},
},
}],
// https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/no-self-import.md
'import/no-self-import': 2,
// The no-cycle rule is slow, because it doesn't cache dependencies.
// Disable it.
// https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/no-cycle.md
'import/no-cycle': 0,
// https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/no-useless-path-segments.md
'import/no-useless-path-segments': 2,
// https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/no-unused-modules.md
'import/no-unused-modules': 2,
// https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/no-default-export.md
'import/no-default-export': 2,
// Prevents certain identifiers being used.
// Prefer flush() over flushAsynchronousOperations().
'id-blacklist': ['error', 'flushAsynchronousOperations'],
},
// List of allowed globals in all files
globals: {
// Polygerrit global variables.
// You must not add anything new in this list!
// Instead export variables from modules
// TODO(dmfilippov): Remove global variables from polygerrit
// Global variables from 3rd party libraries.
// You should not add anything in this list, always try to import
// If import is not possible - you can extend this list
ShadyCSS: 'readonly',
linkify: 'readonly',
security: 'readonly',
},
overrides: [
{
files: ['.eslintrc.js', '.eslintrc-bazel.js'],
env: {
browser: false,
es6: true,
node: true,
},
},
{
// .js-only rules
files: ['**/*.js'],
rules: {
// https://github.com/gajus/eslint-plugin-jsdoc#eslint-plugin-jsdoc-rules-require-param-type
'jsdoc/require-param-type': 2,
// https://github.com/gajus/eslint-plugin-jsdoc#eslint-plugin-jsdoc-rules-require-returns-type
'jsdoc/require-returns-type': 2,
// The rule is required for .js files only, because typescript compiler
// always checks import.
'import/no-unresolved': 2,
'import/named': 2,
},
globals: {
goog: 'readonly',
},
},
{
files: ['**/*.ts'],
extends: [require.resolve('gts/.eslintrc.json')],
rules: {
'no-restricted-imports': ['error', {
name: '@polymer/decorators/lib/decorators',
message: 'Use @polymer/decorators instead',
}],
'@typescript-eslint/no-explicit-any': 'error',
// The following rules is required to match internal google rules
'@typescript-eslint/restrict-plus-operands': 'error',
'@typescript-eslint/no-unused-vars': [
'error',
{argsIgnorePattern: '^_'},
],
// https://github.com/mysticatea/eslint-plugin-node/blob/master/docs/rules/no-unsupported-features/node-builtins.md
'node/no-unsupported-features/node-builtins': 'off',
// Disable no-invalid-this for ts files, because it incorrectly reports
// errors in some cases (see https://github.com/typescript-eslint/typescript-eslint/issues/491)
// At the same time, we are using typescript in a strict mode and
// it catches almost all errors related to invalid usage of this.
'no-invalid-this': 'off',
'node/no-extraneous-import': 'off',
// Typescript already checks for undef
'no-undef': 'off',
'jsdoc/no-types': 2,
},
parserOptions: {
project: path.resolve(__dirname, './tsconfig_eslint.json'),
},
},
{
files: ['*_test.ts'],
rules: {
'@typescript-eslint/no-explicit-any': 'off',
},
},
{
files: ['*.html', 'test.js', 'test-infra.js'],
rules: {
'jsdoc/require-file-overview': 'off',
},
},
{
files: [
'*.html',
'*_test.js',
'a11y-test-utils.js',
],
// Additional global variables allowed in tests
globals: {
// Global variables from 3rd party test libraries/frameworks.
// You can extend this list if you want to use other global
// variables from these libraries and import is not possible
MockInteractions: 'readonly',
_: 'readonly',
axs: 'readonly',
a11ySuite: 'readonly',
assert: 'readonly',
expect: 'readonly',
fixture: 'readonly',
flush: 'readonly',
setup: 'readonly',
sinon: 'readonly',
stub: 'readonly',
suite: 'readonly',
suiteSetup: 'readonly',
suiteTeardown: 'readonly',
teardown: 'readonly',
test: 'readonly',
fixtureFromElement: 'readonly',
fixtureFromTemplate: 'readonly',
},
},
{
files: 'import-href.js',
globals: {
HTMLImports: 'readonly',
},
},
{
files: ['samples/**/*.js'],
globals: {
// Settings for samples. You can add globals here if you want to use it
Gerrit: 'readonly',
Polymer: 'readonly',
},
},
{
files: ['test/functional/**/*.js'],
// Settings for functional tests. These scripts are node scripts.
// Turn off "no-undef" to allow any global variable
env: {
browser: false,
node: true,
es6: false,
},
rules: {
'no-undef': 'off',
},
},
{
files: ['*_html.js', 'gr-icons.js', '*-theme.js', '*-styles.js'],
rules: {
'max-len': 'off',
},
},
{
files: ['*_html.js'],
rules: {
'prettier/prettier': ['error', {
bracketSpacing: false,
singleQuote: true,
}],
},
},
],
plugins: [
'html',
'jsdoc',
'import',
'prettier',
],
settings: {
'html/report-bad-indent': 'error',
'import/resolver': {
node: {},
[path.resolve(__dirname, './.eslint-ts-resolver.js')]: {},
},
},
};