diff --git a/.eslintrc.json b/.eslintrc.js similarity index 55% rename from .eslintrc.json rename to .eslintrc.js index 616794da3a..9aba78d2be 100644 --- a/.eslintrc.json +++ b/.eslintrc.js @@ -1,61 +1,63 @@ -{ - "root": true, - "env": { - "es2020": true, - "node": true +"use strict"; + +module.exports = { + root: true, + env: { + es2020: true, + node: true, }, - "extends": [ + extends: [ "eslint:recommended", "plugin:import/errors", "plugin:import/warnings", "plugin:no-jquery/recommended", "plugin:no-jquery/deprecated", "plugin:unicorn/recommended", - "prettier" + "prettier", ], - "parser": "@babel/eslint-parser", - "parserOptions": { - "requireConfigFile": false, - "warnOnUnsupportedTypeScriptVersion": false, - "sourceType": "unambiguous" + parser: "@babel/eslint-parser", + parserOptions: { + requireConfigFile: false, + warnOnUnsupportedTypeScriptVersion: false, + sourceType: "unambiguous", }, - "plugins": ["formatjs", "no-jquery"], - "settings": { - "formatjs": { - "additionalFunctionNames": ["$t", "$t_html"] + plugins: ["formatjs", "no-jquery"], + settings: { + formatjs: { + additionalFunctionNames: ["$t", "$t_html"], }, "no-jquery": { - "collectionReturningPlugins": { - "expectOne": "always" + collectionReturningPlugins: { + expectOne: "always", }, - "variablePattern": "^\\$(?!t$|t_html$)." - } + variablePattern: "^\\$(?!t$|t_html$).", + }, }, - "reportUnusedDisableDirectives": true, - "rules": { + reportUnusedDisableDirectives: true, + rules: { "array-callback-return": "error", "arrow-body-style": "error", "block-scoped-var": "error", "consistent-return": "error", - "curly": "error", + curly: "error", "dot-notation": "error", - "eqeqeq": "error", + eqeqeq: "error", "formatjs/enforce-default-message": ["error", "literal"], "formatjs/enforce-placeholders": [ "error", - {"ignoreList": ["b", "code", "em", "i", "kbd", "p", "strong"]} + {ignoreList: ["b", "code", "em", "i", "kbd", "p", "strong"]}, ], "formatjs/no-id": "error", "guard-for-in": "error", "import/extensions": "error", "import/first": "error", "import/newline-after-import": "error", - "import/no-cycle": ["error", {"ignoreExternal": true}], + "import/no-cycle": ["error", {ignoreExternal: true}], "import/no-duplicates": "error", "import/no-self-import": "error", "import/no-unresolved": "off", "import/no-useless-path-segments": "error", - "import/order": ["error", {"alphabetize": {"order": "asc"}, "newlines-between": "always"}], + "import/order": ["error", {alphabetize: {order: "asc"}, "newlines-between": "always"}], "import/unambiguous": "error", "lines-around-directive": "error", "new-cap": "error", @@ -64,7 +66,7 @@ "no-bitwise": "error", "no-caller": "error", "no-catch-shadow": "error", - "no-constant-condition": ["error", {"checkLoops": false}], + "no-constant-condition": ["error", {checkLoops: false}], "no-div-regex": "error", "no-else-return": "error", "no-eq-null": "error", @@ -93,24 +95,24 @@ "no-sync": "error", "no-throw-literal": "error", "no-undef-init": "error", - "no-unneeded-ternary": ["error", {"defaultAssignment": false}], + "no-unneeded-ternary": ["error", {defaultAssignment: false}], "no-unused-expressions": "error", "no-unused-vars": [ "error", - {"args": "all", "argsIgnorePattern": "^_", "ignoreRestSiblings": true} + {args: "all", argsIgnorePattern: "^_", ignoreRestSiblings: true}, ], - "no-use-before-define": ["error", {"functions": false}], + "no-use-before-define": ["error", {functions: false}], "no-useless-concat": "error", "no-useless-constructor": "error", "no-var": "error", - "object-shorthand": ["error", "always", {"avoidExplicitReturnArrows": true}], + "object-shorthand": ["error", "always", {avoidExplicitReturnArrows: true}], "one-var": ["error", "never"], "prefer-arrow-callback": "error", - "prefer-const": ["error", {"ignoreReadBeforeAssign": true}], - "radix": "error", - "sort-imports": ["error", {"ignoreDeclarationSort": true}], - "spaced-comment": ["error", "always", {"markers": ["/"]}], - "strict": "error", + "prefer-const": ["error", {ignoreReadBeforeAssign: true}], + radix: "error", + "sort-imports": ["error", {ignoreDeclarationSort: true}], + "spaced-comment": ["error", "always", {markers: ["/"]}], + strict: "error", "unicorn/consistent-function-scoping": "off", "unicorn/explicit-length-check": "off", "unicorn/filename-case": "off", @@ -127,61 +129,61 @@ "unicorn/prefer-top-level-await": "off", "unicorn/prevent-abbreviations": "off", "unicorn/switch-case-braces": "off", - "valid-typeof": ["error", {"requireStringLiterals": true}], - "yoda": "error" + "valid-typeof": ["error", {requireStringLiterals: true}], + yoda: "error", }, - "overrides": [ + overrides: [ { - "files": ["web/tests/**"], - "rules": { - "no-jquery/no-selector-prop": "off" - } + files: ["web/tests/**"], + rules: { + "no-jquery/no-selector-prop": "off", + }, }, { - "files": ["web/e2e-tests/**"], - "globals": { - "zulip_test": false - } + files: ["web/e2e-tests/**"], + globals: { + zulip_test: false, + }, }, { - "files": ["web/src/**"], - "globals": { - "StripeCheckout": false - } + files: ["web/src/**"], + globals: { + StripeCheckout: false, + }, }, { - "files": ["**/*.ts"], - "extends": [ + files: ["**/*.ts"], + extends: [ "plugin:@typescript-eslint/strict-type-checked", "plugin:@typescript-eslint/stylistic-type-checked", - "plugin:import/typescript" + "plugin:import/typescript", ], - "parserOptions": { - "project": "tsconfig.json" + parserOptions: { + project: "tsconfig.json", }, - "settings": { + settings: { "import/resolver": { - "node": { - "extensions": [".ts", ".d.ts", ".js"] // https://github.com/import-js/eslint-plugin-import/issues/2267 - } - } + node: { + extensions: [".ts", ".d.ts", ".js"], // https://github.com/import-js/eslint-plugin-import/issues/2267 + }, + }, }, - "globals": { - "JQuery": false + globals: { + JQuery: false, }, - "rules": { + rules: { // Disable base rule to avoid conflict "no-use-before-define": "off", "@typescript-eslint/consistent-type-assertions": [ "error", - {"assertionStyle": "never"} + {assertionStyle: "never"}, ], "@typescript-eslint/consistent-type-definitions": ["error", "type"], "@typescript-eslint/consistent-type-imports": "error", "@typescript-eslint/explicit-function-return-type": [ "error", - {"allowExpressions": true} + {allowExpressions: true}, ], "@typescript-eslint/member-ordering": "error", "@typescript-eslint/method-signature-style": "error", @@ -190,98 +192,98 @@ "@typescript-eslint/no-unnecessary-qualifier": "error", "@typescript-eslint/no-unused-vars": [ "error", - {"args": "all", "argsIgnorePattern": "^_", "ignoreRestSiblings": true} + {args: "all", argsIgnorePattern: "^_", ignoreRestSiblings: true}, ], - "@typescript-eslint/no-use-before-define": ["error", {"functions": false}], + "@typescript-eslint/no-use-before-define": ["error", {functions: false}], "@typescript-eslint/parameter-properties": "error", "@typescript-eslint/promise-function-async": "error", "@typescript-eslint/restrict-plus-operands": ["error", {}], "@typescript-eslint/restrict-template-expressions": ["error", {}], - "no-undef": "error" - } - }, - { - "files": ["**/*.d.ts"], - "rules": { - "import/unambiguous": "off" - } - }, - { - "files": ["web/e2e-tests/**", "web/tests/**"], - "globals": { - "CSS": false, - "document": false, - "navigator": false, - "window": false + "no-undef": "error", }, - "rules": { + }, + { + files: ["**/*.d.ts"], + rules: { + "import/unambiguous": "off", + }, + }, + { + files: ["web/e2e-tests/**", "web/tests/**"], + globals: { + CSS: false, + document: false, + navigator: false, + window: false, + }, + rules: { "formatjs/no-id": "off", "new-cap": "off", "no-sync": "off", - "unicorn/prefer-prototype-methods": "off" - } + "unicorn/prefer-prototype-methods": "off", + }, }, { - "files": ["web/debug-require.js"], - "env": { - "browser": true, - "es2020": false + files: ["web/debug-require.js"], + env: { + browser: true, + es2020: false, }, - "rules": { + rules: { // Don’t require ES features that PhantomJS doesn’t support // TODO: Toggle these settings now that we don't use PhantomJS "no-var": "off", "object-shorthand": "off", - "prefer-arrow-callback": "off" - } + "prefer-arrow-callback": "off", + }, }, { - "files": ["web/shared/**", "web/src/**", "web/third/**"], - "env": { - "browser": true, - "node": false + files: ["web/shared/**", "web/src/**", "web/third/**"], + env: { + browser: true, + node: false, }, - "globals": { - "ZULIP_VERSION": false + globals: { + ZULIP_VERSION: false, }, - "rules": { - "no-console": "error" + rules: { + "no-console": "error", }, - "settings": { + settings: { "import/resolver": { - "webpack": { - "config": "./web/webpack.config.ts" - } - } - } + webpack: { + config: "./web/webpack.config.ts", + }, + }, + }, }, { - "files": ["web/shared/**"], - "env": { - "browser": false, - "shared-node-browser": true + files: ["web/shared/**"], + env: { + browser: false, + "shared-node-browser": true, }, - "rules": { + rules: { "import/no-restricted-paths": [ "error", { - "zones": [ + zones: [ { - "target": "./web/shared", - "from": ".", - "except": ["./node_modules", "./web/shared"] - } - ] - } + target: "./web/shared", + from: ".", + except: ["./node_modules", "./web/shared"], + }, + ], + }, ], - "unicorn/prefer-string-replace-all": "off" - } + "unicorn/prefer-string-replace-all": "off", + }, }, { - "files": ["web/server/**"], - "env": { - "node": true - } - } - ] -} + files: ["web/server/**"], + env: { + node: true, + }, + }, + ], +};