{ "$schema": "https://json.schemastore.org/eslintrc.json", "plugins": ["@typescript-eslint", "import"], "parserOptions": { "project": "tsconfig.json" }, "extends": [ "plugin:@typescript-eslint/recommended", "plugin:@typescript-eslint/recommended-requiring-type-checking", "plugin:import/recommended", "plugin:import/typescript", "prettier", "next/core-web-vitals" ], "rules": { // sort imports "import/order": "error", // no let exports "import/no-mutable-exports": "error", "import/no-cycle": "error", "import/no-default-export": "error", "import/no-unresolved": "off", // allow {} even though it's unsafe but comes handy "@typescript-eslint/ban-types": [ "error", { "types": { "{}": false } } ], "@typescript-eslint/consistent-type-imports": [ "error", { "prefer": "type-imports", "fixStyle": "inline-type-imports", "disallowTypeAnnotations": false } ], "import/no-duplicates": ["error", { "prefer-inline": true }], // false negatives "import/namespace": ["off"], // we allow empty interfaces "no-empty-pattern": "off", "@typescript-eslint/no-empty-interface": "off", // we allow empty functions "@typescript-eslint/no-empty-function": "off", // we sometimes use async functions that don't await anything "@typescript-eslint/require-await": "off", // make sure to `await` inside try…catch "@typescript-eslint/return-await": ["error", "in-try-catch"], // allow unused vars prefixed with `_` "@typescript-eslint/no-unused-vars": ["error", { "argsIgnorePattern": "^_", "varsIgnorePattern": "^_" }], // numbers and booleans are fine in template strings "@typescript-eslint/restrict-template-expressions": [ "error", { "allowNumber": true, "allowBoolean": true } ], // @todo "@typescript-eslint/no-explicit-any": "off", "@typescript-eslint/no-misused-promises": [ "error", { "checksVoidReturn": false } ] }, "overrides": [ { "files": ["src/app/**/{page,layout,error,loading,not-found}.tsx", "*.ts"], "rules": { "import/no-default-export": "off" } }, { "files": ["src/checkout/**/*.{ts,tsx}"], "rules": { "no-restricted-imports": [ "error", { "patterns": [ { "group": ["next/*", "@next/*", "next"], "message": "Usage of Next.js-specific imports inside src/checkout is forbidden. Checkout is a standalone component and should not depend on Next.js." } ] } ] } }, { "files": ["__tests__/**/*.{ts,tsx}"], "extends": ["plugin:playwright/recommended"] } ], "ignorePatterns": ["*.js", "*.jsx", "*.cjs", "src/checkout/src/graphql"] }