module.exports = { ignorePatterns: [ "test/*.js", "server/modules/*", "src/util.js" ], root: true, env: { browser: true, commonjs: true, es2020: true, node: true, }, extends: [ "eslint:recommended", "plugin:vue/vue3-recommended", "plugin:jsdoc/recommended-error", ], parser: "vue-eslint-parser", parserOptions: { parser: "@typescript-eslint/parser", sourceType: "module", requireConfigFile: false, }, plugins: [ "jsdoc", "@typescript-eslint", ], rules: { "yoda": "error", eqeqeq: [ "warn", "smart" ], "linebreak-style": [ "error", "unix" ], "camelcase": [ "warn", { "properties": "never", "ignoreImports": true }], "no-unused-vars": [ "warn", { "args": "none" }], indent: [ "error", 4, { ignoredNodes: [ "TemplateLiteral" ], SwitchCase: 1, }, ], quotes: [ "error", "double" ], semi: "error", "vue/html-indent": [ "error", 4 ], // default: 2 "vue/max-attributes-per-line": "off", "vue/singleline-html-element-content-newline": "off", "vue/html-self-closing": "off", "vue/require-component-is": "off", // not allow is="style" https://github.com/vuejs/eslint-plugin-vue/issues/462#issuecomment-430234675 "vue/attribute-hyphenation": "off", // This change noNL to "no-n-l" unexpectedly "vue/multi-word-component-names": "off", "no-multi-spaces": [ "error", { ignoreEOLComments: true, }], "array-bracket-spacing": [ "warn", "always", { "singleValue": true, "objectsInArrays": false, "arraysInArrays": false }], "space-before-function-paren": [ "error", { "anonymous": "always", "named": "never", "asyncArrow": "always" }], "curly": "error", "object-curly-spacing": [ "error", "always" ], "object-curly-newline": "off", "object-property-newline": "error", "comma-spacing": "error", "brace-style": "error", "no-var": "error", "key-spacing": "warn", "keyword-spacing": "warn", "space-infix-ops": "error", "arrow-spacing": "warn", "no-trailing-spaces": "error", "no-constant-condition": [ "error", { "checkLoops": false, }], "space-before-blocks": "warn", //"no-console": "warn", "no-extra-boolean-cast": "off", "no-multiple-empty-lines": [ "warn", { "max": 1, "maxBOF": 0, }], "lines-between-class-members": [ "warn", "always", { exceptAfterSingleLine: true, }], "no-unneeded-ternary": "error", "array-bracket-newline": [ "error", "consistent" ], "eol-last": [ "error", "always" ], //"prefer-template": "error", "template-curly-spacing": [ "warn", "never" ], "comma-dangle": [ "warn", "only-multiline" ], "no-empty": [ "error", { "allowEmptyCatch": true }], "no-control-regex": "off", "one-var": [ "error", "never" ], "max-statements-per-line": [ "error", { "max": 1 }], "jsdoc/check-tag-names": [ "error", { "definedTags": [ "link" ] } ], "jsdoc/no-undefined-types": "off", "jsdoc/no-defaults": [ "error", { "noOptionalParamNames": true } ], "jsdoc/require-throws": "warn", "jsdoc/require-jsdoc": [ "error", { "require": { "FunctionDeclaration": true, "MethodDefinition": true, } } ], "jsdoc/no-blank-block-descriptions": "error", "jsdoc/require-returns-description": "warn", "jsdoc/require-returns-check": [ "error", { "reportMissingReturnForUndefinedTypes": false } ], "jsdoc/require-returns": [ "warn", { "forceRequireReturn": true, "forceReturnsWithAsync": true } ], "jsdoc/require-param-type": "warn", "jsdoc/require-param-description": "warn" }, "overrides": [ { "files": [ "src/languages/*.js", "src/icon.js" ], "rules": { "comma-dangle": [ "error", "always-multiline" ], } }, // Override for TypeScript { "files": [ "**/*.ts", ], extends: [ "plugin:@typescript-eslint/recommended", ], "rules": { "jsdoc/require-returns-type": "off", "jsdoc/require-param-type": "off", "@typescript-eslint/no-explicit-any": "off", "prefer-const": "off", } } ] };