diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 0000000000..ee98c5bdb0 --- /dev/null +++ b/.eslintignore @@ -0,0 +1,8 @@ +# Contains the PDF file of the Tag as JSON string, thus does not need to be linted +src/components/CheckIn/tagTemplate.ts +package.json +package-lock.json +tsconfig.json + +# Ignore the Docusaurus website subdirectory +docs/** \ No newline at end of file diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 0000000000..de93fb465f --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,157 @@ +{ + "env": { + "browser": true, + "node": true, + "es6": true + }, + + "extends": [ + "plugin:react/recommended", + "eslint:recommended", + "plugin:jest/recommended", + "plugin:prettier/recommended", + "plugin:@typescript-eslint/recommended", + "eslint-config-prettier", + "prettier" + ], + "globals": { + "Atomics": "readonly", + "SharedArrayBuffer": "readonly" + }, + "parser": "@typescript-eslint/parser", + "parserOptions": { + "ecmaFeatures": { + "jsx": true + }, + "ecmaVersion": 2018, + "sourceType": "module" + }, + + "plugins": [ + "react", + "@typescript-eslint", + "jest", + "import", + "eslint-plugin-tsdoc", + "prettier" + ], + "rules": { + "react/destructuring-assignment": "error", + "@typescript-eslint/explicit-module-boundary-types": "error", + "react/no-multi-comp": [ + "error", + { + "ignoreStateless": false + } + ], + "react/jsx-filename-extension": [ + "error", + { + "extensions": [".tsx"] + } + ], + "import/no-duplicates": "error", + "tsdoc/syntax": "error", + "@typescript-eslint/ban-ts-comment": "error", + "@typescript-eslint/no-unused-vars": "error", + "@typescript-eslint/no-explicit-any": "error", + "@typescript-eslint/no-inferrable-types": "error", + "@typescript-eslint/no-non-null-asserted-optional-chain": "error", + "@typescript-eslint/no-non-null-assertion": "error", + "@typescript-eslint/no-var-requires": "error", + "@typescript-eslint/no-unsafe-function-type": "error", + "@typescript-eslint/no-wrapper-object-types": "error", + "@typescript-eslint/no-empty-object-type": "error", + "@typescript-eslint/no-duplicate-enum-values": "error", + "@typescript-eslint/array-type": "error", + "@typescript-eslint/consistent-type-assertions": "error", + "@typescript-eslint/consistent-type-imports": "error", + "@typescript-eslint/explicit-function-return-type": [ + 2, + { + "allowExpressions": true, + "allowTypedFunctionExpressions": true + } + ], + "camelcase": "off", + "@typescript-eslint/naming-convention": [ + "error", + + { + "selector": "interface", + "format": ["PascalCase"], + "prefix": ["Interface", "TestInterface"] + }, + + { + "selector": ["typeAlias", "typeLike", "enum"], + "format": ["PascalCase"] + }, + { + "selector": "typeParameter", + "format": ["PascalCase"], + "prefix": ["T"] + }, + { + "selector": "variable", + "format": ["camelCase", "UPPER_CASE", "PascalCase"], + "leadingUnderscore": "allow" + }, + { + "selector": "parameter", + "format": ["camelCase"], + "leadingUnderscore": "allow" + }, + { + "selector": "function", + "format": ["camelCase", "PascalCase"] + }, + { + "selector": "memberLike", + "modifiers": ["private"], + "format": ["camelCase"], + "leadingUnderscore": "require" + }, + + { + "selector": "variable", + "modifiers": ["exported"], + "format": null + } + ], + + "react/jsx-pascal-case": [ + "error", + { "allowAllCaps": false, "allowNamespace": false } + ], + + "react/jsx-equals-spacing": ["warn", "never"], + "react/no-this-in-sfc": "error", + + "jest/expect-expect": 0, + + "react/no-unstable-nested-components": ["error", { "allowAsProps": true }], + "react/function-component-definition": [ + 0, + { "namedComponents": "function-declaration" } + ], + "prettier/prettier": "error" + }, + + "settings": { + "react": { + "version": "detect" + } + }, + "ignorePatterns": [ + "**/*.css", + "**/*.scss", + "**/*.less", + "**/*.json", + "**/*.svg", + "docs/docusaurus.config.ts", + "docs/sidebars.ts", + "docs/src/**", + "docs/blog/**" + ] +}