
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you 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.

# Note:
# If eslint does not work in VSCode, please check:
# (1) Whether "@typescript-eslint/eslint-plugin" and "@typescript-eslint/parser"
# are npm installed locally. Should better in the same version.
# (2) Whether "VSCode ESlint extension" is installed.
# (3) If the project folder is not the root folder of your working space, please
# config the "VSCode ESlint extension" in "settings":
# ```json
# "eslint.workingDirectories": [{"mode": "auto"}]
# ```
# Note that it should be "workingDirectories" rather than "WorkingDirectories".

root: true
rules:
    # Check the rules in: node_modules/@typescript-eslint/eslint-plugin/README.md
    no-console:
        - 2
        -
            allow:
                - "warn"
                - "error"
    prefer-const: 1
    no-constant-condition: 0
    comma-dangle: 0
    no-debugger: 2
    no-dupe-keys: 2
    no-empty-character-class: 2
    no-ex-assign: 2
    no-extra-boolean-cast: 0
    no-func-assign: 2
    no-inner-declarations: 2
    no-invalid-regexp: 2
    no-negated-in-lhs: 2
    no-obj-calls: 2
    no-sparse-arrays: 2
    no-unreachable: 2
    use-isnan: 2
    valid-typeof: 2
    block-scoped-var: 2
    curly:
        - 2
        - "all"
    eqeqeq:
        - 2
        - "allow-null"
    guard-for-in: 2
    no-else-return: 0
    no-labels:
        - 2
        -
            allowLoop: true
    no-eval: 2
    no-extend-native: 2
    no-extra-bind: 0
    no-implied-eval: 2
    no-iterator: 2
    no-irregular-whitespace: 2
    no-lone-blocks: 2
    no-loop-func: 2
    no-multi-str: 2
    no-native-reassign: 2
    no-new-wrappers: 2
    no-octal: 2
    no-octal-escape: 2
    no-proto: 2
    no-self-compare: 2
    no-unneeded-ternary: 2
    no-with: 2
    radix: 2
    wrap-iife:
        - 2
        - "any"
    no-delete-var: 2
    no-dupe-args: 2
    no-duplicate-case: 2
    no-label-var: 2
    no-shadow-restricted-names: 2
    no-undef: 2
    no-undef-init: 2
    "no-use-before-define": "off"
    "@typescript-eslint/no-use-before-define": 0
    brace-style:
        - 2
        - "stroustrup"
        - {}
    comma-spacing:
        - 2
        -
            before: false
            after: true
    comma-style:
        - 2
        - "last"
    new-parens: 2
    no-array-constructor: 2
    no-multi-spaces:
        - 1
        -
            ignoreEOLComments: true
            exceptions:
                Property: true
    no-new-object: 2
    no-trailing-spaces: 2
    no-extra-parens:
        - 2
        - "functions"
    no-mixed-spaces-and-tabs: 2
    one-var:
        - 2
        - "never"
    operator-linebreak:
        - 2
        - "before"
        -
            overrides:
                "=": "after"
    "quotes": "off"
    "@typescript-eslint/quotes":
        - 2
        - "single"
    "semi": "off"
    "@typescript-eslint/semi":
        - 2
        - "always"
    semi-spacing: 2
    keyword-spacing: 2
    key-spacing:
        - 2
        -
            beforeColon: false
            afterColon: true
    "space-before-function-paren": "off"
    "@typescript-eslint/space-before-function-paren":
        - 2
        -
            anonymous: "always"
            named: "never"
    space-before-blocks:
        - 2
        - "always"
    computed-property-spacing:
        - 2
        - "never"
    space-in-parens:
        - 2
        - "never"
    space-unary-ops: 2
    spaced-comment: "error"

    max-nested-callbacks:
        - 1
        - 5
    max-depth:
        - 1
        - 6
    max-len:
        - 2
        - 120
        - 4
        -
            ignoreUrls: true
            ignoreComments: true
    max-params:
        - 1
        - 15

    space-infix-ops: 2
    dot-notation:
        - 2
        -
            allowKeywords: true
            allowPattern: "^catch$"

    arrow-spacing: 2
    constructor-super: 2
    no-confusing-arrow:
        - 2
        -
            allowParens: true
    no-class-assign: 2
    no-const-assign: 2
    # no-dupe-class-members: 2
    no-this-before-super: 0
    no-var: 2
    no-duplicate-imports: 2
    prefer-rest-params: 0
    unicode-bom: 2
    max-statements-per-line: 2

    no-useless-constructor: 0

    "func-call-spacing": "off"
    "@typescript-eslint/func-call-spacing": "error"

    "no-unused-vars": "off"
    "@typescript-eslint/no-unused-vars":
        - 1
        -
            vars: "local"
            args: "none"
    # Avoid dangerous usage of globals.
    "no-restricted-globals":
        - 2
        - "event"
        - "name"
        - "length"
        - "orientation"
        - "top"
        - "parent"
        - "location"
        - "closed"